MIGX, отображение названия вместо id в grid
Всем привет!
Давно интересует вопрос каким образом в MIGX в гриде отображать названия ресурсов вместо id.
Суть такая, есть некий набор данный, где в одном поле список значений tv, а в другом список выбора документов.
В гриде это потом отображается в виде id, что естественно неудобно для пользования.
Поэтому возникает вопрос, как правильно сделать отображение названия вместо id?
Буду признателен за любую наводку.
Давно интересует вопрос каким образом в MIGX в гриде отображать названия ресурсов вместо id.
Суть такая, есть некий набор данный, где в одном поле список значений tv, а в другом список выбора документов.
В гриде это потом отображается в виде id, что естественно неудобно для пользования.
Поэтому возникает вопрос, как правильно сделать отображение названия вместо id?
Буду признателен за любую наводку.
Комментарии: 28
В поле для рендера можно вызвать свой сниппет, который вернет нужное значение
Вот здесь подробнее: jonybang.blogspot.ru/2015/03/migx-modx.html
Илья, вы может быть имели дело с вызовом сниппета для параметра с типом listbox-multiple?
вариант вызова сниппета в поле шаблона чанка ([[filterTvCats? &ids=`[[+root]]`]]) работает только в случае если выбран один элемент в списке, если более одного, параметр прилетает пустым.
Видимо дело в том что modx туда пытается передать массив, хз, что только не пробовал уже
вариант вызова сниппета в поле шаблона чанка ([[filterTvCats? &ids=`[[+root]]`]]) работает только в случае если выбран один элемент в списке, если более одного, параметр прилетает пустым.
Видимо дело в том что modx туда пытается передать массив, хз, что только не пробовал уже
У тв-параметра есть параметр (слава богу, хоть, у него нет параметров) — разделитель, или как-то так. И модх выводит значения через разделитель, например, через запятую. Как выглядит значение [[+root]]?
да, у меня как раз там был разделитель, через запятую.
но проблема в том что даже если в шаблон рендерера написать [[+root]], при наличии разделителя в выводе параметра, в ячейке пусто.
но проблема в том что даже если в шаблон рендерера написать [[+root]], при наличии разделителя в выводе параметра, в ячейке пусто.
Да уж… хочешь что-то сделать, сделай сам. Проблема как я понял существует со времен зарождения MIGX и никто ее никак не решал и даже не пытались. По крайней мере Бруно проблемы не видит в этом. Поковырял исходники, проблему нашел и пофиксил. Сейчас PR оформлю и зашлю, ждите обновление.
При указании пресловутого this.renderChunk и указания ему renderchunktpl, MIGX начинает перезаписывать значение отрендеренного поля.
Т.е., сначала в поле «ID параметра» сохранится значение: «37», как и положено.
Потом произойдет рендер этого поля с помощью this.renderChunk.
Да, в таблице у вас отобразится не ID, а текст «Цвет» который соответствует этому ID.
Но! При этом, this.renderChunk — так же перезаписывает значение и в самой JSON-строке, которая сохраняется в TV поле.
По итогу, при попытке вывести данное TV поле на сайте, у вас выведется не «37», а «Цвет».
Зачем Bruno17 сделал таким образом — одному ему известно.
Поэтому, если вы не хотите чтобы this.renderChunk перезаписывал значение вашего TV, придётся писать свой собственный рендер.
Т.е., сначала в поле «ID параметра» сохранится значение: «37», как и положено.
Потом произойдет рендер этого поля с помощью this.renderChunk.
Да, в таблице у вас отобразится не ID, а текст «Цвет» который соответствует этому ID.
Но! При этом, this.renderChunk — так же перезаписывает значение и в самой JSON-строке, которая сохраняется в TV поле.
По итогу, при попытке вывести данное TV поле на сайте, у вас выведется не «37», а «Цвет».
Зачем Bruno17 сделал таким образом — одному ему известно.
Поэтому, если вы не хотите чтобы this.renderChunk перезаписывал значение вашего TV, придётся писать свой собственный рендер.
Надыбал инфу как это исправить. При создании поля для рендера, оно не должно называться так же как и поле, с которым вы взаимодействуете. Ну то бишь. Например у вас есть поле id, в которое вы передаёте id ресурса. Для поля отображения не вы должны уже указывать id т.к. он его перезапишет в этом случае.
Вот пример моего конфига вывода тайтла для ресурсов.
Вот пример моего конфига вывода тайтла для ресурсов.
Добавлю, что при этом если включен Ceil Editor, работать он не будет. Решить эту проблему мне не удалось.
В итоге: если выбрано несколько категорий в селекте, то рендер не получается выполнить, как писали выше — modx.pro/help/6945#comment-49022. У кого-нибудь получилось разгадать?
Почему не передается в сниппет-рендерер значение поля [[+cat]] (к примеру), если в селекте выбрано несколько категорий и [[+cat]] прекрасно передается, если выбрана одна категория?
Почему не передается в сниппет-рендерер значение поля [[+cat]] (к примеру), если в селекте выбрано несколько категорий и [[+cat]] прекрасно передается, если выбрана одна категория?
Покажите рендер чанк.
[{"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;
А зачем вам TV-шка? она еще что-то делает?
Я обычно такие вещи без TV делаю.
Сразу советую перейти и переделать вызов MIGX через форму как Илья Уткин писал.
а по существу есть ММммммаааленький нюанс в парсере MODX.
Заключается он в том что при обработке поля renderchunktpl если у нас 1 значение — это строка, а если там несколько значений для типа listbox-multiple, то там в результате массив или json смотря с какой стороны смотреть.
А как всемне известно массивы у нас в парсере преобразуются в НОВЫЕ плейсхолдеры с ключем который приходит из этих массивов.
В данном случае у нас ключ это простой индекс от 0 и до бесконечности.
И чтобы получить перечень значений, нужно составить последовательность плейсов в сниппете и вернуть именно в этом формате строкой:
Если не поняли — кидайте код сниппета.
Плюсики в КАРМУ. приветствуются.
Я обычно такие вещи без TV делаю.
Сразу советую перейти и переделать вызов MIGX через форму как Илья Уткин писал.
а по существу есть ММммммаааленький нюанс в парсере MODX.
Заключается он в том что при обработке поля renderchunktpl если у нас 1 значение — это строка, а если там несколько значений для типа listbox-multiple, то там в результате массив или json смотря с какой стороны смотреть.
А как всем
В данном случае у нас ключ это простой индекс от 0 и до бесконечности.
И чтобы получить перечень значений, нужно составить последовательность плейсов в сниппете и вернуть именно в этом формате строкой:
[[+code.0]], [[+code.1]] ...... [[+code.N]].
И тогда все будет хорошо и вы увидете отрендеренные значения.Если не поняли — кидайте код сниппета.
Плюсики в КАРМУ. приветствуются.
А как всем не известно массивы у нас в парсере преобразуются в НОВЫЕ плейсхолдеры с ключем который приходит из этих массивовСпасибо — не знал! Но, получается, каким-то образом мне нужно все эти плейсхолдеры с индексами передать в сниппет? При условии, что я не знаю сколько элементов в массиве может быть…
Сразу советую перейти и переделать вызов MIGX через форму как Илья Уткин писалТоже вопрос — есть какие-то дополнительные плюшки, если через конфигуратор конфиг делаю? Как-то изначально привык json-код в доп. поле вставлять, получается быстрее, чем по всем формочкам пробегаться
А зачем вам TV-шка? она еще что-то делает?Не нашел другого варианта, чтобы вывести в MIGX селект со списком ресурсов. В TV category_list настраиваю выборку, в MIGX эту тивиху подцепляю
В карму — завсегда c удовольствием))
С кол-вом беда…
Но в момент когда сниппет у нас будет срабатывать плейсхолдеры уже будут в системе.
Это значит что наличие их мы сможем проверить через:
Про плюшки:
ну опечаток со скобками и прочего будет меньше… — накликал и все отлично.
плюс — надо добавить поле — пару кликов и готово, а с json надо возиться и помнить все поля. В редакторе — просто удобнее расширять и править. ну и переносить из проекта в проект — вообще просто.
Если осовите редактор, то и такие вещи проще там делать. вот хорошая общая статья:
modx.pro/howto/16558
Но в момент когда сниппет у нас будет срабатывать плейсхолдеры уже будут в системе.
Это значит что наличие их мы сможем проверить через:
$modx->getPlaceholder('place.N');
Остается прогнать в цикле и проверить на пустоту или наличие.Про плюшки:
ну опечаток со скобками и прочего будет меньше… — накликал и все отлично.
плюс — надо добавить поле — пару кликов и готово, а с json надо возиться и помнить все поля. В редакторе — просто удобнее расширять и править. ну и переносить из проекта в проект — вообще просто.
Если осовите редактор, то и такие вещи проще там делать. вот хорошая общая статья:
modx.pro/howto/16558
Это значит что наличие их мы сможем проверить через:Не получается отловить плейсхолдеры в сниппете, в логах пустота:
$modx->log(1, $modx->getPlaceholder('cat.0'));
$modx->log(1, $modx->getPlaceholder('cat.1'));
Я же правильно пишу: cat.0? Возможно, какой-то префикс ещё должен быть?
Да, верно. странно что не выводит в лог… может выбраны не 0 и не 1 значения?
Вот рабочий вариант оставлю тут для себя и всех:
Сниппет вызывается так без знака воскл. !:
Вот рабочий вариант оставлю тут для себя и всех:
Сниппет вызывается так без знака воскл. !:
[[alextest? &data=`[[+cat]]`]]
Сам сниппет: alextestif (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;
}
Круто, спасибо!!!
Но тут нюанс вылез: если более одной строки в доп поле, то значение рендера берется от первой строки.
skrinshoter.ru/s/031122/kYuN7bAB?a
skrinshoter.ru/s/031122/LzRFR73f?a
В таблице в обоих строках выдает айдишники главной страницы и роботса
skrinshoter.ru/s/031122/tOi0sLSb
Судя по логам, обращение к сниппету рендера происходит только один раз, несмотря на то, что строк две… и да, вызов некешированного сниппета не прокатывает
Но тут нюанс вылез: если более одной строки в доп поле, то значение рендера берется от первой строки.
skrinshoter.ru/s/031122/kYuN7bAB?a
skrinshoter.ru/s/031122/LzRFR73f?a
В таблице в обоих строках выдает айдишники главной страницы и роботса
skrinshoter.ru/s/031122/tOi0sLSb
Судя по логам, обращение к сниппету рендера происходит только один раз, несмотря на то, что строк две… и да, вызов некешированного сниппета не прокатывает
Да, действительно сниппет кешируется. Но мы хитрее, чем MODX )))
Нам нужно передавать какой-то простой уникальный параметр с уникальным значением, чтобы вызов сниппета не брался из кеша.
Думаю, для этого подойдет MIGX_id. И тогда можно добавить к вызову:
Нам нужно передавать какой-то простой уникальный параметр с уникальным значением, чтобы вызов сниппета не брался из кеша.
Думаю, для этого подойдет MIGX_id. И тогда можно добавить к вызову:
[[alextest?data=`[[+cat]]` &chtougodno=`[[+MIGX_id]]` ]]
Алексей, прямо в точку, ещё раз спасибо, что помогли разобраться с «большим и страшным»©. Про доп параметр сниппета я протупил, конечно, мог бы и сам догадаться.
В итоге, сниппет для вывода названий ресурсов вместо id у меня получился такой:
Остается лишь переменную $limit как-то динамически найти. У меня получилось только доп запросом к БД по нужным параметрам выборки, других вариантов не увидел. Ну, или если заведомо количество категорий ограничено, то — возможно — проще захардкодить так
В итоге, сниппет для вывода названий ресурсов вместо 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 как-то динамически найти. У меня получилось только доп запросом к БД по нужным параметрам выборки, других вариантов не увидел. Ну, или если заведомо количество категорий ограничено, то — возможно — проще захардкодить так
Лимит искать? Сомневаюсь что в поле накликают больше 50 категорий. Но если надо можно и до 100ки.
Этот лимит только для одного поля ввода. Так что должно хватить с лихвой.
Этот лимит только для одного поля ввода. Так что должно хватить с лихвой.
Чтобы совсем было красиво, добавил в сниппет сортировку после $q->where(['id:IN' => $arr]);:
$q->sortby('FIELD(modResource.id, ' . implode(',', $arr) . ' )');
В итоге порядок действий
1. в Collums нужно создать отдельное поле для рендера.
2. В нем активируем this.renderChunk и в renderChunk template вызываем созданный сниппет
Типо такой:
[[migxIDtoPagetitle?data=`[[+players]]` &chtougodno=`[[+MIGX_id]]` ]]
3. И код сниппета migxIDtoPagetitle: modx.pro/help/6945#comment-136437
1. в Collums нужно создать отдельное поле для рендера.
2. В нем активируем this.renderChunk и в renderChunk template вызываем созданный сниппет
Типо такой:
[[migxIDtoPagetitle?data=`[[+players]]` &chtougodno=`[[+MIGX_id]]` ]]
3. И код сниппета migxIDtoPagetitle: modx.pro/help/6945#comment-136437
Если установлен pdoToolse, то достаточно вписать в renderChunk:
[[#[[+idmy]].pagetitle]]
где [[+idmy]] — название поля в migx где id ресурса.
Это сработает, если ID один, а если список то нет
Спасибо, то что нужно, не мог сразу понять почему не определяет id ресурса.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.