Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


MajorChocolate

Recommended Posts

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

 

из /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

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.