Экспорт заказов из MiniShop2 в таблицу Excel формат CSV.
Привет всем интересующимся в раздел «Для разработчиков» писать не могу рейтинг низкий, поэтому сюда. Не нашел готового простого решения, есть заметки «Кастомный экспорт заказов MiniShop2», но там нужно создавай два сниппета, три чанка, один ресурс, зачем так много если можно обойтись одним сниппетом и одним ресурсом, лень двигатель прогресса + не люблю много снипетов, чанков, шаблонов и бла бла бла. Да есть платные решения, но это для новичков больше и зачем платить больше если можно сделать самому. История как обычно нафиг не нужно пока клиент не попросил выгружать статистику по заказам в таблицу Эксель, чтобы ему было удобно ее фильтровать и вообще работать с данными так удобнее и привычнее. Сразу скажу часть информацию взял в инете у других авторов, так что если кто-то узнал свой код не обижайтесь, мне нужно было решение я его сделал теперь делюсь своими наработками так сказать.
Создаем сниппет например getOrders
Далее создаем ресурс и внутри этого ресурса просто вызываем данный сниппет
З.Ы. Если кто сделает на кнопку «Cкачать» в админке minishop2 буду очень благодарен. Дорабатывайте, оптимизируйте самое главное делайте лучше чем есть. Всем спасибо за внимание.
1
Создаем сниппет например 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 буду очень благодарен. Дорабатывайте, оптимизируйте самое главное делайте лучше чем есть. Всем спасибо за внимание.