Aleksandr Huz

Aleksandr Huz

Был в сети 04 ноября 2025, 21:25
Заказы принимаю
Я тоже вставлю 5 копеек.
Это похоже на обиду в детском саду, когда машинку отобрали.
Какая разница на что это похоже? Любой человек вправе обижаться в любом возрасте. А если говорить про Василия, то он очень много сделал для MODX и выкинуть его из чата — это не уважение к нему. Ок, они почистили неактивных, но они же могли подумать, что важных людей ненужно удалять и вернуть их назад. Или могли рассылку сделать по эти неактивным пользователям.
Я не говорю, что Василий сделал правильно или неправильно, но его реакцию я понимаю. Они поступили не обдуманно, он поддался эмоциям. А что ему нельзя?

А еще говорим о том, что взрослые люди
А что у взрослых людей нет эмоций? Или нужно делать чтобы никто не осуждал потом?
А так получается, что в MODX появилась новая дырка, и при мне её обсуждать не хотят.
Конечно не хотят, потому что ты можешь отправить пул реквест, который они будут неделями разбирать. Оно им надо?!)))

А если серьезно, то очень жаль что руководители не понимают, что самое ценное — это люди, программисты, которые и сделали MODX более популярным. А может и понимают, но не хотят выходить из зоны комфорта и не развиваются, поэтому логично, что прогеры уходят в современный мир.
Ну, посмотрим, что будет дальше.
В базе они сохраняются в виде списка через запятую, верно?
Соответственно, нам нужно преобразовать список в массив обратно на выходе. Это делается в процессоре modObjectGetProcessor (get.class.php)

public function cleanup()
    {
        $array = $this->object->toArray();
        if(!empty($array['products'])) {
            $array['products'] = explode(',', $array['products']);
        }
        return $this->success('', $array);
    }
}
Теперь понятно. Значит нам в массив нужно добавить поле с заголовками товаров.

Примерно, так:
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');
Вопрос в том, зачем получать 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. Код, не проверял, в комментах набросал, возможно есть ошибки.