Хаки и Скрипты Next Generation CMS

В чем разница ?

irbees2008 irbees2008 Опубликовано - 15 - ноября TWIG
  • Уровень сложности исполнения: это делается простым копированием и нажиманием кнопки

Всем привет. есть две конструкции на твиге для вывода блока в полной новости определенной категории , обе выводят блок в полной новости определенной категории, но принцип разный . Вот эти конструкции

Код:
 {% if isHandler('news') and handler.params.category == 'blog' %}
Я в категории блог, и на страничке полной новости с категорией блог
{% endif %}
и
Код:
{% if (news.categories.list[0]['alt'] == 'soft') %}
Блок на страничке ПОЛНОЙ новости с главной категорией soft
{% endif %}

Разница между двумя конструкциями в источнике данных и контексте, в котором условие срабатывает.

news.categories.list[0]['alt'] == 'soft'
Источник: объект текущей новости (массив категорий, прикреплённых к конкретной записи) доступен только когда рендерится сама новость (полная или краткая).
list[0]: первая (главная) категория, которую движок пометил как primary. Если новость в нескольких категориях, остальные игнорируются.
alt: алиас/чПУ категории (а не её отображаемое имя).
Условие истинно только на страницах, где переменная news вообще присутствует (обычно шаблон полной новости news.full.tpl или элемент в списке).
Не зависит от URL-параметров — опирается на реальное прикрепление категории к новости.

isHandler('news') and handler.params.category == 'test'
isHandler('news'): проверка текущего активного обработчика маршрута — вы на странице, обслуживаемой модулем news (это может быть список новостей, страница категории, полная новость, поиск внутри news и т.п.).
handler.params.category: значение параметра category из маршрутизатора (то, что пришло из URL). Обычно присутствует на странице списка категорий (категорийный архив) или если схема URL полной новости включает сегмент категории. Если URL без категории – параметр может отсутствовать.
Сравнение происходит с параметром запроса, а не с реальным списком категорий у конкретной новости. Если новость принадлежит другой наборной категории, но открыта по альтернативному URL или без категории — условие может не сработать.
Подходит для оформления страниц списка/архива категории или фильтра по категории, а не для проверки прикрепления категории у самой новости.

Ключевые отличия:
Объект vs маршрут:
news.categories берёт данные из самой записи;
handler.params.category — из URL/маршрутизатора.
Множественные категории:
news.categories.list может содержать несколько;вы берёте только [0].
В handler.params.category всегда одно значение.
Надёжность на полной новости:
первый вариант гарантированно отражает реальное прикрепление;
второй зависит от того, как сформирован URL.
Доступность переменных:
news.* доступно только там, где движок передал контент новости;
handler.* доступно глобально в шаблонах, где работает соответствующий обработчик.
Риск ошибки:
news.categories.list[0] упадёт, если у новости нет категорий (нужно либо проверять длину, либо использовать news.categories.list|length > 0).
handler.params.category может быть unset — стоит проверять через defined или default.

Когда что использовать:
Показ блока, если сама новость относится к конкретной категории .
Код:
{% if (news.categories.list[0]['alt'] == 'soft') %}
Блок на страничке ПОЛНОЙ новости с главной категорией soft
{% endif %}
Показ блока оформления для страницы архива категории (вне зависимости от конкретной новости) → второй способ.
Код:
 {% if isHandler('news') and handler.params.category == 'blog' %}
Я в категории блог, и на страничке полной новости с категорией блог
{% endif %}
Если хотите универсально на полной новости (учёт главной категории) и падать нельзя:
Код:
{% if news.categories.list|length and news.categories.list[0].alt == 'soft' %}...{% endif %}
Если URL может содержать категорию и хотите использовать второй способ только когда параметр существует:
Код:
{% if isHandler('news') and handler.params.category is defined and handler.params.category == 'test' %}...{% endif %}

Сводно:
Первый — проверка контекстной категории из URL/обработчика (архивный/маршрутный контекст).проверка факта прикрепления категории к записи.
Второй — проверка факта прикрепления категории к записи.
Нужно объединить оба (например, показывать блок и на архиве, и на полной новости этой категории)?
Пример:
Код:
{% if (news is defined and news.categories.list|length and news.categories.list[0].alt == 'soft') or (isHandler('news') and handler.params.category is defined and handler.params.category == 'soft') %}
... блок ...
{% endif %}

Можешь почитать и вот эту статейку "Размещаем блок рекламы в середине новости на TWIGe"

Опрос

Ваше мнение

На каком движке ваш сайт?
Результаты

Последние комментарии

Теги

Anything in here will be replaced on browsers that support the canvas element

Статистика

  • Caйт cущecтвуeт: 4694 дня
  • Статических страниц: 10
  • Категорий: 28
  • Новостей: 620
  • Неопубликованных новостей: 8
  • Комментариев: 257
  • Зарегестрированных пользователей: 779
  • Онлайн всего: [5]
  • Гости: [5]
  • Сегодня нас посетили: [15] Google, Larrytitly, Яндекс, Яндекс, irbees2008, Google, dankeanke, Google, Google, Яндекс, Google, Google, Google, Google, Google
  • SQL запросов: 38
  • Генерация страницы: 0.171сек
  • Потребление памяти: 14.601 Mb 
  •   Яндекс.Метрика