Проверка активности раздела каталога при использовании макроса getCategoryList
Материал из Umicms
На текущий момент (версия системы 2.8.4.4 и ниже), метод catalog getCategoryList() не предоставляет информации о том, входит ли какой-либо из обрабатываемых разделов каталога в активную цепочку родителей, как это происходит при использовании content menu(). Чтобы все-таки получить данную информацию, воспользуемся кастомным php-методом, который добавим в файл classes/modules/custom.php:
public function is_active($page_id, $mode = 'tpl'){
$currentPageId = cmsController::getInstance()->getCurrentElementId();
if($currentPageId){
static $allParentsIds = null;
if(is_null($allParentsIds)) {
$allParentsIds = umiHierarchy::getInstance()->getAllParents($currentPageId, true);
}
$page_id = (int) $page_id;
$result = in_array($page_id, $allParentsIds) ? true : false;
}else $result = false;
switch ($mode){
case 'tpl':
if($result) return 'active';
break;
case 'xslt':
if($result) return 1;
else return 0;
break;
}
}
В tpl-шаблоне вызов будет следующим:
class="%custom is_active(%id%, 'tpl')%"
class - это атрибут какого-либо узла верстки, который представляет элемент "Раздел каталога". В случае если раздел входит в активную цепочку, то кастомный метод вернет слово: active.
Для XSLT принцип использования следующий:
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="left-column">
<xsl:variable name="is_active" select="document(concat('udata://custom/is_active/', @id, '/xslt'))/udata" />
<li>
<span>
<a href="{@link}">
<xsl:if test="$is_active = 1">
<xsl:attribute name="class">active</xsl:attribute>
</xsl:if>
<xsl:value-of select="." />
</a>
</span>
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id))" />
</li>
</xsl:template>