Dmitry

Dmitry

Был в сети 02 мая 2019, 10:57
Заказы не принимаю
Проблема в том, что всё это ещё нужно завязать на mFilter2. Например, отфильтровал я каталог из 1000 позиций, получил выборку в 250 позиций, и мне нужно получить ID всей выборки вне зависимости от страниц пагинации.
Попробовал добавить такой код в файл core/components/pdotools/model/pdotools/pdofetch.class.php перед началом подготовки к выводу.
$ids = array();
                foreach ($rows as $row) {
                    $ids[] = $row[$this->pk];
                }
                $this->modx->setPlaceholder('idsList',implode(',', $ids));
Плейсхолдер срабатывает, но выдаёт только одну актуальную страницу, а мне нужно получить ID всей выборки вне зависимости от количества страниц :(
Да, действительно, в документации есть такой блок:

Плейсхолдеры с точкой или тире
Во многих местах MODX используются плейсхолдеры, которые нельзя указывать в Fenom, так как они не соотвествуют правилам наименования переменных PHP. Например, плейсхолдеры с точкой (MODX обычно выставляет так данные массивов) или с тире (ТВ параметры).

Для доступа к этим плейсхолдерам нужно использовать вторую служебную переменную - {$_pls}:

<!-- Вывод сразу -->
{$_pls['tag.subtag']}

<!-- Или через переменную -->
{var $tv_name = $_pls['tv-name']}
{$tv_name}
Если плейсхолдер был выставлен в глобальный массив modX::placeholders, то его нужно получать вот так:

{var $tag_sub_tag = $_modx->getPlaceholder('tag.sub_tag')}
{$tag_sub_tag}

{$_modx->getPlaceholder('tv_name')}
При указании неправильных переменных ваш шаблон не будет скомпилирован и вы получите запись об этом в системном журнале.
Но мне не было очевидно, что это распространяется на обычные плейсхолдеры в шаблонах. Спасибо за помощь!
Заказы не передаются, добавил в плагин строчку печати в лог, получаю такую ошибку:
[2018-07-10 15:52:03] (ERROR @ /home/s14252/www/meat/cache/includes/elements/modplugin/19.include.cache.php : 93) [modRetailCRM]  Order Response RetailCrm\Response\ApiResponse Object
(
    [statusCode:protected] => 400
    [response:protected] => Array
        (
            [success] => 
            [errorMsg] => Order is not loaded
            [errors] => Array
                (
                    [customer.externalId] => Customer with externalId=2 not found. Order externalId=16.
                )

        )

)
Буду благодарен за совет, как исправить.
Спасибо, посмотрю.
Мысль ещё пришла такая: есть обычный сниппет Profile в составе пакета Login. Он может вывести JSON-массив всех полей, плейсхолдер extended. В принципе, можно создать простой сниппет, который получит этот массив, обработает его и выведет формы по шаблону.
В документации Office написано такое:
Контроллер позволяет редактировать расширенные поля профиля пользователя, типа extended.some_field. Для этого вам нужно:

Вывести их в форме
<label for="extended.some_field">Какое-то поле</label>
<input name="extended[some_field]" value="[[+extended.some_field]]" id="extended.some_field">
То есть в форме все равно придётся руками выводить поля (инпуты) с плейсхолдерами. Как вывести инпуты для редактирования всех существующих полей — вот в чем вопрос :)
Ну да, это, вроде очевидная реализация.
Вполне можно через JS создавать сколько угодно полей вида:
<input type="text" name="address_1[region]" id="region_1" value="" />
просто подменяя суффикс с порядковым номером.
Вопрос тогда становится такой: каким образом потом на этой же странице вывести список всех кастомных полей, чтобы из можно было редактировать? Ведь для этого еще необходимо поставлять плейсхолдеры вида [[!+address_1.address]] в поле value.