Технические данные
- Опубликовано:
- 27.01.2019
- Обновлено:
- 04.04.2023
- Версия:
- 1.0.63
- Установлено:
- 100 - 499 раз
- Подходящие редакции:
- «Малый бизнес», «Бизнес»
- Адаптивность:
- Да
- Поддержка Композита:
- Да
- Совместимо с Сайты24
- Нет
- Совместимо с PHP 8.1
- Нет
Пользовательское соглашение
Описание
Для неавторизованного пользователя список товаров хранится в куках, после авторизации список хранится в специальном свойстве пользователя, которое добавляется при установке модуля.
Модуль содержит настройки прав пользователей.
Для взаимодействия с внешним кодом предусмотрены события:
1. При добавлении товара в избранное,
2. При удалении
3. При переносе списка из кук в свойство
Доступны публичные методы:
1. Добавлен ли товар в избранное (С учетом прав доступа или нет)
2. Количество товаров в избранном (С учетом прав доступа или нет)
3. Полный список добавленных товаров (С учетом прав доступа или нет)
Модуль содержит компонент, который выводит краткий список товаров.
Также при установке модуля автоматически создается раздел, где выводится список товаров с подробным описанием, ссылку на который пользователь может получить из краткого списка.
Компонент поддерживает технологию аякс. Содержит событие на изменения счетчика товара при добавлении или удалении товара из избранного. Данный счетчик можно расположить в любом месте сайта, в зависимости от дизайна.
1.0.63 (04.04.2023) | Иправления:
|
1.0.62 (26.01.2022) | Иправления:
|
1.0.61 (21.11.2020) | Улучшения:
|
1.0.5 (24.08.2020) | Иправления:
|
1.0.4 (29.05.2020) | Иправления:
|
1.0.3 (18.04.2020) | Улучшения:
Поэтому текущий, установленный на сайте затрется, eсли при внесенных изменений он не был переименован или скопирован в папку local |
1.0.2 (03.02.2020) | Исправлен баг при установке модуля |
Внимание, в версии 3 модуль полностью переписан, поэтому старые методы оставлены для совместимости. Документация предыдущих версий сохранена на сайте компании по ссылке https://itserw.ru/support/faq/187/.
Принцип работы
Если пользователь не авторизован, создается кука и избранные товары в ней хранятся, после авторизации пользователя товары перебрасываются в свойство пользователя и хранятся там. Кука уничтожается
ИНСТРУКЦИЯ ПО УСТАНОВКЕ И НАСТРОЙКЕ МОДУЛЯ 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
Далее перейдем к настройка
Все настройки можно оставить по умолчанию, кроме настроек тип информационного блока и код информационного блока, а так же настройки аякс По умолчанию пока только один шаблон для списка избранного, в след версии мы добавим несколько шаблонов. Но функционал модуля позволяет создать свой шаблон – индивидуальный под дизайн вашего сайта. Список можно расположить во всплывающем попап окне, в выезжающий плашках сайта или в любом произвольном месте сайта. Копируем код компонента и добавляем в произвольное место сайта
ПримерПосле необходимо также настроить раздел избранное. Фильтр товаров там уже добавлен. Следует только вывести по этому фильтру элементы. Можно с помощью компонента catalog.section, добавив параметр "FILTER_NAME" => "arFilterWishlist". Далее раздел тест можно удалить.<?$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 и др.
В начале файла где будет располагаться кнопка добавляем псевдоним имени класса с помощью оператора useuse \Itserw\Wishlist\Favorites;
Добавлен новый шаблон кнопки, работает с версии обновления 1.0.61<? 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
- Добавление счетчика избранных товаров в произвольное место сайта c помощью кода. Данный код представлен с поддержкой композита.
<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; ?> |
Модуль содержит 3 класса и 1 интерфейс.
Класс DataStorageCookie - если избранное хранится в куках, класс DataStorageProperty - если избранное хранится в свойстве.
Два этих класса наследуются от 1 и того же интерфейса (содержат одинаковые методы, но со своей логикой работы).
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); } |
Все классы построены по шаблону проектирования Singleton.
Вся работа происходит с классом Favorites.
Получаем хранилище данных избранного
Favorites::getInstance()->getStorageObject() |
Favorites::getInstance()->getStorageObject()->getStorageValue() |
Все события делятся на After и Before
Before вызываются до совершения действия и могут повлиять на результат - для отмены действия требуется вернуть false из функции.
Аfter - после
События
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){ } |