Доп поля для нескольких категорий k2 joomla

Главная проблема k2 joomla — нельзя назначить категории доп поля из разных групп. Решение есть, правда в виде хака:

Шаг 1. В таблице #__k2_categories для поля extraFieldsGroup меняем тип с INT на VARCHAR(255). Здесь мы будем хранить IDы групп в виде X,Y,Z,…

Шаг 2. В файле /administrator/components/com_k2/models/extrafield.php ищем функцию getExtraFieldsByGroup и в ней строки:

$group = (int)$group;
$query = "SELECT * FROM #__k2_extra_fields WHERE `group`={$group} AND published=1 ORDER BY ordering";

Первую удаляем, вторую меняем на:

$query = "SELECT * FROM #__k2_extra_fields WHERE `group` IN ($group) AND published=1 ORDER BY `group`, ordering";

Теперь, если в базу в поле категории extraFieldsGroup таблицы #__k2_categories добавить IDы существующих групп дополнительных полей в виде ‘1,2,3’, то в окне редатирования материала во вкладке «Дополнительные поля» появятся поля всех групп, которые можно заполнить и сохранить. Итак, половину задачи мы решили.

Шаг 3. В файле /administrator/components/com_k2/models/categories.php ищем функцию getData класса K2ModelCategories. В ней находим строку:

$query = "SELECT c.*, g.name AS groupname, exfg.name as extra_fields_group FROM #__k2_categories as c LEFT JOIN #__groups AS g ON g.id = c.access LEFT JOIN #__k2_extra_fields_groups AS exfg ON exfg.id = c.extraFieldsGroup WHERE c.id>0";

Заменим ее на:

$query = "SELECT c.*, g.name AS groupname, (SELECT GROUP_CONCAT(exfg.name) FROM #__k2_extra_fields_groups AS exfg WHERE FIND_IN_SET (exfg.id, c.extraFieldsGroup )) 
as extra_fields_group FROM #__k2_categories as c LEFT JOIN #__groups AS g ON g.id = c.access LEFT JOIN #__k2_extra_fields_groups AS exfg ON exfg.id = c.extraFieldsGroup WHERE c.id>0";

Теперь в списке категорий в админке мы получим названия присвоенных групп дополнительных полей через запятую.

Шаг 4. И последний. Добавим возможность выбора нескольких групп при редактировании категории. Для этого в файле /administrator/components/com_k2/views/category/views.html.php в функции display класса K2ViewCategory (~62) находим:

$lists['extraFieldsGroup'] = JHTML::_ ( 'select.genericlist', $group, 'extraFieldsGroup', 'class="inputbox" size="1" ', 'id', 'name', $category->extraFieldsGroup );

Заменим ее на:

$lists['extraFieldsGroup'] = JHTML::_ ( 'select.genericlist', $group, 'extraFieldsGroup[]', 'class="inputbox" size="4" multiple="multiple"', 'id', 'name', explode(",",$category->extraFieldsGroup) );

Теперь мы получили мультиселектор с выбранными группами вместо выпадающего списка.

Затем идем в файл /administrator/components/com_k2/models/category.php, находим функцию save класса K2ModelCategory, ищем блок кода:

if (!$row->store()) {
     $mainframe->redirect('index.php?option=com_k2&view=categories', $row->getError(), 'error');
}

и добавляем перед ним:

$row->extraFieldsGroup=implode(",",$row->extraFieldsGroup);

И последнее, сделаем вывод этих самых допполей в модели материала:
в файле components/com_ k2/models/item. php примерно строка 1310 нужно заменить

`group` = ".(int)$group."
на
`group` IN ($group)

Спасибо автору решения

Запись опубликована в рубрике Joomla. Добавьте в закладки постоянную ссылку.

Один комментарий на «Доп поля для нескольких категорий k2 joomla»

  1. Dima говорит:

    Подскажите, а как можно при этом при всем выводить названия групп полей?
    Заранее спасибо!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *