Чекбоксы вместо выпадающего списка при фильтрации объектов каталога — различия между версиями
Материал из Umicms
VITL' (обсуждение | вклад) |
Mad grant (обсуждение | вклад) |
||
Строка 14: | Строка 14: | ||
<source lang="php"> | <source lang="php"> | ||
− | + | public function filter_checkbox($items, $name) { | |
− | + | $field_name = $name; | |
− | + | $hierarchy = umiHierarchy::getInstance(); | |
− | + | $controller = cmsController::getInstance(); | |
− | + | $page_id = $controller->getCurrentElementId(); | |
− | + | $h_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName('catalog', 'object')->getId(); | |
− | + | $type_id = $hierarchy->getDominantTypeId($page_id, 10, $h_type_id); | |
− | + | if(!$type_id){ | |
− | + | $type_id = umiObjectTypesCollection::getInstance()->getTypeByHierarchyTypeId($h_type_id); | |
− | + | } | |
− | + | $type = umiObjectTypesCollection::getInstance()->getType($type_id); | |
− | + | $field_id = $type->getFieldId($field_name); | |
− | + | if(!$field_id){ | |
− | + | throw new publicException('field with name <strong>\'' . $name . '\'</strong> not found in type with id = ' . $type_id); | |
− | + | } | |
− | + | $field = umiFieldsCollection::getInstance()->getField($field_id); | |
− | + | $guid_id = $field->getGuideId(); | |
− | + | $arr = umiObjectsCollection::getInstance()->getGuidedItems($guid_id); | |
− | + | ||
− | + | $res = ""; | |
− | + | $i = 0; | |
− | + | ||
− | + | foreach ($arr as $key=>$value) { | |
− | + | $res .= "<input type=\"checkbox\" name=\"fields_filter[$name][" . $i . "]\" id=\"" . $key ."\" value=\"" . $key ."\" />" . $value . "<br/>"; | |
− | + | $i++; | |
− | + | } | |
− | + | ||
+ | return $res; | ||
+ | } | ||
</source> | </source> |
Версия 11:57, 3 марта 2014
Задача: реализовать в фильтрации каталога представление данных из выпадающего списка в виде чекбоксов.
Данную задачу можно решить используя кастомный макрос. В кастомный макрос передается значение %name%, и используя средства API UMI.CMS [1] скрипт получает содержимое справочника для переданного поляи по полученным значения сформировать в цикле чекбоксы.
Вызов в кастомного скрипта производится в блоке search_block_line_relation (шаблона по которому производится фильтрация):
%custom filter_checkbox(%id%, %name%)% %object_name%<br/>
В результате, код кастомного макроса должен выглядеть следующим образом:
public function filter_checkbox($items, $name) {
$field_name = $name;
$hierarchy = umiHierarchy::getInstance();
$controller = cmsController::getInstance();
$page_id = $controller->getCurrentElementId();
$h_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName('catalog', 'object')->getId();
$type_id = $hierarchy->getDominantTypeId($page_id, 10, $h_type_id);
if(!$type_id){
$type_id = umiObjectTypesCollection::getInstance()->getTypeByHierarchyTypeId($h_type_id);
}
$type = umiObjectTypesCollection::getInstance()->getType($type_id);
$field_id = $type->getFieldId($field_name);
if(!$field_id){
throw new publicException('field with name <strong>\'' . $name . '\'</strong> not found in type with id = ' . $type_id);
}
$field = umiFieldsCollection::getInstance()->getField($field_id);
$guid_id = $field->getGuideId();
$arr = umiObjectsCollection::getInstance()->getGuidedItems($guid_id);
$res = "";
$i = 0;
foreach ($arr as $key=>$value) {
$res .= "<input type=\"checkbox\" name=\"fields_filter[$name][" . $i . "]\" id=\"" . $key ."\" value=\"" . $key ."\" />" . $value . "<br/>";
$i++;
}
return $res;
}