Повторение заказа пользователя(Demomarket)
Актуально для версии 20
Иногда бывает необходимо повторить заказ, сделанный пользователем ранее. Мы рассмотрим реализацию данного функционала на примере шаблона Демомаркет.
Задача: реализовать возможность повторения одного из заказов, сделанных пользователем ранее.
Решение:
В шаблоне "Демомаркет" в личном кабинете пользователя имеется вкладка "Заказы", на которой имеется вся необходимая нам информация о заказах, сделанных пользователем, включая товары и их количество. Для начала, добавим в файл шаблона этой страницы код, который позволит нам получить эти данные.
1. Для отправки данных проще всего использовать тег <form>. Заключим в этот тег весь html-код в файле ~/templates/demomarket/php/emarket/personal/order.phtml: перед строкой
<div class="content_order">
добавим тег
<form method="post" action="/emarket/createSameOrder/">
и в конце файла добавим закрывающий тег </form>.
2. Затем, добавим там, где нам нужно, кнопку "Повторить заказ", код:
<input type="submit" value="Повторить заказ"/>
для простоты примера мы добавили эту кнопку в самый конец файла перед закрывающим тегом </form>.
3. Итак, у нас есть форма и возможность её отправки с помощью кнопки "Повторить заказ". Теперь нужно сформировать данные для отправки.
После строки
<div class="content_order">
добавим следующий код:
<div>
<?php foreach ($order['items'] as $orderItem): ?>
<?php
$pageObject = $orderItem['page'];
$amount = $orderItem['amount'];
$values[$pageObject->id] = $amount;
?>
<input hidden name="orderData" value="<?=base64_encode(serialize($values))?>"/>
<?php endforeach; ?>
</div>
С помощью этого кода мы получили идентификатор товара и его количество, а затем преобразовали это в массив вида идентификатор товара => количество. Теперь по нажатию кнопки "повторить заказ" эти данные будут отправляться на обработку в макрос createSameOrder, который мы указали в атрибуте action у нашей формы.
4. Теперь опишем необходимый код для формирования заказа с такими же товарами и в таком же количестве. В файле ~/classes/components/emarket/customMacros.php напишем следующий код:
public function createSameOrder()
{
// Получили преобразованный массив с данными
$serializedData = $_POST['orderData'];
// Преобразовали его в нужный нам вид
$originalData = unserialize(base64_decode($serializedData));
// Для того, чтобы не было перенаправлений при добавлении товара в корзину, ставим флаг no-redirect
$_REQUEST['no-redirect'] = true;
// Получаем ключи - идентификаторы товара
$keys = array_keys($originalData);
foreach($keys as $key)
{
// Идентификатор товара
$id = $key;
// Количество товара
$amount = $originalData[$key];
// Добавляем товар в корзину amount раз
for($i = 0; $i < $amount; $i++)
{
// Метод добавления товара в корзину
$this->module->basket('put', 'element', $id);
}
}
// После того как заказ сформирован автоматически начинаем оформление заказа
$this->module->redirect('/emarket/purchase');
}
На этом все необходимые действия заканчиваются. Теперь при нажатии кнопки "Повторить заказ" в личном кабинете пользователя около соответствующего заказа будет происходить следующее: 1. Формируются данные о товаре и его количестве 2. Сформированные данные отправляются на обработку в метод createSameOrder 3. В этом методе формируется новый заказ с аналогичными товарами и их количеством 4. Как только заказ сформирован - происходит переход на страницу начала процесса оформления заказа