Opencart. Добавить кнопку «повторить весь заказ» в истории заказов

Инструкция проверялась на Opencart 2.3

Opencart уже располагает похожим функционалом, но разница в том, что нужно заходить в интересующий заказ и нажимать повторить в каждом товаре, чтобы продублировать весь заказ

Чтобы сократить работу покупателю, нужно вынести эту кнопку на уровень выше(как на рис. ниже). И запрограммировать нажатие так, чтобы в корзину попадали все товары заказа единовременно.

Для этого надо воспользоваться кодом повторного добавления товара в корзину. Это функция reorder из контроллера
ControllerAccountOrder. Добавим в неё два аргумента вот так

public function reorder($orderid=null,$orderproductid=null) {

И внесём небольшие изменения в её тело

БЫЛОСТАЛО
if (isset($this->request->get[‘order_id’])) {
$order_id = $this->request->get[‘order_id’];
} else {
if(!empty($orderid)) $order_id = $orderid;
else if (isset($this->request->get[‘order_id’])) {
$order_id = $this->request->get[‘order_id’];
if (isset($this->request->get[‘order_product_id’])) {
$order_product_id = $this->request->get[‘order_product_id’];
if(!empty($orderid)) $order_product_id = $orderproductid;
else if (isset($this->request->get[‘order_product_id’])) {
$order_product_id = $this->request->get[‘order_product_id’];
$this->response->redirect($this->url->link(‘account/order/info’, ‘order_id=’ . $order_id));if(empty($orderid))
$this->response->redirect($this->url->link(‘account/order/info’, ‘order_id=’ . $order_id));

И добавим в этот же файл функцию reorderALL, которая будет повторно отправлять в корзину все товары заказа, вызывая функцию reorder под разные значения $orderproductid

	public function reorderALL(){
		if (isset($this->request->get['order_id'])) {
			$order_id = $this->request->get['order_id'];
	   		$this->load->model('account/order');
			$results =  $this->model_account_order->getProductIds($order_id);

			foreach ($results as $result) {
				$this->reorder($order_id,$result['order_product_id']);
			}
			$this->response->redirect($this->url->link('account/order/info', 'order_id=' . $order_id));
		}
	}

Внутри этого метода используется модель account/order, а в ней новый метод getProductIds. Он получает все товары из заказа с выбранным ID. Добавьте вот такой код в файл model/
account/order.php

public function getProductIds($order_id){
    $query = $this->db->query("SELECT order_product_id FROM " . DB_PREFIX . "order_product WHERE order_id = $order_id");
    return $query->rows;
}

Осталось сделать саму кнопку во вьюшке истории заказов в личной кабинете пользователя. Это файл account/order_list.tpl в шаблоне opencart

<td class="text-right" style="white-space: nowrap;"><?php if ($order['reorder']) { ?>
                <a href="<?php echo $order['reorder']; ?>" data-toggle="tooltip" title="<?php echo $button_reorder; ?>" class="btn btn-primary"><i class="fa fa-shopping-cart"></i></a>
                <?php } ?>
                </td>

Не хватает только правильно сформированного url в кнопке, чтобы при нажатии запускался новый метод reorderALL. Опять вернемся в ControllerAccountOrder и в самом первом методе info (отвечает за вывод данных истории заказов) пропишем перед строкой $data[‘orders’][] = array(

$reorder = $this->url->link('account/order/reorderALL', 'order_id=' . $result['order_id'], true);

А в массив $data[‘orders’][] = array( добавим новый элемент в конце

'reorder'	 => $reorder,

2 thoughts on “Opencart. Добавить кнопку «повторить весь заказ» в истории заказов”

  1. Спасибо! только стоит добавить что :
    в функции
    public function reorder($orderid=null,$orderproductid=null)
    строку в конце
    $this->response->redirect($this->url->link(‘account/order/info’, ‘order_id=’ . $order_id));
    надо заменить на что то типа
    if(empty($orderid)){
    $this->response->redirect($this->url->link(‘account/order/info’, ‘order_id=’ . $order_id));
    }

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *