Исправление 1 В шаблоне - задействуем свою шаблонную функцию, например назовем ее getParentSubcategories, вызов которой поставим в шаблоне, а тело функции напишем позже.
Итак, вот как будет выглядеть исправленный фрагмент в вашем шаблоне:
{if !empty($category)}
{getParentSubcategories from=$category result=items}
{else}
{$items = $categories}
{/if}
{include file = '../../../common_parts/AIMatrix/Constructor/items.htm'
items = $items
maxcount = 100000
opentag = '<div class="block">'
listing_opentag = '<ul class="bullet">'
link_opentag = '<li class="item">'
a_params = ''
link_closetag = '</li>'
listing_closetag = '</ul>'
closetag = '</div>'}
Суть действия: если существует текущая категория $category, с помощью шаблонной функции получаем массив подкатегорий ее родителя и передаем в локальную переменную $items. Иначе текущей категории нет, то есть посетитель сейчас не на странице товара (где эта переменная существует) и не на странице категории (где она тоже существует), следовательно в локальную переменную передаем все дерево категорий $categories.
Исправление 2 Нужно зарегистрировать свою шаблонную функцию. Открываем в шаблоне файл emulator.php, там есть класс TemplateEmulator и в нем определен метод регистрации вспомогательных функций - setSmartyPlugins, в него дописываем регистрацию нашей функции таким образом:
class TemplateEmulator {
...
...
protected function setSmartyPlugins ( & $cms ) {
...
...
$cms->smarty->registerPlugin('function',
'getParentSubcategories',
array($this, 'getParentSubcategories'));
}
...
...
}
Исправление 3 Теперь в тот же класс TemplateEmulator добавим метод нашей функции следующего содержания:
class TemplateEmulator {
...
...
public function getParentSubcategories ( $params = null, & $smarty = null ) {
$cat = $params['from'];
$var = $params['result'];
if (empty($cat->path) || count($cat->path) <= 1) {
$smarty->assignByRef($var, $this->cms->categories_tree);
} else {
$id = $cat->path[count($cat->path) - 2]->category_id;
$smarty->assignByRef($var, $this->cms->categories[$id]->subcategories);
}
return '';
}
}
Суть действия: принятая в парметрах метода переменная текущей категории $cat хранит в своем свойстве path весь путь по узлам дерева от его корня до этой текущей категории. Следовательно вторым с конца пути будет указатель на идентификатор родителя этой категории. Мы извлекаем данный идентификатор $id и через него в плоском списке категорий (то есть в categories) выходим на подкатегории subcategories родителя. Этот список отдаем в указанную входными параметрами переменную $var шаблона. Если же путь содержит всего одну запись (пользователь в первом уровне вложенности категорий, и родителем по сути является корень дерева) или пути вообще нет (пользователь не в товаре и не в категории), тогда в шаблон отдаем древовидный список категорий categories_tree.