Aleksandr Huz

Aleksandr Huz

С нами с 02 августа 2014; Место в рейтинге пользователей: #21
Aleksandr Huz
16 июня 2020, 21:29
0
В базе сохраняется такой формат как строка.

Перед сохранением нужно преобразовать массив в список.
create.class.php
update.class.php

public function beforeSet()
{
    $this->setProperty('products', implode(',', $this->getProperty('products')));
    return !$this->hasErrors();
}
А для вывода, я выше написал.
Aleksandr Huz
16 июня 2020, 21:23
0
Теперь вопрос)) Уверен, что это массив?
Aleksandr Huz
16 июня 2020, 21:18
0
В базе они сохраняются в виде списка через запятую, верно?
Соответственно, нам нужно преобразовать список в массив обратно на выходе. Это делается в процессоре modObjectGetProcessor (get.class.php)

public function cleanup()
    {
        $array = $this->object->toArray();
        if(!empty($array['products'])) {
            $array['products'] = explode(',', $array['products']);
        }
        return $this->success('', $array);
    }
}
Aleksandr Huz
16 июня 2020, 14:03
+1
С помощью MIGX можно создать компонент.
modx.pro/howto/18144
modx.pro/howto/18469
Aleksandr Huz
16 июня 2020, 09:21
1
+1
Теперь понятно. Значит нам в массив нужно добавить поле с заголовками товаров.

Примерно, так:
public function prepareRow(xPDOObject $object)
{
        $array = $object->toArray();
        
        $q = $this->modx->newQuery('modResource');
        if(!is_array($array['products'])) {
            $array['products'] = explode(',', $array['products']);
        }
        $q->where(array('id:IN' => $array['products']));
        $q->select(array('pagetitle'));
        if($q->prepare() && $q->stmt->execute()) {
            $resources = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
            $array['productsTitle'] = array_map(function($res){
                return $res['pagetitle'];
            },$resources);
            $array['productsTitle'] = implode(',', $array['productsTitle']);
        }
        

        $array['actions'] = [];

      ....
}
Теперь в место products подставляем productsTitle

Удаляем ненужный код:
функцию — outputArray
и вот эти строчки тоже ни к чему
$item = $this->modx->getObject('modExtraItem', 'modExtraItem.id');
$products = $item->get('products');
Aleksandr Huz
15 июня 2020, 23:14
0
Должно быть доступно 2 поля, которые мы выбрали: id и pagetitle. Если для комбо, то оставляем как есть.
Aleksandr Huz
15 июня 2020, 22:42
0
Вопрос в том, зачем получать id, если оно уже получено? ($product)

Я не совсем понял задачи, например, зачем выводить заголовки через запятую, может для вывода в селект.

Можно так:
1. Создаем переменную
protected $productsList = [];

2. Получаем список id товаров и заголовки
public function prepareQueryBeforeCount(xPDOQuery $c)
{
    $item = $this->modx->getObject('modExtraItem', 'modExtraItem.id');
    $products= $item->get('products');

    $q = $this->modx->newQuery('modResource');
    $q->where(array('id:IN' => $products));
    $q->select(array('id','pagetitle'));
    if($q->prepare() && $q->stmt->execute()) {
        $this->productsList = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    return $c;
}

3. Выводим нужный массив
public function outputArray(array $array, $count = false)
{
    return parent::outputArray($this->productsList, $count);
}

P.S. Код, не проверял, в комментах набросал, возможно есть ошибки.
Aleksandr Huz
09 июня 2020, 22:49
0
Ну, почему не получится?)
Можно же так:
if($event = $modx->getObject('modPluginEvent', ['pluginid' => 2, 'event' => 'OnDocFormSave'])) {
    $event->remove();
}
Aleksandr Huz
08 июня 2020, 08:39
+1
Нужно читать внимательнее. 1-ое августа еще не наступило.
Aleksandr Huz
05 июня 2020, 22:05
0
Привет, Антон!
Значит вызываешь до загрузки основного скрипта. Добавь на событие ready или load
Aleksandr Huz
01 июня 2020, 10:06
+1
К слову, getElementById('formtest') уже практически не используется в новом коде, поэтому рекомендую заменять его на querySelector('#formtest').
А почему не используется? getElementById быстрее находит элемент, чем querySelector
Aleksandr Huz
27 мая 2020, 14:17
0
Добрый день, Александр!
Напишите мне в тех поддержку или скиньте сайт
Aleksandr Huz
24 мая 2020, 17:22
+1
Обновил компонент. Теперь, если по каким-то причинам SweetAlert2 не загрузится, то будет работать стандартные уведомления. Ошибок не будет
Aleksandr Huz
24 мая 2020, 00:15
0
Одна из причин что цены на услуги хранятся в TV
Попробуйте заменить вот эту срочку в коде
$data[$k] = $this->modx->resource->getTVValue($k);
на эту
$this->resource[$k] = $v[1];