0 Пользователей и 1 Гость просматривают эту тему.
  • 19 Ответов
  • 1218 Просмотров
*

maxis

  • Осваиваюсь на форуме
  • 106
  • 1
С праздником, Коллеги!

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

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

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

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

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

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

« Последнее редактирование: 21.05.2016, 13:08:19 от maxis »
*

maxis

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

maxis

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

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

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

Может, кто подкинет идею, где копать?
*

maxis

  • Осваиваюсь на форуме
  • 106
  • 1
Добрался до того, что надо запрос немного переделывать, убирать лишнюю группировку. Только не знаю какую группировку убирать.
Есть у кого идеи?
Результирующий запрос получается такой:
Спойлер
[свернуть]

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

maxis

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

maxis

  • Осваиваюсь на форуме
  • 106
  • 1
Нашел на форуме похожую задачу: 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

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

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

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

maxis

  • Осваиваюсь на форуме
  • 106
  • 1
На всякий случай, если вдруг кому-то интересно покопаться, текст запроса до применения пагинации:
Код
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

  • Осваиваюсь на форуме
  • 106
  • 1
Пока решил таким образом:
Закомментировал в выборке вот эти строки
Код
->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, 09:47:11 от maxis »
*

maxis

  • Осваиваюсь на форуме
  • 106
  • 1
Благодарю всех за помощь!

Задачу по переопределению вывода списка материалов по метке в компоненте метки 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 в первом пункте  ^-^
*

maxis

  • Осваиваюсь на форуме
  • 106
  • 1
Совместными усилиями результат достигнут, благодаря моему другу, который хорошо разбирается логике построения запросов Владимир Герасимчук v.gerasimchuk@mail.ru
 :D :D :D

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

Всех благ!
 ^-^
*

vipiusss

  • Профи
  • 5592
  • 322
  • Круглая ава-зло!
Вы случайно от id не избавлялись в брауз.строке в тегах?
В плане такая ссылка при клике на тег : /component/tags/tag/id-тег
Миграция, установка, обновление версий Joomla  |  Создание сайтов "под ключ"  |  Эксклюзивные заглушки "offline"  |  Работа с "напильником" над шаблонами и расширениями
*

maxis

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

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

vipiusss

  • Профи
  • 5592
  • 322
  • Круглая ава-зло!
А при чём тут id материала?
Это id тега по счёту из компонента:если тег создан 7-ой по счёту "joomla", то и id будет 7.
И ссылка будет /component/tags/tag/7-joomla
Вот от этого я хочу избавиться.
Миграция, установка, обновление версий Joomla  |  Создание сайтов "под ключ"  |  Эксклюзивные заглушки "offline"  |  Работа с "напильником" над шаблонами и расширениями
*

maxis

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

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

vipiusss

  • Профи
  • 5592
  • 322
  • Круглая ава-зло!
Решил плагином скрытия ид.
Миграция, установка, обновление версий Joomla  |  Создание сайтов "под ключ"  |  Эксклюзивные заглушки "offline"  |  Работа с "напильником" над шаблонами и расширениями
*

easy_simple

  • Осваиваюсь на форуме
  • 49
  • 0
Уважаемые господа, вы так хорошо разбираетесь в Joomla. может знаете как фильтровать по тэгу внутри категории? то есть нахожусь я в определённой категории и хочу только в ней отфильтровать материалы по тэгу.
*

maxis

  • Осваиваюсь на форуме
  • 106
  • 1
Уважаемые господа, вы так хорошо разбираетесь в Joomla. может знаете как фильтровать по тэгу внутри категории? то есть нахожусь я в определённой категории и хочу только в ней отфильтровать материалы по тэгу.

Движком не предусмотрена такая сортировка. Либо тег, либо категория. Сам хотел это использовать, но сами видите во что это вылилось.
*

maxis

  • Осваиваюсь на форуме
  • 106
  • 1
Тему можно закрывать.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Настройка визуального редактора материалов

Автор stigor-74

Ответов: 3
Просмотров: 53
Последний ответ 07.09.2017, 15:24:05
от stigor-74
слетели все стили в админке при редактировании материалов

Автор tehfoxen

Ответов: 12
Просмотров: 143
Последний ответ 11.08.2017, 14:23:26
от tehfoxen
Как определить адрес материалов с ЧПУ без меню?

Автор Louck

Ответов: 7
Просмотров: 198
Последний ответ 11.08.2017, 04:12:56
от Missile
Количество материалов подкатегорий

Автор yanetcoi

Ответов: 0
Просмотров: 91
Последний ответ 27.07.2017, 16:33:51
от yanetcoi
Одна ссылка для всех материалов

Автор mario052

Ответов: 4
Просмотров: 114
Последний ответ 28.06.2017, 17:38:33
от mario052