Как в MODX добавить иконки к фильтрам mFilter2?

Александр, добрый вечер, пытался найти инфу, как в mfilter2 каждому фильтру назначить уникальную иконку, если иконка одинаковая, понятно что можно указать её в чанке, но если, к примеру в группе фильтров (страны) нужно у каждого фильтра привязать иконку с флагом страны и вывести в форме с фильтрами, тут уже возникают проблемы, в нете этой информации нет по крайне мери нужных вариантов, если возможно опишите пожалуйста, как это сделать? Подзабыл честно говоря, давненько это было, интересовался на сайте modx, как это реализовать, там было предложено, сделать массив ресурсов-стран с TV-картинкой flag. В возможных значениях у тв ставить:
@EVAL return $modx->runSnippet('pdoResources',array(
'parents'=>123, //родитель ресурсов-стран
'limit'=>0,
'tpl'=>'@INLINE [[+pagetitle]]==[[+id]]',
'outputSeparator'=>'||'
));
Создать для параметра тв strani в mFilters2 свой шаблон, где выводить:
<img src="[[#[[+title]].flag]] " alt="" />
[[#[[+title]].pagetitle]]
Изначально показалось это не плохим вариантом, но в итоге, не то, тем более, если используешь свою таблицу да и плодить ресурсы для каждой страны, создавая ресурс ради иконки. Вариант через migx тоже не подходит. С помощью css на основе нумерации в дереве элементов, тоже не то. Это тебе не то, то тебе не то, иди строй сарай:) Всё таки, возможно есть еще какие варианты, для решения данной задачи?

Комментарии: 19

Александр Мальцев
Александр Мальцев
Привет!
1. Создать чанк-шаблон для фильтра страны.
&tplFilter.row.tv|country=`filter_keywords`
Если нужно без TV, то как в комментарии.
2. В чанк-шаблоне название страны хранится в {$value}. Значит его можно использовать.
Код чанка:
{var $key = $table ~ $delimeter ~ $filter}
{var $array = ['Россия' => 'ru', 'Украина' => 'ua']}
{var $flag = ''}
{if $array | iterable}
    {foreach $array as $key => $value1}
        {if $key == $value}
           {var $flag = $value1} 
        {/if}
    {/foreach}
{/if}

<label for="mse2_{$key}_{$idx}" class="{$disabled}">
    <input type="checkbox" name="{$filter_key}" id="mse2_{$key}_{$idx}" value="{$value}" {$checked} {$disabled}/>
    <img src="/assets/flags/{$flag}.png"><span>{$title}</span> <sup>{$num}</sup>
</label>
Александр
Александр
Александр, доброго вечера, спасибо, пытаюсь реализовать, делаю чанк, название: filter_keywords, название поля со значениями стран, strana, далее в фильтре вызываю так:
&tplFilter.row.strana|country=`filter_keywords`
но даже tpl не могу прикрутить к значением, чё то не так прописываю?

Или я не так всё понял и если используешь свою таблицу для фильтрации, нужно ищё в файле с расширенном классом фильтра чё-то добавлять, править?

В теге foreach прописано value1, это не ошибка?
Александр
Александр
Удалось разобраться, value1 оказывается не ошибка, изначально показалось что опечатка, при таком вызове работает
&tplFilter.row.strana=`filter_keywords`

но в ссылках на изображения прописывает по русски и в for дублирует последние значения из этой строки:
{var $array = ['Россия' => 'ru', 'Украина' => 'ua', 'Абхазия' => 'ab']]}



В чанке filter_keywords так:
{var $key = $table ~ $delimeter ~ $filter}
{var $array = ['Россия' => 'ru', 'Украина' => 'ua', 'Абхазия' => 'ab']}
{var $flag = ''}
{if $array | iterable}
    {foreach $array as $key => $value1}
        {if $key == $value}
           {var $flag = $value} 
        {/if}
    {/foreach}
{/if}

<label for="mse2_{$key}_{$idx}" class="{$disabled}">
    <input type="checkbox" name="{$filter_key}" id="mse2_{$key}_{$idx}" value="{$value}" {$checked} {$disabled}/>
    <img src="/assets/flags/{$flag}.png"><span>{$title}</span> <sup>{$num}</sup>
</label>
Александр, если значения на русском, как сделать чтобы в ссылке на img к значению применялась транслитерация?

Для чего нужны в коде сокращения ua,ru и т.д?
Александр
Александр
Огромное спасибо за отличное и подробное решение.
Александр Мальцев
Александр Мальцев
Пожалуйста. Рад что помог :)
Александр
Александр
Александр, доброго вечера, подскажите пожалуйста, как можно использовать эту привязку флага, там где это понадобиться к примеру просто вызывая в шаблоне тв поле страны и например в результатах pdoTools, mfilter2?
Александр Мальцев
Александр Мальцев
Привет! Добавить это поле к выводу с помощью leftJoin, а затем в шаблоне row написать аналогичный код. Только в этом случае плейсхолдер будет назваться не {$value}, а так как укажите в параметре &select.
Александр
Александр
Здравствуйте, пытался разобраться, но как обычно возникли трудности:) В leftjoin прописано так:
&leftJoin=`{
    "extendresource": {
      "class": "extendResource",
      "alias": "extFields", 
      "on": "extFields.resource = modResource.id"
    }
  }`
  &select=`{
    "extFields": "extFields.strana as strana,extFields.tv1 as tv1,extFields.tv2 as tv2,extFields.tv3 as tv3"
  }`  
Правильно я понял тут нужно прописать название поля, в место value?
{foreach $array as $key => $strana1}
        {if $key == $strana}
           {var $flag = $strana1} 
        {/if}
    {/foreach}
Как потом выводить?
Александр Мальцев
Александр Мальцев
Да, правильно.
Но, более привычная запись будет такой:
{foreach $array as $key => $value}
  {if $key == $strana}
    {var $flag = $value} 
  {/if}
{/foreach}
Выводить аналогично:
<img src="/assets/flags/{$flag}.png">
Александр
Александр
Вставляю код в чанк tpls, ссылку там же:
<img src="/assets/flags/{$flag}.png"><span>{$strana}</span>
Но не работает, а точнее результаты фильтрации пропадают, не правильно делаю?
Александр Мальцев
Александр Мальцев
В &tpls необходимо указать имя одного или нескольких чанков. По умолчанию используется первый чанк. В этот чанк необходимо вставить этот код.
Александр
Александр
Здравствуйте, я всё так и делаю, просто видимо в вопросе написал не много не понятно, почему-то при том когда ставлю код, результаты фильтрации пропадают, пока не могу понять с чем связано, я пока не переписывал и не включал феном в шаблонах, но в чанках он работает, проблема наверно всё таки не в этом?
Александр Мальцев
Александр Мальцев
Да, Fenom в шаблонах включать не обязательно. Должно работать. Может в URL есть параметр tpl, и нужно отредактировать другой чанк?
Александр
Александр
Нет, в url нет этого параметра я же указываю это в чанке по умолчанию, а там url не меняется. Спасибо, главное щас стало понятно что делаю правильно и феном не причём, буду искать причину.
Александр
Александр
Здравствуйте! Александр, подскажите пожалуйста, как использовать эту связку
<img src="/assets/flags/{$flag}.png"><span>{$strana}</span>
в шаблоне Modx?
Александр Мальцев
Александр Мальцев
Привет!
Например, если страна имеет значение:
{var $strana = 'Украина'}
То, получить флаг можно так:
{var $сountries = ['Россия' => 'ru', 'Украина' => 'ua']}
{var $flag = ''}
{if $сountries | iterable}
    {foreach $сountries as $key => $value}
        {if $key == $strana}
           {var $flag = $value} 
        {/if}
    {/foreach}
{/if}

<img src="/assets/flags/{$flag}.png"><span>{$strana}</span>
Чтобы это можно было использовать, необходимо чтобы Fenom на страницах был включен в настройках.
Другой (традиционный) вариант — это использовать сниппет.
Александр
Александр
В шаблоне не в какую не хочет, тестировал с включённым феномом. Если сниппетом как правильно прописать его?

Но больше важно вывести в чанке default mFilter2 в результатах, пытаюсь таким образом:

В чанке default вывожу так:
{var $array = ['Ангола' => 'ao_24', 'Ангилья' => 'ai_24']}
{var $flag = ''}
{if $array | iterable}
    {foreach $array as $key => $country1}
        {if $key == $country}
           {var $flag = $country1} 
        {/if}
    {/foreach}
{/if}


<img src="/assets/flags/{$flag}.png"><span>{$country}</span>
В место array пробовал сountries, не выводит, визуально значения поля country, выводятся так
Ангола||Ангилья
но без иконки.

В Leftjoin прописано так:
"extendresource": {
      "class": "extendResource",
      "alias": "extFields", 
      "on": "extFields.resource = modResource.id"
    }
В Select, так:
"extFields": "extFields.country as country"
В чём ошибка, подскажите пожалуйста?
Александр Мальцев
Александр Мальцев
У вас значение поля country состоит из 2 значений. Вам сначала необходимо разбить его на несколько значений с помощью Fenom модификатора split:
{var $strs = $strana | split:'||'}
А затем для каждой из них подобрать соответствующее имя флага.
Пример итогового кода:
{var $strana = 'Ангола||Ангилья'}

{var $strs = $strana | split:'||'}
{if $strs | iterable}

  {foreach $strs as $strana1}

    {var $сountries = ['Ангола' => 'ao_24', 'Ангилья' => 'ai_24']}
    {var $flag = ''}
    {if $сountries | iterable}
      {foreach $сountries as $key => $value}
        {if $key == $strana1}
          {var $flag = $value} 
        {/if}
      {/foreach}
    {/if}
    
     <img src="/assets/flags/{$flag}.png"><span>{$strana1}</span>

  {/foreach}
{/if}
Александр
Александр
Огромное, спасибо.