Повторение ранее совершенного заказа — различия между версиями
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>