Добавление вопроса на странице проекта с выбором категории (XSLT)
Задача: Реализовать возможность добавления вопроса на странице проекта FAQ с возможностью выбора категории вопроса.
Реализация:
Напишем кастомный макрос, возвращающий все категории вопросов проекта, id которого нужно передать в параметре $project_id.
Код макрос можно поместить в файл classes\modules\faq\__custom.php
public function getCategoriesList($project_id){
if (!$project_id)
return 'Не передано id проекта';
$hierarchy = umiHierarchy::getInstance();
$list = $hierarchy->getChilds($project_id,false,true,1);
if (!is_array($list))
return 'Передан некорректный id проекта';
$arr = Array();
$block_arr = Array();
foreach($list as $id=>$value){
$element = $hierarchy->getElement($id);
if ($element instanceof umiHierarchyElement){
$arr['node:value'] = $element->getName();
$arr['attribute:id'] = $id;
$block_arr['nodes:item'][] = $arr;
}
}
return $block_arr;
}
Далее, в файл classes\modules\faq\permissions.custom.php нужно поместить следующий код:
<?php
$permissions = Array(
'projects_list' => Array('getCategoriesList'));
?>
В шаблон вывода проекта FAQ (в demodizzy файл templates\demodizzy\xslt\modules\faq\project.xsl) нужно добавить вызов макроса addQuestionForm и скрипт обработки выбранного элемента выпадающего списка:
<xsl:apply-templates select="document('udata://faq/addQuestionForm//')/udata" />
<script>
$('#postQ').click(function(){
var id = $("#category :selected").val();
$('#formQ').attr('action','/faq/post_question/'+id+'/');
});
</script>
В шаблоне вывода результатов работы макроса addQuestionForm(), @method=addQuestionForm (в demodizzy файл templates\demodizzy\xslt\modules\faq\addQuestionForm.xsl) нужно добавить атрибут id="formQ":
<form method="post" action="{action}" id="formQ" onsubmit="site.forms.data.save(this); return site.forms.data.check(this);">
А для кнопки - id="postQ":
<input type="submit" class="button" value="Задать вопрос" id="postQ" />
Также в этот шаблон нужно добавить элементы для вывода выпадающего списка:
<div class="form_element">
<label class="required">
<span><xsl:text>Выберите категорию вопроса:</xsl:text></span>
<select id="category">
<xsl:apply-templates select="document(concat('udata://faq/getCategoriesList/',$document-page-id))/udata/item"/>
</select>
</label>
</div>
И наконец, в файле этого же шаблона, нужно добавить следующий шаблон:
<xsl:template match="udata[@method='getCategoriesList']/item">
<option value="{@id}"><xsl:value-of select="."/></option>
</xsl:template>