Всего 125 004 комментария

Павел Романов
21 апреля 2025, 12:44
0
Здравствуйте.
Первой должна идти колонка «Категории»
Дмитрий
21 апреля 2025, 10:52
0
$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'
        );
Дмитрий
20 апреля 2025, 22:05
0
так, то да, только для мня то тут написана абракадабра =)
Артур Шевченко
20 апреля 2025, 20:59
0
Ага. Собственно в одном из первых ответов я точно так же сделал.
Дмитрий
20 апреля 2025, 20:56
0
$q->leftJoin('msOrderProduct', 'Product', 'msOrder.id=Product.order_id 
AND Product.product_id = 190');
о как, т.е. ты для существующего класса msOrderProduct, делаешь алисас Product, и описываешь условия джойна?
Артур Шевченко
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, 20:39
0
Эх! Сразу бы, ты меня послал бы на эти схемы=)))
Бегло посмотрел, кажись это именно то, что мне нужно было…
По крайней мере, уже нашел, как подключить нужную мне таблицу.
Собственно, я с самого начала был на верном пути… но…
я писал
$c->leftJoin('msOrderProduct', 'Product');
а нужно было
$c->leftJoin('msOrderProduct', 'Products');
Т.е. одна буква и все=)))
Вопрос в том, что мне даже в голову не приходило, что алиас, а именно Products, тоже где-то описан… я думал, это уже на мое усмотрение, ан нет, в схеме описано =)))
Дмитрий
20 апреля 2025, 20:08
0
я сам не очень понимаю, что мне нужно найти=)))
Но ведь где-то описан класс msOrderAddress, думаю, что если у меня будет этот класс, на основе него, я смогу создать свой, который мне нужен =))
Артур Шевченко
20 апреля 2025, 16:54
0
смогу найти как создан класс
Не очень понимаю, что ты хочешь найти, но могу с уверенностью заявить класс создан руками человека))) А в схеме можно посмотреть соответствие таблиц и классов, чтобы можно было писать запросы через XPDO.
Артур Шевченко
20 апреля 2025, 16:52
0
Наверное такой поход имеет место быть, правда я бы с удовольствием узнал подробности, как это работает.
Дмитрий
20 апреля 2025, 15:24
0
о! А вот это уже ближе к теме! Т.е. там я смогу найти как создан класс msOrderAddress? я правильно тебя понял?
Дмитрий
20 апреля 2025, 15:23
0
=))) ну значит не погружаюсь.
Что же касается исходников, я уже писал выше, что все изменения, которые я вношу в код у меня реализованы посредством подгрузки моих кастомных файлов.
Т.е. я смог сделать так, что бы модикс выводя таблицу с заказами минишопа, подгружал процессор не getlist.class.php, а мой собственный custom_getlist.class.php, то же самое и с файлами JS скриптов, которые мне требуется исправить. Другими словами, обновление мне нипочем.
А теперь я погружаюсь в ExtJs? =)))

Тут явно не требуется плагин… вернее, не так, у меня уже создан плагин, который грузит нужный мне процессор вместо штатного. Теперь мне лишь нужно «допилить» его до нужного мне состояния.
Артур Шевченко
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, 14:23
0
А я думал, я уже погружаюсь… медленно правда, но тем не менее.
На сколько я тебя понял, то как раз, в том запросе, который я писал самостоятельно, именно это реализовано с помощью разделителя, по сути, меня такой вариант устроит более чем.
(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…

Если не трудно, помоги разобраться.
Артур Шевченко
20 апреля 2025, 11:07
0
Если ты не готов погружаться в в недра ExtJs будет сложно. К тому же вывести в списке заказов список товаров для каждого заказа можно только в виде строки с разделителем или в виде json. Я бы сделал свой интерфейс вместо стандартного если нужна сложная кастомная логика.
Дмитрий
20 апреля 2025, 10:31
0
Очень любопытный вопрос! Кастомизирую, так, что бы было удобно работать с таблицей, и нужная информация, для обработки заказа выводилась в таблицу, а не нужная, как раз таки пускай будет в модальном окне.
Артур Шевченко
19 апреля 2025, 11:56
0
Если речь про админку, то мне вообще непонятно, что ты пытаешься сделать и зачем? В админке есть интерфейс работы с заказами и в этом интерфейсе можно посмотреть перечень товаров в конкретном заказе.
Дмитрий
19 апреля 2025, 11:51
0
Спасибо за ответ!
Так, то не мой код, то код разработчика minishop2. Это штатный процессор getlist.class.php.
И выдержки кода, я привел именно из него =)
Вот ссылка на полный код github.com/modx-pro/miniShop2/blob/master/core/components/minishop2/processors/mgr/orders/getlist.class.php

Что же касается изначального вопроса.

Ранее, в качестве практики, я уже формировал подобную таблицу, но не со стороны панели управления сайта, а на фронтенд (я правильно употребляю термин? Т.е. на самом сайте, в открытом доступе).
Делал эту таблицу на основе готового снипета, который нашел на просторах интернета.
Там код существенно проще, для моего восприятия.
Там есть sql-запрос, понятный мне, и есть цикл, который выводит данные.

По сути вот запрос, с которым, я достаточно долго сидел, прежде чем оно заработало. Однако это, как раз тот запрос, который решает, ту проблему, о который ты пишешь (когда товаров много).
$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
а дальше уже обрабатываю полученную таблицу и вывожу
$result = $modx->query($sQuery);
$res = $result->fetchAll(PDO::FETCH_ASSOC);

foreach($res as $v){
echo "$v[id]";
}
По сути, ты пишешь тоже самое, но только именно под бекенд (верно термин использую?), т.е. для панели администратора?

А самое главное, у меня есть четкое убеждение того, что мне как-то нужно придерживаться стилистики кода, которым написан процессор. Или нет? Просто нужно же не просто в базу запрос сформировать, а еще нужно этот запрос потом обработать =)
Pavel
18 апреля 2025, 21:11
0
Здравствуйте
Есть желание использовать компонент polylang для автоматизации перевода с наименьшими усилиями, но есть пару вопросов, которые хотелось уточнить.
Планирую использовать google translator для перевода сайта.
1. Мне не нужно будет создавать копию для каждой страницы чтобы она имела перевод на выбранный язык? Просто сайт имеет порядка 2000 страниц и даже перещелкать каждую страницу для перевода на несколько языков это не реально.
2. На сколько я понимаю сейчас не нужно переводить каждое поле Локализации для каждого языка, они все будут переводиться автоматически. Правильно я понимаю? На видео видел что нужно создать поля для каждого языка в Лексиконе с переводом, по этому и возник вопрос.
3. Можно ли исключить некоторые страницы из перевода и показывать их такими как они есть?
4. Для организации документов в бекенде используется компонент Collection, не будет ли с ним проблем?

Сайт использует MODx 2.8.4
Заранее спасибо.