new

ms3Favorites

Создание списков избранного для MODX Revolution 3 и MiniShop3
Автор дополнения
Ivan Bochkarev
Пакетов
9
Закачек
63
Обычно отвечает в течение 2 часов
Автор дополнения
Пакетов
9
Закачек
63
Обычно отвечает в течение 2 часов
Версия 1.1.0-pl
Дата выпуска 03.04.2026
Загрузки 8
Просмотры 232
Внимание, этот компонент требует PHP 8.1 или выше!
Внимание, этот компонент требует MODX 3 или выше.
❤️ ms3Favorites — список избранного для MODX Revolution 3 и MiniShop3

Пользователи сохраняют товары и ресурсы в избранное, возвращаются к покупке позже, делятся списком по ссылке и оформляют заказ с страницы /wishlist/. Данные в браузере (localStorage или cookie), синхронизация в БД для авторизованных и гостей (по настройкам). Рост вовлечённости, повторных визитов и конверсии.

Это дополнение для тех, кому нужно:
  • несколько списков (подарки, планы покупок, свои имена) с лимитом через системные настройки
  • шаринг уникальной ссылкой /wishlist/share?token=… и копирование чужого списка к себе
  • полноценная страница wishlist с табами, toolbar (ms3FavoritesIdspdoPagems3Favorites)
  • добавление выбранных позиций или всего списка в корзину MiniShop3 одним действием
  • заметки к позициям (комментарии) в карточках, с сохранением локально и в БД
  • единый сценарий для разных типов контента через resource_type (товары MS3, ресурсы, статьи и др.)

✨ Ключевые возможности
  • Кнопка избранного data-favorites-toggle, счётчик data-favorites-count, выбор списка (tplFavoritesListSelector)
  • Уведомления: свой ms3fConfig.notifyms3Message (MiniShop3) → iziToast (при необходимости подгружается из пакета)
  • Сниппеты: ms3Favorites, ms3FavoritesIds, ms3FavoritesPage, ms3FavoritesShare, ms3fLexiconScript
  • AJAX-коннектор: sync, шаринг, комментарии, корзина, очистка, популярность. HTML-вывод списка для ms3Favorites.render()
  • Интеграция с mxQuickView и mFilter (обновление состояния кнопок после подгрузки контента)

🛒 MiniShop3
  • Вывод списка через msProducts и pdoTools
  • Действие add_to_cart в коннекторе: чекбоксы и кнопки «в корзину» на странице wishlist
  • Совместимость с типичной витриной без навязывания вёрстки магазина

🔒 Надёжность на фронте
  • Настраиваемые лимиты, TTL гостей и срок жизни ссылок шаринга

🚀 Быстрый старт
  1. Установите пакет через Extras → Installer
  2. Подключите [[!ms3fLexiconScript]], CSS и favorites.js из assets/components/ms3favorites/
  3. Разметьте кнопки: data-favorites-toggle, data-id, при необходимости data-list и data-resource-type
  4. Страницу списка выведите сниппетом ms3FavoritesPage: пагинацию и каталог — по интеграции на docs.modx.pro

📋 Требования
  • MODX Revolution 3.0.3+
  • PHP 8.1+
  • MiniShop3 1.0+
  • pdoTools 3.x (рекомендуется для вывода списков и Fenom)

Официальная документация:

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[1.1.0] - 2026-04-03

Added

  • JS API getTotalCount(resourceType?): без аргумента — суммарное число элементов во всех типах и списках; с аргументом (например 'products') — сумма по всем спискам указанного resource_type. Совпадает с логикой счётчика [data-favorites-count].
  • События ms3f:added, ms3f:removed, ms3f:listCleared: в detail добавлены поля countInList, totalByType, totalAllTypes (состояние после сохранения в storage) — для empty state и кастомного UI без ручного обхода данных.

Changed

  • updateCounter() использует getTotalCount() внутри.
  • Лексикон RU/EN: формулировки «желаемое» → «избранное»; в чанках — вызов лексикона через Fenom {'key' | lexicon}.
  • favorites.css: hover вторичных кнопок тулбара страницы избранного — рамка и текст #111 (не акцентный красный).

[1.0.1] - 2026-03-27

Changed

  • Инлайн-скрипты чанков tplFavoritesPage, tplFavoritesSharePage: объявления var заменены на const / let.

Fixed

  • Сниппет ms3fLexiconScript: при повторном разборе вывода через Fenom (pdoTools) объектный JSON после =` воспринимался как тег шаблона (ошибка у `{"empty":). В строке скрипта добавлены пробелы после { и перед } в JSON-объектах и вокруг =` / `||, чтобы Fenom не ломал разметку.

[1.0.0] - 2026-22-03

Added

  • Snippet ms3Favorites: вывод списка товаров из Wishlist по ID (MiniShop3 msProducts, pdoTools)
  • Snippet ms3fLexiconScript: лексикон и конфиг для фронта (window.ms3fLexicon, window.ms3fConfig)
  • Connector (POST): assets/components/ms3favorites/connector.php — HTML списка, action=sync для синхронизации
  • JS (wishlist.js): localStorage/cookie, toggle add/remove через data-wishlist-toggle, toast-уведомления
  • Счётчик [data-wishlist-count]
  • Chunks: tplWishlistItem (карточка с кнопкой удаления), tplWishlistEmpty (empty state с CTA)
  • System settings: ms3favorites.max_items, ms3favorites.storage_type
  • CSS: BEM ms3f, CSS-переменные, toast, mobile-first
  • Sync service: Ms3favoritesSyncService для авторизованных пользователей
  • Несколько списков: default, gifts, plans и кастомные; dropdown выбора при добавлении (tplWishlistListSelector); БД: колонка list_name, unique (user_id, product_id, list_name).
  • Шаринг списка: уникальная ссылка /wishlist/share?token=xxx; таблица ms3favorites_shares; сниппет ms3FavoritesShare; кнопка [data-wishlist-share]; action=create_share, get_share, copy_share.
  • Срок хранения для гостей: настройка ms3favorites.guest_ttl_days; колонки session_id, is_guest; резолвер очищает старые записи при upgrade.
  • Страница /wishlist/: сниппет ms3FavoritesPage, чанки tplWishlistPage, tplWishlistPageItem; табы списков, toolbar; серверная пагинация — отдельно pdoPage + ms3Favorites.
  • Интеграция с корзиной MiniShop3: action=add_to_cart; кнопки «Добавить все в корзину», «Добавить выбранные»; checkbox [data-wishlist-cart-checkbox].
  • Комментарии к позициям: колонка comment в ms3favorites_items; textarea [data-wishlist-comment]; action=update_comment; сохранение в localStorage и БД.
  • Новые настройки: guest_ttl_days (30), share_ttl_days (90), max_lists (10).
  • Share service: Ms3favoritesShareService; расширен Sync service для list_name.
  • Лексиконы: ms3favoriteslist, ms3favoritesshare, ms3favorites_copy_to_my_list, ms3favorites_add_to_cart, ms3favoritescomment*.
  • Поддержка любых ресурсов (resource_type): products, resources, articles, pages, custom. Adapter layer (ProductAdapter, ResourceAdapter), AdapterFactory. Сниппеты ms3Favorites, ms3FavoritesPage, ms3fLexiconScript принимают resource_type.
  • Режим удаления mode="list": data-favorites-mode="list", обёртка .ms3f-parent — при удалении скрывается вся карточка, при пустом списке показывается empty state.
  • Интеграция mxQuickView: подписка на mxqv:loaded и mxqv:open, вызов updateButtonStates() после загрузки модалки.
  • Интеграция mFilter: MutationObserver на контейнер результатов ([data-mfilter-results], .mfilter-results), ms3fConfig.mfilterContainer для кастомного селектора.
  • Плейсхолдер ms3f.total: серверный счётчик для авторизованных. Функция ms3f_get_total_for_current_user().
  • Опция сортировки sortBy: added_at_desc (по умолчанию) или added_at_asc в ms3FavoritesPage.
  • Раздел «Устранение неполадок» в INTEGRATION.md: порядок скриптов, типичные проблемы, пример условного вывода для гостей.
  • Хранение гостей в БД: при sync гости сохраняются по session_id (user_id=0, is_guest=1). Серверный счётчик ms3f.total и страница /wishlist/ для гостей из БД. Настройка ms3favorites.guest_db_enabled; CLI cleanup_guests.php для cron по TTL.
  • Чанк tplCatalogRowMs3f и пример «каталог + pdoPage + msProducts + счётчик и кнопка в строке» в INTEGRATION.md §5.2 и QUICK-START.md (аналог типового примера из документации сторонних дополнений избранного).

Changed

  • Sync API: теперь передаётся lists (объект {default:[ids], gifts:[ids]}) вместо плоского ids; обратная совместимость при legacy ids.
  • localStorage/cookie: структура {lists: {...}, comments: {...}}.
  • JS API: add(id, list), remove(id, list), getList(name), getAllLists(), switchList(name), createShare(list), copyFromShare(token), addToCart(ids), updateComment(id, list, comment).
  • Sync: getResourceIds(), saveToDb() с resource_type.
  • Connector: resource_type в sync, render, update_comment, copy_share.
  • wishlist.js: _resourceType, resource_type в sync/render; update_comment и copyFromShare передают resource_type.
  • Уведомления: вместо встроенного DOM-toast используется iziToast: при отсутствии на странице библиотеки она один раз подгружается из assets/components/ms3favorites/vendor/izitoast/ (URL в ms3fConfig.iziToastBaseUrl из сниппета ms3fLexiconScript). Цепочка: опционально ms3fConfig.notify (возврат true — полностью своё UI) → window.ms3Message.show (MiniShop3) → глобальный iziToast → ленивая загрузка. Удалены системная настройка ms3favorites.use_minishop3_toast и кастомные классы .ms3f__toast в CSS пакета.

Fixed

  • Счётчики табов на странице wishlist: getAllLists() без типа объединял списки всех resource_type; вкладки показывали лишние элементы при пустом списке текущего типа. В чанке страницы передаётся data-resource-type и getAllLists(pageResourceType).

Последние обсуждения в сообществе MODX.pro