Проверка активности раздела каталога при использовании макроса 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>
