Zoo - замечательный компонент каталога, и я часто использую его в разработке сайтов, но у него есть один небольшой минус - это невозможность вывести теги как пункты меню, чтобы можно было как-то индивидуально оформить страницу каждого тега в отдельности.
Если на вашем сайте сложный каталог - например, вы хотите выводить товары и по категориям, и, например, сортировать по производителям, то теги подойдут вам как нельзя кстати.
Штатные решения каталога позволяют нам выводить пунктом меню отдельные товары, категории товаров и главную страницу товаров, а теги к сожалению выводить нельзя. Но как же тогда вставить какие-нибудь модули на конкретные страницы тегов, ведь для отображения модулей на конкретных страницах нам нужны пункты меню?
Есть вариант - использовать компонент TorTags, про который уже писали на форуме
в этой теме. Но мне такой вариант показался слишком замудрёным, т.к. в данном решении пришлось бы проставлять теги на все товары заново, а в моём случае сайт уже был наполнен большим количеством товаров, на которых уже стояли нужные теги. К тому же данный компонент платный.
Мы с моим штатным программистом нашли следующее решение данной проблемы (хотя его тоже незамудрённым не назовёшь):
1.
Сначала мы сделаем возможность добавлять тег как пункт меню. Для этого в папке:
components/com_zoo/views создаем новую папку
tag. В ней создадим файл файл
index.html с содержимым:
<!DOCTYPE html><title></title>
В новосозданной папке tag создадим еще папку tmpl, куда поместим 4 файла:
а) файл
elements.php с содержимым:
<?php
defined('_JEXEC') or die('Restricted access');
<style>
table.list tfoot td { text-align: center; }
table.list tfoot td a {
text-decoration: none;
cursor: pointer;
}
</style>
б) файл
element.xml с содержимым:
<?xml version="1.0" encoding="utf-8"?>
<metadata>
<layout hidden="true" />
</metadata>
в) файл
index.html с содержимым:
<!DOCTYPE html><title></title>
г) и файл
tag.xml с содержимым:
<?xml version="1.0" encoding="utf-8"?>
<metadata>
<layout title="Tag">
<message><![CDATA[Displays an overview of users submitted articles]]></message>
</layout>
<state>
<name>Tag</name>
<description>Пункт меню TAG</description>
</state>
<fields name="request">
<fieldset name="request">
<field
name="tag"
type="text"
label="Наименование TAG"
description="Наименование TAG"
default=""
>
</field>
<field
name="task"
type="hidden"
label="Наименование TAG"
description="Наименование TAG"
default="tag"
>
</field>
<field
name="app_id"
type="hidden"
label="Наименование TAG"
description="Наименование TAG"
default="1"
>
</field>
<field
name="option"
type="hidden"
default="com_zoo"
>
</field>
</fieldset>
</fields>
</metadata>
После этого при создании нового пункта меню в списке раздела Zoo появится новый элемент tag. Создаём пункт меню с данным элементом. В параметрах пункта указываем точное название тега.
2. Теперь
нужно подружить наши теги с пунктами меню. Здесь мы пошли похожим путём, как в пункте меню типа item.
В чем заключается особенность ссылок из пунктов Zoo каталога: если вы уже создавали пункты меню для типа item, то наверное уже замечали, что алиас пункта не совпадает со стандартной ссылкой из каталога Zoo. Обычная ссылка из каталога выглядит примерно так:
/category/item/example.html, тогда как при создании пункта меню дополнительная приставка
/item/ исчезает, и ссылка становится вида:
/category/example.html. Однако zoo каталог принимает новый алиас пункта меню, и уже непосредственно в каталоге все ссылки именно на данный товар станут такими, как в пункте, то есть
/category/example.html.
А то, что мы сделали в пункте 1. не будет менять тэги в каталоге, то есть ссылка из пункта будет вида:
category/tagexample.html, а из карточки товара тег будет вида
/category/tag/tagexample.html.
Чтобы исправить эту проблему, мы должны откорректировать файл itemtag.php, расположенный по адресу:
/media/zoo/elements/itemtag/В файле заменяем строку:
$values[] = '<a href="'.JRoute::_($this->app->route->tag($this->_item->application_id, $tag)).'">'.$tag.'</a>';
на следующий код (
сравните некоторые параметры с параметрами вашего сайта!):
$q='SELECT path FROM #__menu WHERE `link` like "index.php?option=com_zoo&view=tag&layout=item&tag='.$tag.'&task=tag&app_id=1"';
$db->setQuery($q);
$data_row = $db->loadAssoc();
if(!empty($data_row['path'])){
$values[] = '<a href="/'.$data_row['path'].'.html">'.$tag.'</a>';
} else {
$values[] = '<a href="'.JRoute::_($this->app->route->tag($this->_item->application_id, $tag)).'">'.$tag.'</a>';
}
И в самый конец файла после строк:
public function render($params = array()) {
добавляем код:
$db = JFactory::getDbo();
Пояснения:
WHERE `link` like "index.php?option=com_zoo&view=tag&layout=item&tag='.$tag.'&task=tag&app_id=1"';
, где link - параметр из таблицы _menu базы данных (The actually link the menu item refers to.);
index.php?option=com_zoo&view=tag&layout=item&tag='.$tag.'&task=tag&app_id=1 - значение данного параметра с вставкой в место, где указано название пункта меню переменной $tag.
После этой строчки следуют условия, при которых ссылка на тег в каталоге zoo меняется на ссылку пункта меню.
Вывод:После данных манипуляций вы сможете создавать пункты меню в тегах, алиасы тегов во всех шаблонах вывода в каталоге zoo будут автоматически изменяться на алиасы созданных пунктов меню. Следовательно, на страницу тега, который выводится через пункт меню, вы сможете добавлять любые модули в стандартном режиме.
В данном случае даже хлебные крошки показывают правильный результат. На сайте, где было применено данное решение, используются штатные джумловские ЧПУ.
Ссылка, где тег выведен пунктом меню, и на странице выведены модули.