Повторение заказа пользователя(Demomarket) — различия между версиями
Alelekov (обсуждение | вклад) (Новая страница: «'''Актуально для версии 20''' Иногда бывает необходимо повторить заказ, сделанный пользова…») |
Aposio (обсуждение | вклад) |
||
(не показано 5 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
'''Актуально для версии 20''' | '''Актуально для версии 20''' | ||
− | + | '''Задача:''' реализовать возможность повторения одного из заказов, сделанных пользователем ранее, на примере шаблона Демомаркет. | |
− | |||
− | '''Задача:''' реализовать возможность повторения одного из заказов, сделанных пользователем ранее. | ||
'''Решение:''' | '''Решение:''' | ||
Строка 29: | Строка 27: | ||
<?php endforeach; ?> | <?php endforeach; ?> | ||
</div></source> | </div></source> | ||
− | С помощью этого кода мы получили идентификатор товара и его количество, а затем преобразовали это в массив вида идентификатор товара => количество. | + | С помощью этого кода мы получили идентификатор товара и его количество, а затем преобразовали это в массив вида "идентификатор товара => количество". |
Теперь по нажатию кнопки "повторить заказ" эти данные будут отправляться на обработку в макрос createSameOrder, который мы указали в атрибуте action у нашей формы. | Теперь по нажатию кнопки "повторить заказ" эти данные будут отправляться на обработку в макрос createSameOrder, который мы указали в атрибуте action у нашей формы. | ||
+ | |||
+ | Результирующий код в этом файле будет вот таким: | ||
+ | <source lang="html"> | ||
+ | <form method="post" action="/emarket/createSameOrder/"> | ||
+ | <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> | ||
+ | |||
+ | <div> | ||
+ | <div class="title_text hidden-md hidden-lg"> | ||
+ | <?= $this->translate('order_number') ?> | ||
+ | </div> | ||
+ | |||
+ | <div><?= $this->getOrderDateMessage($order) ?></div> | ||
+ | |||
+ | <?php foreach ($order['items'] as $orderItem): ?> | ||
+ | <div> | ||
+ | <a href="<?= $this->getOrderItemProductUrl($orderItem) ?>"> | ||
+ | <?= $this->escape($orderItem['name']) ?> | ||
+ | </a> | ||
+ | </div> | ||
+ | <?php endforeach; ?> | ||
+ | </div> | ||
+ | |||
+ | <div> | ||
+ | <div class="title_text hidden-md hidden-lg"> | ||
+ | <?= $this->translate('order_sum') ?> | ||
+ | </div> | ||
+ | |||
+ | <div><?= $this->render($order['summary'], 'emarket/price') ?></div> | ||
+ | |||
+ | <?php foreach ($order['items'] as $orderItem): ?> | ||
+ | <?= $this->render($orderItem, 'emarket/personal/order_item_price') ?> | ||
+ | <?php endforeach; ?> | ||
+ | </div> | ||
+ | |||
+ | <div> | ||
+ | <div class="title_text hidden-md hidden-lg"> | ||
+ | <?= $this->translate('order_status') ?> | ||
+ | </div> | ||
+ | |||
+ | <div><?= $this->getOrderStatusMessage($order) ?></div> | ||
+ | </div> | ||
+ | |||
+ | <div> | ||
+ | <div class="title_text hidden-md hidden-lg"> | ||
+ | <?= $this->translate('order_method') ?> | ||
+ | </div> | ||
+ | |||
+ | <div> | ||
+ | <?php if ($invoiceLink): ?> | ||
+ | <a href="<?= $invoiceLink ?>" target="__blank"> | ||
+ | <?= $order['payment_name'] ?> | ||
+ | </a> | ||
+ | <?php else: ?> | ||
+ | <?= $order['payment_name'] ?> | ||
+ | <?php endif; ?> | ||
+ | </div> | ||
+ | </div> | ||
+ | </div> | ||
+ | <input type="submit" value="Повторить заказ"/> | ||
+ | </form> | ||
+ | </source> | ||
4. Теперь опишем необходимый код для формирования заказа с такими же товарами и в таком же количестве. В файле '''~/classes/components/emarket/customMacros.php''' напишем следующий код: | 4. Теперь опишем необходимый код для формирования заказа с такими же товарами и в таком же количестве. В файле '''~/classes/components/emarket/customMacros.php''' напишем следующий код: | ||
Строка 63: | Строка 134: | ||
$this->module->redirect('/emarket/purchase'); | $this->module->redirect('/emarket/purchase'); | ||
} | } | ||
+ | </source> | ||
+ | |||
+ | Чтобы наш макрос мог быть вызван обычными пользователями, добавим соответствующие записи о нём в файл '''~/classes/components/emarket/permissions.custom.php''': | ||
+ | <source lang="php"> | ||
+ | $permissions = [ | ||
+ | /** Права на личный кабинет покупателя */ | ||
+ | 'personal' => [ | ||
+ | 'createsameorder' | ||
+ | ] | ||
+ | ]; | ||
</source> | </source> | ||
На этом все необходимые действия заканчиваются. Теперь при нажатии кнопки "Повторить заказ" в личном кабинете пользователя около соответствующего заказа будет происходить следующее: | На этом все необходимые действия заканчиваются. Теперь при нажатии кнопки "Повторить заказ" в личном кабинете пользователя около соответствующего заказа будет происходить следующее: | ||
− | 1. Формируются данные о товаре и его количестве | + | <ul> |
− | 2. Сформированные данные отправляются на обработку в метод createSameOrder | + | <li>1. Формируются данные о товаре и его количестве</li> |
− | 3. В этом методе формируется новый заказ с аналогичными товарами и их количеством | + | <li>2. Сформированные данные отправляются на обработку в метод createSameOrder</li> |
− | 4. Как только заказ сформирован - происходит переход на страницу начала процесса оформления заказа | + | <li>3. В этом методе формируется новый заказ с аналогичными товарами и их количеством</li> |
− | + | <li>4. Как только заказ сформирован - происходит переход на страницу начала процесса оформления заказа </li> | |
− | [[category:Модуль Интернет магазин]] | + | </ul> |
+ | [[category:Модуль Интернет магазин]][[category:Верстка в PHP]] |
Текущая версия на 07:35, 17 мая 2019
Актуально для версии 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 у нашей формы.
Результирующий код в этом файле будет вот таким:
<form method="post" action="/emarket/createSameOrder/">
<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>
<div>
<div class="title_text hidden-md hidden-lg">
<?= $this->translate('order_number') ?>
</div>
<div><?= $this->getOrderDateMessage($order) ?></div>
<?php foreach ($order['items'] as $orderItem): ?>
<div>
<a href="<?= $this->getOrderItemProductUrl($orderItem) ?>">
<?= $this->escape($orderItem['name']) ?>
</a>
</div>
<?php endforeach; ?>
</div>
<div>
<div class="title_text hidden-md hidden-lg">
<?= $this->translate('order_sum') ?>
</div>
<div><?= $this->render($order['summary'], 'emarket/price') ?></div>
<?php foreach ($order['items'] as $orderItem): ?>
<?= $this->render($orderItem, 'emarket/personal/order_item_price') ?>
<?php endforeach; ?>
</div>
<div>
<div class="title_text hidden-md hidden-lg">
<?= $this->translate('order_status') ?>
</div>
<div><?= $this->getOrderStatusMessage($order) ?></div>
</div>
<div>
<div class="title_text hidden-md hidden-lg">
<?= $this->translate('order_method') ?>
</div>
<div>
<?php if ($invoiceLink): ?>
<a href="<?= $invoiceLink ?>" target="__blank">
<?= $order['payment_name'] ?>
</a>
<?php else: ?>
<?= $order['payment_name'] ?>
<?php endif; ?>
</div>
</div>
</div>
<input type="submit" value="Повторить заказ"/>
</form>
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');
}
Чтобы наш макрос мог быть вызван обычными пользователями, добавим соответствующие записи о нём в файл ~/classes/components/emarket/permissions.custom.php:
$permissions = [
/** Права на личный кабинет покупателя */
'personal' => [
'createsameorder'
]
];
На этом все необходимые действия заканчиваются. Теперь при нажатии кнопки "Повторить заказ" в личном кабинете пользователя около соответствующего заказа будет происходить следующее:
- 1. Формируются данные о товаре и его количестве
- 2. Сформированные данные отправляются на обработку в метод createSameOrder
- 3. В этом методе формируется новый заказ с аналогичными товарами и их количеством
- 4. Как только заказ сформирован - происходит переход на страницу начала процесса оформления заказа