Проверка товаров на наличие в корзине из категории

Здравствуйте. Подскажите пожалуйста… я использую $smarty.session.cart.products для определения наличия товара из категории в корзине.

При добавлении товара в корзину, данные карты обновляются, а данные переменной конечно же нет.

Но при обновлении страницы данные $smarty.session.cart.products тоже не меняются, только при очистке кеша. Где взять актуальные данные? Или подскажите пожалуйста в какую сторону копать?

При добавлении в корзину происходит обновление данных без перезагрузки по AJAX.

Что можно попробовать сделать.

Ваш код обернуть в следующий контейнер:
<div id="cart_status_update_my_block">
{if $smarty.session.cart.products} Товары есть в корзине {else}В корзине пусто{/if}
<!--cart_status_update_my_block--></div>

По идентификатору cart_status* как раз должен обновиться контейнер.

Благодарю за быструю реакцию.
Дело в том что я выбираю product_id 's для их дальнейшего сравнения с id товаров в категори.
Вот кусок кода:

{foreach from=$smarty.session.cart.products item=p}
{$p.product_id}

{/foreach}

Сейчас я его вывожу в верху страницы категории просто чтоб видеть результат.
Понимаю что при добавлении по нажатию на кнопку “В корзину” происходит Ajax запрос.
Немогу понять почему при обновлении этой же страницы (через F5 или Ctrl+R) данные не обновляются.
Подскажите пожалуйста как это решить?

Оберните код в контейнер, должно сработать

<div id="cart_status_update_my_block">
{foreach from=$smarty.session.cart.products item=p}
{$p.product_id}

{/foreach}
<!--cart_status_update_my_block--></div>

Комментарий cart_status_update_my_block перед div !не удаляйте

Прошу прощения если мои вопросы выглядят тупо. Я недавно взялся за CS-Cart и еще слабо ориентируюсь в нём. Изучать приходится прямо в процессе.

Вставляю вышеуказанный код без изменений в grid_list.tpl перед < div class=“grid-list” >, пробую добавить товар в карзину, после чего обновляю страницу, но результат остается прежним. При этом если я сменю категорию результат обновляется. А при возвращении в категорию из которой ушел результат возвращается к прежнему (старому) значению.

Находил по данной похожей теме ветку на форуме, но ненашел решения.

Вопросы выглядят вполне нормально :slight_smile:

Может кэш. Посмотрите настройку в разделе Темы
http://joxi.ru/l2Z5DVDuw4DQZm

Поставьте ползунок на ON
и еще раз проверьте данные на сайте

В таком варианте работает как нужно. Правда разработчики предупреждают что это надо в дальнейшем отключить.

Но как тогда получать обновленный список товаров в карзине? Ведь пользователь может оставаясь на этой же странице и обновив её получить некорректный результат (кнопку “В корзину” вместо “уже в корзине” ).

Если это как-то поможет вот ссылка: https://spclimate.ru/kondicionery/
Прямо после блока сортировки, если товары есть в корзине, выводятся их id.
Добавляя (или удаляя) товары и после этого обновляя страницу, результат остается прежним.
Это кажется немного странным, потому что после обновления страницы (например через F5) блок корзины получает актуальные данные.
Возможно есть способ брать (или пердавать) именно те данные?

UPD^ Обратил внимание что при удалении товара из корзины список категории обновляется сразу, а при добавлении товара такого обновления не происходит. (Это при всё включенном АвтоОбновлении)

При удалении из корзины блок обновляется http://joxi.ru/MAjyXMXs45RPE2
При добавлении в корзину, - почему-то нет, надо тестировать варианты.

Что-то прерывается, при добавлении в корзину, не видны значки удаления товара (только после перезагрузки страницы)

Кнопка “В корзину” была прописана ссылкой, не подключением темплейта кнопки. Это связанно именно с этим. Так как обычный вызов кнопки добавления отчего-то не реагировал никаким образом на нажатия.

Где-то в соседней ветке я просил чтоб мне помогли с этой проблемой разобраться и рабочим оказался только такой вот вариант.

<a data-ca-target-id=“cart_status*” href="{“checkout.add…$obj_id”|fn_url}" class=“ty-btn__primary cm-post cm-ajax cm-ajax-full-render”>{__ (‘add_to_cart’)}

А если так? (только, наверное, стили съедут…)

<button id="button_cart_{$obj_id}" class="ty-btn__primary cm-form-dialog-closer ty-btn" type="submit" name="dispatch[checkout.add..{$obj_id}]">{__ ('add_to_cart')}</button>

Надо тестировать, искать варианты. Блок id=“cart_status_update_my_block” обновляется, надо искать баг при добавлении товара в корзину

Мне очень жаль что я отнимаю ваше время.
Дело в том что подобный код (сейчас я его вставил вместо “своей” кнопки) вообще не реагирует на нажатия мышью.

Он не будет реагировать, т.к в классах отсутствует cm-post cm-ajax cm-ajax-full-render и data-ca-target-id=“cart_status*”

Скажите, а чего вы в итоге хотите добиться? Какого поведения на странице?

Добавляем товары в корзину, при этом кнопку выбраного товара меняем на " Уже в корзине" (сейчас отключено).
При обновлении страницы кнопка у товара который добавлен в корзину, должна оставаться “Уже в корзине”.

Пробую делать так как писал вначале ветки.
Для примера вывожу список id товаров которые в корзине из $smarty.session.cart.products (как в cart_content.tpl) но получаю старые данные которые обновляются только при очистке кеша.

Собственно мне нужно получить (после перезагрузки страницы) свежие данные из корзины.

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

И если я правильно понимаю это должно работать при выключенном Авто Обновлении файлов темы.

У вас проблема с кэшем. Посмотрите, как сделано в нашем бесплатном модуле

https://www.ecom-labs.ru/cs-cart-multi-vendor-moduli/cs-cart-modul-kolichestvo-tovara-v-korzine.html

1 лайк

Достаточно будет просто поменять текст кнопки?

{assign var="button_msg" value="add_to_cart"}
{foreach from=$smarty.session.cart.products item=p}
    {if $product.product_id == $p.product_id}
        {assign var="button_msg" value="Already in cart"}
    {/if}
{/foreach}
<ваш код ссылки которая вместо кнопки работает>{$button_msg}</a>

А… Ну еще при нажатии текст поменять

Спасибо. Сейчас скачаю, буду смотреть.

Этого было бы достаточно, но к сожалению дело в том, что $smarty.session.cart.products после добавления товара в корзину остается прежним и после обновления страницы. Т.е. если я добавлю товар и обновлю страницу, кнопка снова будет по “В корзину”. Сама корзина обновляется и после перезагрузки страницы всё в ней отображается верно. А в нижней части (в сетке категории) остается информация которая и была.

Попробовал вставить таким образом:

< button id=“button_cart_{$obj_id}” class=“ty-btn__primary cm-form-dialog-closer ty-btn cm-post cm-ajax cm-ajax-full-render” type=“submit” name=“dispatch[checkout.add…{$obj_id}]” data-ca-target-id=“cart_status*” >{__ (‘add_to_cart’)}< /button >

Реакция по прежнему нулевая. В файле шаблона show_add_to_cart = true

Этот параметр указыввет id блока который должен обновляться. У Вас получается обновляется только блок с id = cart_status
<div id="cart_status">
<!--cart_status--></div>

Вам нужно заключить часть кода шаблона в котором переопределяется это значение в
<div id="cart_status">
<!--cart_status--></div>
Либо с другим id но тогда нужно в кнопке прописать data-ca-target-id=“cart_status*,my_id”

Ну и конечно если в фале шабона включается другой файл через include и явно передается параметр show_add_to_cart = true то Вам нужно перезаписать этот файл с show_add_to_cart = $my_var и передавать в него актуальный флаг - true или false

UPD. Примечание data-ca-target-id - не вешается на button. У Вас тип submit - отправка формы. Поэтому в форме нужен <input type="hidden" name="result_ids" value="cart_status*,my_id" />
https://www.cs-cart.ru/docs/4.4.x/developer_guide/core/front-end/custom_attributes.html