Модификация способа вывода объектов каталога (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%')%
Личные инструменты