Экспорт заказов из MiniShop2 в таблицу Excel формат CSV.

Привет всем интересующимся в раздел «Для разработчиков» писать не могу рейтинг низкий, поэтому сюда. Не нашел готового простого решения, есть заметки «Кастомный экспорт заказов MiniShop2», но там нужно создавай два сниппета, три чанка, один ресурс, зачем так много если можно обойтись одним сниппетом и одним ресурсом, лень двигатель прогресса + не люблю много снипетов, чанков, шаблонов и бла бла бла. Да есть платные решения, но это для новичков больше и зачем платить больше если можно сделать самому. История как обычно нафиг не нужно пока клиент не попросил выгружать статистику по заказам в таблицу Эксель, чтобы ему было удобно ее фильтровать и вообще работать с данными так удобнее и привычнее. Сразу скажу часть информацию взял в инете у других авторов, так что если кто-то узнал свой код не обижайтесь, мне нужно было решение я его сделал теперь делюсь своими наработками так сказать.

Создаем сниппет например getOrders
<?php
// Сниппет getOrders - выгрузка заказов miniShop2 в CSV

// Устанавливаем заголовки для скачивания CSV файла
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="orders_export_' . date('Y-m-d_H-i') . '.csv"');

// Создаем итератор для заказов (экономнее памяти, чем getCollection)
$c = $modx->newQuery('msOrder');
$c->sortby('createdon', 'DESC'); // Сортировка по дате создания
$iterator = $modx->getIterator('msOrder', $c);

// Открываем поток вывода
$output = fopen('php://output', 'w');
// Добавляем BOM для корректного отображения кириллицы в Excel
fwrite($output, "\xEF\xBB\xBF");

// Заголовки столбцов CSV
fputcsv($output, [
    'ID заказа',
    'Номер заказа', 
    'Статус',
    'Стоимость',
    'Способ доставки',
    'Дата создания',
    'Покупатель',
    'Телефон',
    //'Email',
    'Город',
    'Адрес доставки',
    //'Комментарий'
], ';');

// Получаем все статусы заказов для преобразования ID в названия
$statuses = [];
$statusQuery = $modx->newQuery('msOrderStatus');
$statusCollection = $modx->getCollection('msOrderStatus', $statusQuery);
foreach ($statusCollection as $status) {
    $statusData = $status->toArray();
    $statuses[$statusData['id']] = $statusData['name'];
}

// Получаем все способы доставки для преобразования ID в названия
$deliveries = [];
$deliveryQuery = $modx->newQuery('msDelivery');
$deliveryCollection = $modx->getCollection('msDelivery', $deliveryQuery);
foreach ($deliveryCollection as $delivery) {
    $deliveryData = $delivery->toArray();
    $deliveries[$deliveryData['id']] = $deliveryData['name'];
}

// Обходим каждый заказ
foreach ($iterator as $order) {
    $orderArray = $order->toArray();
    
    // Получаем адрес заказа
    $addressData = [
        'receiver' => '',
        'phone' => '',
        //'email' => '',
        'city' => '',
        'street' => '',
        'building' => '',
        'room' => '',
        //'comment' => ''
    ];
    
    // Ищем адрес по order_id (для новых версий miniShop2)
    $address = $modx->getObject('msOrderAddress', ['order_id' => $orderArray['id']]);
    if (!$address) {
        // Если не нашли по order_id, ищем по user_id (для старых версий)
        $address = $modx->getObject('msOrderAddress', ['user_id' => $orderArray['user_id']]);
    }
    
    if ($address) {
        $addressArray = $address->toArray();
        $addressData = array_merge($addressData, $addressArray);
    }
    
    // Преобразуем ID статуса в название
    $statusName = isset($statuses[$orderArray['status']]) ? $statuses[$orderArray['status']] : 'Неизвестно';
    
    // Преобразуем ID способа доставки в название
    $deliveryName = isset($deliveries[$orderArray['delivery']]) ? $deliveries[$orderArray['delivery']] : 'Неизвестно';
    
    // Формируем полный адрес
    $fullAddress = '';
    if (!empty($addressData['street'])) {
        $fullAddress = $addressData['street'];
        if (!empty($addressData['building'])) {
            $fullAddress .= ', д.' . $addressData['building'];
        }
        if (!empty($addressData['room'])) {
            $fullAddress .= ', кв.' . $addressData['room'];
        }
    }
    
    // Формируем строку с данными
    $row = [
        $orderArray['id'],
        $orderArray['num'],
        $statusName,
        $orderArray['cost'],
        $deliveryName, // Способ доставки
        $orderArray['createdon'],
        $addressData['receiver'],
        $addressData['phone'], // Телефон отдельным столбцом
        //$addressData['email'],
        $addressData['city'],
        $fullAddress,
        //$addressData['comment']
    ];
    
    fputcsv($output, $row, ';');
}

fclose($output);
@session_write_close();
exit();
Далее создаем ресурс и внутри этого ресурса просто вызываем данный сниппет
[[!getOrders]]
При открытие ресурса на фронте будет предложено скачать файл типа orders_export_2025-10-2213-34.csv дата и время подставляется автоматически. Далее можно открывать в любом редакторе CSV файлов.
З.Ы. Если кто сделает на кнопку «Cкачать» в админке minishop2 буду очень благодарен. Дорабатывайте, оптимизируйте самое главное делайте лучше чем есть. Всем спасибо за внимание.
Вячеслав
8 часов назад
modx.pro
37
0

Дайджест форума за сентябрь 2025 глазами DeepSeek

Сентябрь 2025 года на modx.pro выдался довольно насыщенным — от философских дискуссий о будущем профессии разработчика до практических релизов компонентов и инструментов для повседневной работы. Особенно выделились темы вокруг кастомизации админки, интеграции современных инструментов разработки и, конечно же, вечный вопрос про ИИ.

Digest BOT
13 октября 2025, 10:28
modx.pro
2 307
+9

Обновление PdoPage

Ранее описал как убрать зависимость от jQuery в PdoPage
Затем залез в issues и увидел там давольно интересное предложение от @Руслан Алеев и описание ошибок с которыми тоже сталкивался не раз
Самая бесячая для меня
PHP warning: Undefined variable $showLog
решение которой начинается сразу после установки

Поэтому решил немного исправить ошибки и добавить новые фишки

Скажу сразу что я не гуру кода, часть делал через нейронку

Тестил на php начиная с 7.4 до 8.4
MODX 3.1.2
ВитОс
05 октября 2025, 23:37
modx.pro
499
+7

PdoPage без jQuery

Давно делал костылями пагинацию без jQuery
недавно дошли руки поковырять PdoPage

Скажу сразу в скрипте могут быть баги
У меня с ресурсами работает отлично
ВитОс
01 октября 2025, 18:25
modx.pro
2
484
+8

MODX HTML Cache Plugin

Плагин для MODX, который сохраняет сгенерированные страницы в HTML-файлы и отдает их напрямую без парсинга MODX.
Это позволяет значительно ускорить работу сайта на фронтенде.

ЗЫ: Делался плагин в основном для статики и лендингов!!! (Если в шаблоне есть динамические данные (например, корзина, личный кабинет), лучше исключить его из кэширования.)

Файлы сохраняются в директории:
core/cache/html_pages/{template_id}/
Имя файла формируется так:
{resource_id}_{md5(uri)}.html
vectorserver
30 сентября 2025, 10:18
modx.pro
3
387
+7

Заменит ли ИИ разработчиков?



Субботним утром мне вдруг страшно захотелось поделится одной мыслью, которая скопилась у меня в голове и усердно ищет выхода. Такая филосовия момента.

Ни для кого не секрет, что процесс разработки последнее время сильно трансформируется. И причиной этого стало бурное развитие искуственного интеллекта и инструментов для кодинга — автодополнение, агенты и т.п. Программисты всё чаще сталкиваются с необходимостью осваивать эти инструменты. Причины озвучивают разные — они помогают быстрее решить задачу, они лучше знают мат.часть, так как в их распоряжении вся информация из интернета, потому что интересно, потому что эта тема сейчас на подъеме, ну и, в конце концов, чтобы банально не уволили, так как бизнес видит в ИИ возможность сократить издержки на содержание штата сотрудников.
Сергей Шлоков
27 сентября 2025, 12:02
modx.pro
1 532
+13

🚀 PageBlocks 2.8.0 — большой шаг вперёд

Вышла новая версия PageBlocks, и это не просто обновление, а большой шаг вперёд. Главная новинка — pbQuery, удобный конструктор запросов, который делает работу с базой данных быстрой и читаемой. Если раньше приходилось писать громоздкие xPDO-запросы или вручную собирать SQL, теперь всё решается лаконичной цепочкой методов.



Aleksandr Huz
23 сентября 2025, 13:57
modx.pro
1
1 276
+16