Повторение ранее совершенного заказа — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
(не показана 1 промежуточная версия 1 участника)
Строка 1: Строка 1:
 +
'''Актуально для версии 2.17'''<br/><br/>
 +
'''Задача:''' Реализовать возможность повторного оформления заказа<br/><br/>
 +
'''Реализация:''' <br/>
 
В данной статье описан пример кастомного макроса, с помощью которого можно повторить ранее совершенный заказ, т.е. одним кликом перенести его в текущею корзину и оформить заказ.
 
В данной статье описан пример кастомного макроса, с помощью которого можно повторить ранее совершенный заказ, т.е. одним кликом перенести его в текущею корзину и оформить заказ.
Код нового метода необходимо добавить в файл '''classes/modules/emarket/__custom.php''', после слов //TODO: Write here your own macroses:
+
 
 +
С версии 14 (2.14) UMI.CMS поддерживает работу на php версии 7. Ядро поддерживает работу на любой версии php от 5.4, а для модулей есть отдельный набор реализаций, поддерживающих 7. Старый набор реализаций модулей находится в директории /classes/modules, а новый в /classes/components.
 +
 
 +
Для подключения нового набора реализаций на версиях PHP до PHP 7.*.* необходимо в файле config.ini включить опцию [http://dev.docs.umi-cms.ru/nastrojka_sistemy/dostupnye_sekcii/sekciya_system/#sel=103:1,103:3 compatible-modules]
 +
 
 +
Если вы используете новую реализацию модулей, то код метода repeatOrder необходимо добавить в файл
 +
'''/classes/components/emarket/customMacros.php''':
 +
<source lang="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->module->redirect($referer);
 +
}
 +
 
 +
$orderItems = $order->order_items;
 +
 
 +
if (is_array($orderItems)) {
 +
    $_REQUEST['no-redirect'] = 1;
 +
    $this->module->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->module->basket('put', 'element', $element_id);
 +
  }
 +
}
 +
            }
 +
 
 +
}
 +
 
 +
$referer = getServer('HTTP_REFERER');
 +
        $this->module->redirect($referer);
 +
}
 +
</source>
 +
 
 +
 
 +
 
 +
 
 +
Если вы используете старую реализацию модулей, то код метода repeatOrder необходимо добавить в файл
 +
'''/classes/modules/emarket/__custom.php''':
 
<source lang="php">
 
<source lang="php">
public function repeatorder(){
+
public function repeatOrder() {
 +
$permissions = permissionsCollection::getInstance();
 +
$userId = $permissions->getUserId();
 +
$objects = umiObjectsCollection::getInstance();
 +
$order_id = (int) getRequest('param0');
 +
$order = $objects->getObject($order_id);
  
  $permissions = permissionsCollection::getInstance();
+
if (!$order || $order->customer_id != $userId) {
  $userId = $permissions->getUserId();
+
$referer = getServer('HTTP_REFERER');
  $objects = umiObjectsCollection::getInstance();
+
$this->redirect($referer);
  $order_id = (int) getRequest('param0');
+
}
  $order = $objects->getObject($order_id);
+
$orderItems = $order->order_items;
 
+
  if(!$order || $order->customer_id != $userId){
+
if (is_array($orderItems)) {
  $referer = getServer('HTTP_REFERER');
+
$_REQUEST['no-redirect'] = 1;
  $this->redirect($referer);
+
$this->basket('remove_all');
  }
+
  $orderItems = $order->order_items;
+
foreach ($orderItems as $orderItemId) {
 
 
  if(is_array($orderItems)) {
 
    foreach($orderItems as $orderItemId) {
 
     
 
      $orderItem = orderItem::get($orderItemId);
 
     
 
      if($orderItem) {
 
        $element = $orderItem->getItemElement();
 
        if($element){
 
         
 
          $element_id = $element->id;
 
          $_REQUEST['no-redirect'] = 1;
 
          $_REQUEST['amount'] = $orderItem->item_amount;
 
         
 
          $options_arr = array();
 
          foreach($orderItem->options as $item){
 
            $index = $item['varchar'];
 
            $options_arr[$index] = $item['rel'];
 
          }
 
          if(count($options_arr)) $_REQUEST['options'] = $options_arr;
 
          $this->basket('put', 'element', $element_id);
 
         
 
        }
 
      }
 
    }
 
  }
 
  $referer = getServer('HTTP_REFERER');
 
  $this->redirect($referer);
 
  
 +
$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: Строка 124:
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
   $permissions = array('purchasing' => array('repeatorder'));
+
   $permissions = array('purchasing' => array('repeatOrder'));
 
?>
 
?>
 
</source>
 
</source>
  
Если говорить на примере TPL-шаблонов, то в шаблоне '''tpls/emarket/default.tpl''', должны быть примерно следующие блоки:
+
<h2>TPL-шаблонизатор</h2>
 +
В шаблоне '''tpls/emarket/default.tpl''', должны быть примерно следующие блоки:
 
<pre>
 
<pre>
 
$FORMS['personal'] = <<<END
 
$FORMS['personal'] = <<<END
Строка 72: Строка 147:
  
 
$FORMS['orders_item'] = <<<END
 
$FORMS['orders_item'] = <<<END
<li>%name% <a href="/emarket/repeatorder/%id%/">Повторить</a></li>
+
<li>%name% <a href="/emarket/repeatOrder/%id%/">Повторить</a></li>
 
END;
 
END;
 
</pre>
 
</pre>
  
 
Когда пользователь зайдет в личный кабинет Интернет-магазина по ссылке: _http://sait.ru/emarket/personal/ , он увидит список заказов возле которых будет ссылка '''Повторить'''. Кликнув по ссылке Повторить, в текущею корзину товаров добавятся товары из ранее совершенного заказа, с сохранением количества товара и опционных свойств.
 
Когда пользователь зайдет в личный кабинет Интернет-магазина по ссылке: _http://sait.ru/emarket/personal/ , он увидит список заказов возле которых будет ссылка '''Повторить'''. Кликнув по ссылке Повторить, в текущею корзину товаров добавятся товары из ранее совершенного заказа, с сохранением количества товара и опционных свойств.
Для XSLT принцип аналогичен, с помощью макроса '''ordersList()''' получаем список заказов, потом формируем ссылку для повторения заказа, используя '''object_id''' заказа.
+
<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>
 
[[Категория:Модуль Интернет магазин]]
 
[[Категория:Модуль Интернет магазин]]

Текущая версия на 12:38, 14 января 2018

Актуально для версии 2.17

Задача: Реализовать возможность повторного оформления заказа

Реализация:
В данной статье описан пример кастомного макроса, с помощью которого можно повторить ранее совершенный заказ, т.е. одним кликом перенести его в текущею корзину и оформить заказ.

С версии 14 (2.14) UMI.CMS поддерживает работу на php версии 7. Ядро поддерживает работу на любой версии php от 5.4, а для модулей есть отдельный набор реализаций, поддерживающих 7. Старый набор реализаций модулей находится в директории /classes/modules, а новый в /classes/components.

Для подключения нового набора реализаций на версиях PHP до PHP 7.*.* необходимо в файле config.ini включить опцию compatible-modules

Если вы используете новую реализацию модулей, то код метода repeatOrder необходимо добавить в файл /classes/components/emarket/customMacros.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->module->redirect($referer);
	}

	$orderItems = $order->order_items;

	if (is_array($orderItems)) {
	    $_REQUEST['no-redirect'] = 1;
	    $this->module->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->module->basket('put', 'element', $element_id);
		   }
		}
             }

	}

	$referer = getServer('HTTP_REFERER');
        $this->module->redirect($referer);
}



Если вы используете старую реализацию модулей, то код метода 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>