sfLink
Сниппет посложнее и служит для формирования ссылок по переданным параметрам. В отличии от sfWord, возвращает полноценные ссылки из таблицы URL, немного сложнее, но позволяет получать ссылки, учитывая условия добавленных полей в правилах.
Если ссылка будет не найдена - то сниппет ничего создаст и не вернёт. sfLink ищет ссылку по всем переданным правилам, подставляя в них переданные параметры. Как только подходящая ссылка будет найдена - поиск прервётся. То есть всегда возвращается только одна 1 ссылка.
Подсказка
Если же нужно вывести много ссылок, а точнее целое меню, с подсчётами результатов и дополнительными условиями - то есть сниппет sfMenu
По умолчанию, вернёт ссылку, завернув её в стандартный чанк <a href="[[+url]]">[[+name]]</a>
. Нужно позаботиться о том, чтобы у всех ссылок в админке компонента были сформированы названия. Если их нет - то нужно при редактировании правила ввести шаблон для ссылок, нажать галочку Перегенерировать названия ссылок и сохранить, иначе вы получите ссылки без названий.
Зачем нужен поиск по нескольким правилам? Допустим у вас для одной страницы есть два правила, состоящее из категории и бренда. И в правилах есть ограничение по каким-нибудь брендам, или категориям. Нам нужно верно вывести ссылку на SEO категорию со страницы товара и у нас всегда 2 параметра: бренд и категория. Чтобы в коде не делать дополнительные условия (если бренд такой-то то, то правило это и т.д), можно передать в параметр rules несколько id правил.
Более развёрнуто про условия полей в правилах на странице дополнительных возможностей, "Условия полей в правилах" рассматривается на основе примера про производителей Apple и Epson. (где мы могли сделать порядок полей разным, или разный шаблон для названий ссылок, соответственно могли быть и различающиеся URL-адреса).
В сниппет sfLink нужно передать минимум 2 обязательных параметра. Далее рассмотрим работу сниппета для формирования ссылок для этих двух правил. Оттолкнёмся от таких вводных данных:
- ID правила "Техника Apple" (2 поля с условиями) -- 7
- ID правила "Принтеры Epson" (2 поля с условиями) -- 6
- 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>
Примеры использования
Ссылка на SEO категорию по цвету (используется на странице товара поле color из miniShop2):
fenom{foreach $_modx->resource.color as $cvet} {'!sfLink' | snippet : [ 'rules' => 17, 'cvet' => $cvet, ]} {/foreach}
Стандартное использование с синтаксисом MODX:
modxСсылка на производителя: [[!sfLink? &rules=`5` &vendor=`[[+vendor]]`]]
Из реального проекта, где станции метро пересекаются с некоторыми типами помещения. И ссылки нужны как относительные
/type1/metro-kolomenskaya
, так и обычные/metro-kolomenskaya
.fenom{'!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>', ]}