Форум русской поддержки Joomla!® CMS
09.12.2016, 02:09:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Переопределение вывода списка материалов по меткам в com_tags

 (Прочитано 702 раз)
0 Пользователей и 1 Гость смотрят эту тему.
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« : 09.05.2016, 12:38:15 »

С праздником, Коллеги!

Копаюсь в компоненте
Код:
com_tags в Joomla 3.x
и пытаюсь переопределить шаблон вывода материалов по меткам (тегам).

Хочу вывести программу мероприятия по дням (в роли дней метки), формат вывода:
Название метки
материал1, материал2, ...
Название метки2
материал3, материал4, ...
...

Лично мне это позволит построить гибкий список материалов, где метками можно управлять под каким названиями материал будет отображаться. Конкретная задача - расписание программ мероприятий на фестивале. Т.е. описание программы одно, но может попадать в разные даты. Для того, чтобы снять с программы на любой день, просто убираю метку с датой или добавляю при необходимости.

Если кто-то знает другие решения для такой задачи на Joomla 3.x - буду очень признателен.

столкнулся со следующими трудностями:
- не могу понять в каком месте компонент определяет кол-во меток, чтобы менять вывод (и если честно не до конца понял, где в шаблоне зависимость вида от кол-ва меток)
- как разделить результат запроса по нескольким меткам по конкретным меткам для группированного вывода в шаблоне.
- как получить список меток и их свойства, чтобы вывести заголовок метки и описание
- надо ли объединять шапку и список

Возможно есть другие решения, но я пока не придумал.

« Последнее редактирование: 21.05.2016, 14:08:19 от maxis » Записан
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« Ответ #1 : 09.05.2016, 23:52:44 »

Может на описание работы компонента, кто ссылку даст?
Записан
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« Ответ #2 : 10.05.2016, 16:18:08 »

В общем решил вопрос следующим образом (возможно есть более изящные)

1. Добавил в файл tags.php по адресу libraries/cms/helper
следом за 547 строкой перед скобкой:
Код:
. ', ' . 'tags.title AS tag_title'
и после 577 строки вставил строку:
Код:
->join('LEFT', '#__tags AS tags ON tags.id = m.tag_id')
Это для того, чтобы по тегу можно было отсортировать в шаблоне вывода (это тот самый костыль, который не нравится)

2. в шаблоне вывода списка тегов шаблон\html\com_tags\tag\default_items.php переопределил вместо стандартного (заменяем код с 62 строки по 93 тем, что в спойлере):   
Показать текстовый блок

Детали вывода надо дополнять, конечно, но основную канву выводит как надо.
Записан
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« Ответ #3 : 11.05.2016, 13:38:07 »

Рано радовался...
Выводит только по последнему указанному тегу. А надо, чтобы материал выводился по каждому тегу.

Может, кто подкинет идею, где копать?
Записан
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« Ответ #4 : 12.05.2016, 18:05:35 »

Добрался до того, что надо запрос немного переделывать, убирать лишнюю группировку. Только не знаю какую группировку убирать.
Есть у кого идеи?
Результирующий запрос получается такой:
Показать текстовый блок

Не понимаю для чего так много значений с оператором MAX, может в этом загвоздка?
Записан
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« Ответ #5 : 16.05.2016, 22:57:14 »

А где можно поправить количество результатов по тегам по умолчанию? Столкнулся с тем, что выдаёт только 20 строк запроса.
Записан
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« Ответ #6 : 18.05.2016, 09:55:39 »

Нашел на форуме похожую задачу: http://joomlaforum.ru/index.php?topic=311732.0
проделывал похожее, но количество не поменялось. Нужно сделать так, чтобы все выбранные записи выводились с указанными параметрами. Упорно выдаёт 20 записей, хотя я меняю 20 на 60 здесь:
Код:
$limit = $params->get('display_num', $app->get('list_limit', 20));
и здесь в значение по умолчанию задавал 60 (3-й параметр)
Код:
$limit = $app->getUserStateFromRequest('global.list.limit', 'limit', $limit, 'uint');

Есть несколько вопросов для знатоков:
Куда в конечном счёте передаётся итоговый запрос $query для выборки?
protected function populateState в моделе com_tags - кто и когда вызывает или через что вызывается. Не нашёл связей?


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

HELP!
Записан
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« Ответ #7 : 18.05.2016, 17:12:12 »

Как оказалось всё гораздо проще. При отключенном фильтре компонент com_tags ориентируется на глобальные настройки. Там по умолчанию 20 стоит. Заодно и для админ панели добро сделал - 50 установил.
Исправляется здесь: Общие настройки -> Сайт -> Длина списка по умолчанию

Но вернулся к изначальной проблеме - список материалов. Оказывается не всё так просто... для меня. Копаем дальше.

Благодарю всех за внимание, помогать не стоит, сам как-нибудь доберусь до Истины.
До новых постов.
Записан
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« Ответ #8 : 18.05.2016, 17:14:50 »

На всякий случай, если вдруг кому-то интересно покопаться, текст запроса до применения пагинации:
Код:
SELECT
m.type_alias,
m.content_item_id,
m.core_content_id,
count(m.tag_id) AS match_count,
MAX(m.tag_date) as tag_date,
MAX(c.core_title) AS core_title,
MAX(c.core_params) AS core_params,
tags.title AS tag_title,
MAX(c.core_alias) AS core_alias,
MAX(c.core_body) AS core_body,
MAX(c.core_state) AS core_state,
MAX(c.core_access) AS core_access,
MAX(c.core_metadata) AS core_metadata,
MAX(c.core_created_user_id) AS core_created_user_id,
MAX(c.core_created_by_alias) AS core_created_by_alias,
MAX(c.core_created_time) as core_created_time,
MAX(c.core_images) as core_images,
CASE WHEN c.core_modified_time = '0000-00-00 00:00:00' THEN c.core_created_time ELSE c.core_modified_time END as core_modified_time,
MAX(c.core_language) AS core_language,
MAX(c.core_catid) AS core_catid,
MAX(c.core_publish_up) AS core_publish_up,
MAX(c.core_publish_down) as core_publish_down,
MAX(ct.type_title) AS content_type_title,
MAX(ct.router) AS router,
CASE WHEN c.core_created_by_alias > ' ' THEN c.core_created_by_alias ELSE ua.name END AS author,
ua.email AS author_email
FROM
#__contentitem_tag_map AS m INNER JOIN #__ucm_content AS c ON
m.type_alias = c.core_type_alias AND
m.core_content_id = c.core_content_id AND
c.core_state IN (1) AND
(c.core_publish_up = '0000-00-00 00:00:00' OR c.core_publish_up <= '2016-05-12 09:05:34') AND
(c.core_publish_down = '0000-00-00 00:00:00' OR c.core_publish_down >= '2016-05-12 09:05:34')
INNER JOIN #__content_types AS ct ON
ct.type_alias = m.type_alias
LEFT JOIN #__users AS ua ON
ua.id = c.core_created_user_id
LEFT JOIN #__tags AS tags ON
tags.id = m.tag_id
WHERE m.tag_id IN (3,4,5,6) AND
`c`.`core_language` IN ('ru-RU', '*') AND
m.type_alias IN ('com_content.article') AND
c.core_access IN (0,1,5)
GROUP BY m.type_alias, m.content_item_id, m.core_content_id, core_modified_time, core_created_time, core_created_by_alias, name, author_email ORDER BY MAX(`c`.`core_title`) ASC

Буду признателен, если подскажете, что здесь лишнее исходя из задачи. В выборку должны попадать не только уникальные, но и повторяющиеся материалы согласно таблице #__contentitem_tag_map
Записан
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« Ответ #9 : 20.05.2016, 10:43:30 »

Пока решил таким образом:
Закомментировал в выборке вот эти строки
Код:
->group('m.type_alias, m.content_item_id, m.core_content_id, core_modified_time, core_created_time, core_created_by_alias, name, author_email')
. ', ' . 'count(m.tag_id) AS match_count'

убрал из запроса группировку по максимальным значениям MAX

Теперь выбираются не только уникальные строки, но и добавлены строки, где установлено несколько тегов (меток), с учётом настроек компонента. Возможно некорректно работает параметр Строгое соответствие или не строгое соответствие.
« Последнее редактирование: 20.05.2016, 10:47:11 от maxis » Записан
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« Ответ #10 : 21.05.2016, 14:01:55 »

Благодарю всех за помощь!

Задачу по переопределению вывода списка материалов по метке в компоненте метки com_tags решил следующим образом:

1. установил максимальное кол-во позиций в списке в глобальных настройках Общие настройки -> Сайт -> Длина списка по умолчанию
2. Закомментировал следующие строки в SQL Запросе:
Код:
->group('m.type_alias, m.content_item_id, m.core_content_id, core_modified_time, core_created_time, core_created_by_alias, name, author_email')
. ', ' . 'count(m.tag_id) AS match_count'
3. переопределил шаблон вывода имяшаблона/html/com_tags/tag/default_item.php
Добавил непосредственно перед выводом списка:
Код:
<?php $sort_by_tag = array();
foreach ($items as $item) {
$sort_by_tag[$item->tag_title][] = $item;
}
?>
Изменил вывод списка вместо простого вывода списка по умолчанию, поставил вот это:
Код:
<?php foreach ($sort_by_tag as $tag => $items_by_tag): ?>
<div class="h2dev"><h2>Мероприятия на <?php echo $tag; ?></h2></div>
<ul class="category list-striped">
<?php foreach ($items_by_tag as $item): ?>
...и в конце не забываем закрыть циклы foreach:
Код:
</li> <!-- завершает вывод позиции списка в оригинальном варианте -->
<?php endforeach; ?>
</ul>
<?php endforeach; ?>

Не проверял опцию по соответствию, она может некорректно работать так как переменная, которая отвечает за условие, которое добавляется в запрос закомментирована match_count в первом пункте  Smiley
Записан
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« Ответ #11 : 21.05.2016, 14:10:45 »

Совместными усилиями результат достигнут, благодаря моему другу, который хорошо разбирается логике построения запросов Владимир Герасимчук v.gerasimchuk@mail.ru
 Cheesy Cheesy Cheesy

По сути тему можно закрывать, но если кто-то хочет добавить свои альтернативные решения или уже готовые, то будет отличное дополнение ветки. Благодарю всех за внимание!

Всех благ!
 Smiley
Записан
vipiusss
Профи
********

Репутация: +261/-8
Offline Offline

Пол: Мужской
Сообщений: 4573


Skype: renor_


« Ответ #12 : 21.05.2016, 14:18:02 »

Вы случайно от id не избавлялись в брауз.строке в тегах?
В плане такая ссылка при клике на тег : /component/tags/tag/id-тег
Записан
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« Ответ #13 : 23.05.2016, 09:21:03 »

Вы случайно от id не избавлялись в брауз.строке в тегах?
В плане такая ссылка при клике на тег : /component/tags/tag/id-тег

Читал Ваш пост, прикинул как это можно сделать но не придумал. Столкнулся с тем, что без ID материала ссылка некликабельная становится, но я полагаю, что неглубоко копал.
Записан
vipiusss
Профи
********

Репутация: +261/-8
Offline Offline

Пол: Мужской
Сообщений: 4573


Skype: renor_


« Ответ #14 : 23.05.2016, 09:35:41 »

А при чём тут id материала?
Это id тега по счёту из компонента:если тег создан 7-ой по счёту "joomla", то и id будет 7.
И ссылка будет /component/tags/tag/7-joomla
Вот от этого я хочу избавиться.
Записан
maxis
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 90


« Ответ #15 : 01.06.2016, 23:42:03 »

А при чём тут id материала?
Это id тега по счёту из компонента:если тег создан 7-ой по счёту "joomla", то и id будет 7.
И ссылка будет /component/tags/tag/7-joomla
Вот от этого я хочу избавиться.

Я понял Вас, но не ставил себе такой задачи. А в чём сложность? На каком месте неразрешимая проблема?
Записан
vipiusss
Профи
********

Репутация: +261/-8
Offline Offline

Пол: Мужской
Сообщений: 4573


Skype: renor_


« Ответ #16 : 02.06.2016, 08:28:34 »

Решил плагином скрытия ид.
Записан
easy_simple
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 50



« Ответ #17 : 06.06.2016, 20:08:57 »

Уважаемые господа, вы так хорошо разбираетесь в Joomla. может знаете как фильтровать по тэгу внутри категории? то есть нахожусь я в определённой категории и хочу только в ней отфильтровать материалы по тэгу.
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet