Как в 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}
Аноним
Аноним
Огромное, спасибо.