Свой фильтр в mFilter2

Добрый день. Расскажите, пожалуйста, с какой целью используются методы getMyNewValues(array $fields, array $ids), buildMyNewFilter(array $values) и filterMyNew(array $requested, array $values, array $ids) при кастомизации mFilter2. Расковырял компонент, но так и не понял, что должен возвращать каждый из них. Хотя с последним ситуация более менее понятна. Странно, что в модели и сниппете не удается сделать var_dump. Очевидно, данные кешируются. Разъясните, как реализовать фильтр по произвольной таблице.
Алексей
24 января 2017, 20:08
modx.pro
4
3 985
0

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

    Алексей
    25 января 2017, 15:04
    0
    Спасибо за ответ. Я уже почти всё понял экспериментальным путем. Тем не менее ваша ссылка будет для меня очень полезна.

    В данный момент меня интересуют 2 вопроса.

    1. Какое имя таблицы использовать при вызове фильтра, если фильтр работает с таблицей стороннего компонента?

    2. Я собираюсь фильтровать товары по остаткам конкретной опции. Не станет ли система внутреннего кеширования помехой для отображения актуальной информации в режиме реального времени. Если станет, то как с этим бороться
      Максим Кузнецов
      25 января 2017, 15:46
      0
      С самой таблицей работает не mFilter2 (он — обертка результатов), а сниппет в параметр element. Процесс формирования селекторов для кнопок фильтрации — в getNameValues.

      modx.pro/howto/8360-filtering-users-using-mfilter2/ — вот пример работы со сторонней таблицей.

      Кэш — нет, вряд ли, значение тех или иных полей цепляется непосредственно из бд. (или я не понял ваш вопрос) %)
        Алексей
        25 января 2017, 22:21
        0
        Я использую msProducts, но кастомную таблицу с остатками. Исходя из того, что при вызове фильтра нужно использовать код таблицы, непонятно что туда передавать, когда таблица кастомная. У неё нет кода. Скорее все туда можно передавать любое значение, а таблицу задавать внутри методов.

        По ссылке неполный пример. Там реализовано 2 метода из трёх. Если мой фильтр отличается только способом получения значений, я могу определить только метод getMyFilterValues. А для сборки и фильтрации будут использованы buildDefaultFilter и filterDefault. Верно?

        К сожалению, пока нет компонента остатков под рукой, поэтому не могу проверить свои гипотезы.
          Максим Кузнецов
          25 января 2017, 22:31
          0
          Вы можете попробовать присоединить данные таблицы остатков через &leftJoin (только для этого таблицу предварительно потребуется объявить для modx'a, если это не готовый компонент), после чего фильтровать по ней стандартными способами.
            Алексей
            26 января 2017, 09:44
            0
            Вы опять не поняли) Функционал выбора значений для фильтра реализован. Непонятно, какое имя таблицы указывать при вызове спиппета mFilter. Ладно, вечером у меня будет возможность всё протестировать
              Максим Кузнецов
              26 января 2017, 11:02
              0
              Ну… вот как я вижу вашу задачу (поправьте меня если я не прав):

              У вас есть товары минишопа (в родной таблице) и данные по остаткам в таблице, созданной вами. Вы хотите подгрузить эти данные непосредственно в вызов mFilter2 к самим товарам, чтобы их можно было использовать в фильтрации. Для этого вам необходимо:

              1. Подключить модель своей таблицы в MODX, чтобы можно было обращаться к ней стандартными методами
              2. Подцепить ее в вызов mFilter2 через leftJoin и добавить в выборку select:

              [[!mFilter2?
              	&element=`msProducts`
              	&class=`msProduct` 
              	&leftJoin=`{
              		"любой псевдоним для таблицы (например, Remains)": {
              			"class": "объявленное_название_таблицы_в_MODX'e",
              			"alias": "Remains", 
              			"on": "Remains.product_id = msProduct.id"
              		}
              	}`
              	&select=`{
              		"Data": *,
              		"Remains": "Remains.value as remains"
              	}`
              	...
              ]]
              — после этого данные будут корректно цепляться и их можно будет обрабатывать в фильтрации, а также вы сможете в чанке применять плейсхолдер [[+remains]].
                Василий Столейков
                17 ноября 2017, 06:53
                1
                0
                А что если таблица совсем кастомная, не ресурсы, и сниппет для их вывода свой собственный? Что нужно mFilter2, чтобы он подцепил результаты из этой таблицы?
                Я вроде бы научил сниппет правильно работать с параметрами where, limit, returnIds, sortby и другими. Сниппет прекрасно работает без mFilter2, в том числе и с pdoTools, а через mFilter не желает…
                По логам я определил что он передаёт limit 0 независимо от числа, указанного в параметрах сниппета. Откуда он его берет?
                  Максим Кузнецов
                  17 ноября 2017, 08:35
                  +2
                  Нужно:
                  1. подключить модель и все параметры вашего сниппета в вызов mFilter2
                  2. расширить метод фильтрации, чтобы mFilter2 научился фильтровать по вашим таблицам.
                    Василий Столейков
                    17 ноября 2017, 09:50
                    1
                    0
                    2. Я это уже сделал, загвоздка видимо в 1.
                    Я хотел сделать сниппет устойчивым к высоким нагрузкам и просто сделал выборку на SQL, типа этого:
                    $q = $modx->prepare("SELECT * FROM my_table");
                    $q->execute();
                    $r = $q->fetchAll(PDO::FETCH_ASSOC);
                    Этот вариант не загружает объекты в память и соответственно в разы быстрее и оптимальнее. Но видимо для mFilter2 прийдётся создавать модель таблицы…

                    Спасибо за ответ!
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    10