Давно искал способ для того чтобы присвоить одному материалу в K2 несколько категорий, да и чтоб при этом работа сайта не пострадала. Кажется нашел, мир не без добрых разработчиков.
Итак, что нужно, чтобы один и тот же материал компонента K2 отображался в нескольких категориях, как у компонента ZOO, или другими словами, как добиться мультикатегорий в K2? Давайте разбираться.
От разработчиков мы пока такой возможности не получили (но она обещана в версии 3.0 компонента), поэтому приходится использовать расширения "умельцев" - сторонних разработчиков.
Я перебирал множество расширений, пока не нашел Additional Categories for K2 (в переводе - Дополнительные категории для K2) в каталоге расширений для компонента K2, который как раз и позволяет разместить один и тот же материла в нескольких категориях.
После его установки, он скорее всего откажется работать, как заявлено, но мы исправим =) как всегда, благодаря форуму разработчика мне удалось заставить работать этот компонент мультикатегорий, как надо.
Итак, первое с чем я столкнулся - не отображалось название дополнительных категорий для материала, на русском языке, с английскими названиями проблем не возникало.
По словам разработчика исправить это можно:
Следует несколько поправить файл самого плагина plugins/k2/k2additonalcategories/k2additonalcategories.php
.
Где то в районе строки 197:
Заменить
if(K2_JVERSION=='16')
На
if(K2_JVERSION != '15')
Или скачайте уже исправленный плагин с моего сайта
Далее нам нужно несколько поправить шаблоны вывода компонента K2 для правильного отображения материалов в нескольких категориях.
Для этого мы скопируем шаблоны вывода компонента в наш шаблон:
/components/com_k2/templates/
и копируем из нее папку default
к себе на дискtemplates/ПАПКА_ВАШЕГО_ШАБЛОНА/html/
com_k2
создаем ее и копируем в нее папку default
/components/com_k2/
также скопируйте папки CSS и IMAGES.templates/ПАПКА_ВАШЕГО_ШАБЛОНА/
Вот, теперь можно не беспокоиться за сам компонент и начать редактировать файлы для правильного отображения мультикатегорий.
Далее идет инструкция для исправления возникших вопросов при использовании данного плагина мультикатегорий:
Если при просмотре сайта у материалов в категории отображается только одна, а вы знаете что присвоили несколько, необходимо внести некоторые правки в ваш шаблон для компонента K2, править будем 2 файла:
Первый: category_item.php
, так как ранее мы сделали копию шаблона вывода то идем в templates/ПАПКА_ВАШЕГО_ШАБЛОНА/html/com_k2/default
и находим указанный файл
После строки:
<?php echo JText::_('K2_PUBLISHED_IN'); ?>
<a href="/<?php echo $this->item->category->link; ?>"><?php echo $this->item->category->name; ?></a>
Добавляем:
<?php
$dispatcher = JDispatcher::getInstance();
JPluginHelper::importPlugin ('k2');
$additional_category_links=$dispatcher->trigger('onK2AfterLinkCategoryPublish', array($this->item->id));
echo $additional_category_links[0];
?>
Второй файл в этом же месте - item.php
Ищем строку:
<?php echo JText::_('K2_PUBLISHED_IN'); ?>
<?php echo $this->item->category->link; ?>"><?php echo $this->item->category->name; ?>
После нее вставляем:
<?php
$dispatcher = JDispatcher::getInstance();
JPluginHelper::importPlugin ('k2');
$additional_category_links=$dispatcher->trigger('onK2AfterLinkCategoryPublish', array($this->item->id));
echo $additional_category_links[0];
?>
Теперь все наши материалы будут показывать несколько категорий к которым они принадлежат, если их отображение включено.
Чтобы счетчики в названиях категорий отображали правильное число находящихся в нем материалов, при использовании плагина мультикатегорий, нам необходимо модифицировать /components/com_k2/models/itemlist.php
в районе строки 771 находим:
return $total;
И прямо перед этой строкой вставляем:
$dispatcher = JDispatcher::getInstance();
JPluginHelper::importPlugin ('k2');
$dispatcher->trigger('onK2BeforeSetCountCategoryQuery', array(&$total, &$id, &$categories));
Данный код заставляет K2 учитывать дополнительные категории при подсчете материалов в категории.
Единственный минус - фактически это "ХАК" самого компонента K2, поэтому при обновлении самого компонента он затирается, имейте это ввиду!!!
Если вам хочется чтобы и в админке количество материалов в категории показывалось с учетом ВСЕХ категорий K2(как основных, так и дополнительных), то здесь тоже придется прибегнуть к правке кода файла модели K2 (то есть, опять небольшой "хак"!).
Ищем файл administrator/components/com_k2/models/category.php
, где то в конце файла (район строки 163) находим:
$query = "SELECT COUNT(*) FROM #__k2_items WHERE catid={$catid} AND trash = ".(int)$trash;
И сразу после нее вставляем:
$dispatcher = JDispatcher::getInstance();<br />JPluginHelper::importPlugin ('k2');
$additional_category_links=$dispatcher->trigger('onK2BeforeCountCategoryItemsQuery', array(&$query));
Так как это тоже "хак" компонента, то при обновлении он затрется, учитывайте это на своих сайтах!
Чтобы не захламлять таблицу базы данных при использовании плагина и чтобы при удалении материала K2 все работало без ошибок, разработчик плагина Additional Categories for K2 рекомендует внести следующие изменения в модель работы компонента K2:
В файле administrator/components/com_k2/models/items.php
около строки 802 найдите:
$dispatcher->trigger('onFinderAfterDelete', array('com_k2.item', $row));
и сразу после допишите:
JPluginHelper::importPlugin ('k2');
$dispatcher->trigger('onK2AfterDeleteItem', array($row));
Это позволит незахламлять базу и обеспечит правильный учет категорий для компонента и плагина.
Это тоже "хак", учитывайте при обновлении!
О ваших результатах использования плагина и его работе, пишем в комментариях!
Автор блога.
Веб-разработчик.