Артур Шевченко

Артур Шевченко

С нами с 24 мая 2019; Место в рейтинге пользователей: #4
Отправить деньги
Артур Шевченко
22 апреля 2025, 10:57
0
Вполне вероятно, что с PHP 8.3 AdminTools не работает
Артур Шевченко
22 апреля 2025, 10:29
0
Ошибки HTTP начинающиеся на 5 это ошибки сервера. Чтобы разобраться в причинах надо смотреть логи сервера. Но поскольку обычно проблем с AdminTools не наблюдается, предположу, что причина ошибки в окружении: не подходящая версия php, modx, БД.
Артур Шевченко
21 апреля 2025, 21:16
0
Если ты прописал в шаблоне [[*context_key]], то он обязан был вывестись. Тут есть два варианта: ты его не видишь из-за стилей, ты прописал не в шаблоне. Есть и третий, ты не копировал, а набирал буквы сам и опечатался.
Артур Шевченко
21 апреля 2025, 19:50
0
Настроил контексты
Как именно настроил? Указал site_url, site_start, http_host? Плагин для переключения контекстов написал?
Артур Шевченко
21 апреля 2025, 14:20
0
Я же готовый пример скинул — пользуйся. Могу лишь добавить, что $c->select() и все другие методы можно вызывать сколько угодно раз.
Артур Шевченко
20 апреля 2025, 20:59
0
Ага. Собственно в одном из первых ответов я точно так же сделал.
Артур Шевченко
20 апреля 2025, 20:50
0
я думал, это уже на мое усмотрение, ан нет
Как говориться: учи матчасть))) Ты можешь сам задать алиас, но в этом случае тебе так же самостоятельно нужно задать условия для соединения таблиц
$q = $modx->newQuery('msOrder');
$q->leftJoin('msOrderProduct', 'Product', 'msOrder.id=Product.order_id AND Product.product_id = 190');
$q->select('Product.options as options');
$q->where(['msOrder.id' => 604]);
$q->prepare();
echo $q->toSQL();
$q->stmt->execute();
$r= $q->stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($r);
Артур Шевченко
20 апреля 2025, 16:54
0
смогу найти как создан класс
Не очень понимаю, что ты хочешь найти, но могу с уверенностью заявить класс создан руками человека))) А в схеме можно посмотреть соответствие таблиц и классов, чтобы можно было писать запросы через XPDO.
Артур Шевченко
20 апреля 2025, 16:52
0
Наверное такой поход имеет место быть, правда я бы с удовольствием узнал подробности, как это работает.
Артур Шевченко
20 апреля 2025, 15:20
0
leftJoin это как раз таки присоединение таблицы, но вот какой? у минишопа нет такой таблицы msOrderAddress…
Конечно нет, msOrderAddress это название класса. Работать напрямую с БД не очень удобно, поэтому Modx использует XPDO для формирования запросов в БД, а чтобы это было возможно нужно описать какие поля есть в таблице, какой тип данных в них надо записывать и т.д. Для описания используют классы модели, и каждому классу соответствует xml схема. Посмотреть xml схему можно в папке компонента core/components/minishop2/model/schema
Артур Шевченко
20 апреля 2025, 15:11
0
А я думал, я уже погружаюсь
Не, ты не погружаешься в ExtJs, кажется ты его ещё не видел))) Это js фреймворк на котором работает админка modx, т.е. тебе мало получить данные из БД, тебе нужно прокинуть эти данные в js, который отрисовывает админку. Есть вероятность, что прокинуть данные можно плагином, а вот модифицировать процессор через плагин вряд ли возможно. Если же ты будешь править исходники, то автоматически останешься без обновлений компонента, даже случайная переустановка снесёт все изменения. В общем, я бы так не делал. К тому же, за 6 лет работы с Modx, я сам в ExtJs не погружался, слава богу Modx позволяет делать страницы в админке со своими скриптами, для простой логики можно сделать страницы с помощью migx.
Артур Шевченко
20 апреля 2025, 11:07
0
Если ты не готов погружаться в в недра ExtJs будет сложно. К тому же вывести в списке заказов список товаров для каждого заказа можно только в виде строки с разделителем или в виде json. Я бы сделал свой интерфейс вместо стандартного если нужна сложная кастомная логика.
Артур Шевченко
19 апреля 2025, 11:56
0
Если речь про админку, то мне вообще непонятно, что ты пытаешься сделать и зачем? В админке есть интерфейс работы с заказами и в этом интерфейсе можно посмотреть перечень товаров в конкретном заказе.
Артур Шевченко
17 апреля 2025, 17:49
0
Очевидно ты используешь источник файлов, поэтому в админке путь прописан от источника, хочешь полный путь, откажись от источника файлов.
Артур Шевченко
16 апреля 2025, 22:39
+2
Я не видел весь твой код, но думаю что $c это объект класса xPDOQuery, который является конструктором SQL-запросов. А $c->leftJoin(), $c->select() это всё вызовы методов конструктора запросов. После все манипуляций получается обычный SQL, который и отправляется в БД.
Если упрощать, то когда ты делаешь leftJoin одна таблица ставится рядом с другой так, чтобы совпали поля, которые ты указываешь в условии ON (или передаешь третьим параметром в метод leftJoin). Таким образом получается новая таблица, но с бОльшим количеством столбцов, при этом количество строк будет таким же как и в первой таблице. Например, если у тебя в первой таблице одна запись, а во второй две, в итоговой таблице будет одна запись. Именно поэтому ты не можешь просто взять и присоединить все товары, тебе нужно сгруппировать их по id заказа, упаковать их в одну строку и только потом присоединять. вот так можно получить товары для заказа с id = 594
<?php
$q = $this->modx->newQuery('msOrder');
$q->leftJoin('msOrderProduct', 'Product', 'msOrder.id=Product.order_id');
$select = <<<EOD
        CONCAT(
                '[', GROUP_CONCAT(
                    DISTINCT CONCAT(
                        '{"name":"', Product.name, '", "count":"', Product.count, '", "price":"', Product.price, '"}'
                    )
                    SEPARATOR ','
                ), ']'
            )
EOD;
$q->select('msOrder.id as order_id, :products AS products');
$q->where(['msOrder.id' => 594]);
$q->groupby('msOrder.id');
$q->prepare();
$sql = $q->toSQL();
$sql = str_replace(':products', $select,$sql);
$stmt = $modx->prepare($sql);
if($stmt->execute()){
    $result = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
    print_r($result);
}