Есть ли возможность проверить, что товар добавлен в список "Избранное"

В шаблоне имеется иконка, которая является кнопкой добавления в “Избранное”. Есть ли возможность проверить, что товар находится в списке “Избранное”? Чтобы скажем изменить цвет иконки, чтобы пользователь видел, что данный товар находится у него в желаниях.

Можно такой вариант. Включите модуль “Мои изменения” и создайте файл по такому пути:

ТЕМА/templates/addons/my_changes/hooks/index/scripts.post.tpl

В файл вставьте код:

{if ($runtime.controller == "products" && $runtime.mode == "view")}
    <script type="text/javascript">
        $(document).bind('ready ajaxComplete', function(){
            $('.ty-add-to-wish').click(function(){
                $(this).css('background', '#4fbe31');
            });
        });
    </script>
    {foreach $smarty.session.wishlist.products as $in_wl}
        {if $in_wl['product_id'] == $product.product_id}
            <script type="text/javascript">
                $(document).bind('ready ajaxComplete', function(){
                    $('.ty-add-to-wish').css('background', '#4fbe31');
                });
            </script>
        {/if}
    {/foreach}
{/if}

Почистите кэш.

Это самый быстрый и бюджетный вариант, помогающий избежать проблем с кэшированием подсвеченной кнопки.

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

Цвет кнопки можете выбрать самостоятельно.

Для UniTheme 2 вместо класса .ty-add-to-wish надо использовать .ut2-pb__wrapper .ut2-pb__button .ut2-add-to-wish

6 лайков

Спасибо!!!

а если вместо этого

прописать так

.html(‘В избранном’);
то будет выводиться надпись “В избранном”

2 лайка

А “Уже в корзине” можно так сделать? Просто $smarty.session.wishlist на $smarty.session.cart поменять?

{if ($runtime.controller == "products" && $runtime.mode == "view")}
<script type="text/javascript">
    $(document).bind('ready ajaxComplete', function(){
        $('.ty-btn__add-to-cart').click(function(){
            $(this).html('в корзине');
        });
    });
</script>
{foreach $smarty.session.cart.products as $in_wl}
    {if $in_wl['product_id'] == $product.product_id}
        <script type="text/javascript">
            $(document).bind('ready ajaxComplete', function(){
                $('.ty-btn__add-to-cart').html('в корзине');
            });
        </script>
    {/if}
{/foreach}{/if}
{if ($runtime.controller == "products" && $runtime.mode == "view")}
<script type="text/javascript">
    $(document).bind('ready ajaxComplete', function(){
        $('.ty-add-to-wish').click(function(){
            $(this).html('в избранном');
        });
    });
</script>
{foreach $smarty.session.wishlist.products as $in_wl}
    {if $in_wl['product_id'] == $product.product_id}
        <script type="text/javascript">
            $(document).bind('ready ajaxComplete', function(){
                $('.ty-add-to-wish').html('в избранном');
            });
        </script>
    {/if}
{/foreach}{/if}

вроде бы как работает… :slight_smile:
Кто бы подсказал как сделать чтобы кнопка в корзине стала некликабельной…

3 лайка

Для проверки товара в корзине можно попробовать такой код:

{foreach $smarty.session.cart.products as $in_cart}
	{foreach $products as $p_ids}
		{if $in_cart['product_id'] == $p_ids['product_id']}
			<script>
				...
			</script>
		{/if}
	{/foreach}
{/foreach}

Сложнее всего прикрутить это все на страницу категорий из-за ajax-загрузок (фильтры, сортировка, комбинации), из-за которых проверку smarty-условий надо заново запускать, иначе скрипт перестает подсвечивать кнопку без полной перезагрузки страницы. Тут только редактировать другие шаблоны, чтоб блок с кодом обновлялся после ajax-запросов.
На странице товаров все гораздо проще в этом плане.

Актуальнее и лучше будет посмотреть на этот бесплатный модуль, там реализовано отключение кэша после добавления в корзину товара: https://www.ecom-labs.ru/cs-cart-multi-vendor-moduli/cs-cart-modul-kolichestvo-tovara-v-korzine.html

1 лайк

Я пробовал этот модуль. Как я помню, он не работает с вариациями в Категориях совместно с модулем Переключение Вариаций. Щёлкаю по разным вариациям, а количество не меняется.

Попробывал и на страницу категорий прикрутить,вроде как работает.
в
$runtime.controller == “products”
products заменил на categories.

1 лайк

Это только до обновления страницы. Как только покупатель перейдёт на следующую страницу и вернётся обратно - изменения пропадают. К сожалению.
Если удалить этот товар в миникорзине, то надпись не обновляется. На Быстром просмотре тоже не работает. При переключении между размерами в Вариации как один товар.

@albinoz, можно ли этот код оформить отдельным скриптом и пристёгивать вместе с другими на страницу?

<button disabled>...</button>

Чтоб все работало на страницах категорий, надо вносить изменения в шаблоны common/pagination.tpl, common/sorting.tpl, /views/products/components/sorting.tpl, в которых нет хуков и править только напрямую/оверрайдом.

В эти шаблоны, в атрибуты data-ca-target-id надо добавить div-контейнер, который надо обновлять после ajax-загрузки (переходы по страницам, сортировка, тип отображения), соответственно сам код со скриптом должен полностью быть в этом div-контейнере (который, в свою очередь, лучше вставить в блок с поддержкой smarty, чтоб для него не было кэширования).

К сожалению, в двух строчках тут не расписать, да и не уверен, что стоит так жестко костылить.