Создаем снипеты и чанки для вывода перечня заказов пользователя и товаров в заказах для minishop2 в MODX
Возникла необходимость вывода заказов клиента и перечня товаров из этих заказов в Личном кабинете пользователя. На маркетплейсе дополнений для MODX MODSTORE.PRO есть конечно замечательное дополнение Office которое, помимо нужного мне функционала, имеет и ряд других полезных плюшек, но поскольку во-первых, дополнительные функции мне без надобности, а во-вторых, данное дополнение стоит довольно не дешево - было принято решение своими силами интегрировать нужный функционал…
Как результат, предлагаю один из вариантов решения данной задачи найденых мной на просторах интернет.
1) Начнем из создания сниппета msOrders
для вывода заказов текущего пользователя:
<?php
// снипет выводит заказы текущего пользователя
$user_id = $modx->user->get('id');
$tpl = $modx->getOption('tpl',$scriptProperties,'tpl.order');
// подхватываем заказы текущего пользователя
$q = $modx->newQuery('msOrder', array('user_id' => $user_id));
$results = $modx->getCollection('msOrder', $q);
// выводим или чанками или предупреждением что заказов пока нет
foreach ($results as $result) {
if ( $result ) {
$resultArray = $result->toArray();
$output .= $modx->getChunk($tpl,$resultArray);
} else {
$output = 'У вас пока еще нет заказов.';
}
}
return $output;
2) Далее создаем чанк tpl.order
для отображения заказов на сайте:
<div>
<div> Заказ <span>[[+num]]</span> от <span>[[+createdon]]</span> года</div>
<div>
[[!msOrdersProducts?
&order=[[+id]]
&tpl=`tpl.order_row`
&tpl_empty=`tpl.order_row_empty`
]]
</div>
</div>
Обратите внимание! В параметрах вызова сниппета вы можете указать свои названия шаблонов для вывода товаров, но тогда не забудьте создать чанки с соответствующими именами.
3) Теперь сниппет msOrdersProducts
для вывода перечня данных товаров в заказе:
<?php
// выводит товары заказа.
$tpl = $modx->getOption('tpl',$scriptProperties,'tpl.order_row'); // если товар найден
$tpl_empty = $modx->getOption('tpl',$scriptProperties,'tpl.order_row_empty'); // если товар не найден
// ищем товар по id заказа
$q = $modx->prepare("SELECT * FROM ".$modx->getOption('table_prefix')."ms2_order_products WHERE order_id=".$order);
$q->execute();
$results = $q->fetchAll(PDO::FETCH_ASSOC);
$output;
// перебором либо выводим нужный заказ, либо оповещаем что его уже нет
foreach ($results as $result) {
$res = $modx->getObject('modResource', array('pagetitle'=>$result[name]));
if ($res) {
$resArray = $res->toArray();
$output .= $modx->getChunk($tpl,$resArray);
} else {
$prodName = $modx->setPlaceholder('name', $result[name]);
$output .= $modx->getChunk($tpl_empty);
}
}
return $output;
4) После чего создаем чанк tpl.order_row
для отображения на сайте данных по товару:
<div>
<span><a href="[[~[[+id]]]]">[[+pagetitle]]</a></span>
<span>[[+price]] [[%ms2_frontend_currency]]</span>
</div>
5) И напоследок, создаем чанк для отображения товара которого уже нет на сайте:
<div>
<span>[[+pagetitle]]</span>
<span>не найден</span>
</div>
На этом все. Как обычно, вопросы и замечания - в комментариях.
Удачи!