Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Наборы (вместе дешевле) падают в корзину только если залогинен


MajorChocolate
 Поделиться

Рекомендованные сообщения

На сайте реализован функционал покупки наборов. Реализовано все это не через модуль, а как говорится просто прописано разработчиком по аналогии с функцией добавления товара в корзину. Все работает отлично за исключением того что эти наборы добавляются в корзину только если пользователь залогинен. Незалогиненому же пользователю так же пишется что набор успешно добавлен, но корзина по сути остается пустой. Я слабо разбираюсь в "подкопотье" опенкарта. Может сможете сориентировать в чем проблема?

 

из /controller/checkout/cart.php

Скрытый текст
public function addkit() {
	$this->load->language('checkout/cart');

	$json = array();

	if (isset($this->request->get['kit'])) {
		$kit = $this->request->get['kit'];
	} else {
		$kit = 0;
	}

	if (isset($this->request->get['p_id'])) {
		$p_id = (int)$this->request->get['p_id'];
	} else {
		$p_id = 0;
	}

	if (!empty($this->request->get['pids'])) {
		$pids = @explode(',', $this->request->get['pids']);
	} else {
		$pids = [];
	}

	$q = $this->db->query("SELECT sd.name, s.set_id FROM " . DB_PREFIX . "set s 
	LEFT JOIN " . DB_PREFIX . "set_description sd ON (s.set_id = sd.set_id) 
	WHERE s.set_id = '" . (int)$kit . "' AND sd.language_id = '" . (int)$this->config->get('config_language_id') . "'");

	if ($q->num_rows && $pids) {
		$this->cart->addKit($q->row['set_id'], $pids, $p_id);

		$json['success'] = 1;

		// Unset all shipping and payment methods
		unset($this->session->data['shipping_method']);
		unset($this->session->data['shipping_methods']);
		unset($this->session->data['payment_method']);
		unset($this->session->data['payment_methods']);

		// Totals
		$this->load->model('setting/extension');

		$totals = array();
		$taxes = $this->cart->getTaxes();
		$total = 0;

		// Because __call can not keep var references so we put them into an array.
		$total_data = array(
				'totals' => &$totals,
				'taxes'  => &$taxes,
				'total'  => &$total
		);

		// Display prices
		if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) {
				$sort_order = array();

				$results = $this->model_setting_extension->getExtensions('total');

				foreach ($results as $key => $value) {
					$sort_order[$key] = $this->config->get('total_' . $value['code'] . '_sort_order');
				}

				array_multisort($sort_order, SORT_ASC, $results);

				foreach ($results as $result) {
					if ($this->config->get('total_' . $result['code'] . '_status')) {
						$this->load->model('extension/total/' . $result['code']);

						// We have to put the totals in an array so that they pass by reference.
						$this->{'model_extension_total_' . $result['code']}->getTotal($total_data);
					}
				}

				$sort_order = array();

				foreach ($totals as $key => $value) {
					$sort_order[$key] = $value['sort_order'];
				}

				array_multisort($sort_order, SORT_ASC, $totals);
		}

		$json['total'] = $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0);
	} else {
		$json['redirect'] = 1;
	}

	$this->response->addHeader('Content-Type: application/json');
	$this->response->setOutput(json_encode($json));
}

 

 

Ну и если вдруг необходимо AJAX 

Скрытый текст
$(document).on(\'click\', \'.btn-buy-kit\', function(){
  var pids = [];
  var kit = $(this).attr(\'data-kit\');

  $(\'#kit-\' + kit + \' li[data-id]\').each(function(){
    pids.push(parseInt($(this).attr(\'data-id\')));
  });
  
  $.ajax({
    url: \'index.php?route=checkout/cart/addkit\',
    type: \'get\',
    data: \'kit=\' + kit + \'&pids=\' + pids + \'&p_id=' . $this->request->get['product_id'] . '\',
    dataType: \'json\',
    success: function (json) {
      $(\'.alert-dismissible, .text-danger\').remove();
      $(\'.form-group\').removeClass(\'has-error\');

      if (json[\'success\']) {
        Notification(\'linked\',\'n-cart\',\'Комлект добавлен в корзину\', \'' . $this->url->link('checkout/cart') . '\');

          // Need to set timeout otherwise it wont update the total
          setTimeout(function () {
            $(\'#cart, .btn-mobile-menu-cart\').attr(\'data-count\', json[\'total\']);
          }, 100);

          $.get(\'index.php?route=common/cart/info\', function(g){
            $(\'#cart ul\').html($(g).find(\'ul\').html());
          });
      } else if (json[\'redirect\']) {
        Notification(\'error\',\'close\', \'Набор не найден\');
      }
    }
  });
});

 

 

Из library/cart.php

Скрытый текст
    public function addKit($kit, $pids = [], $p_id = 0) {
	    if ($p_id) {
            foreach ($pids as $p) {
                $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "cart WHERE api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "' AND product_id = '" . (int)$p . "' AND set_id = '" . (int)$kit . "'");

                if ($p != $p_id) {
                    $p_id = 0;
                }

                if (!$query->row['total']) {
                    $this->db->query("INSERT " . DB_PREFIX . "cart SET set_id = '" . (int)$kit . "', p_id = '" . (int)$p_id . "', api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "', customer_id = '" . (int)$this->customer->getId() . "', session_id = '" . $this->db->escape($this->session->getId()) . "', product_id = '" . (int)$p . "', recurring_id = '0', `option` = '[]', quantity = '1', date_added = '" . $this->db->escape(date('Y-m-d H:i:s')) . "'");
                } else {
                    $this->db->query("UPDATE " . DB_PREFIX . "cart SET set_id = '" . (int)$kit . "', p_id = '" . (int)$p_id . "', quantity = (quantity + 1) WHERE api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "' AND product_id = '" . (int)$p . "' AND recurring_id = '0' AND `option` = '[]'");
                }
            }
        }
    }

 

 

Изменено пользователем MajorChocolate
Ссылка на комментарий
Поделиться на других сайтах


Я думаю вам лучше обратиться в раздел услуг, править скорее всего нужно библиотеку cart

Ссылка на комментарий
Поделиться на других сайтах

Возможно у вас этот модуль стоит 

 

Ссылка на комментарий
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.