Модификация способа вывода объектов каталога (TPL)
Материал из Umicms
В статье для XSLT-шаблонов приводился пример модификации стандартного метода catalog getObjectsList, для TPL-шаблонов идея остается той же, но реализация отличается. Добавляем в папку classes/modules/catalog/ файл permissions.custom.php следующего содержания:
<?php $permissions = Array('view' => Array('getObjectsListCustom')); ?>
А в файл classes/modules/catalog/__custom.php добавляем методы:
public static function getNameObject($object_id){ if(!$object_id) return false; $id = (int) $object_id; $sql = "SELECT name FROM cms3_objects WHERE id = {$id}"; $result = l_mysql_query($sql); $row = mysql_fetch_row($result); return $row[0]; } public function getObjectsListCustom($template = "default", $path = false, $limit = false, $ignore_paging = false, $i_need_deep = 0) { if($this->breakMe()) return; if(!$template) $template = "default"; if (!$i_need_deep) $i_need_deep = intval(getRequest('param4')); if (!$i_need_deep) $i_need_deep = 0; $i_need_deep = intval($i_need_deep); if ($i_need_deep === -1) $i_need_deep = 100; $hierarchy = umiHierarchy::getInstance(); list($template_block, $template_block_empty, $template_block_search_empty, $template_line) = def_module::loadTemplates("tpls/catalog/{$template}.tpl", "objects_block", "objects_block_empty", "objects_block_search_empty", "objects_block_line"); $hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("catalog", "object")->getId(); $category_id = $this->analyzeRequiredPath($path); if($category_id === false && $path != KEYWORD_GRAB_ALL) { throw new publicException("Element not found: \"{$path}\""); } $category_element = $hierarchy->getElement($category_id); $per_page = ($limit) ? $limit : $this->per_page; $curr_page = getRequest('p'); if($ignore_paging) $curr_page = 0; $sel = new umiSelection; $sel->setElementTypeFilter(); $sel->addElementType($hierarchy_type_id); if($path != KEYWORD_GRAB_ALL) { $sel->setHierarchyFilter(); $sel->addHierarchyFilter($category_id, $i_need_deep); } $sel->setPermissionsFilter(); $sel->addPermissions(); $hierarchy_type = umiHierarchyTypesCollection::getInstance()->getType($hierarchy_type_id); $type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt()); if($path === KEYWORD_GRAB_ALL) { $curr_category_id = cmsController::getInstance()->getCurrentElementId(); } else { $curr_category_id = $category_id; } if($path != KEYWORD_GRAB_ALL) { $type_id = $hierarchy->getDominantTypeId($curr_category_id, $i_need_deep); } if(!$type_id) { $type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt()); } if($type_id) { $this->autoDetectOrders($sel, $type_id); $this->autoDetectFilters($sel, $type_id); if($this->isSelectionFiltered) { $template_block_empty = $template_block_search_empty; $this->isSelectionFiltered = false; } } else { $sel->setOrderFilter(); $sel->setOrderByName(); } if($curr_page !== "all") { $curr_page = (int) $curr_page; $sel->setLimitFilter(); $sel->addLimit($per_page, $curr_page); } $result = umiSelectionsParser::runSelection($sel); $total = umiSelectionsParser::runSelectionCounts($sel); if(($sz = sizeof($result)) > 0) { $block_arr = Array(); $lines = Array(); for($i = 0; $i < $sz; $i++) { //id товара $element_id = $result[$i]; $element = umiHierarchy::getInstance()->getElement($element_id); if(!$element) continue; $alt_name = $element->getAltName(); // ссылка на страницу с товаром $link = umiHierarchy::getInstance()->getPathById($element_id); // название товара $text = $element->getName(); // $pic_path - путь к изображению, прописанному в поле pic. $pic_path_object = $element->getValue('pic'); $pic_path = ($pic_path_object) ? $pic_path_object->getFilePath() : ""; //получение ссылки на превью изображение, используя стандартный метод system makeThumbnail. $ini_system = system_buildin_load('system'); $photo_view_image = $ini_system->makeThumbnail($pic_path, 180, 'auto', 'catalog_view'); $photo_preview_image= $ini_system->makeThumbnail($pic_path, 110, 'auto'); // получение значения строкового поля artikul $artikul = $element->artikul; // получение значений из поля типа Выпадающий список с множественным выбором, поле metall $metall_arr = $element->metall; $metall_arr_name = array(); foreach($metall_arr as $object_id){ $metall_arr_name []= self::getNameObject($object_id); } $metalls = implode(', ', $metall_arr_name); $proba = $element->proba; $srednij_ves = $element->srednij_ves; $srednij_ves_str = ($srednij_ves) ? "<li>Средний вес: {$srednij_ves}</li>" : ""; $vstavki_arr = $element->vstavki; $vstavki_arr_name = array(); foreach($vstavki_arr as $object_id){ $vstavki_arr_name []= self::getNameObject($object_id); } $vstavki = implode(', ', $vstavki_arr_name); //получение значений строковых полей, ves_vstavki и proizvoditel. $ves_vstavki = $element->ves_vstavki; $proizvoditel = $element->proizvoditel; // получение значения цены и ее форматирование по шаблону 'short' $ini_emarket = cmsController::getInstance()->getModule('emarket'); $price= $ini_emarket ->price($element_id, 'short', 0); $lines[] ='<div class="items"> <div id="{$element_id}" class="show" onmouseover="Show({$element_id})" onmouseout="unShow({$element_id})"> <table cellpadding="0" cellspacing="0"> <tr valign="middle"> <td bgcolor="#FFFFFF"> <a href="{$link}" title="{$text}">$photo_view_image</a> </td> <td valign="top"><ul> <li>Артикул: $artikul</li> <li>Металл: $metalls</li> <li>Проба: $proba</li> $srednij_ves_str <li>Вставки: $vstavki</li> <li>Производитель: $proizvoditel</li> <li><div class="cenamag">$zoloto_in_kredit</div></li> <li><div class="price" >$price_str</div></li> <li><a href="{$link}">Подробнее</a></li> <li><br />$addtobasket</li> </ul></td> </tr> </table> </div> <div class="im1" style="height: 180px; float: left;"><a href="{$link}" title="{$text}" onmouseover="Show({$element_id})" onmouseout="unShow({$element_id})"> $photo_preview_image</a></div> <div class="item"> <a href="{$link}" title="{$text}" onmouseover="Show({$element_id})" onmouseout="unShow({$element_id})" class="lupa">увеличить</a><br /> <ul class="ul1"> <li>Проба: $proba</li> $srednij_ves_str </ul> <div class="cenamag">$zoloto_in_kredit</div> <div class="price" >$price</div> </div> </div>'; templater::pushEditable("catalog", "object", $element_id); umiHierarchy::getInstance()->unloadElement($element_id); } $block_arr['subnodes:lines'] = $lines; $block_arr['numpages'] = umiPagenum::generateNumPage($total, $per_page); $block_arr['total'] = $total; $block_arr['per_page'] = $per_page; $block_arr['category_id'] = $category_id; if($type_id) { $block_arr['type_id'] = $type_id; } return def_module::parseTemplate($template_block, $block_arr, $category_id); } else { $block_arr['numpages'] = umiPagenum::generateNumPage(0, 0); $block_arr['lines'] = ""; $block_arr['total'] = 0; $block_arr['per_page'] = 0; $block_arr['category_id'] = $category_id; return def_module::parseTemplate($template_block_empty, $block_arr, $category_id);; } }
В шаблоне tpls/catalog/default.tpl, в блоке category, необходимо изменить вызов метода:
%catalog getObjectsList('default', '%category_id%')%
на:
%catalog getObjectsListCustom('default', '%category_id%')%
