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

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

Был в сети 56 минут назад
Заказы принимаю
Отправить деньги
я думал, это уже на мое усмотрение, ан нет
Как говориться: учи матчасть))) Ты можешь сам задать алиас, но в этом случае тебе так же самостоятельно нужно задать условия для соединения таблиц
$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);
смогу найти как создан класс
Не очень понимаю, что ты хочешь найти, но могу с уверенностью заявить класс создан руками человека))) А в схеме можно посмотреть соответствие таблиц и классов, чтобы можно было писать запросы через XPDO.
leftJoin это как раз таки присоединение таблицы, но вот какой? у минишопа нет такой таблицы msOrderAddress…
Конечно нет, msOrderAddress это название класса. Работать напрямую с БД не очень удобно, поэтому Modx использует XPDO для формирования запросов в БД, а чтобы это было возможно нужно описать какие поля есть в таблице, какой тип данных в них надо записывать и т.д. Для описания используют классы модели, и каждому классу соответствует xml схема. Посмотреть xml схему можно в папке компонента core/components/minishop2/model/schema
А я думал, я уже погружаюсь
Не, ты не погружаешься в ExtJs, кажется ты его ещё не видел))) Это js фреймворк на котором работает админка modx, т.е. тебе мало получить данные из БД, тебе нужно прокинуть эти данные в js, который отрисовывает админку. Есть вероятность, что прокинуть данные можно плагином, а вот модифицировать процессор через плагин вряд ли возможно. Если же ты будешь править исходники, то автоматически останешься без обновлений компонента, даже случайная переустановка снесёт все изменения. В общем, я бы так не делал. К тому же, за 6 лет работы с Modx, я сам в ExtJs не погружался, слава богу Modx позволяет делать страницы в админке со своими скриптами, для простой логики можно сделать страницы с помощью migx.
Если ты не готов погружаться в в недра ExtJs будет сложно. К тому же вывести в списке заказов список товаров для каждого заказа можно только в виде строки с разделителем или в виде json. Я бы сделал свой интерфейс вместо стандартного если нужна сложная кастомная логика.
Если речь про админку, то мне вообще непонятно, что ты пытаешься сделать и зачем? В админке есть интерфейс работы с заказами и в этом интерфейсе можно посмотреть перечень товаров в конкретном заказе.
Я не видел весь твой код, но думаю что $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);
}
По сути, добавлять атрибуты в вёрстку — это то же самое, что вручную расставлять плейсхолдеры.
Не совсем. При натягивании совы на глобус верстки нужно расставить плейсхолдеры и записать значение плейсхолдера в админке. А перед этим нужно создать поля для этих значений. А тут ты расставил атрибуты, запустил скрипт и плейсхолдеры расставились, поля создались, значения записались. Другое дело, что migx не лучший способ хранения данных, поэтому твой подход безусловно круче.

Как работает мультиязычность? Допустим я перевел блок на три языка, как на фронте переключить язык?
Скажи пожалуйста, есть вариант получить ключ бесплатно для локальных экспериментов? По описанию очень крутая штука, если удастся реализовать автоматическое заполнение контентом напрямую из вёрстки, выкину нафиг свой MigxPageConfigurator)))
Требуется вывести перечень товаров, которые содержаться в заказе.
В админке он и так выводится, а чтобы с фронта запустить процессор нужно дать права пользователю.

Второй момент ты хочешь присоединить к одной строке много строк, для этого нужно завернуть много строк в json. Примерно так
$q = $this->modx->newQuery('modResource');
$q->leftJoin('msCategoryMember', 'Member', 'Product.id=Member.product_id');
$q->leftJoin(
            'modResource',
            'Category',
            'Member.category_id=Category.id AND Category.class_key="msCategory" AND Category.id != Product.parent AND Category.published = 1'
        );
        $q->select(':categoriesSelect AS categories');
        $this->replacements[':categoriesSelect'] = <<<EOD
        CONCAT(
                '[', GROUP_CONCAT(
                    DISTINCT CONCAT(
                        '{"alias":"', Category.alias, '", "rid":"', Category.id, '", "menuindex":"', Category.menuindex, '", "template":"', Category.template, '"}'
                    )
                    SEPARATOR ','
                ), ']'
            )
EOD;
Если MySQL повыше можно использовать спец функции для создания json