Финансовая поддержка VPS, бесплатные дополнения и docs Донаты оплачивают сервер и двигают бесплатные дополнения MODX и документацию. Поддержать

Всего 126 118 комментариев

Дмитрий
Дмитрий
$q->leftJoin('msOrderProduct', 'Product', 'msOrder.id=Product.order_id AND Product.product_id = 190');
а как в этой конструкции сделать AS, как в запросе, к примеру, select name from table_name as name_product?

а если быть точнее, то в штатном процессоре есть вот такой вот запрос

$c->select(
            $this->modx->getSelectColumns('msOrder', 'msOrder', '', ['status', 'delivery', 'payment'], true) . ',
            msOrder.status as status_id, msOrder.delivery as delivery_id, msOrder.payment as payment_id,
            UserProfile.fullname as customer, User.username as customer_username,
            Address.region as region, Address.text_address as text_address, Address.city as city, Address.phone as phone,
            Status.name as status, Status.color, Delivery.name as delivery, Payment.name as payment'
        );
и если я дописываю, к примеру Product.name as name_product, а в системных настройках минишопа задаю дополнительное поле для таблицы заказов name_product, то все работает.
Но, естественно, выводится только 1 товар, а не все. И, увы, финт ушами, который я проворачивал со стороны фронденда, уже не выходит.
$sQuery="SELECT 
adr.id, adr.country, adr.region, adr.phone, adr.comment, ord.status, adr.text_address, ord.order_comment, ord.delivery, ord.num, ord.weight,
adr.receiver, ord.cost,
*********
(select GROUP_CONCAT(name, ' - ', count, 'шт ') as names from modx3_ms2_order_products where order_id = adr.id) as names
FROM modx3_ms2_order_addresses as adr
*********

LEFT JOIN 
modx3_ms2_orders as ord ON adr.id=ord.id ORDER BY adr.id DESC
";
я так понимаю, что select это какой-то метод в процессоре, и в итоге выходит ошибка…

как мне это:
(select GROUP_CONCAT(name, ' - ', count, 'шт ') as names from modx3_ms2_order_products where order_id = adr.id) as names
FROM modx3_ms2_order_addresses as adr
засунуть в это:
$c->select(
            $this->modx->getSelectColumns('msOrder', 'msOrder', '', ['status', 'delivery', 'payment'], true) . ',
            msOrder.status as status_id, msOrder.delivery as delivery_id, msOrder.payment as payment_id,
            UserProfile.fullname as customer, User.username as customer_username,
            Address.region as region, Address.text_address as text_address, Address.city as city, Address.phone as phone,
            Status.name as status, Status.color, Delivery.name as delivery, Payment.name as payment'
        );
Артур Шевченко
Артур Шевченко
я думал, это уже на мое усмотрение, ан нет
Как говориться: учи матчасть))) Ты можешь сам задать алиас, но в этом случае тебе так же самостоятельно нужно задать условия для соединения таблиц
$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);
Дмитрий
Дмитрий
Эх! Сразу бы, ты меня послал бы на эти схемы=)))
Бегло посмотрел, кажись это именно то, что мне нужно было…
По крайней мере, уже нашел, как подключить нужную мне таблицу.
Собственно, я с самого начала был на верном пути… но…
я писал
$c->leftJoin('msOrderProduct', 'Product');
а нужно было
$c->leftJoin('msOrderProduct', 'Products');
Т.е. одна буква и все=)))
Вопрос в том, что мне даже в голову не приходило, что алиас, а именно Products, тоже где-то описан… я думал, это уже на мое усмотрение, ан нет, в схеме описано =)))
Дмитрий
Дмитрий
я сам не очень понимаю, что мне нужно найти=)))
Но ведь где-то описан класс msOrderAddress, думаю, что если у меня будет этот класс, на основе него, я смогу создать свой, который мне нужен =))
Артур Шевченко
Артур Шевченко
смогу найти как создан класс
Не очень понимаю, что ты хочешь найти, но могу с уверенностью заявить класс создан руками человека))) А в схеме можно посмотреть соответствие таблиц и классов, чтобы можно было писать запросы через XPDO.
Дмитрий
Дмитрий
=))) ну значит не погружаюсь.
Что же касается исходников, я уже писал выше, что все изменения, которые я вношу в код у меня реализованы посредством подгрузки моих кастомных файлов.
Т.е. я смог сделать так, что бы модикс выводя таблицу с заказами минишопа, подгружал процессор не getlist.class.php, а мой собственный custom_getlist.class.php, то же самое и с файлами JS скриптов, которые мне требуется исправить. Другими словами, обновление мне нипочем.
А теперь я погружаюсь в ExtJs? =)))

Тут явно не требуется плагин… вернее, не так, у меня уже создан плагин, который грузит нужный мне процессор вместо штатного. Теперь мне лишь нужно «допилить» его до нужного мне состояния.
Артур Шевченко
Артур Шевченко
leftJoin это как раз таки присоединение таблицы, но вот какой? у минишопа нет такой таблицы msOrderAddress…
Конечно нет, msOrderAddress это название класса. Работать напрямую с БД не очень удобно, поэтому Modx использует XPDO для формирования запросов в БД, а чтобы это было возможно нужно описать какие поля есть в таблице, какой тип данных в них надо записывать и т.д. Для описания используют классы модели, и каждому классу соответствует xml схема. Посмотреть xml схему можно в папке компонента core/components/minishop2/model/schema
Артур Шевченко
Артур Шевченко
А я думал, я уже погружаюсь
Не, ты не погружаешься в ExtJs, кажется ты его ещё не видел))) Это js фреймворк на котором работает админка modx, т.е. тебе мало получить данные из БД, тебе нужно прокинуть эти данные в js, который отрисовывает админку. Есть вероятность, что прокинуть данные можно плагином, а вот модифицировать процессор через плагин вряд ли возможно. Если же ты будешь править исходники, то автоматически останешься без обновлений компонента, даже случайная переустановка снесёт все изменения. В общем, я бы так не делал. К тому же, за 6 лет работы с Modx, я сам в ExtJs не погружался, слава богу Modx позволяет делать страницы в админке со своими скриптами, для простой логики можно сделать страницы с помощью migx.
Дмитрий
Дмитрий
А я думал, я уже погружаюсь… медленно правда, но тем не менее.
На сколько я тебя понял, то как раз, в том запросе, который я писал самостоятельно, именно это реализовано с помощью разделителя, по сути, меня такой вариант устроит более чем.
(select GROUP_CONCAT(name, ' - ', count, 'шт ') as names
from modx3_ms2_order_products
where order_id = adr.id) as names
Верно же?
Вопрос только в том, что я не могу понять код процессора.
Как я уже писал выше, мне нужно понять что такое msOrderAddress, и как можно создать аналогичный, по всей видимости запрос:
$c->leftJoin('msOrderAddress', 'Address');
ведь по логике вещей leftJoin это как раз таки присоединение таблицы, но вот какой? у минишопа нет такой таблицы msOrderAddress…

Если не трудно, помоги разобраться.
Артур Шевченко
Артур Шевченко
Если ты не готов погружаться в в недра ExtJs будет сложно. К тому же вывести в списке заказов список товаров для каждого заказа можно только в виде строки с разделителем или в виде json. Я бы сделал свой интерфейс вместо стандартного если нужна сложная кастомная логика.