[msFavorites] - апгрейд компонента.

msFavorites — списки избранного.


— работа с любыми ресурсами
— работа с любыми пользователями

Основное отличие от ранних версий работа без каких либо сниппетов, нужно только инициализировать скрипт.
Интерактивные примеры тут msfavorites.vgrish.ru/



Основное


Вы можете использовать msFavorites где угодно на странице. Для этого нужно подключить сниппет
msFavorites.initialize, указать нужным элементам необходимые параметры вызова.

data-msfavorites-mode — режим работы,
list — список избранного, в данном режиме удаляется элемент избранного
data-data-list — список избранного, например default
data-data-id — идентификатор обрабатываемого ресурса


Особенности


Список избранного работает для все пользователей. Для авторизованных пользователей идентификатором
служит id пользователя, для неавторизованный id сессии. Избранному анонимных пользователей присваивается флаг
временный и проставляется метка создания, можно задать интервал (кол-во дней) жизни.



пример 2
Постановка:
— требуется вывести список избранного
— возможность удалить ресурс из списка избранного default
— вывести общий счетчик кол-ва в избранном

Вызов:
<div id="pdopage">
			<div class="rows">
			[[!pdoPage?
			&parents=`0`
			&element=`msProducts`
			&resources=`[[!msFavorites.ids]]`
			&tpl=`@INLINE
			<div class="msfavorites-parent">
			<a class="msfavorites"
			data-click
			data-data-id="[[+id]]"
			data-data-list="default"
			data-msfavorites-mode="list">
			<i class="msfavorites-icon-heart"></i>
			</a>
			<span class="msfavorites-total" data-data-list="default">0</span>
			[[+pagetitle]]
			</div>
			`
			&ajaxMode=`default`
			]]
			</div>
			[[!+page.nav]]
			</div>

Результат:



Примеры



пример 1
Постановка:
— требуется вывести список ресурсов
— возможность добавить ресурс в список избранного default
— вывести общий счетчик кол-ва в избранном

Вызов:
<div id="pdopage">
			<div class="rows">
			[[!pdoPage?
			&parents=`0`
			&element=`msProducts`
			&tpl=`@INLINE
			<a class="msfavorites"
			data-click
			data-data-id="[[+id]]"
			data-data-list="default">
			<i class="msfavorites-icon-heart"></i>
			</a>
			<span class="msfavorites-total" data-data-list="default">0</span>
			[[+pagetitle]]
			`
			&ajaxMode=`default`
			]]
			</div>
			[[!+page.nav]]
			</div>

Результат:



Подключение msFavorites


В удобном месте шаблона сайта вам нужно вставить вызов сниппета msFavorites.initialize

[[!msFavorites.initialize]]


Настройка msFavorites


Основные настройки msFavorites находяться Настройки системы -> msFavorites


front_css — стили фронтенда
front_js — скрипты фронтенда
clear_temporary — очищать временные списки


Списки избранного


Вы можете использовать сниппет msFavorites.ids для получения списка ресурсов в избранном.


[[!msFavorites.ids?&list=`default`]]
list — название списка избранного

Так же сниппет задает плейсхолдеры вида
[[!+msfavorite.list.default]]
			[[!+msfavorite.total.default]]
msfavorite.list.default — список ресурсов в избранном default
msfavorite.total.default — общее кол-во ресурсов в избранном default

Володя
25 мая 2017, 16:34
modx.pro
4
6 100
+7
Поблагодарить автора Отправить деньги

Комментарии: 58

ck
ck
26 мая 2017, 10:17
+1
Т.е. после обновления нужно переделать вызовы?
    Володя
    26 мая 2017, 11:52
    +1
    Да, формат вызова другой, избранное хранится только в базе… все иначе…
    Илья
    26 мая 2017, 11:50
    0
    А пакет уже в репозитории?
    Что у меня нет предложения обновления:
    Илья
    26 мая 2017, 16:41
    0
    Володя, а &removeElement=`1` работает?
      Володя
      26 мая 2017, 16:59
      0
      Володя, а &removeElement=`1` работает?
      нет, нужно указать параметр
      data-msfavorites-mode="list"
      и ограничить элемент блок
      <div class="msfavorites-parent">

      пример msfavorites.vgrish.ru/favorites.html
        Илья
        26 мая 2017, 17:30
        0
        да, это я понял
        раньше страница перезагружалась, при удалении последнего избранного товара, и выскакивала дефолтная надпись:
        [[!msProducts:default=`<div><strong>Ваш список избранных проектов пока пуст</strong></div>`?
        Ещё вопрос:
        у меня сразу после тега bodi выскочила вот такая надпись: msFavorites::__call says: isRemove
        что это может быть?
          Володя
          26 мая 2017, 17:42
          0
          раньше страница перезагружалась, при удалении последнего избранного товара, и выскакивала дефолтная надпись
          да про это я подзабыл… нужный функционал?
          у меня сразу после тега bodi выскочила вот такая надпись: msFavorites::__call says: isRemove
          вы где то используете старый сниппет… советую вам деинсталировать пакет, удалить все сниппеты и затем установить заново…
            Илья
            26 мая 2017, 17:58
            +1
            нужный функционал?
            ну, если не сложно, то было бы не плохо )))
            а так, спасибо за проделанную работу!
            отличный компонент!
              Володя
              26 мая 2017, 18:14
              +1
              готово!
              а так, спасибо за проделанную работу!
              отличный компонент!
              пожалуйста!
            Stan Ezersky
            26 мая 2017, 18:36
            0
            Хм, у меня старая версия на одном из сайтов стоит, нет перезагрузки, всё ajax
              Илья
              26 мая 2017, 20:44
              0
              Так вы через AjaxSnippet фавориты выводите?
                Stan Ezersky
                26 мая 2017, 20:48
                0
                Нет, «из коробки» всё было в предыдущей версии
                  Володя
                  26 мая 2017, 22:01
                  0
                  нет, примеры вызовов есть на демо сайте.
          Илья
          26 мая 2017, 17:57
          0
          делит
            Сергей
            14 июня 2017, 20:48
            0
            Почему [[!+msfavorite.total.default]] показывает количество торов и избранном только на странице избранные товары, если перейти на другую страницу, то не показывает это значение. Добавил сердечко с количеством в шапку сайта.
              Володя
              14 июня 2017, 21:10
              0
              Почему [[!+msfavorite.total.default]] показывает количество торов
              показывает если предварительно вызвать сниппет
              [[!msFavorites.ids?&list=`default`&toPlaceholder=`x`]]
              именно он выставляет плейсхолдеры

              либо второй вариант если скрипт компонента присутствует на странице можно просто вставить где либо в код страницы
              <span class="msfavorites"
              data-data-list="default">
              </span>
              и тогда скрипт будет инициализирован и подгрузится кол-во в избранном
              Сергей
              14 июня 2017, 22:08
              0
              Все равно работает коряво, получается если я убираю из избранного, происходит пересчет, если добавляю, то не чего не происходит, только после обновления страницы меняется число.
                Володя
                14 июня 2017, 22:32
                0
                Тогда пишите в ТП с указанием доступов.
                Спасибо.
                Илья
                19 июня 2017, 16:15
                0
                Владимир привет!
                Я что-то сразу не заметил, но у меня после обновления вот такая картина с меню msfavorites



                и ошибка:

                [2017-06-19 16:13:49] (ERROR @ /home/s21221211/www/core/xpdo/xpdo.class.php : 644) Could not load class: msFavoritesOnHandleRequest from msfavoritesonhandlerequest.
                  Володя
                  19 июня 2017, 16:50
                  0
                  Привет.
                  Я что-то сразу не заметил, но у меня после обновления вот такая картина с меню msfavorites
                  этот рудимент вырезан с корнями. Не вижу никакой пользы тащить это далее…
                  если вам необходим функционал вывода избранного у пользователей напишите в ТП, набросаю вызов сниппета для вывода.
                  Спасибо!
                  Евгений
                  20 июня 2017, 18:08
                  0
                  После обновления консоль выдает ошибку:
                  Uncaught TypeError: Cannot read property 'fn' of undefined
                  at default.min.js?v=d79f078f:formatted:183
                  at default.min.js?v=d79f078f:formatted:240
                    Володя
                    20 июня 2017, 21:56
                    0
                    Старая версия jquery?
                    Пишите в ТП и приложите доступы если проблемы…
                    Спасибо!
                      Евгений
                      21 июня 2017, 11:01
                      0
                      Версия jquery — 3.2.1.
                      Доступы, к сожалению дать не смогу, т.к. сайт еще на локалке висит.
                        Володя
                        21 июня 2017, 11:03
                        0
                        тогда незнаю. Попробуйте продублировать ситуацию на тестовом хостинге modhost.pro/
                        и покажите эту проблему.
                        Спасибо!
                          Евгений
                          21 июня 2017, 11:05
                          0
                          Ок, попробую.

                          Конкретно ошибку по этому куску кода выдает:

                          a.fn.msfavorites = function() {

                          }(window.jQuery, msFavoritesConfig);
                            Володя
                            21 июня 2017, 11:23
                            0
                            Оказывается это я не был готов к свежей версии jquery.
                            Поправил, обновитесь.
                            Спасибо!
                              Евгений
                              21 июня 2017, 11:53
                              0
                              Ошибка сохранилась. Теперь на код
                              t.fn.msfavorites = function() {
                              }(window.jQuery, msFavoritesConfig);
                              ругается… кэш почистил — тоже самое(
                                Володя
                                21 июня 2017, 12:04
                                0
                                msfavorites.vgrish.ru/
                                все работает, ошибок нет.
                                Накати обновлние, кеш и все должно работать.
                    Василий Столейков
                    21 августа 2017, 08:51
                    0
                    Как сортируются списки избранного? Можно ли сортировать по дате добавления в избранное?
                      Володя
                      21 августа 2017, 10:10
                      +1
                      ПРивет. Да чет я этот момент упустил.
                      Добавил сортировку и параметр для сортировки избранного в сниппет msFavorites.ids
                      дефолт
                      {"timestamp": "ASC"}
                      можно обновить компонент…
                    Илья
                    15 сентября 2017, 12:33
                    0
                    Володя, помоги:

                      Володя
                      15 сентября 2017, 12:39
                      +3
                      Обнови до последней версии компонент, там баг поправлен.
                      Антон
                      16 октября 2017, 12:41
                      0
                      Поделитесь, пожалуйста, где и как вы ссылку на списки избранного размещаете.
                      В старой версии активировался переход на страницу избранных при добавлении.
                      Если не добавлять, то нет перехода.

                      Возникла идея чтобы в меню появлялось сердечко при условии, что хоть 1 товар там есть.
                      И в футер наверно тоже сердечко нужно. Если ничего не отмечено, то и ничего не мозолит глаза.
                      Есть такая возможность?
                        Володя
                        16 октября 2017, 12:46
                        0
                        Открыть пример работы компонента msfavorites.vgrish.ru/
                        там есть то о чем вы говорите.
                        Сергей Кепкин
                        25 октября 2017, 15:22
                        0
                        Подскажите, что может быть, появилось неделю назад, до обновления, обновил компонент — также глючит:
                        захожу на сайт с чистой сессией — все ок, через какое-то время или после каких-то действии в счетчике избранного (код чуть ниже) вместо нуля — единичка, причем при обновлении страницы видно что мелькает ноль и затем единичка. Захожу на страницу избранных товаров — там пусто.
                        К сожалению, связь не отловил, в связи с чем так происходит.

                        Описываемый глюк происходит в таком блоке:
                        <span class="msfavorites-total" data-data-list="default">0</span>
                        все новое, кроме ModX=2.5.7 — пока очкую обновлять на продакшене
                          Володя
                          25 октября 2017, 15:25
                          0
                          К сожалению, связь не отловил, в связи с чем так происходит.
                          предположительно у вас в каком то месте вместо id товара стоит id категории. вы его успешно добавляете в избранное, но в списках его естественно нет.
                            Сергей Кепкин
                            25 октября 2017, 16:07
                            0
                            связь не отловил, но точно не добавляю в избранное, т.е. как будто само добавляется
                        Сергей Макаров
                        24 ноября 2017, 23:18
                        1
                        0
                        Добрый день! подскажите пожалйста а как уже внутри карточки добавить сердечко (В избранное) -внутри страницы товара я имею в виду (и то там у меня список всех товаров выводит(((((
                          Сергей Кепкин
                          25 ноября 2017, 00:31
                          0
                          <a title="В список понравившихся товаров" class="msfavorites" data-click data-data-id="[[*id]]" data-data-list="default">
                          <i class="msfavorites-icon-heart"></i>
                          </a>
                          start.exe
                          15 июня 2018, 13:29
                          0
                          задача такая — в шапке сайта видим общее количество, а при открытии страницы с избранным видим несколько списков, у каждого свой total. возникает вопрос:

                          предусмотрена ли возможность для вывода общего количества элементов указанных списков, типа

                          <span class="msfavorites-total" data-data-list="list1,list2">0</span>

                            Володя
                            15 июня 2018, 14:02
                            0
                            нет, подобное не предусмотрено.
                            Вы можете в js обработать ответ, получить общее кол-во и вывести куда нужно.
                            Александр
                            01 июля 2018, 08:13
                            0
                            А как-то можно вывести количество добавлений в избранное для конкретного товара?
                            Мне нужно под каждым товаром показать у скольких людей он в избранном. Запутался в новой документации, до апгрейда как-то попроще было что ли.
                              Володя
                              01 июля 2018, 12:04
                              0
                              Добрый день.
                              Мне нужно под каждым товаром показать у скольких людей он в избранном.

                              добавить разметку вида
                              <span class="msfavorites-total-user" data-data-list="default" data-data-id="44"></span>
                              пример msfavorites.vgrish.ru/several-lists.html
                            Алексей Смирнов
                            06 сентября 2018, 22:22
                            0
                            Хорошее и полезное дополнение.
                            Но пришлось откатиться на первую версию компонента (благо покупал давно и осталась) т.к. во 2й существует сейчас непреодолимая вещь:
                            У меня в ручную реализованы схожие товары и есть ведомый товар, который доступен, остальные товары (связанные) отдают 301 редирект на главный товар (страницы товаров со своими ID). Так вот при попытке добавить связанные товары — появляется ошибка в консоли js. и все. Как только убираю редиректы со связанных товаров — все работает.
                            Убил день на то чтобы понять это…
                            Зачем проверять доступность ресурса по ID — мне не ясно.
                            Есть просьба убрать эту проверку или как-то сделать ее выключаемой, т.к. думаю могут в перспективе быть подобные проблемы у людей (хотя сомневаюсь — наверное я единственный ))) ) но все же.
                            Спасибо.
                              Володя
                              07 сентября 2018, 08:04
                              0
                              Хорошее и полезное дополнение.
                              спасибо!
                              Зачем проверять доступность ресурса по ID — мне не ясно.
                              чтобы не добавлять в список избранного того чего нет.
                              Есть просьба убрать эту проверку или как-то сделать

                              Сначала стоит разобраться что за ошибка у вас была и каким образом реализован редирект.
                              Уточните, спасибо!
                                Алексей Смирнов
                                07 сентября 2018, 11:11
                                0
                                К сожалению проект в производстве, поэтому уже удалил 2ю версию компонента.
                                Ошибок в логе небыло, лишь после нажатия на «Добавить в избранное» ничего не происходило, а в консоли браузера писалась (самим скриптом) error… (2 слова).
                                Ошибку отправляет класс на сколько я сумел влезть в код: класс (public function processResource($rid = 0)) в файле msfavorites.class.php. Точнее не отправлял а не давал сработать компоненту.
                                А у меня подчиненные ресурсы отдают редирект таким кодом:
                                //$sendok  - url главного товара.
                                 $modx->sendRedirect($sendok,array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
                                этот код в снипете на странице конкретного товара.
                                Если этих данных достаточно, то ок. Иначе чуть позже на тестовом воссоздам ситуацию.
                                  Володя
                                  07 сентября 2018, 12:48
                                  0
                                  А у меня подчиненные ресурсы отдают редирект таким кодом:
                                  просто редирект не вызывает такого поведения.
                                  добавил редирект на товар 1
                                  msfavorites.vgrish.ru/katalog/tovar-1.html как видим тут msfavorites.vgrish.ru
                                  все нормально функционирует и нет никаких ошибок.

                                  Так что дело явно не в этом.
                              Ivan
                              19 октября 2018, 13:58
                              0
                              Здравствуйте!
                              Стоит задача реализовать уведомление об добавлении в избранное, как это можно сделать? После добавления, должно выводится модальное окно, с текстом, что Товар 32 был добавлен в избранное. Пока реализовал на jQuery, но есть ли предусмотренный вариант или как лучше это сделать?
                                Володя
                                19 октября 2018, 15:29
                                1
                                +1
                                Добрый день.
                                Предусмотренного варианта нет, можно например использовать уведомления minishop
                                <script>
                                    $(document).ready(function () {
                                        if (typeof msFavorites != 'undefined' && typeof miniShop2 != 'undefined') {
                                            msFavorites.addMethodAction('success', 'name_action', function(){
                                                miniShop2.Message.initialize();
                                                var self = this; 
                                                if (self.data && self.data.method == 'add') {
                                                    miniShop2.Message.success('add');
                                                }
                                                if (self.data && self.data.method == 'remove') {
                                                    miniShop2.Message.info('remove');
                                                }
                                            });
                                        }
                                    });
                                </script>
                                Денис
                                14 августа 2019, 19:17
                                0
                                Добрый день!
                                Подскажите, данный компонент работает для неавторизованных пользователей?
                                  Володя
                                  14 августа 2019, 19:20
                                  0
                                  Добрый.
                                  Да.
                                  Евгений Лазарев
                                  21 марта 2020, 14:52
                                  0
                                  Добрый день подскажите, не обращал раньше на это внимания.Код [[!msFavorites.initialize]] находится в header. Там же ниже код счетчика
                                  <a href="{120 | url}" class="msfavorites-total" data-data-list="default" data-value="0">0</a>
                                  На страницах каталога и товаров все ок — значение меняется, на остальных страницах — тишина.
                                    Денис Усачев
                                    18 августа 2023, 13:46
                                    0
                                    Недавно Chrome начал показывать предупреждение:
                                    [Deprecation] Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead.
                                    Всему причина msfavorites assets/components/msfavorites/js/default.js

                                    а имеено DOMNodeInserted

                                    $(window).on('load', function () {
                                            $('body').msfavorites('loadFavorites', true);
                                            $($.fn.msfavorites.selectors.main).msfavorites();
                                    
                                            $('body').on('DOMNodeInserted', function (event) {
                                                var html;
                                                if (event.target && (html = event.target.innerHTML) && typeof html === 'string' && html.match(new RegExp($.fn.msfavorites.defaults))) {
                                                    $(document).trigger($.fn.msfavorites.CONTENT_CHANGE, jQuery.merge([html], arguments));
                                                }
                                            });
                                        });
                                    заменить на

                                    $(window).on('load', function () {
                                        $('body').msfavorites('loadFavorites', true);
                                        $($.fn.msfavorites.selectors.main).msfavorites();
                                        var observer = new MutationObserver(function (mutationsList) {
                                            for (var i = 0; i < mutationsList.length; i++) {
                                                var mutation = mutationsList[i];
                                                var target = mutation.target;
                                                if (mutation.type === 'childList' && target && target.innerHTML) {
                                                    var html = target.innerHTML;
                                                    if (typeof html === 'string' && html.match(new RegExp($.fn.msfavorites.defaults))) {
                                                        $(document).trigger($.fn.msfavorites.CONTENT_CHANGE, jQuery.merge([html], arguments));
                                                    }
                                                }
                                            }
                                        });
                                        observer.observe($('body')[0], { childList: true, subtree: true });
                                    });
                                    пробелема решена
                                      Сергей Карпович
                                      20 февраля 2024, 15:24
                                      0
                                      Подскажите, как вывести список ID ресурсов избранного, что бы он обновлялся при изменении ресурсов в избранном, без перезагрузки страницы?
                                        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                        58