Повторение заказа пользователя(Demomarket) — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: «'''Актуально для версии 20''' Иногда бывает необходимо повторить заказ, сделанный пользова…»)
 
 
(не показано 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. Как только заказ сформирован - происходит переход на страницу начала процесса оформления заказа