sfLink

21 августа 2017, 18:14

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

По умолчанию, выводит URL ссылки, но может вернуть обработанный результат. В одном из проектов служит для формирования относительных ссылок.
Абстрактный пример использования: на основе примера в дополнительных возможностях, про производителей Apple, Epson. В том примере мы сделали 2 правила: Один - "Техника Apple", другой "Принтеры Epson" (где мы могли сделать порядок полей разным, соответственно получив различающиеся URL-маски). И формировать ссылку в чанке карточки продукта (tpl.msProducts.row), вызывая 2 раза sfWord - будет не корректно. Будут ссылки на несуществующие страницы - то есть 404.

Чтобы избежать неверных ссылок был сделан сниппет 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 Небязательный. Служит для обработки результата. Обработка через pdoTools, поддержка INLINE-чанков. Принимает только один плейсхолдер: {$link}. @INLINE <a href="{$link}">Текст ссылки</a>
&toPlaceholder Небязательный. Вместо вывода результата на страницу выставит плейсхолдер, с названием, который, вы передадите. seoLink
&brand - параметр, подходящий только для примера. Должен соответствовать синониму поля. Вам нужно передавать все синонимы полей, задейстованных в написанных правилах. $vendor.id
&category - второй параметр, подходящий только для примера. Соответствует синониму поля "Категория". $parent

Внимание! Если не будет найдено значение для переданного поля, то оно будет создано и записано в словарь. Соответственно синоним создастся автоматически и слово будет просклонировано по падежам, если включено в настройках.

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

Из реального проекта, где станции метро пересекаются с некоторыми типами помещения. И ссылки нужны как относительные(/type1/metro-kolomenskaya), так и обычные (/metro-kolomenskaya).

{if $metropoliten?}
    {set $metro_link = $_modx->runSnippet('sfLink',[
        'rules'=> '18,6', //id правил. 18 - (из двух полей метро+тип, но с условием по типу), 6 - (чисто метро)
        'types'=> $types, //id типа помещения (в данном случае в тексте ссылки не участвует)
        'metro'=> $metropoliten, //станция метро (ID записи из другой таблицы)
    ])}     
    // так как sfLink вовзращает только ссылку, то нужно получить название станции метро по ID 
    {set $metro = $metropoliten | sfWord : 4} // раньше был запрос к сторонней таблице, теперь всё через словарь
    <a href="{15|url}{$metro_link}/" class="sklad-link">м. {$metro['value']}</a> 
{/if}

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