Константин Ильин

Константин Ильин

Был в сети 22 октября 2025, 18:41
Заказы принимаю
Я немного не по теме(возможно с этим и связанна текущая проблема), но когда то давно вам писали в ТП(не я), ваш компонент вроде как не работает с mysql 8, из-за поля rank.
Название rank в mysql 8 зарезервированное и выдает ошибку при запросах.
Возможно вы это исправили, но в chagelog не видел запись об этом.
Нет
Отправляете например на request.php запрос, в нем проводите проверки необходимые и возвращаете уже обработанный чанк.

<?
return $modx->getChunk('chunkname', []);

или
$resp['out'] = $modx->getChunk('chunkname', []);
echo json_encode($resp);return;

Все зависит от того какой тип обращения AJAX, но саму обработку чанка вам выше подсказали
$modx->getChunk('chunkname', array());
// Это просто доп код
$pdo = $modx->getService('pdoTools');
$resp['out'] = $pdo->parseChunk('chunk',[
                'hashp' => $_POST['hashp'],
                'data' => $arr,
            ]);
echo json_encode($resp);return;
мда…

<?php
$query = $modx->newQuery('msProduct');
$query->select(['msProduct.*']);
$query->where(['class_key' => 'msProduct']);
$query->limit(0);
$resources = $modx->getIterator('msProduct',$query);
foreach ($resources as $resource) {

        // Эти строки не трогайте
        $arr = $resource->toArray();
        $productArray['context_key'] = 'web';
        $productArray['class_key'] = 'msProduct';
        $productArray['alias'] = $arr['alias'];
        $productArray['id'] = $arr['id'];
    
        // Эти строки настраивайте как вам надо
         $productArray['options-available'] = $resource->getTVValue(30);
    
        // Это процессор обновления товара
        $response = $modx->runProcessor('resource/update', $productArray);
}
Примеры я давал, нужно для «Список с автодополнением» передавать массив, а не просто значение
<?
$productArray['tags'] =  ['большие' , 'маленькие'];
$productArray['options-cvet'] = ['белый' , 'кофе', 'серый'];
$productArray['options-napryzhenie'] = ['220' , '320'];
«У вас же заданы конкретные значения для опций, мне же надо эти самые опции вытаянуть из дополнительных полей.»

Ничего трудного же нет в этом, вот чуть просто подумать надо
$productArray['options-available'] = $resource->getTVValue(30);
Просто ведь? да?

Если у вас TV с множеством значений, то его сначала надо разобрать и преобразовать в массив, чтобы условно получилось ['белый', 'кофе', 'серый'] и потом уже присвоить нужной вам опции. Т.е. надо посмотреть что выдает $resource->getTVValue('id или название ТВ') и преобразовать в нужные данные.
Ну это уже совсем. Программированию вас никто учить не будет. Включите голову, как присваиваются переменные. Вам уже все дали, как получить из ТВ, засунуть ее в переменную, как обновлять товар и его опции, осталось чуть подумать собрать все вместе, удалить ненужное.
Совсем вы не хотите гуглить.
Есть процессоры, один минус они медленные. Если товаров очень много(примерно >1000) то это будет долго или выйдет за лимит выполнения скрипта.
.....
foreach ($resources as $resource) {
    // Эти строки не трогайте
    $arr = $resource->toArray();
    $productArray['context_key'] = 'web';
    $productArray['class_key'] = 'msProduct';
    $productArray['alias'] = $arr['alias'];
    $productArray['id'] = $arr['id'];
    
    // Эти строки настраивайте как вам надо
    $productArray['options-cvet'] = ['белый' , 'кофе', 'серый'];
    $productArray['options-available'] = 1;
    $productArray['price'] = 99999;
    $productArray['tags'] =  ['большие' , 'маленькие'];
    
    // Это процессор обновления товара
    $response = $modx->runProcessor('resource/update', $productArray);
}
ну надо сначала получить все товары, и в цикле обработать

$query = $modx->newQuery('modResource');
$query->select(['msProduct.*']);
$query->where(['class_key' => 'msProduct']);
$query->limit(0);
$resources = $modx->getIterator('modResource',$query);
foreach ($resources as $resource) {
      $tv_price = $resource->getTVValue('price');
        $resource->set('price',$tv_price);
        //$resource->save();
}