Если пользователь не авторизован, создается кука и избранные товары в ней хранятся, после авторизации пользователя товары перебрасываются в свойство пользователя и хранятся там. Кука уничтожается
ИНСТРУКЦИЯ ПО УСТАНОВКЕ И НАСТРОЙКЕ МОДУЛЯ 1С-БИТРИКСЗайти в административную панель 1С-Битрикс и перейти в раздел «Marketplace» -> «Установленные решения». Выбрать модуль «Модуль избранное (itserw.wishlist)» и нажать кнопку УСТАНОВИТЬ. http://prntscr.com/lsm8fs Далее мы попадаем на страницу настроек установки модуля http://prntscr.com/lsm8kc При отмеченной опции скопировать публичные файлы в публичную часть сайта будет добавлен раздел избранных товаров. Далее следует указать название папки с разделом избранных товаров. По умолчанию эта папка wishlist. И если такая папка уже существует на сайте, то отмеченная опция “Переписывать существующие файлы” - затрет все файлы из этой папки. После установки модуля появится сообщение о его успешной установке. Далее необходимо перейти к настройкам модуля
Настройки модуля расположены по пути
Настройки ->Настройки продукта->Настройки модулей->Модуль избранное
Основные настройки
Пользовательское свойство - задается идентификатор пользовательского свойства, в котором хранятся id товаров избранного
Идентификатор куки – в котором хранятся id товаров избранного
Вкладка доступ – устанавливается права доступа к модулю избранного.
http://prntscr.com/lsmcbq
И нажимаем сохранить
Далее выведем вывести компонент, где необходимо отображать список избранного
Добавим вызов компонента на все страницы сайта, в файл footer.php шаблона.
Для начала в публичной части сайта создадим тестовый раздел
http://prntscr.com/lsmeis
И из визуальной части редактора вызовем компонент и добавим необходимые настройки
http://prntscr.com/lsmeql
http://prntscr.com/lsmeu9
Далее перейдем к настройка
Все настройки можно оставить по умолчанию, кроме настроек тип информационного блока и код информационного блока, а так же настройки аякс По умолчанию пока только один шаблон для списка избранного, в след версии мы добавим несколько шаблонов. Но функционал модуля позволяет создать свой шаблон – индивидуальный под дизайн вашего сайта. Список можно расположить во всплывающем попап окне, в выезжающий плашках сайта или в любом произвольном месте сайта. Копируем код компонента и добавляем в произвольное место сайта
Пример
<?$APPLICATION->IncludeComponent("itserw:wishlist.list", "", Array( "AJAX_MODE" => "Y", "AJAX_OPTION_ADDITIONAL" => "", "AJAX_OPTION_HISTORY" => "Y", "AJAX_OPTION_JUMP" => "N", "AJAX_OPTION_STYLE" => "Y", "CACHE_GROUPS" => "Y", "CACHE_TIME" => "36000000", "CACHE_TYPE" => "A", "IBLOCKS" => "2", "IBLOCK_TYPE" => "catalog", "ITSERW_ACTION" => "action", "ITSERW_BTN_CLASS" => "itserw_wishlist", "ITSERW_BTN_CLASS_DELETE" => "itserw_wishlist_delete", "ITSERW_ID" => "id_w", "ITSERW_LINK" => "/wishlist/", "WIDTH_IMAGE" => "100", "HEIGHT_IMAGE" => "100", ) );?> |
Пример кода добавления кнопки для компонентов catalog.element, catalog.top и др.
В начале файла где будет располагаться кнопка добавляем псевдоним имени класса с помощью оператора use
use \Itserw\Wishlist\Favorites; |
<? if (CModule::IncludeModule("itserw.wishlist")): ?> <button class="button button--favorites itserw_wishlist js-add-to-wishlist-btn <? if (Favorites::getInstance()->getStorageObject()->isStorageValue(array($item['ID']))): ?>itserw_wishlist_added<? endif; ?>" data-id="<?= $item['ID'] ?>" data-action="add" data-product-id="<?= $item['ID'] ?>" data-toggle="tooltip" title="" data-original-title="<? if (!empty(Favorites::getInstance()->getStorageObject()->isStorageValue(array($item['ID'])))): ?><?= GetMessage('ITSERW_WISHLIST_TMPL_IN_FAVORITES') ?><? else: ?> <?= GetMessage('ITSERW_WISHLIST_TMPL_FAVORITES') ?><? endif; ?>"> <i class="fa fa-heart"></i> <span class="button__text"><? if (Favorites::getInstance()->getStorageObject()->isStorageValue(array($item['ID']))): ?><?= GetMessage('ITSERW_WISHLIST_TMPL_IN_FAVORITES') ?><? else: ?> <?= GetMessage('ITSERW_WISHLIST_TMPL_FAVORITES') ?><? endif; ?></span> </button> <? endif ?> |
<? if (CModule::IncludeModule("itserw.wishlist")): ?> <button class="button-favorite-default itserw_wishlist js-add-to-wishlist-btn <? if (Favorites::getInstance()->getStorageObject()->isStorageValue(array($arResult['ID']))): ?>itserw_wishlist_added<? endif; ?>" data-id="<?= $arResult['ID'] ?>" data-action="add" data-product-id="<?= $arResult['ID'] ?>"> <svg area-label="<?= GetMessage('ITSERW_WISHLIST_TMPL_FAVORITES') ?>" version="1.1"xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 446.171 446.171" style="enable-background:new 0 0 446.171 446.171;" xml:space="preserve" width="20" height="20"> <path class="svg-hard-bg" d="M399.151,81.241c42.841,40.751,42.841,106.057,0,146.808l-20.898,19.853L223.608,394.71 L68.963,247.902l-20.898-19.853c-42.841-40.751-42.841-106.057,0-146.808s111.804-40.751,154.645,0l20.898,19.853l20.898-19.853 C287.347,40.49,356.31,40.49,399.151,81.241z"/> <path class="svg-hard-border" d="M223.608,410.384c-3.657,0-7.837-1.567-10.971-4.18L37.094,239.543 C13.584,216.555,0,186.775,0,154.906s13.061-62.171,37.094-84.637c48.588-45.976,127.478-45.976,176.065,0l9.927,9.404l9.927-9.404 c48.588-45.976,127.478-45.976,176.065,0l0,0c24.033,22.465,37.094,52.767,37.094,84.637s-13.061,62.171-37.094,84.637 L234.58,406.204C231.445,408.816,227.265,410.384,223.608,410.384z M125.388,66.612c-24.033,0-48.065,8.882-66.351,26.122 c-17.763,16.718-27.167,38.661-27.167,62.171s9.927,45.453,27.167,62.171L223.608,373.29L388.18,217.078 c17.763-16.718,27.167-38.661,27.167-62.171s-9.927-45.453-27.167-62.171l0,0c-36.571-35.004-96.131-35.004-133.225,0 l-20.898,19.853c-6.269,5.747-15.673,5.747-21.42,0l-20.898-19.853C173.453,74.971,149.42,66.612,125.388,66.612z"/> </svg> </button> <? endif ?> |
Внимание! Идентификатор товара в кнопке должен быть реально существующего. Так как при добавлении товара модуль проверяет наличие товара в базе. И если не найдет, то добавления не произойдет. Используемые методы модуля описаны далее в документации пункта 6
<span id="js-favorite-prod-count"> <? Bitrix\Main\Page\Frame::getInstance()->startDynamicWithID("wishlist-count"); ?> <? if (CModule::IncludeModule("itserw.wishlist")) { echo \Itserw\Wishlist\Favorites::getInstance()->getCountValuesFromFavorites(); } ?> <? Bitrix\Main\Page\Frame::getInstance()->finishDynamicWithID("wishlist-count", ""); ?> </span> |
Компонент избранное при удалении и добавлении товара создает js событие wishlist, что позволяет изменять счетчик на лету. Пример добавления обработчика js события: Содержит данные количества элементов e.detail.COUNT, а так же массив элементов e.detail.ITEMS.
<script> window.addEventListener('wishlist', function (e) { $('#js-favorite-prod-count').text(e.detail.COUNT); }, false); </script> |
use \Bitrix\Main\Loader; use \Itserw\Wishlist\Favorites; if (Loader::includeModule('itserw.wishlist')) { //Получаем все товары $arFilter = Favorites::getInstance()->getStorageObject()->getStorageValue(); $GLOBALS['arFilter']['ID'] = $arFilter; } ?> <? if (count($arFilter)): ?> //Здесь вызов компонента например, bitrix:catalog.section <? endif; ?> |
interface dataStorageInterface { /** * Добавляет хранилище данных * @param array $value * @return mixed */ public function addStorage(array $value); /** * Удаляет хранилище данных * @return mixed */ public function deleteStorage(); /** * Проверяет, есть ли хранилище для данных * @return mixed */ public function isStorage(); /** * Добавляет значение в хранилище * @param array $values * @return mixed */ public function addStorageValue(array $values); /** * Удаляет значение из хранилища * @param array $values * @return mixed */ public function deleteStorageValue(array $values); /** * Получает данные из хранилища * @return mixed */ public function getStorageValue(); /** * Проверяет, есть ли передаваемые данные в хранилище * @param array $values * @return mixed */ public function isStorageValue(array $values); } |
Favorites::getInstance()->getStorageObject() |
Favorites::getInstance()->getStorageObject()->getStorageValue() |
OnBeforeValueCookieToPropertyMove |
OnAfterValueCookieToPropertyMove |
происходят в момент авторизации пользователя в системе, когда способ хранения данных в куках меняется на хранение в свойстве пользователя
Следующие группы событий работают непосредственно с добавлением или удалением данныхВызывается перед добавлением элемента в куку
$values - массив элементов
AddEventHandler("itserw.wishlist", "OnBeforeCookieFavoritesValueAdd", "MyBeforeCookieFavoritesValueAdd"); function MyBeforeCookieFavoritesValueAdd(&$values){ return false; } |
Вызывается перед удалением элемента из куки
AddEventHandler("itserw.wishlist", "OnBeforeCookieFavoritesValueDelete", "MyOnBeforeCookieFavoritesValueDelete"); function MyOnBeforeCookieFavoritesValueDelete(&$values){ $values = array(7); } |
Вызывается после добавления элемента в куку
AddEventHandler("itserw.wishlist", "OnAfterCookieFavoritesValueAdd", "MyAfterCookieFavoritesValueAdd"); function MyAfterCookieFavoritesValueAdd($values){ } |
Вызывается после удаления элемента из куки
AddEventHandler("itserw.wishlist", "OnAfterCookieFavoritesValueDelete", "MyOnAfterCookieFavoritesValueDelete"); function MyOnAfterCookieFavoritesValueDelete($values){ } |
Аналогичные функции, только если данные хранятся свойстве пользователя
AddEventHandler("itserw.wishlist", "OnBeforeCustomPropertyFavoritesValueAdd", "MyBeforeCustomPropertyFavoritesValueAdd"); function MyBeforeCustomPropertyFavoritesValueAdd(&$values){ return false; } AddEventHandler("itserw.wishlist", "OnBeforeCustomPropertyFavoritesValueDelete", "MyBeforeCustomPropertyFavoritesValueDelete"); function MyBeforeCustomPropertyFavoritesValueDelete(&$values){ $values = array(9); } AddEventHandler("itserw.wishlist", "OnAfterCustomPropertyFavoritesValueAdd", "MyAfterCustomPropertyFavoritesValueAdd"); function MyAfterCustomPropertyFavoritesValueAdd($values, $user){ } AddEventHandler("itserw.wishlist", "OnAfterCustomPropertyFavoritesValueDelete", "MyAfterCustomPropertyFavoritesValueDelete"); function MyAfterCustomPropertyFavoritesValueDelete($values, $user){ } |
Внимание! Повторная установка в демо-режиме приведет к окончанию демо‑режима и невозможности использовать модуль.