Всего 123 810 комментариев

Сергей Лим
03 ноября 2022, 20:30
0
Вот так я пытался сделать, но страница тоже начинает бесконечно перезагружаться от того, что меняется url
Загрузка страницы->смена url->загрузка страницы и тд
Артур Шевченко
03 ноября 2022, 20:27
+1
Ну ок, если не получается через ссылку, можно вывести параметры в скрытый инпут, при загрузке страницы получать м помощью JS эти параметры и активировать соответствующие фильтры
Сергей Лим
03 ноября 2022, 20:17
0
Не очень понял, мне надо, чтобы не по одной ссылке открывалась страница с нужными параметрами, а в принципе. И у каждой страницы где есть фильтр, по умолчанию выбираться будут разные фильтры
Артур Шевченко
03 ноября 2022, 20:13
+1
А зачем в замороженном url? Что мешает передать параметры в шаблон через TV например и добавить к ссылке?
Сергей Лим
03 ноября 2022, 20:04
0
Я пробовал в замороженном url добавить параметры, но страница при открытии уходит в бесконечный редирект
Артур Шевченко
03 ноября 2022, 20:00
+1
Если используете mFilter2, то просто передайте нужные фильтры в get параметрах должно сработать.
Артур Шевченко
03 ноября 2022, 19:59
0
а как имеено получит массив
Получить массив где?
Алексей Смирнов
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