Повторение ранее совершенного заказа — различия между версиями
Cmac (обсуждение | вклад) |
Stexe (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
+ | '''Актуально для версии 2.9.6'''<br/><br/> | ||
+ | '''Задача:''' Реализовать возможность повторного оформления заказа<br/><br/> | ||
+ | '''Реализация:''' <br/> | ||
В данной статье описан пример кастомного макроса, с помощью которого можно повторить ранее совершенный заказ, т.е. одним кликом перенести его в текущею корзину и оформить заказ. | В данной статье описан пример кастомного макроса, с помощью которого можно повторить ранее совершенный заказ, т.е. одним кликом перенести его в текущею корзину и оформить заказ. | ||
− | Код | + | Код метода repeatOrder необходимо добавить в файл '''/classes/modules/emarket/__custom.php''': |
<source lang="php"> | <source lang="php"> | ||
− | public function | + | public function repeatOrder() { |
+ | $permissions = permissionsCollection::getInstance(); | ||
+ | $userId = $permissions->getUserId(); | ||
+ | $objects = umiObjectsCollection::getInstance(); | ||
+ | $order_id = (int) getRequest('param0'); | ||
+ | $order = $objects->getObject($order_id); | ||
− | + | if (!$order || $order->customer_id != $userId) { | |
− | + | $referer = getServer('HTTP_REFERER'); | |
− | + | $this->redirect($referer); | |
− | + | } | |
− | + | $orderItems = $order->order_items; | |
− | + | ||
− | + | if (is_array($orderItems)) { | |
− | + | $_REQUEST['no-redirect'] = 1; | |
− | + | $this->basket('remove_all'); | |
− | + | ||
− | + | foreach ($orderItems as $orderItemId) { | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | $orderItem = orderItem::get($orderItemId); | ||
+ | |||
+ | if ($orderItem) { | ||
+ | $element = $orderItem->getItemElement(); | ||
+ | if ($element) { | ||
+ | |||
+ | $element_id = $element->getId(); | ||
+ | $_REQUEST['no-redirect'] = 1; | ||
+ | |||
+ | $_REQUEST['amount'] = $orderItem->getAmount(); | ||
+ | |||
+ | $options_arr = array(); | ||
+ | foreach ($orderItem->options as $item) { | ||
+ | $index = $item['varchar']; | ||
+ | $options_arr[$index] = $item['rel']; | ||
+ | } | ||
+ | if (count($options_arr)) | ||
+ | $_REQUEST['options'] = $options_arr; | ||
+ | $_REQUEST['redirect-uri'] = ''; | ||
+ | $this->basket('put', 'element', $element_id); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | $referer = getServer('HTTP_REFERER'); | ||
+ | $this->redirect($referer); | ||
} | } | ||
</source> | </source> | ||
Строка 50: | Строка 57: | ||
<source lang="php"> | <source lang="php"> | ||
<?php | <?php | ||
− | $permissions = array('purchasing' => array(' | + | $permissions = array('purchasing' => array('repeatOrder')); |
?> | ?> | ||
</source> | </source> | ||
− | + | <h2>TPL-шаблонизатор</h2> | |
+ | В шаблоне '''tpls/emarket/default.tpl''', должны быть примерно следующие блоки: | ||
<pre> | <pre> | ||
$FORMS['personal'] = <<<END | $FORMS['personal'] = <<<END | ||
Строка 72: | Строка 80: | ||
$FORMS['orders_item'] = <<<END | $FORMS['orders_item'] = <<<END | ||
− | <li>%name% <a href="/emarket/ | + | <li>%name% <a href="/emarket/repeatOrder/%id%/">Повторить</a></li> |
END; | END; | ||
</pre> | </pre> | ||
Когда пользователь зайдет в личный кабинет Интернет-магазина по ссылке: _http://sait.ru/emarket/personal/ , он увидит список заказов возле которых будет ссылка '''Повторить'''. Кликнув по ссылке Повторить, в текущею корзину товаров добавятся товары из ранее совершенного заказа, с сохранением количества товара и опционных свойств. | Когда пользователь зайдет в личный кабинет Интернет-магазина по ссылке: _http://sait.ru/emarket/personal/ , он увидит список заказов возле которых будет ссылка '''Повторить'''. Кликнув по ссылке Повторить, в текущею корзину товаров добавятся товары из ранее совершенного заказа, с сохранением количества товара и опционных свойств. | ||
− | + | <h2>XSLT-шаблонизатор</h2> | |
+ | В демонстрационном дизайне "Современный интернет-магазин" ("demodizzy") в файле \templates\demodizzy\xslt\modules\emarket\orders-list.xsl в шаблон <xsl:template match="udata[@module = 'emarket'][@method = 'order']"> для вывода ссылки на повторения ранее совершенного заказа можно воспользоваться следующей конструкцией: | ||
+ | <source lang="xml"> | ||
+ | <a href="/emarket/repeatOrder/{@id}/">Повторить</a> | ||
+ | </source> | ||
[[Категория:Модуль Интернет магазин]] | [[Категория:Модуль Интернет магазин]] |
Версия 10:29, 1 июня 2014
Актуально для версии 2.9.6
Задача: Реализовать возможность повторного оформления заказа
Реализация:
В данной статье описан пример кастомного макроса, с помощью которого можно повторить ранее совершенный заказ, т.е. одним кликом перенести его в текущею корзину и оформить заказ.
Код метода repeatOrder необходимо добавить в файл /classes/modules/emarket/__custom.php:
public function repeatOrder() {
$permissions = permissionsCollection::getInstance();
$userId = $permissions->getUserId();
$objects = umiObjectsCollection::getInstance();
$order_id = (int) getRequest('param0');
$order = $objects->getObject($order_id);
if (!$order || $order->customer_id != $userId) {
$referer = getServer('HTTP_REFERER');
$this->redirect($referer);
}
$orderItems = $order->order_items;
if (is_array($orderItems)) {
$_REQUEST['no-redirect'] = 1;
$this->basket('remove_all');
foreach ($orderItems as $orderItemId) {
$orderItem = orderItem::get($orderItemId);
if ($orderItem) {
$element = $orderItem->getItemElement();
if ($element) {
$element_id = $element->getId();
$_REQUEST['no-redirect'] = 1;
$_REQUEST['amount'] = $orderItem->getAmount();
$options_arr = array();
foreach ($orderItem->options as $item) {
$index = $item['varchar'];
$options_arr[$index] = $item['rel'];
}
if (count($options_arr))
$_REQUEST['options'] = $options_arr;
$_REQUEST['redirect-uri'] = '';
$this->basket('put', 'element', $element_id);
}
}
}
}
$referer = getServer('HTTP_REFERER');
$this->redirect($referer);
}
В той же папке необходимо добавить файл permissions.custom.php следующего содержания:
<?php
$permissions = array('purchasing' => array('repeatOrder'));
?>
TPL-шаблонизатор
В шаблоне tpls/emarket/default.tpl, должны быть примерно следующие блоки:
$FORMS['personal'] = <<<END %emarket ordersList()% END; $FORMS['orders_block'] = <<<END <p>Список ваших заказов:</p> <ul> %items% </ul> END; $FORMS['orders_block_empty'] = <<<END <p>Заказов нет</p> END; $FORMS['orders_item'] = <<<END <li>%name% <a href="/emarket/repeatOrder/%id%/">Повторить</a></li> END;
Когда пользователь зайдет в личный кабинет Интернет-магазина по ссылке: _http://sait.ru/emarket/personal/ , он увидит список заказов возле которых будет ссылка Повторить. Кликнув по ссылке Повторить, в текущею корзину товаров добавятся товары из ранее совершенного заказа, с сохранением количества товара и опционных свойств.
XSLT-шаблонизатор
В демонстрационном дизайне "Современный интернет-магазин" ("demodizzy") в файле \templates\demodizzy\xslt\modules\emarket\orders-list.xsl в шаблон <xsl:template match="udata[@module = 'emarket'][@method = 'order']"> для вывода ссылки на повторения ранее совершенного заказа можно воспользоваться следующей конструкцией:
<a href="/emarket/repeatOrder/{@id}/">Повторить</a>