Всего 123 803 комментария

Алексей Смирнов
03 ноября 2022, 16:05
0
Ну array показывается если вы переменную не верно выводите. попробуйте так:
$title=$_POST['title'];
<pre>
print_r($title);
</pre>
vit
vit
03 ноября 2022, 15:26
0
спасибо за ответ сделал так
....
<input type="text" value="[[!+title]]" class="form-control" id="title" name="title[]" placeholder="79991112233">
...
сниппет
...
<?
$title=$_POST['title'];

$title=implode(",",$title);
..
в таком примере пр выводе $title выводяться все значения поля перез замятую, а как имеено получит массив (вида Array([0] => 1 [1] => 2))
потому что сейчас в $title=$_POST['title']; показывается просто Array?
Alexey
03 ноября 2022, 14:19
0
Чтобы совсем было красиво, добавил в сниппет сортировку после $q->where(['id:IN' => $arr]);:

$q->sortby('FIELD(modResource.id, ' . implode(',', $arr) . ' )');
Максим
03 ноября 2022, 14:16
0
Странно что у вас получились цифры под 39 сек для 11к товаров. — у вас что-то не то с БД.
Может просто проиндексировать БД надо? Там вроде в настройках mFilter что-то такое было.
Возможно, из-за этого такая цифра.
Артур Шевченко
03 ноября 2022, 14:10
0
$modifications = $modx->getObject('msopModification', array('article'=> $cellY[0] );
foreach($modifications as $modification){
// тут остальное
}
Алексей Смирнов
03 ноября 2022, 13:13
0
Лимит искать? Сомневаюсь что в поле накликают больше 50 категорий. Но если надо можно и до 100ки.
Этот лимит только для одного поля ввода. Так что должно хватить с лихвой.
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, 12:36
+1
Да, действительно сниппет кешируется. Но мы хитрее, чем MODX )))
Нам нужно передавать какой-то простой уникальный параметр с уникальным значением, чтобы вызов сниппета не брался из кеша.
Думаю, для этого подойдет MIGX_id. И тогда можно добавить к вызову:
[[alextest?data=`[[+cat]]` &chtougodno=`[[+MIGX_id]]` ]]
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, 11:54
0
появилась еще одна проблема
if( $modification = $modx->getObject('msopModification', array('article'=> $cellY[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, 11:37
0
Это значит что наличие их мы сможем проверить через:
Не получается отловить плейсхолдеры в сниппете, в логах пустота:

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

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

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

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

В карму — завсегда c удовольствием))
Алексей Смирнов
03 ноября 2022, 10:43
+1
А зачем вам TV-шка? она еще что-то делает?
Я обычно такие вещи без TV делаю.
Сразу советую перейти и переделать вызов MIGX через форму как Илья Уткин писал.
а по существу есть ММммммаааленький нюанс в парсере MODX.
Заключается он в том что при обработке поля renderchunktpl если у нас 1 значение — это строка, а если там несколько значений для типа listbox-multiple, то там в результате массив или json смотря с какой стороны смотреть.
А как всем не известно массивы у нас в парсере преобразуются в НОВЫЕ плейсхолдеры с ключем который приходит из этих массивов.
В данном случае у нас ключ это простой индекс от 0 и до бесконечности.
И чтобы получить перечень значений, нужно составить последовательность плейсов в сниппете и вернуть именно в этом формате строкой:
[[+code.0]], [[+code.1]] ...... [[+code.N]].
И тогда все будет хорошо и вы увидете отрендеренные значения.
Если не поняли — кидайте код сниппета.
Плюсики в КАРМУ. приветствуются.
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, 09:25
0
Конечно можно. Там есть события, а MIGX это json. Вот при обновлении просто обрабатываете нужное поле и в json его пишите
Алексей Смирнов
03 ноября 2022, 08:27
0
Покажите рендер чанк.
Alexey
03 ноября 2022, 01:11
0
В итоге: если выбрано несколько категорий в селекте, то рендер не получается выполнить, как писали выше — modx.pro/help/6945#comment-49022. У кого-нибудь получилось разгадать?

Почему не передается в сниппет-рендерер значение поля [[+cat]] (к примеру), если в селекте выбрано несколько категорий и [[+cat]] прекрасно передается, если выбрана одна категория?
Артур Шевченко
02 ноября 2022, 21:47
0
Вероятно да, только надо использовать конструктор запросов newQuery(). Тут почитай