1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - новый и перспективный форумный движок от бывших создателей vBulletin.

Условия в шаблонах

Тема в разделе "Модификации шаблонов", создана пользователем adder, 31 авг 2013.

Загрузка
  1. adder

    adder Местный

    Регистрация:
    08.10.10
    Сообщения:
    1.163
    Симпатии:
    840
    Версия XF:
    1.3.4
    Многие из вас встречались с проблемой, когда надо в шаблонах сделать условие (пример: чтобы гость видел текст, а пользователи - нет; чтобы гости видели одно, а пользователи другое; и т.д.), но не знали какие теги использовать.

    Я нашёл на официальном сайте тему от модератора, где он описывает популярные условия.
    HTML:
    http://xenforo.com/community/resources/conditional-statements.1604/
    Оригинальный автор: Brogan
    Авторы перевода: adder и Romchik®

    Мы их перевели специально для XF-RUSSIA.RU. Если будете копировать на свой сайт - оставляйте ссылку на авторов перевода и на XFR!

    Операторы можно расширить используя AND, OR, xen:else и xen:elseif.

    Замена == на != в примерах ниже будет менять условие с положительного на отрицательное.
    К примеру, <xen:if is="{$visitor.user_id} == x"> является положительным, а <xen:if is="{$visitor.user_id} != x"> отрицательным.

    Там, где аргумент имеет только один параметр, вставка ! перед параметром имеет тот же самый эффект.
    К примеру, <xen:if is="{$visitor.user_id}"> является положительным, а <xen:if is="!{$visitor.user_id}"> уже будет отрицательным.

    При работе с массивами ставьте ! прямо перед аргументом.
    К примеру, <xen:if is="in_array({$forum.node_id}, array(x, y, z))"> будет положительным, а <xen:if is="!in_array({$forum.node_id}, array(x, y, z))"> отрицательным.

    Используя xen:else и xen:elseif, мультиоператоры можно укомплектовать в один.
    Самая проста форма использования xen:else выглядит так:
    <xen:if is="{$forum.node_id} == x">
    Этот контент будет показан в форуме x
    <xen:else />
    Этот контент будет показан в любом другом месте
    </xen:if>


    Более расширенное условие с мультиоператорами используя xen:elseif будет выглядеть так:
    <xen:if is="{$forum.node_id} == x">
    Этот контент будет показан в форуме x
    <xen:elseif is="{$forum.node_id} == y" />
    Этот контент будет показан в форуме y
    <xen:elseif is="{$forum.node_id} == z" />
    Этот контент будет показан в форуме z
    <xen:else />
    Этот контент будет показан в любом другом месте
    </xen:if>


    В зависимости от того с каким шаблоном вы ведёте работу, Вам может понадобится использовать $user вместо $visitor; $visitor всегда является записью текущего залогиненного пользователя, а $user это запись обработчика (пример: автор сообщения, список пользователей, список пользователей онлайн и т.д.)

    При работе с шаблоном PAGE_CONTAINER можно передавать переменные из шаблонов представления (category_view, forum_view, thread_view и т.д.), используя xen:container. Это справедливо ко всем шаблонам, которые подключаются к шаблону PAGE_CONTAINER (допустим, шаблоны header или ad_header). Например, чтобы использовать переменную $forum.node_id, нужно добавить в шаблон следующее: <xen:container var="$forumId">{$forum.node_id}</xen:container>.
    Точно так же, для переменной $threadId нужно добавить следующее: <xen:container var="$threadId">{$thread.thread_id}</xen:container>.

    Переменные X, Y или Z, использующиеся в примерах, должны быть заменены на их актуальные значения.

    Отображение содержимого только авторизованным пользователям (не показывать гостям):
    <xen:if is="{$visitor.user_id}">
    Содержимое видно только авторизованным пользователям
    </xen:if>



    Отображение содержимого только гостям (не показывать авторизованным пользователям):
    <xen:if is="!{$visitor.user_id}">
    Содержимое видно только гостям
    </xen:if>



    Отображение различного содержимого гостям и авторизованным:
    <xen:if is="{$visitor.user_id}">
    Это содержимое видно только авторизованным пользователям
    <xen:else />
    Это содержимое видно только гостям
    </xen:if>



    Отображение содержимого определенной группе пользователей:
    <xen:if is="{xen:helper ismemberof, $visitor, X}">
    Это содержимое видно только группе с ID=X
    </xen:if>



    Скрытие содержимого от определенной группы пользователей:
    <xen:if is="!{xen:helper ismemberof, $visitor, X}">
    Это содержимое скрыто от группы с ID=X
    </xen:if>



    Отображение содержимого нескольким группам пользователей:
    <xen:if is="{xen:helper ismemberof, $visitor, X, Y}">
    Это содержимое видно только группам с ID=X и ID=Y
    </xen:if>



    Скрытие содержимого от нескольких групп пользователей:
    <xen:if is="!{xen:helper ismemberof, $visitor, X, Y}">
    Это содержимое скрыто от групп с ID=X и ID=Y
    </xen:if>



    Отображение содержимого только администраторам:
    <xen:if is="{$visitor.is_admin}">
    Это содержимое видно только администраторам
    </xen:if>



    Отображение содержимого только модераторам:
    <xen:if is="{$visitor.is_moderator}">
    Это содержимое видно только модераторам
    </xen:if>



    Отображение содержимого только администраторам и модераторам:
    <xen:if is="{$visitor.is_admin} OR {$visitor.is_moderator}">
    Это содержимое видно толькоадминистраторам и модераторам
    </xen:if>



    Отображение содержимого только определенному пользователю:
    <xen:if is="{$visitor.user_id} == X">
    Это содержимое видно только пользователю с ID=X
    </xen:if>



    Отображение содержимого нескольким пользователям:
    <xen:if is="in_array({$visitor.user_id}, array(X, Y, Z))">
    Это содержимое видно только пользователям с ID=X, ID=Y и ID=Z.
    </xen:if>



    Отображение содержимого после первого сообщения в теме:
    <xen:if is="{$post.position} == 0">
    Это содержимое видно после первого сообщения в теме
    </xen:if>



    Отображение содержимого после первого сообщения в теме или личной переписке:
    <xen:if is="{$post.position} == 0 AND !{$message.conversation_id}">
    Это содержимое видно после первого сообщения в теме или личной переписке
    </xen:if>



    Отображение содержимого после X сообщений в теме на каждой странице:
    <xen:if is="{$post.position} % {$xenOptions.messagesPerPage} == X AND !{$message.conversation_id}">
    Это содержимое видно после X сообщений в теме на каждой странице
    </xen:if>



    Отображение содержимого после X сообщений в теме или личной переписке на каждой странице:
    <xen:if is="{$post.position} % {$xenOptions.messagesPerPage} == X">
    Это содержимое видно после X сообщений в теме или личной переписке на каждой странице
    </xen:if>



    Отображение содержимого после X сообщений в теме на каждой странице, только в разделах Y или Z:
    <xen:if is="{$post.position} % {$xenOptions.messagesPerPage} == X AND in_array({$thread.node_id}, array(Y, Z))">
    Это содержимое видно после X сообщений в теме на каждой странице, только в разделах Y и Z
    </xen:if>



    Отображение содержимого после X сообщений в теме на каждой странице, кроме разделов Y и Z:
    <xen:if is="{$post.position} % {$xenOptions.messagesPerPage} == x AND !in_array({$thread.node_id}, array(Y, Z))">
    Это содержимое видно после X сообщений в теме на каждой странице, кроме разделов Y и Z
    </xen:if>



    Отображение содержимого только на определенных страницах:
    <xen:if is="{$contentTemplate} == 'XYZ'">
    Это содержимое видно только на странице XYZ
    </xen:if>



    Отображение содержимого только в определенной категории:
    <xen:if is="{$category.node_id} == X">
    Это содержимое видно только в категории X
    </xen:if>

    Примечание: чтобы это работало, необходимо включить опцию "Создавать страницы для категорий" в настройках:
    Панель администратора -> Настройки -> Список разделов форума и узлов.


    Отображение содержимого только в определенном разделе:
    <xen:if is="{$forum.node_id} == X">
    Это содержимое видно только в разделе X
    </xen:if>



    Отображение содержимого только в нескольких определенных разделах:
    <xen:if is="in_array({$forum.node_id}, array(X, Y, Z))">
    Это содержимое видно только в разделах X, Y и Z
    </xen:if>



    Отображение содержимого только в определенной теме:
    <xen:if is="{$threadId} == X">
    Это содержимое видно только в теме X
    </xen:if>



    Отображение содержимого только в нескольких определенных темах:
    <xen:if is="in_array({$threadId}, array(X, Y, Z))">
    Это содержимое видно только в темах X, Y и Z
    </xen:if>



    Отображение содержимого только в определенном сообщении:
    <xen:if is="{$postId} == X">
    Это содержимое видно только в сообщении X
    </xen:if>



    Отображение содержимого только в нескольких определенных сообщениях:
    <xen:if is="in_array({$postId}, array(X, Y, Z))">
    Это содержимое видно только в сообщениях X, Y и Z
    </xen:if>



    Отображение содержимого если автор сообщения является автором темы:
    <xen:if is="{$post.user_id} == {$thread.user_id}">
    Это содержимое видно если автор является автором темы
    </xen:if>



    Отображение содержимого пользователям, у которых 0 сообщений:
    <xen:if is="{$visitor.message_count} == 0">
    Это содержимое видно только пользователям, у которых 0 сообщений
    </xen:if>



    Отображение содержимого пользователям, у которых более X сообщений:
    <xen:if is="{$visitor.message_count} > X">
    Это содержимое видно только пользователям, у которых более X сообщений
    </xen:if>



    Отображение содержимого пользователям, у которых менее X сообщений:
    <xen:if is="{$visitor.message_count} < X">
    Это содержимое видно только пользователям, у которых менее X сообщений
    </xen:if>



    Отображение содержимого пользователям, которые не подтвердили свой почтовый адрес:
    <xen:if is="{$isAwaitingEmailConfirmation}">
    Это содержимое видно только пользователям, которые не подтвердили свой почтовый адрес
    </xen:if>



    Отображение содержимого пользователям, которые пришли с поисковых систем:
    <xen:if is="{$visitor.from_search}">
    Это содержимое видно только пользователям, которые пришли с поисковых систем
    </xen:if>


    Первый пост будет периодически обновляться новыми примерами. Был бы очень рад помощи в виде примеров и их описании в комментариях!
     
    Последнее редактирование: 31 авг 2013
    rvint, n0rt37, patrig и 11 другим нравится это.
  2. adder

    adder Местный

    Регистрация:
    08.10.10
    Сообщения:
    1.163
    Симпатии:
    840
    Версия XF:
    1.3.4
    Цель: вывод ника автора сообщения в нужное мне место в шаблоне message
    1. Открываем шаблон message.
    2. Находим нужное место.
    3. Вставляем данный код:
      Код:
      <xen:username user="$message" class="author" />
    4. Радуемся результату.

    1.png

    Цель: вывод миниаватара около навигационной панели пользователя
    1. Открываем шаблон navigation_visitor_tab.
    2. Находим нужное место.
    3. Вставляем данный код:
      Код:
      <img src="{xen:helper avatar, $visitor, s}" class="miniMe" alt="" />
    4. Радуемся результату.

    2.png

    Данный пост будет пополняться примерами с иллюстрациями, чтобы было понятно, что делает то или иное условие.
     
    Последнее редактирование: 31 авг 2013
    TAIFUN, RockeT1993, Romchik® и 4 другим нравится это.
  3. fly_indiz

    fly_indiz Местный

    Регистрация:
    20.08.11
    Сообщения:
    460
    Симпатии:
    352
    Версия XF:
    1.4.3
    а есть условие проверяющее установлено ли дополнение с указанным addon_id ?
     
  4. ratta

    ratta Пользователь

    Регистрация:
    23.11.13
    Сообщения:
    19
    Симпатии:
    1
    Версия XF:
    1.2.4
    А есть вариант вывести только определенному полу
    например:
    <xen:if is="{$user.gender} == 'male'">
    Содержимое видно только мужчинам
    </xen:if>
     
  5. Aiden

    Aiden Местный

    Регистрация:
    03.01.12
    Сообщения:
    202
    Симпатии:
    74
    Версия XF:
    1.4.3
    Нет, нужно выводить как доп. поле.
     
  6. ratta

    ratta Пользователь

    Регистрация:
    23.11.13
    Сообщения:
    19
    Симпатии:
    1
    Версия XF:
    1.2.4
    это как? свое проверил, видно всем, но выводит у указанного пола.
     
  7. rom-kola

    rom-kola Пользователь

    Регистрация:
    27.12.13
    Сообщения:
    20
    Симпатии:
    1
    Версия XF:
    1.3.2
    а как будет выглядеть условие. отображение содержимого пользователям, которые зарегистрированы минимум 30 дней.
     
  8. ratta

    ratta Пользователь

    Регистрация:
    23.11.13
    Сообщения:
    19
    Симпатии:
    1
    Версия XF:
    1.2.4
    Думаю нужно искать в сторону
    {xen:date $user.register_date, 'd.m.y'}

    <xen:if is="{$visitor.register_date} > X">
    Это содержимое видно только пользователям, у которых дата регистрации больше Х.
    </xen:if>


    не проверял, но для работы здесь есть все.
     
    rom-kola нравится это.
  9. rom-kola

    rom-kola Пользователь

    Регистрация:
    27.12.13
    Сообщения:
    20
    Симпатии:
    1
    Версия XF:
    1.3.2
    Спасибо работает)
    А вот еще такой вопрос.
    Условие связанное с ID темы.
    В шаблонах работает код
    PHP:
    <xen:if is="{$forum.node_id} == x">
    Этот контент будет показан в форуме x
    А вот как будет выглядеть код, если его использовать в php файлах сайта
    Пробую
    PHP:
    if ($forum['node_id'] == х)
    но ничего не получается =(
     
  10. Valentine

    Valentine Новичок

    Регистрация:
    16.10.13
    Сообщения:
    23
    Симпатии:
    0
    Перевод устарел. :cry:
     
  11. adder

    adder Местный

    Регистрация:
    08.10.10
    Сообщения:
    1.163
    Симпатии:
    840
    Версия XF:
    1.3.4
    @Valentine как перевод статьи может устареть? :)
     
    exarh нравится это.
  12. exarh

    exarh Местный

    Регистрация:
    05.11.10
    Сообщения:
    364
    Симпатии:
    78
    Версия XF:
    1.1.3
    А поисковым роботам будет показываться?

    Вообще щас ХенФоро научился разделять поисковых ботов от гостей.
    Нет ли какого то условия, что бы показывать гостям и не показывать поисковым ботам?
     
  13. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.525
    Симпатии:
    3.321
    Версия XF:
    1.5.9
    Если по какой-то причине один поисковый бот не будет идентифицирован, а другой - будет, а при этом оба бота будут принадлежать одному поисковому сервису, то в результате сайт попадет в блокировку, так как будут отличаться контенты, полученные ботами. Конечно, это не факт, но такая ситуация может возникнуть.
    Поэтому в принципе лучше не разделять контент для гостей и для поисковых ботов. ИМХО.
     
    exarh нравится это.
  14. rom-kola

    rom-kola Пользователь

    Регистрация:
    27.12.13
    Сообщения:
    20
    Симпатии:
    1
    Версия XF:
    1.3.2
    ну а всетаки этот код не работает
    PHP:
    if ($forum['node_id'] == х)
    как быть
     
  15. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.525
    Симпатии:
    3.321
    Версия XF:
    1.5.9
    Все зависит от того, где Вы этот код пытаетесь использовать. Надеюсь, что Вы понимаете, что наличие переменной в коде обусловлено передачей в этот код этой конкретной переменной.
     
  16. exarh

    exarh Местный

    Регистрация:
    05.11.10
    Сообщения:
    364
    Симпатии:
    78
    Версия XF:
    1.1.3
    НУ сказали бы коротко и ясно - клоакинг недопустим! А то целую речь толкнули, но все таки так и не ответили на мой вопрос ;).

    Вопрос остается открытым!
     
  17. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.525
    Симпатии:
    3.321
    Версия XF:
    1.5.9
    Я не говорил, что это недопустимо. Я сказал, что это плохо. Так что не передергивайте :)
    Если уж так сильно хочется, то вот:
    Код:
    <xen:if is="{$session.robotId}">
       Content for robot
    </xen:if>
    
    А вообще доступные параметры сессии можете посмотреть, например, так:
    Код:
    {xen:helper dump, $session}
     
    exarh, Zlata Jesen и Mirovinger нравится это.
  18. Valentine

    Valentine Новичок

    Регистрация:
    16.10.13
    Сообщения:
    23
    Симпатии:
    0
    Нормально так. В оригинале статьи уже много чего добавлено. Движек-то развивается.
     
  19. valera3680

    valera3680 Активный пользователь

    Регистрация:
    27.11.13
    Сообщения:
    45
    Симпатии:
    0
    Версия XF:
    1.5.4
    Ребят, а как вывести сообщения только от пользователей из определенной ID группы?
     
  20. adder

    adder Местный

    Регистрация:
    08.10.10
    Сообщения:
    1.163
    Симпатии:
    840
    Версия XF:
    1.3.4
    Я что-то не понял Вашего вопроса. Какие сообщения и где?
    Или вывести СООБЩЕНИЕ для определённой группы?
     
    valera3680 нравится это.

Поделиться этой страницей