trubadan

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

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

trubadan    0

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

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

 

Вопрос 1.

 

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

cart_01.jpg

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

cart_02.jpg

 

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

 

Вопрос 2.

 

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

cart_03.jpg

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
specussa    0

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

Изменено пользователем specussa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
trubadan    0
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'];}

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Shureg    130

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

Можно попробовать аналогично $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'] там два раза встречается.

Изменено пользователем Shureg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
vadim    3

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

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

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

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

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Engineer    7
Цитата

 

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

Чуть теории.

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

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

это оно.

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

$this->cart->countProducts()

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
vadim    3

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

Цитата

$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'] = ' Немного подкреплюсь ';}

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

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

Изменено пользователем vadim

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Engineer    7

Правильно поняли, что "что-то не так" $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 ненужные параметры.

Изменено пользователем Engineer

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Engineer    7

Новый форум - это нечто. Полностью сожрало разметку. Попробую повторить. Правильно поняли, что "что-то не так" $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 ненужные параметры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
vadim    3

Поделюсь решением для своего текста в корзине, может кому пригодится. Огромное спасибо 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)); }

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

Изменено пользователем vadim

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу