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