21 января 2016 г.

Если у товара определены обязательные опции, то при попытке добавить его в корзину вне страницы нахождения, т.е. из под страниц категорий, производителей, поиска, акций или модулей, произойдёт перенаправление на страницу этого товара. Причём пользователь не увидит никаких сообщений о причинах того, почему одни товары сразу добавляются в корзину с любого раздела сайта, а другие не добавляются и вместо этого открывается страница его размещения. Разработчикам ПО OpenCart и владельцам самих магазинов покажется это несущественным, однако покупатели бывают разные. В их числе есть и те, кто видит в этом разного рода "глюки", которые могут стать причиной отказа от дальнейшей навигации по сайту. А поскольку хороший магазин ценит каждого покупателя, то ниже пойдёт речь о том, как исправить это "недоразумение" с помощью небольшой доработки OpenCart 1.5+.

Если у товара несколько групп опций, среди которых одна группа обязательная, например "Размер платья: L, XL, XXL", то логично первым значением в списке выбора выставлять наиболее востребованный размер. Тогда при добавлении в корзину можно автоматически выставлять данное значение как по умолчанию.

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

Проверка на наличие обязательных опций для товара происходит в файле ./catalog/controller/checkout/cart.php. Чтобы реализовать возможность описанную выше, весь участок кода после $product_options = $this->model_catalog_product->getProductOptions($this->request->post['product_id']); и до $this->cart->add($this->request->post['product_id'], $quantity, $option); меняем на следующий:

$option_cnt = 0; $force_error = false;
foreach ($product_options as $product_option) {
if ($product_option['required'] && empty($option[$product_option['product_option_id']])) {
$json['error']['option'][$product_option['product_option_id']] = sprintf($this->language->get('error_required'), $product_option['name']);
$option_cnt++;}}

if ($option_cnt == 1 && !$option) {$option[$product_option['product_option_id']] = $product_option['option_value'][0]['product_option_value_id']; }

if (!$json || $force_error) {

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

1. Для этого в этом же файле перед строкой $json['redirect'] = ... добавим следующую: $this->session->data['attention'] = $this->language->get('text_option_required');, где $_['text_option_required']  = 'Товар будет добавлен в корзину после выбора его обязательных опций!'; добавляем в один из языковых файлов, в нашем случае в ./catalog/language/russian/checkout/cart.php.

2. Далее в файле ./catalog/controller/product/product.php до строки $this->load->model('catalog/product'); добавляем следующий блок кода:
if (isset($this->session->data['attention'])) {
$this->data['attention'] = $this->session->data['attention'];
unset($this->session->data['attention']);} else {$this->data['attention'] = '';}

3. И чтобы сообщение отображалось на странице товара в файле ./catalog/view/theme/default/template/product/product.tpl после <?php echo $header; ?> добавляем следующую конструкцию: <?php if ($attention) { ?>
<div class="attention"><?php echo $attention; ?><img src="catalog/view/theme/default/image/close.png" alt="" class="close" /></div>
<?php } ?>

Собственно на этом всё. Можно ещё использовать специальный модуль, который выводит опции товара в модальном окне после нажатия кнопки В корзину (вне страницы товара).

Заказать такой модуль или описанную здесь доработку можно у автора блога.

0 comments:

Отправить комментарий

  • RSS
  • Twitter
  • Youtube