ms3Favorites — избранное для MODX Revolution 3 и MiniShop3
Есть решение

Пользователи сохраняют товары и ресурсы в избранное, возвращаются к покупке позже, делятся списком по ссылке и оформляют заказ со страницы /wishlist/. Список хранится в браузере (localStorage или cookie), при необходимости синхронизируется с БД для авторизованных и гостей — по системным настройкам. Это помогает удерживать вовлечённость, повторные визиты и конверсию без навязанной вёрстки витрины.
Это дополнение для тех, кому нужно:
- несколько именованных списков (подарки, планы покупок и свои названия) с лимитом через настройки пространства имён ms3favorites;
- шаринг по уникальной ссылке /wishlist/share?token=… и копирование чужого списка к себе;
- страница избранного на ms3FavoritesPage: табы, панель действий, для товаров по умолчанию — SSR в чанке (pdoPage + msProducts); для кастомных сценариев — цепочка ms3FavoritesIds → pdoPage → ms3Favorites (или снова msProducts);
- добавление в корзину MiniShop3: весь список или только отмеченные позиции;
- заметки к позициям в карточках (включается настройкой), с сохранением через коннектор;
- единый сценарий для разных типов контента через resource_type (товары MS3, ресурсы, статьи, страницы и др.).
✨ Ключевые возможности
- кнопка избранного с data-favorites-toggle, счётчик data-favorites-count, выбор активного списка (tplFavoritesListSelector / сниппет ms3FavoritesLists);
- уведомления по цепочке: свой ms3fConfig.notify → ms3Message (MiniShop3) → iziToast (при необходимости подгружается из пакета);
- режим списка data-favorites-mode=«list» и обёртка карточки .ms3f-parent — скрытие всей карточки при удалении из избранного;
- сниппеты: ms3FavoritesBtn, ms3FavoritesCounter, ms3Favorites, ms3FavoritesIds, ms3FavoritesPage, ms3FavoritesShare, ms3FavoritesPopularity, ms3fLexiconScript;
- AJAX-коннектор: sync, шаринг и копирование, комментарии, корзина, очистка, популярность; HTML-вывод списка для ms3Favorites.render();
- плейсхолдер ms3f.total для серверного счётчика; на странице списка доступна настройка порядка через параметры ms3FavoritesPage;
- интеграция с mxQuickView и mFilter (актуализация кнопок после подгрузки контента);
- лексикон RU/EN, BEM-префикс ms3f, CSS-переменные, адаптивная вёрстка блока списка.
- вывод избранного через msProducts и pdoTools — по документации и готовому чанку tplCatalogRowMs3f для строки каталога;
- действие add_to_cart в коннекторе; на /wishlist/ — чекбоксы и кнопки массового добавления в корзину;
- гибкая кастомизация чанков и стилей под уже существующую витрину.
- изменяющие запросы к коннектору — с заголовком X-Requested-With: XMLHttpRequest;
- настраиваемые лимиты элементов и списков, TTL записей гостей и срок жизни ссылок шаринга (см. настройки ms3favorites.*).
- Установите пакет через Extras → Installer (репозиторий ModStore; заранее установлены MiniShop3 и pdoTools).
- Подключите [[!ms3fLexiconScript]], затем CSS и favorites.js из assets/components/ms3favorites/.
- Разметьте кнопки: data-favorites-toggle, data-id, при необходимости data-list и data-resource-type.
- Страницу списка выведите сниппетом [[!ms3FavoritesPage]]; пагинацию, каталог и нестандартные страницы — по интеграции на docs.modx.pro.
- Настройки → Очистить кэш.
- MODX Revolution 3.0+
- PHP >=8.2
- MiniShop3 (актуальная установка для вашего проекта)
- pdoTools 3.x (рекомендуется для вывода списков и Fenom)
Дополнение в магазине Modstore
Демо сайт будет готов в течении нескольких дней.
Комментарии: 4
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Но почему-то не могу поставить «плюс» к этой заметке, да и к другим тоже)) Стрелки не активны
Если будут проблемы — пишите
[1.1.9] — 2026-10-25
Fixed
- «Скопировать в мой список»: клик обрабатывает favorites.js, отдельный скрипт на странице не нужен. Если в data-token пусто (в шаблоне страницы нет переменной {$token}), токен берётся из ?token= в адресе. Пустой токен больше не проходит молча: показывается «Не удалось скопировать список»
[1.1.8] — 2026-10-22Fixed
- Страница шаринга: кнопка «Скопировать в мой список» вызывает copy_share и добавляет товары чужого списка в своё избранное. Раньше клик создавал ссылку на список посетителя. Тип ресурсов берётся из записи шаринга. Для гостя пишется только целевой список. Тост после успеха: «Список скопирован»
[1.1.7] — 2026-10-20Fixed
- Страница /wishlist/: удаление одной карточки больше не снимает обёртку всего списка. msProducts в tplFavoritesPage показывает неопубликованные и товары с нулевой ценой, как адаптер списка, чтобы число на вкладке совпадало с карточками
- ms3FavoritesBtn remove: remove=1 перезагружает страницу, другое значение удаляет элемент #префикс-{id}
- ms3FavoritesCounter: чанк пишет data-list и data-resource-type. После загрузки favorites.js счётчик остаётся по списку и типу вызова. Голый счётчик без атрибутов по-прежнему суммирует все типы
- ms3favorites.max_items: пустой limit у ms3Favorites и пустой pageLimit у ms3FavoritesPage берут настройку. Явный параметр в вызове по-прежнему важнее. Потолок 100
- ms3favorites.max_lists: sync режет списки так же, как браузер: min(настройка, 20). У авторизованного пользователя списки сверх потолка удаляются из БД, у гостя набор перезаписывается целиком
- ms3FavoritesShare: живой токен с пустым списком выводит emptyTpl. «Список не найден» остаётся для отсутствующего и просроченного токена
- Тосты без window.ms3fLexicon: запасной русский текст, а не ключ ms3favorites_*
- Changed
- Описание storage_type: cookie привязана к текущему хосту (path=/, SameSite=Lax, 30 дней), без общего домена поддоменов
- Описание max_lists: дефолт 10, потолок 20
[1.1.6] — 2026-10-20Added