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

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

С нами с 24 мая 2019; Место в рейтинге пользователей: #4
Отправить деньги
Артур Шевченко
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);
}
Артур Шевченко
16 апреля 2025, 11:21
+1
Но с другой — это сложнее: нужно учить, какие атрибуты куда вставлять.
однозначно сложнее, поэтому так делаю только я)))
Артур Шевченко
16 апреля 2025, 09:53
+1
По сути, добавлять атрибуты в вёрстку — это то же самое, что вручную расставлять плейсхолдеры.
Не совсем. При натягивании совы на глобус верстки нужно расставить плейсхолдеры и записать значение плейсхолдера в админке. А перед этим нужно создать поля для этих значений. А тут ты расставил атрибуты, запустил скрипт и плейсхолдеры расставились, поля создались, значения записались. Другое дело, что migx не лучший способ хранения данных, поэтому твой подход безусловно круче.

Как работает мультиязычность? Допустим я перевел блок на три языка, как на фронте переключить язык?
Артур Шевченко
15 апреля 2025, 23:09
0
Скажи пожалуйста, есть вариант получить ключ бесплатно для локальных экспериментов? По описанию очень крутая штука, если удастся реализовать автоматическое заполнение контентом напрямую из вёрстки, выкину нафиг свой MigxPageConfigurator)))
Артур Шевченко
14 апреля 2025, 22:34
0
Modx тут не причём, дело в строке, вероятно там есть символы, которые ты не видишь.
Артур Шевченко
14 апреля 2025, 10:14
+1
Требуется вывести перечень товаров, которые содержаться в заказе.
В админке он и так выводится, а чтобы с фронта запустить процессор нужно дать права пользователю.

Второй момент ты хочешь присоединить к одной строке много строк, для этого нужно завернуть много строк в 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
Артур Шевченко
09 апреля 2025, 10:58
0
Наверное надо добавить проверку на наличие аналогичного объекта перед созданием.
Артур Шевченко
09 апреля 2025, 10:53
0
Посмотри в файлах выгрузки. Если там они есть, значит компонент, если нет — 1С
Артур Шевченко
03 апреля 2025, 11:45
0
Очевидно, что модификация не определена, поскольку modification = 0. Это означает, что либо некорректно заданы опции в модификации, либо с фронта передаются некорректные значения.
Артур Шевченко
02 апреля 2025, 23:08
0
если убрать галочку с checkbox то цена обрано не пересчитвается
А вы в консоли браузера смотрели уходит ли пр и этом запрос на сервер и есть ли в нём значение опции?

общая цена пересчитывается с учетом цены всех опций checkbox котоыре есть
msOptionsPrice2 вообще не рассчитывает цену, он выбирает модификацию по переданным опциям и подставляет её цену в качестве цены товара. Тут нужно смотреть какие опции содержит каждая конкретная модификация.
Артур Шевченко
24 марта 2025, 18:43
0
Насколько я помню msMCD не перерисовывает корзину, а точечно обновляет данные, вероятно для этого на html-блоках с этими данными должны быть атрибуты или классы по которым скрипт найдёт блоки и вставит данные.
Артур Шевченко
24 марта 2025, 15:43
0
А почему должны обновляться pagetitle и изображение? Обычно при изменении количества, а именно это позволяет делать стандартная корзина минишопа и, соответственно, msMCD, меняется только количество, остальную логику ты допиливаешь сам. Вариантов несколько:
1. Передавать нужные данные в опциях и потом выводить эти опции в корзине
2. Расширить класс-обработчик корзины и добавить нужные данные в него.
Артур Шевченко
24 марта 2025, 13:04
0
Наверное стоит проверить пути в модуле оплаты, особенно если мишишоп версии 4.*.*
Артур Шевченко
22 марта 2025, 21:38
0
Куда сохраняются файлы? Как поменять путь? Зачем проверять допустимое количество файлов в цикле оно же не меняется? Если имя файла будет содержать пробелы и кириллицу проблем не будет? А если загрузить файл, перезагрузить страницу и загрузить его повторно он сохраниться?
Артур Шевченко
22 марта 2025, 21:29
+1
Можно было все не переписывать, а только одну, ту где загрузка файлов))) Но ты красавчик, что решил разобраться и поделиться!