sfLink

06 августа 2018, 11:31

Сниппет посложнее и служит для формирования ссылок по переданным параметрам. В отличии от sfWord, возвращает полноценные ссылки из таблицы URL, немного сложнее, но позволяет получать ссылки, учитывая условия добавленных полей в правилах.

Если ссылка будет не найдена - то сниппет ничего создат и не вернёт. sfLink ищет ссылку по всем переданным правилам, подставляя в них переданные параметры. Как только подходящая ссылка будет найдена - поиск прервётся. То есть всегда возвращается только одна 1 ссылка.

Если же нужно вывести много ссылок, а точнее целое меню, с подсчётами результатов и дополнительными условиями - то есть сниппет sfMenu

По умолчанию, вернёт ссылку, завернув её в стандартный чанк <a href="[[+url]]">[[+name]]</a>. Нужно позаботиться о том, чтобы у всех ссылок в админке компонента были сформированы названия. Если их нет - то нужно при редактировании правила ввести шаблон для ссылок, нажать галочку Перегенерировать названия ссылок и сохранить, иначе вы получите ссылки без названий.

Зачем нужен поиск по нескольким правилам? Допустим у вас для одной страницы есть два правила, состоящее из категории и бренда. И в правилах есть ограничение по каким-нибудь брендам, или категориям. Нам нужно верно вывести ссылку на SEO категорию со страницы товара и у нас всегда 2 параметра: бренд и категория. Чтобы в коде не делать дополнительные условия (если бренд такой-то то, то правило это и т.д), можно передать в параметр rules несколько id правил.

Более развёрнуто про условия полей в правилах на странице дополнительных возможностей, "Условия полей в правилах" рассматривается на основе примера про производителей Apple и Epson. (где мы могли сделать порядок полей разным, или разный шаблон для названий ссылок, соответственно могли быть и различающиеся URL-адреса).

В сниппет sfLink нужно передать минимум 2 обязательных параметра. Далее рассмотрим работу сниппета для формирования ссылок для этих двух правил. Оттолкнёмся от таких вводных данных:

  1. ID правила "Техника Apple" (2 поля с условиями) -- 7
  2. ID правила "Принтеры Epson" (2 поля с условиями) -- 6
  3. ID правила Бренды (1 поле) -- 2, и оно базовое (то есть будет работать с другими полями, ставя их как GET-параметры)

Параметры

Параметр Описание Пример
&rules Обязательный параметр! Сюда через запятую нужно вписать id правил, которые вы хотите проверить на удовлетворение входным параметрам. Проверка начинается с первого по порядку правила (в примере 7), и будет идти, пока не будет найдено правило, которое удовлятворет параметрам. Последним следует передавать правило, которое точно будет найдено (там может быть только 1 поле, и тогда оно должно быть базовым) 7,6,2
&tpl По умолчанию @INLINE <a href="[[+url]]">[[+name]]</a>. Служит для обёртки результата в ссылку. Обработка через pdoTools, поддержка INLINE-чанков. Можете передать пустую строку, чтобы увидеть доступные плейсхолдеры.
&toPlaceholder Небязательный. Вместо вывода результата на страницу выставит плейсхолдер, с названием, который, вы передадите. seoLink
&brand - параметр, подходящий только для примера. Должен соответствовать синониму поля. Вам нужно передавать все синонимы полей, задейстованных в написанных правилах. $vendor.id
&category - второй параметр, подходящий только для примера. Соответствует синониму поля "Категория". $parent

В данном примере могут быть сильно разные адреса и названия ссылок при одном и том же вызове [[!sfLink?&brand=`[[+vendor]]` &category=`[[+parent]]`]]:

  • 1 товар: передан brand='1'(Apple) category='3'(Телефоны). На выходе можем получить такую ссылку: <a href="/catalog/apple/telephony">Телефоны Apple</a>
  • 2 товар: передан brand='2'(Epson) category='4'(Принтеры). На выходе можем получить такую ссылку: <a href="/catalog/printery/epson">Принтеры от компании Epson</a>
  • 3 товар: передан brand='3' (Xiaomi) category='5'(Роутеры). На выходе можем получить такую ссылку: <a href="/catalog/xiaomi">Техника от Xiaomi</a>

Примеры использования

  1. Ссылка на SEO категорию по цвету (используется на странице товара поле color из miniShop2):

    {foreach $_modx->resource.color as $cvet}
    {'!sfLink'|snippet:[ 
         'rules'=>'17',
         'cvet'=>$cvet
    ]}
    {/foreach}
  2. Стандартное использование с синтаксисом MODX:

    Ссылка на производителя: [[!sfLink? &rules=`5` &vendor=`[[+vendor]]`]]
  3. Из реального проекта, где станции метро пересекаются с некоторыми типами помещения. И ссылки нужны как относительные(/type1/metro-kolomenskaya), так и обычные (/metro-kolomenskaya).
    {'!sfLink'|snippet:[
    'rules'=>'18,6', //id правил. 18 (метро+тип, но с условием по типу), 6 (метро)
    'types'=>$_modx->resource.type_of_room, //id типа помещения
    'metro'=>$_modx->resource.metropoliten, //id станции метро
    'tpl'=>'@INLINE <a href="{$url}" class="station">{$name}</a></span>'
    ]}