Alexey

Alexey

С нами с 02 августа 2015; Место в рейтинге пользователей: #201
Alexey
03 ноября 2022, 14:19
0
Чтобы совсем было красиво, добавил в сниппет сортировку после $q->where(['id:IN' => $arr]);:

$q->sortby('FIELD(modResource.id, ' . implode(',', $arr) . ' )');
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 как-то динамически найти. У меня получилось только доп запросом к БД по нужным параметрам выборки, других вариантов не увидел. Ну, или если заведомо количество категорий ограничено, то — возможно — проще захардкодить так
Alexey
03 ноября 2022, 12:14
0
Круто, спасибо!!!

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

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

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

skrinshoter.ru/s/031122/tOi0sLSb

Судя по логам, обращение к сниппету рендера происходит только один раз, несмотря на то, что строк две… и да, вызов некешированного сниппета не прокатывает
Alexey
03 ноября 2022, 11:37
0
Это значит что наличие их мы сможем проверить через:
Не получается отловить плейсхолдеры в сниппете, в логах пустота:

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

Я же правильно пишу: cat.0? Возможно, какой-то префикс ещё должен быть?
Alexey
03 ноября 2022, 11:09
0
А как всем не известно массивы у нас в парсере преобразуются в НОВЫЕ плейсхолдеры с ключем который приходит из этих массивов
Спасибо — не знал! Но, получается, каким-то образом мне нужно все эти плейсхолдеры с индексами передать в сниппет? При условии, что я не знаю сколько элементов в массиве может быть…

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

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

В карму — завсегда c удовольствием))
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;
Alexey
03 ноября 2022, 01:11
0
В итоге: если выбрано несколько категорий в селекте, то рендер не получается выполнить, как писали выше — modx.pro/help/6945#comment-49022. У кого-нибудь получилось разгадать?

Почему не передается в сниппет-рендерер значение поля [[+cat]] (к примеру), если в селекте выбрано несколько категорий и [[+cat]] прекрасно передается, если выбрана одна категория?
Alexey
20 октября 2022, 18:09
0
Если костылить, то можно попробовать в самом сниппете подключить pdoTools

$pdoTools = $modx->getService('pdoTools');
и переписать вызовы чанков все с
$modx->getChunk(
на
$pdoTools->getChunk(

Но лучше вначале скопировать сниппет, подключить в свой вызов скопированный и уже с ним экспериментировать
Alexey
20 октября 2022, 17:59
0
Может, потому что в самом сниппете fenom не подключается?

skrinshoter.ru/s/201022/BHz7cPvL
Alexey
28 сентября 2022, 21:21
0
Никогда не задавался этим вопросом, просто знал, что на длину вводимого числа это атрибут не влияет. Увидел топик, стало интересно, порыл немного, вот в статье хорошо этот момент разжеван. Но пока так и не понял, как эта информация может помочь в дальнейшем)) Возможно, при извлечение данных нужного формата?
Alexey
13 сентября 2022, 08:15
0
В mSync после проведения импорта возвращается массив id товаров — обновлённых и созданных. И можно через плагин отловить эти товары и опубликовать одним запросом. А здесь нужно смотреть, но подозреваю, что нет такой фичи.
Alexey
12 сентября 2022, 11:48
0
C mSklad не работал, не могу подсказать. Но если проводить аналогию с mSync, то да: mskladOnProductImport — это должно быть событие на обработку одного товара(а mskladOnProductOffers — обработка товарного предложения). В общем, не годится. Если других событий нет и нет соответствующих настроек, то, полагаю, нужно лезть в класс компонента и дописывать свой код.
Alexey
09 сентября 2022, 16:09
1
0
mSync Не снимает товары с публикации перед выгрузкой. Нужно написать плагин на событие mSyncOnBeforeImport, который это делает. Как-то так:

<?php
if ($modx->event->name == 'mSyncOnBeforeImport' && $mode == 'catalog') {
    $query = $modx->newQuery('modResource');
    $query->command('update');
    $query->where(array('class_key' => 'msProduct', 'published' => 1));
    $query->set(array(
        'published' => 0
    ));
    $query->prepare();
    $query->stmt->execute();
}
Alexey
07 сентября 2022, 07:55
+1
Ещё можно проверить upload_max_filesize у php. И в системных настройках MODX upload_maxsize.
Alexey
01 сентября 2022, 16:47
0
Мне кажется, в этом случае, проще было бы дать чекбоксам разные имена и добавить кастомный валидатор, который при сабмите проверял бы, заполнен ли хоть один чекбокс. И если нет, то выводил бы предупреждение
Alexey
01 сентября 2022, 16:21
0
Я не совсем понимаю логику — почему у разных чекбоксов один атрибут name? Да ещё массив… не говоря уже про одинаковые id. Если нужно выбрать в форме какой-то один вариант из двух, то здесь радиобаттоны нужны, не?

Конструкции типа [[!+fi.error.chetest]] используются для formit без ajaxForm.

Вот рабочий вариант для одного чекбокса:

<input type="hidden" name="q_agree" value="">
<div class="form-b__field form-b__field_full">
    <input type="checkbox" name="q_agree" class="checkbox" id="politic" value="1" checked="">
    <label for="politic"><a href="politika-konfidenczialnosti">Политика конфиденциальности</a></label> 
    <span class="error_q_agree"></span>   
</div>

скрытый инпут нужен для проверки на пустоту, иначе required-валидация пропустит. А спан с классом error_q_agree как раз и отвечает за вывод ошибок (класс строится из строки 'erorr_' + имя поля)
Alexey
01 сентября 2022, 09:46
0
Не скажу за радиокнопки, но чекбокс у меня корректно отрабатывает — сообщение об ошибке скрывается, если его прочекать. Без всяких доработок js

skrinshoter.ru/s/010922/JHg0TdiX?a
skrinshoter.ru/s/010922/AwHFH32a?a

Покажите чанк формы.
Alexey
06 августа 2022, 14:29
0
В этой заметке Василий описывает особенность родного парсера MODX «изнутри-наружу». Используйте феном — там парсер работает наоборот — и не будет таких ошибок
Alexey
01 августа 2022, 11:32
0
mFilter2 тут не при чем! Речь идет про msProducts
Alexey
29 июля 2022, 13:46
0
skrinshoter.ru/s/260522/VQZzCu16

В сниппете msProducts можно закомментить эту строку. Но это костыль до первого обновлёния.

Или обновить — modx.pro/components/22950#comment-134211