MIGX, отображение названия вместо id в grid

Всем привет!

Давно интересует вопрос каким образом в MIGX в гриде отображать названия ресурсов вместо id.

Суть такая, есть некий набор данный, где в одном поле список значений tv, а в другом список выбора документов.



В гриде это потом отображается в виде id, что естественно неудобно для пользования.

Поэтому возникает вопрос, как правильно сделать отображение названия вместо id?

Буду признателен за любую наводку.
Eugene
04 ноября 2015, 12:52
modx.pro
3
4 271
0

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

    Илья Уткин
    04 ноября 2015, 17:12
    +1
      Илья Уткин
      04 ноября 2015, 17:13
      +2
      В поле для рендера можно вызвать свой сниппет, который вернет нужное значение
        Илья Уткин
        04 ноября 2015, 17:14
        1
        +2
        Вот здесь подробнее: jonybang.blogspot.ru/2015/03/migx-modx.html
          Eugene
          06 ноября 2015, 18:47
          0
          Илья, вы может быть имели дело с вызовом сниппета для параметра с типом listbox-multiple?
          вариант вызова сниппета в поле шаблона чанка ([[filterTvCats? &ids=`[[+root]]`]]) работает только в случае если выбран один элемент в списке, если более одного, параметр прилетает пустым.
          Видимо дело в том что modx туда пытается передать массив, хз, что только не пробовал уже
            Илья Уткин
            06 ноября 2015, 19:39
            0
            У тв-параметра есть параметр (слава богу, хоть, у него нет параметров) — разделитель, или как-то так. И модх выводит значения через разделитель, например, через запятую. Как выглядит значение [[+root]]?
              Eugene
              08 ноября 2015, 14:38
              0
              да, у меня как раз там был разделитель, через запятую.
              но проблема в том что даже если в шаблон рендерера написать [[+root]], при наличии разделителя в выводе параметра, в ячейке пусто.
        Виталий
        28 января 2019, 11:52
        0
        Да уж… хочешь что-то сделать, сделай сам. Проблема как я понял существует со времен зарождения MIGX и никто ее никак не решал и даже не пытались. По крайней мере Бруно проблемы не видит в этом. Поковырял исходники, проблему нашел и пофиксил. Сейчас PR оформлю и зашлю, ждите обновление.
          Дмитрий Танцирев
          23 июля 2020, 15:10
          0
          При указании пресловутого this.renderChunk и указания ему renderchunktpl, MIGX начинает перезаписывать значение отрендеренного поля.

          Т.е., сначала в поле «ID параметра» сохранится значение: «37», как и положено.
          Потом произойдет рендер этого поля с помощью this.renderChunk.
          Да, в таблице у вас отобразится не ID, а текст «Цвет» который соответствует этому ID.
          Но! При этом, this.renderChunk — так же перезаписывает значение и в самой JSON-строке, которая сохраняется в TV поле.

          По итогу, при попытке вывести данное TV поле на сайте, у вас выведется не «37», а «Цвет».

          Зачем Bruno17 сделал таким образом — одному ему известно.

          Поэтому, если вы не хотите чтобы this.renderChunk перезаписывал значение вашего TV, придётся писать свой собственный рендер.
            Denis Bushaev
            15 ноября 2020, 17:21
            0
            Надыбал инфу как это исправить. При создании поля для рендера, оно не должно называться так же как и поле, с которым вы взаимодействуете. Ну то бишь. Например у вас есть поле id, в которое вы передаёте id ресурса. Для поля отображения не вы должны уже указывать id т.к. он его перезапишет в этом случае.
            Вот пример моего конфига вывода тайтла для ресурсов.

              Артур Шевченко
              09 июня 2022, 13:01
              0
              Добавлю, что при этом если включен Ceil Editor, работать он не будет. Решить эту проблему мне не удалось.
            Alexey
            03 ноября 2022, 01:11
            0
            В итоге: если выбрано несколько категорий в селекте, то рендер не получается выполнить, как писали выше — modx.pro/help/6945#comment-49022. У кого-нибудь получилось разгадать?

            Почему не передается в сниппет-рендерер значение поля [[+cat]] (к примеру), если в селекте выбрано несколько категорий и [[+cat]] прекрасно передается, если выбрана одна категория?
              Алексей Смирнов
              03 ноября 2022, 08:27
              0
              Покажите рендер чанк.
                Alexey
                03 ноября 2022, 09:25
                0
                [{"caption":"Image", "fields": [    
                    {"field":"title","caption":"Заголовок"}, 
                    {"field":"cat","caption":"Категории","inputTV":"category_list"}
                  ]
                }]
                
                [{
                  "header": "Заголовок", "sortable": "true", "dataIndex": "title"
                },{
                  "header": "Категории", "sortable": "true", "dataIndex": "rendercat","renderer":"this.renderChunk",
                  "renderchunktpl":"[[!getPortfolioCategoryTitles?&input=`[[+cat]]`]]"
                }]

                В сниппете getPortfolioCategoryTitles логирую переменную input. Если в селекте выбрано одно значение, то в лог записывается id выбранного ресурса. Если выбрано несколько — в лог пишется строка "[[+cat]]" — skrinshoter.ru/s/031122/ZSCrDuDu

                TV «category_list» — поле типа список со множественным выбором, возможные значения:

                @EVAL $out = $modx->runSnippet('pdoResources',array('parents'=>0,'depth'=>0,'limit'=>0,'sortby'=>'menutitle','sortdir'=>'DESC','tpl'=>'@INLINE [[+pagetitle]]==[[+id]]','outputSeparator'=>'||')); return $out;
                  Алексей Смирнов
                  03 ноября 2022, 10:43
                  +1
                  А зачем вам TV-шка? она еще что-то делает?
                  Я обычно такие вещи без TV делаю.
                  Сразу советую перейти и переделать вызов MIGX через форму как Илья Уткин писал.
                  а по существу есть ММммммаааленький нюанс в парсере MODX.
                  Заключается он в том что при обработке поля renderchunktpl если у нас 1 значение — это строка, а если там несколько значений для типа listbox-multiple, то там в результате массив или json смотря с какой стороны смотреть.
                  А как всем не известно массивы у нас в парсере преобразуются в НОВЫЕ плейсхолдеры с ключем который приходит из этих массивов.
                  В данном случае у нас ключ это простой индекс от 0 и до бесконечности.
                  И чтобы получить перечень значений, нужно составить последовательность плейсов в сниппете и вернуть именно в этом формате строкой:
                  [[+code.0]], [[+code.1]] ...... [[+code.N]].
                  И тогда все будет хорошо и вы увидете отрендеренные значения.
                  Если не поняли — кидайте код сниппета.
                  Плюсики в КАРМУ. приветствуются.
                    Alexey
                    03 ноября 2022, 11:09
                    0
                    А как всем не известно массивы у нас в парсере преобразуются в НОВЫЕ плейсхолдеры с ключем который приходит из этих массивов
                    Спасибо — не знал! Но, получается, каким-то образом мне нужно все эти плейсхолдеры с индексами передать в сниппет? При условии, что я не знаю сколько элементов в массиве может быть…

                    Сразу советую перейти и переделать вызов MIGX через форму как Илья Уткин писал
                    Тоже вопрос — есть какие-то дополнительные плюшки, если через конфигуратор конфиг делаю? Как-то изначально привык json-код в доп. поле вставлять, получается быстрее, чем по всем формочкам пробегаться

                    А зачем вам TV-шка? она еще что-то делает?
                    Не нашел другого варианта, чтобы вывести в MIGX селект со списком ресурсов. В TV category_list настраиваю выборку, в MIGX эту тивиху подцепляю

                    В карму — завсегда c удовольствием))
                      Алексей Смирнов
                      03 ноября 2022, 11:24
                      0
                      С кол-вом беда…
                      Но в момент когда сниппет у нас будет срабатывать плейсхолдеры уже будут в системе.
                      Это значит что наличие их мы сможем проверить через:
                      $modx->getPlaceholder('place.N');
                      Остается прогнать в цикле и проверить на пустоту или наличие.
                      Про плюшки:
                      ну опечаток со скобками и прочего будет меньше… — накликал и все отлично.
                      плюс — надо добавить поле — пару кликов и готово, а с json надо возиться и помнить все поля. В редакторе — просто удобнее расширять и править. ну и переносить из проекта в проект — вообще просто.
                      Если осовите редактор, то и такие вещи проще там делать. вот хорошая общая статья:
                      modx.pro/howto/16558
                        Alexey
                        03 ноября 2022, 11:37
                        0
                        Это значит что наличие их мы сможем проверить через:
                        Не получается отловить плейсхолдеры в сниппете, в логах пустота:

                        $modx->log(1, $modx->getPlaceholder('cat.0'));
                        $modx->log(1, $modx->getPlaceholder('cat.1'));

                        Я же правильно пишу: cat.0? Возможно, какой-то префикс ещё должен быть?
                          Алексей Смирнов
                          03 ноября 2022, 11:45
                          +1
                          Да, верно. странно что не выводит в лог… может выбраны не 0 и не 1 значения?
                          Вот рабочий вариант оставлю тут для себя и всех:
                          Сниппет вызывается так без знака воскл. !:
                          [[alextest? &data=`[[+cat]]`]]
                          Сам сниппет: alextest
                          if (strpos($data,'[[+') === false){
                              return $data;
                          } else {
                              $namex = str_ireplace([ '[[+',']]' ], '', $data);
                              for($i=0;$i<50;$i++){
                                  if ($modx->getPlaceholder($namex . '.' . $i) != '') {
                                      if ($i > 0) {$out .= ',';}
                                      $out .= '[[+' . $namex . '.' . $i .']]';
                                  }
                              }
                              return $out;
                          }
                            Alexey
                            03 ноября 2022, 12:14
                            0
                            Круто, спасибо!!!

                            Но тут нюанс вылез: если более одной строки в доп поле, то значение рендера берется от первой строки.

                            skrinshoter.ru/s/031122/kYuN7bAB?a
                            skrinshoter.ru/s/031122/LzRFR73f?a

                            В таблице в обоих строках выдает айдишники главной страницы и роботса

                            skrinshoter.ru/s/031122/tOi0sLSb

                            Судя по логам, обращение к сниппету рендера происходит только один раз, несмотря на то, что строк две… и да, вызов некешированного сниппета не прокатывает
                              Алексей Смирнов
                              03 ноября 2022, 12:36
                              +1
                              Да, действительно сниппет кешируется. Но мы хитрее, чем MODX )))
                              Нам нужно передавать какой-то простой уникальный параметр с уникальным значением, чтобы вызов сниппета не брался из кеша.
                              Думаю, для этого подойдет MIGX_id. И тогда можно добавить к вызову:
                              [[alextest?data=`[[+cat]]` &chtougodno=`[[+MIGX_id]]` ]]
                                Alexey
                                03 ноября 2022, 13:00
                                +1
                                Алексей, прямо в точку, ещё раз спасибо, что помогли разобраться с «большим и страшным»©. Про доп параметр сниппета я протупил, конечно, мог бы и сам догадаться.

                                В итоге, сниппет для вывода названий ресурсов вместо id у меня получился такой:

                                if (strpos($data,'[[+') === false){
                                    $titles = [];
                                    $q = $modx->newQuery('modResource');
                                    $q->where(['id' => $data]);
                                    $q->select('pagetitle');
                                    if ($q->prepare() && $q->stmt->execute()) {
                                    	$titles = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
                                    }
                                    return $titles[0];
                                } else {
                                    $out = '';
                                    
                                    $limit = 50;
                                    $namex = str_ireplace([ '[[+',']]' ], '', $data);
                                    for($i = 0; $i < $limit; $i++){
                                        if ($modx->getPlaceholder($namex . '.' . $i) != '') {
                                            $arr[] = $modx->getPlaceholder($namex . '.' . $i);
                                        }
                                    }
                                    if(count($arr)) {
                                        $q = $modx->newQuery('modResource');
                                        $q->where(['id:IN' => $arr]);
                                        $q->select('pagetitle');
                                        if ($q->prepare() && $q->stmt->execute()) {
                                        	$titles = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
                                        }
                                        if(count($titles)) {
                                            $out = implode(', ', $titles);
                                        }
                                    }
                                    return $out;
                                }

                                Остается лишь переменную $limit как-то динамически найти. У меня получилось только доп запросом к БД по нужным параметрам выборки, других вариантов не увидел. Ну, или если заведомо количество категорий ограничено, то — возможно — проще захардкодить так
                                Алексей Смирнов
                                03 ноября 2022, 13:13
                                0
                                Лимит искать? Сомневаюсь что в поле накликают больше 50 категорий. Но если надо можно и до 100ки.
                                Этот лимит только для одного поля ввода. Так что должно хватить с лихвой.
                                Alexey
                                03 ноября 2022, 14:19
                                0
                                Чтобы совсем было красиво, добавил в сниппет сортировку после $q->where(['id:IN' => $arr]);:

                                $q->sortby('FIELD(modResource.id, ' . implode(',', $arr) . ' )');
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            24