Мультикатегории в K2

Давно искал способ для того чтобы присвоить одному материалу в K2 несколько категорий, да и чтоб при этом работа сайта не пострадала. Кажется нашел, мир не без добрых разработчиков. Итак, что нужно, чтобы один и тот же материал компонента K2 отображался в нескольких категориях, как у компонента ZOO, или другими словами, как добиться мультикатегорий в K2? Давайте разбираться. От разработчиков мы пока такой возможности не получили (но она обещана в версии 3.0 компонента), поэтому приходится использовать расширения "умельцев" - сторонних разработчиков. Я перебирал множество расширений, пока не нашел [Additional Categories for K2](http://www.netpin.gr/) (в переводе - Дополнительные категории для K2) в каталоге расширений для компонента K2, который как раз и позволяет разместить один и тот же материла в нескольких категориях. После его установки, он скорее всего откажется работать, как заявлено, но мы исправим =) как всегда, благодаря форуму разработчика мне удалось заставить работать этот компонент мультикатегорий, как надо. Итак, первое с чем я столкнулся - не отображалось название дополнительных категорий для материала, на русском языке, с английскими названиями проблем не возникало. По словам разработчика исправить это можно: Следует несколько поправить файл самого плагина `plugins/k2/k2additonalcategories/k2additonalcategories.php` Где то в районе строки 197: Заменить ``` if(K2_JVERSION=='16') ``` На ``` if(K2_JVERSION != '15') ``` Или скачайте [уже исправленный плагин с моего сайта](files/k2addcat.zip) Далее нам нужно несколько поправить шаблоны вывода компонента K2 для правильного отображения материалов в нескольких категориях. Для этого мы скопируем шаблоны вывода компонента в наш шаблон: - Идем в папку `/components/com_k2/templates/` и копируем из нее папку `default` к себе на диск - Далее, идем в папку с вашим шаблоном: `templates/ПАПКА_ВАШЕГО_ШАБЛОНА/html/` - Если в папке HTML нет папки `com_k2` создаем ее и копируем в нее папку `default` - Все, только что мы создали свой шаблон для компонента K2. - ОЙ, чуть не забыл из папки `/components/com_k2/` также скопируйте папки CSS и IMAGES. - Их, тоже скопируйте в папку вашего шаблона - `templates/ПАПКА_ВАШЕГО_ШАБЛОНА/` Вот, теперь можно не беспокоиться за сам компонент и начать редактировать файлы для правильного отображения мультикатегорий. Далее идет инструкция для исправления возникших вопросов при использовании данного плагина мультикатегорий: ### 1) Материал K2 опубликован в нескольких категориях, но показывает только одну присвоенную категорию. Если при просмотре сайта у материалов в категории отображается только одна, а вы знаете что присвоили несколько, необходимо внести некоторые правки в ваш шаблон для компонента K2, править будем 2 файла: Первый: `category_item.php`, так как ранее мы сделали копию шаблона вывода то идем в `templates/ПАПКА_ВАШЕГО_ШАБЛОНА/html/com_k2/default` и находим указанный файл После строки: ``` item->category->name; ?> ``` Добавляем: ``` trigger('onK2AfterLinkCategoryPublish', array($this->item->id)); echo $additional_category_links[0]; ?> ``` Второй файл в этом же месте - `item.php` Ищем строку: ``` item->category->link; ?>">item->category->name; ?> ``` После нее вставляем: ``` trigger('onK2AfterLinkCategoryPublish', array($this->item->id)); echo $additional_category_links[0]; ?> ``` Теперь все наши материалы будут показывать несколько категорий к которым они принадлежат, если их отображение включено. ### 2) Счетчик в подкатегориях показывает неправильные данные Чтобы счетчики в названиях категорий отображали правильное число находящихся в нем материалов, при использовании плагина мультикатегорий, нам необходимо модифицировать `/components/com_k2/models/itemlist.php` в районе строки 771 находим: ``` return $total; ``` И прямо **перед** этой строкой вставляем: ``` $dispatcher = JDispatcher::getInstance(); JPluginHelper::importPlugin ('k2'); $dispatcher->trigger('onK2BeforeSetCountCategoryQuery', array(&$total, &$id, &$categories)); ``` Данный код заставляет K2 учитывать дополнительные категории при подсчете материалов в категории. Единственный минус - фактически это "ХАК" самого компонента K2, поэтому при обновлении самого компонента он затирается, имейте это ввиду!!! ### 3) Подсчет материалов в категории в админке Если вам хочется чтобы и в админке количество материалов в категории показывалось с учетом ВСЕХ категорий 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();
JPluginHelper::importPlugin ('k2'); $additional_category_links=$dispatcher->trigger('onK2BeforeCountCategoryItemsQuery', array(&$query)); ``` Так как это тоже "хак" компонента, то при обновлении он затрется, учитывайте это на своих сайтах! ### 4) Очистка базы данных при удалении материала K2 Чтобы не захламлять таблицу базы данных при использовании плагина и чтобы при удалении материала 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)); ``` Это позволит незахламлять базу и обеспечит правильный учет категорий для компонента и плагина. Это тоже "хак", учитывайте при обновлении! О ваших результатах использования плагина и его работе, пишем в комментариях!