Вывод перечня заказанных товаров в таблицу с заказами minishop2 (панель менеджера)
Доброго всем времени суток!
Требуется вывести перечень товаров, которые содержаться в заказе.
На сколько я понимаю, за все это мероприятие отвечает вот этот вот товарищ: core/components/minishop2/processors/mgr/orders/getlist.class.php
и на сколько я понял, за запрос к базе отвечают следующие части:
И вот что-то я все ни как не соображу как сделать… На сколько я понимаю, объект или класс msOrderAddress не описан в данном процессоре… или поправьте меня?
Буду признателен за подсказки, в какую сторону копать!
UPD 25.05.25
С задачей справился.
понадобилось всего пару строчек кода.
Всем, кто откликнулся огромное спасибо! Особенно Артуру Шевченко, который мужественно терпел мои тупые вопросы =))
Требуется вывести перечень товаров, которые содержаться в заказе.
На сколько я понимаю, за все это мероприятие отвечает вот этот вот товарищ: core/components/minishop2/processors/mgr/orders/getlist.class.php
и на сколько я понял, за запрос к базе отвечают следующие части:
$c->leftJoin('modUser', 'User');
$c->leftJoin('modUserProfile', 'UserProfile');
$c->leftJoin('msOrderStatus', 'Status');
$c->leftJoin('msDelivery', 'Delivery');
$c->leftJoin('msPayment', 'Payment');
$c->leftJoin('msOrderAddress', 'Address');и$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,
Status.name as status, Status.color, Delivery.name as delivery, Payment.name as payment'
);на мои попытки в первую часть кода добавить$c->leftJoin('msOrderProduct', 'Product');и во вторую частьProduct.name,минишоп выдает пустую таблицу…И вот что-то я все ни как не соображу как сделать… На сколько я понимаю, объект или класс msOrderAddress не описан в данном процессоре… или поправьте меня?
Буду признателен за подсказки, в какую сторону копать!
UPD 25.05.25
С задачей справился.
понадобилось всего пару строчек кода.
$c->select(array(
"product_name"=>"GROUP_CONCAT(Products.name, ' - ', Products.count, 'шт ')",
));
$c->groupby('Products.order_id');Однако, на эти строчки из-за своей тотальной не осведомлённости в xPDO, да и в целом, не осведомлённости в программировании, я потратил около недели.Всем, кто откликнулся огромное спасибо! Особенно Артуру Шевченко, который мужественно терпел мои тупые вопросы =))
Комментарии: 29
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Если минишоп выдает пустую таблицу, то — возможно — в логах админки есть что-нибудь?
(ERROR @ /home/c/cz42644/test-iflower/public_html/core/xpdo/xpdo.class.php: 644) Could not load class: ms2_order_products from mysql.ms2_order_products.
(ERROR @ /home/c/cz42644/test-iflower/public_html/core/xpdo/xpdo.class.php: 644) Could not load class: msorderProducts from mysql.msorderproducts.
[2025-04-13 15:04:21] (ERROR @ /home/c/cz42644/test-iflower/public_html/core/xpdo/xpdo.class.php: 1827) No foreign key definition for parentClass: msOrder using relation alias: Product
Каждая ошибка повторяется по нескольку раз, но это я так понимаю, идет несколько обращений к бд и каждое порождает одну и тужу ошибку.
Что за список товаров? Если в админке — он и так выводится в списке заказов, когда модалку открываешь. Если в публичной части сайта, к примеру, в ЛК, то зачем тащить процессор? Не проще ли составить нужный запрос в сниппете и в зависимости от id заказа цеплять товары? Ну, плюс ещё проверять принадлежность заказа к юзеру.
Речь идет именно о панели менеджера и возможности управления заказами.
В модалке без условно выводится и с этим нет сложностей, вопрос в том, что в данном контексте требуется перечень товаров выводить в общую таблицу.
Ну т.е. на равне с комментарием к заказу, датой заказа и прочими данными, требуется вывести перечень заказов.
Второй момент ты хочешь присоединить к одной строке много строк, для этого нужно завернуть много строк в json. Примерно так
Если MySQL повыше можно использовать спец функции для создания json
Как я это себе вижу=) А ты меня поправь.
Те данные, что присутствуют в таблице с заказами, берутся из таблицы _ms2_orders, у меня уже получилось расширить эту таблицу данными из таблицы _ms2_order_addresses, это выглядело сложно, но я справился (скажу даже, что я не менял исходники, а сделал красиво, именно расширив своими файлами), т.к. нужный запрос уже присутствовал в процессоре (фильтрация заказов частично делается и по этой таблице). Я так понимаю, что за это отвечает эта часть кода $c->leftJoin('msOrderAddress', 'Address'); Т.е. дальше, я просто немного изменил SQL-запрос добавив выборку нужных полей.
Сейчас, мне нужно в запрос подключить еще одну таблицу, а именно _ms2_order_products, причем еще нужно сделать сортировку по id заказа, т.к. товаров в одном заказе может быть много.
Не получится ли сделать подобным образом?
или нужно идти по пути, который ты предложил?
Что такое msOrderAddress в данном случае $c->leftJoin('msOrderAddress', 'Address');? А самое главное откуда оно берется, это же не таблица в БД, а объект, класс или что-то еще? Где можно найти рождение msOrderAddress этого? Выше написанная строчка кода делает алиас в запросе, и при дальнейшем обращении я уже могу обращаться к таблице _ms2_order_addresses как Address.
Если упрощать, то когда ты делаешь leftJoin одна таблица ставится рядом с другой так, чтобы совпали поля, которые ты указываешь в условии ON (или передаешь третьим параметром в метод leftJoin). Таким образом получается новая таблица, но с бОльшим количеством столбцов, при этом количество строк будет таким же как и в первой таблице. Например, если у тебя в первой таблице одна запись, а во второй две, в итоговой таблице будет одна запись. Именно поэтому ты не можешь просто взять и присоединить все товары, тебе нужно сгруппировать их по id заказа, упаковать их в одну строку и только потом присоединять. вот так можно получить товары для заказа с id = 594
Так, то не мой код, то код разработчика minishop2. Это штатный процессор getlist.class.php.
И выдержки кода, я привел именно из него =)
Вот ссылка на полный код github.com/modx-pro/miniShop2/blob/master/core/components/minishop2/processors/mgr/orders/getlist.class.php
Что же касается изначального вопроса.
Ранее, в качестве практики, я уже формировал подобную таблицу, но не со стороны панели управления сайта, а на фронтенд (я правильно употребляю термин? Т.е. на самом сайте, в открытом доступе).
Делал эту таблицу на основе готового снипета, который нашел на просторах интернета.
Там код существенно проще, для моего восприятия.
Там есть sql-запрос, понятный мне, и есть цикл, который выводит данные.
По сути вот запрос, с которым, я достаточно долго сидел, прежде чем оно заработало. Однако это, как раз тот запрос, который решает, ту проблему, о который ты пишешь (когда товаров много).
а дальше уже обрабатываю полученную таблицу и вывожу
По сути, ты пишешь тоже самое, но только именно под бекенд (верно термин использую?), т.е. для панели администратора?
А самое главное, у меня есть четкое убеждение того, что мне как-то нужно придерживаться стилистики кода, которым написан процессор. Или нет? Просто нужно же не просто в базу запрос сформировать, а еще нужно этот запрос потом обработать =)
На сколько я тебя понял, то как раз, в том запросе, который я писал самостоятельно, именно это реализовано с помощью разделителя, по сути, меня такой вариант устроит более чем.
Верно же?
Вопрос только в том, что я не могу понять код процессора.
Как я уже писал выше, мне нужно понять что такое msOrderAddress, и как можно создать аналогичный, по всей видимости запрос:
ведь по логике вещей leftJoin это как раз таки присоединение таблицы, но вот какой? у минишопа нет такой таблицы msOrderAddress…
Если не трудно, помоги разобраться.
Что же касается исходников, я уже писал выше, что все изменения, которые я вношу в код у меня реализованы посредством подгрузки моих кастомных файлов.
Т.е. я смог сделать так, что бы модикс выводя таблицу с заказами минишопа, подгружал процессор не getlist.class.php, а мой собственный custom_getlist.class.php, то же самое и с файлами JS скриптов, которые мне требуется исправить. Другими словами, обновление мне нипочем.
А теперь я погружаюсь в ExtJs? =)))
Тут явно не требуется плагин… вернее, не так, у меня уже создан плагин, который грузит нужный мне процессор вместо штатного. Теперь мне лишь нужно «допилить» его до нужного мне состояния.
Вот тут я описываю как подгружал свой процессор.
Но ведь где-то описан класс msOrderAddress, думаю, что если у меня будет этот класс, на основе него, я смогу создать свой, который мне нужен =))
Бегло посмотрел, кажись это именно то, что мне нужно было…
По крайней мере, уже нашел, как подключить нужную мне таблицу.
Собственно, я с самого начала был на верном пути… но…
я писал
а нужно было
Т.е. одна буква и все=)))
Вопрос в том, что мне даже в голову не приходило, что алиас, а именно Products, тоже где-то описан… я думал, это уже на мое усмотрение, ан нет, в схеме описано =)))
а если быть точнее, то в штатном процессоре есть вот такой вот запрос
и если я дописываю, к примеру Product.name as name_product, а в системных настройках минишопа задаю дополнительное поле для таблицы заказов name_product, то все работает.
Но, естественно, выводится только 1 товар, а не все. И, увы, финт ушами, который я проворачивал со стороны фронденда, уже не выходит.
я так понимаю, что select это какой-то метод в процессоре, и в итоге выходит ошибка…
как мне это:
засунуть в это: