Jump to content
Sign in to follow this  
trubadan

Вопросы по корзине.

Recommended Posts

Всем доброго времени суток. 

Парочка вопросов по работе с корзиной.

 

Вопрос 1.

 

При входе на сайт, состояние корзины (если она пустая) выглядит так:

cart_01.jpg

Если добавить в корзину товар, а потом, удалить из нее все товары, то она принимает следующий вид: 

cart_02.jpg

 

Собственно вопрос - как сделать так, чтобы вместо нулей, она показывала надпись "в корзине пусто"? Эта надпись появляется только при обновлении страницы.

 

Вопрос 2.

 

Если зайти в корзину и удалить товар,

cart_03.jpg

то визуально он в корзине остается. То, что товар удаляется, видно только по состоянию корзины или если обновить страницу. 

 

Вопрос - как это исправить?

Share this post


Link to post
Share on other sites

catalog\controller\common\cart.php

после строки:

$data['text_items'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));

вставить:

if ($total===0) {$data['text_items'] = 'В корзине пусто';}

или

if ($total===0) {$data['text_items'] = $data['text_empty'];}

про 2 возможно id="cart" не написано в cart.tpl

Edited by specussa

Share this post


Link to post
Share on other sites
catalog\controller\common\cart.php

после строки:

$data['text_items'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));

вставить:

if ($total===0) {$data['text_items'] = 'В корзине пусто';}

или

if ($total===0) {$data['text_items'] = $data['text_empty'];}

 

Чет не срабатывает ;(

Share this post


Link to post
Share on other sites

В коробочном варианте ОС всегда в пустой корзине ноли показываются. У вас тема или модуль отображают надпись, какие и как- неизвестно.

Можно попробовать аналогично $data['text_items']

в файле \catalog\controller\checkout\cart.php   после

$json['total'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));

добавить 

if ($total===0) {$json['total'] = $this->language->get('text_empty');}

$json['total'] там два раза встречается.

Edited by Shureg

Share this post


Link to post
Share on other sites

Спасибо за подсказки. Первый вариант прошел нормально.

if ($total===0) {$data['text_items'] = 'В корзине пусто';}

 Может кто подскажет - мне нужно сделать надписи на корзине например так:

0 товаров - Останусь голодным (это я реализовал)

1 товар - Немного подкреплюсь (пробовал через языковый файл но появляется только после обновления страницы)

более 2х товаров - Наемся (вообще не понимаю как)

Заранее спасибо за помощь.

 

Share this post


Link to post
Share on other sites
Цитата

 

Блин, парни, откуда такая любовь удалять гланды через задний проход?

Чуть теории.

Манипуляции с содержимым виджета корзины происходят с помощью функций add и remove контроллера catalog/controller/checkout/cart.php.
Если "не сложилось", например попытались добавить товар без обязательной опции, в ответе будет json['redirect'] на страницу товара.
Если все хорошо, в ответе json будет поле total, которое скрипт на странице подхватывает и вставляет как текст в виджет корзины.
 

$json['total'] = ....

это оно.

По умолчанию, "из коробки" вывод формируется в виде "{количество} товаров - {сумма}", независимо от количества товаров и суммы, даже нулевого.
Если хочется, чтобы в зависимости от количества выводились разные надписи, то вместо коробочного единого текста делаете if или switch по

$this->cart->countProducts()

(это функция подсчета числа товаров в корзине) и там уже по вариантам количества ( ноль, не ноль, другие цифры) делаете свой вывод.
В итоге вместо дефолтного присваивания у вас будет конструкция вида:
Если А $json['total'] = ...
Если B $json['total'] = ....
и т.д.

Можно добавить в языковый файл корзины разных текстов и их использовать для таких случаев.

Вышеизложенное для опенкарта из коробки. Если стоит тема и что-то правит по-своему, надо разбирать ее и править по тому же принципу

  • +1 1

Share this post


Link to post
Share on other sites

Спасибо. А можно пример строки привести, чего то у меня не получается(( Я так понял что после

Цитата

$data['text_items'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));

Нужно добавить 

Цитата

if ($json['total'] = 0) {$data['text_items'] = ' Останусь голодным ';}

if ($json['total'] = 1) {$data['text_items'] = ' Немного подкреплюсь ';}

Понимаю, что что-то не так. Я не силен в функциях

Заранее спасибо

Edited by vadim

Share this post


Link to post
Share on other sites

Правильно поняли, что "что-то не так" $json['total'] - это не число товаров в корзине, а уже отформатированная строка ответа " Икс товаров на Игрек тугриков". Число товаров в корзине - это $this->cart->countProducts(), код который вам нужен должен выглядеть где-то так. if($this->cart->countProducts() == 0) $json['total'] = ... if($this->cart->countProducts() == 1) $json['total'] = ... Обратите внимание, сравнение в php не =  (как у вас в коде - это присвоить значение), а == $data['text_items'] - это, тащем-та, тот самый шаблон, вида "%s товаров - %s денег". Он вообще не для правки в коде :) На вашем месте я бы вообще определил в языковом файле language/(язык)/checkout/cart.php несколько текстов для разных вариантов: $_['text_items1'] = "%s товаров - %s денежных единиц. Немного подкреплюсь" и использовал бы их. Например:if($this->cart->countProducts() == 1) $json['total'] = sprintf($this->language->get('text_items1'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total)); Что делает этот код: если число товаров в корзине равно единице, то в заполняет места в шаблоне (первый аргумент функции sprintf, до первой запятой) для подстановки ( %s ) параметрами. Первый - от первой до второй запятой в функции sprintf (второй аргумент) считает число товаров и купонов, второй - после второй запятой (третий аргумент), сумма. Если не нужен вывод числа товаров, суммы - правите шаблоны и убираете из sprintf ненужные параметры.

Edited by Engineer
  • +1 1

Share this post


Link to post
Share on other sites

Новый форум - это нечто. Полностью сожрало разметку. Попробую повторить. Правильно поняли, что "что-то не так" $json['total'] - это не число товаров в корзине, а уже отформатированная строка ответа " Икс товаров на Игрек тугриков". Число товаров в корзине - это $this->cart->countProducts(), код который вам нужен должен выглядеть где-то так Например: if($this->cart->countProducts() == 0) $json['total'] = ... if($this->cart->countProducts() == 1) $json['total'] = ... Обратите внимание, сравнение в php не =  (как у вас в коде - это присвоить значение), а == $data['text_items'] - это, тащем-та, тот самый шаблон, вида "%s товаров - %s денег". Он вообще не для правки в коде :) На вашем месте я бы вообще определил в языковом файле language/(язык)/checkout/cart.php несколько текстов для разных вариантов вида: $_['text_items1'] = "%s товаров - %s денежных единиц. Немного подкреплюсь" и использовал бы их.if($this->cart->countProducts() == 1) $json['total'] = sprintf($this->language->get('text_items1'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total)); Что делает код: если число товаров в корзине равно единице, то в заполняет места в шаблоне (первый аргумент функции sprintf, до первой запятой) для подстановки ( %s ) параметрами. Первый - от первой до второй запятой в функции sprintf (второй аргумент) считает число товаров и купонов, второй - после второй запятой (третий аргумент), сумма. Если не нужен вывод числа товаров, суммы - правите шаблоны и убираете из sprintf ненужные параметры.

Share this post


Link to post
Share on other sites

Поделюсь решением для своего текста в корзине, может кому пригодится. Огромное спасибо Engineer за решение и подсказки.

Править нужно 4 файла

catalog|controller/common/cart.php

catalog/controller/checkout/cart.php

catalog/language/russian/checkout/cart.php

catalog/language/russian/common/cart.php

добавляем в оба языковых файла catalog/language/russian/checkout/cart.php и catalog/language/russian/common/cart.php например текст, который нам нужно у видеть в корзине:

Цитата

$_['text_items_1']   = ' Немного подкреплюсь <br> В Вашей корзине <br> (%s)товаров на - %s';
$_['text_items_2']   = ' Наемся от пуза =) <br> В Вашей корзине <br> (%s)товаров на - %s';

$_['text_empty']      = 'В корзине пусто <br> Останусь голодным =(';

в файл catalog|/controller/common/cart.php

Цитата

после $data['text_empty'] = $this->language->get('text_empty');

добавляем

$data['text_items_1'] = $this->language->get('text_items_1');

$data['text_items_2'] = $this->language->get('text_items_2');

а после 

$data['text_items'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));

добавляем

if ($this->cart->countProducts() == 0) { $data['text_items'] = sprintf($this->language->get('text_empty'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));}
        if ($this->cart->countProducts() == 1) { $data['text_items'] = sprintf($this->language->get('text_items_1'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total)); }

        if ($this->cart->countProducts() >1) { $data['text_items'] = sprintf($this->language->get('text_items_2'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total)); }

в файле catalog/controller/checkout/cart.php

Цитата

после

$json['total'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));

добавляем

if ($this->cart->countProducts() == 0) { $json['total'] = sprintf($this->language->get('text_empty'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));}

if ($this->cart->countProducts() == 1) { $json['total'] = sprintf($this->language->get('text_items_1'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));}
        if ($this->cart->countProducts() > 1) { $json['total'] = sprintf($this->language->get('text_items_2'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total)); }

Как то так  у меня все получилось

Edited by vadim

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.