Как уйти от TV и увеличить быстродействие MODX mFilter2?
Александр Здравствуйте! Вы в одном из комментариев отметили что для того, чтобы, скорость фильтрации mFilter2 возросла, необходимо чтобы значения tv сохранялись в отдельной таблице, озадачился этой темой но инфы по поводу этого просто ноль, не могли бы вы если это возможно, описать как создать отдельную таблицу и сохранять значения tv которые для фильтрации там а далее как указать фильтру эту таблицу?
В чанке deflaut, mFilter2, вызов избранного такой:
всё работает, ошибок нет, но проблема с множественной подгрузкой одного и того же файла, action.php, если открыть консоль браузера, раздел XHR, далее перезагрузить страницу с фильтром, будет видно, что грузиться один файл, action.php, это нормально, далее, если отметить один чекбокс в фильтре и перезагрузить страницу, будет видно что грузятся уже три одинаковых файла action.php, отмечаю в фильтре еще пару чекбоксов, перезагружаю страницу, грузятся уже 8 одинаковых файлов, чем больше в фильтре отмечено чекбоксов, тем больше одинаковых вызовов action.php, дополнения msFavorites.
Пытался убирать сторонние скрипты с шаблона, думал может в них проблема, грешил на дополнение, но тестанул и это походу не тот случай, так и не могу точно найти источник проблемы, остаётся только расширенный класс mFilter2. Александр, подскажите пожалуйста, что можно попробовать сделать в данном случае?
Скриншот консоли браузера раздела XHR:
modx.pro/howto/13058
При редактировании ресурса, значения полей так же сможете изменять как и раньше, только в данном случае при заполнении тв у ресурса помимо дефолтной таблицы они будут дублироваться в новую таблицу. Уменьшиться количества запросов к базе и скорость фильтрации возрастёт. Перед тем как будите что-то менять, сделайте резервною копию базы данных и сайта. Способ отличный, спасибо Александру за подробное руководство.
1. Создать файл \core\components\msearch2\custom\filters\custom.class.php:
2. В системных настройках в разделе mSearch2 в параметре mse2_filters_handler_class указать свой класс-обработчик для фильтров:
3. Настроить сниппет mFilter2:
Вывожу фильтр так:
1) Вот в этой строке: &includeTVs=`data,tv1,tv2` как правильно указать?
2) Не понятно как правильно указать чанк для группы фильтров: &tplFilter.outer.my.tv1=`tpl.outertv1`?
3) Сколько не пытался не получается вывести значения tv в результатах фильтра, создал сниппет, назвал getTVFields, поместил вызов в шаблон, где вызываю mfilter2: В чанке: не выводит, подозреваю что не правильно указал тв в вызове фильтра: 4) Как можно убедиться в том, что фильтрует именно по этой таблице а не дефолтной?
5) Группы фильтров вывожу так: [[+my.extendresource|tv2]], это правильный вариант?
6) Теперь если я правильно понимаю при добавлении нового тв, нужно править файл в этой строке:
и тут:
6) Как я понимаю, если установлен сео-фильтр, чтобы он работал с этой таблицей, там нужно выбрать, (значение в другой таблице), как правильно там прописать, подскажите пожалуйста?
В этом случае сниппет нужно вызывать в чанке и в нём id записи уже будет плейсхолдер [[+id]]:
Или вообще не использовать сниппет, а сделать так:
Поставьте debugParser и протестируйте время и количество запросов. Параметр «&filters» определяется почему будет фильтроваться.
При добавлении нового поля нужно добавить ещё в условие, где оно проверяется на пустоту или null.
— компонент: extendresource
— класс: extendResource
— поле для сопоставления (id): resource
— поле, где хранится значение (name): tv1
Можно через Fenom:
Так же можно написать пользовательские модификаторы вывода. Они реализуются через сниппеты, тут уже можно написать любую логику.
Вызов такой:
с чем связано не подскажите?
Для целых чисел int, для строк с переменной длиной от 1 до 255 символов varchar, text — для строк с максимальной длиной, равной 65535 символов.
Ещё бывает используется tinyint для хранения маленьких чисел (со знаком от –128 до 127, без знака от 0 до 255), datetime — для даты и время, и mediumtext — для больших текстов с максимальной длиной до 16777215 символов.
//Правильные подсчёты в mFilter2
после всё работало, но после обновления mSearh2, такой вариант не прокатывает, подскажите пожалуйста что можно попробовать сделать?
Сейчас выглядит так:
Остались только проблемы с разбиением, как я понимаю от этого зависит разделитель значений тв в таблице? что там указывать?
Так же не получается вывести в mfilter2, как нужно указать там?
Вывожу так:
Метод getTVValue выполняет обработку данных, поэтому вместо него нужно просто выбирать значения.
Таблица готова, теперь для выбора всех полей нужен всего 1 запрос.
По mFilter2 нет готового рецепта, тут нужно писать решение для этой таблицы, т.е. свой фильтр для mFilter2.
В этом примере tv1 имеет id, равный 7, tv2 имеет id, равный 8, tv3 имеет id, равный 9.
Александр а по поводу фильтрации с mfilter2 по этой таблице, как это примерно реализовать, расширять класс? Может есть готовое решение где нужно просто изменить по минимуму, к примеру взять с файла filter.class.php? как я понимаю сейчас даже не получиться вывести эти тв в результатах mfilter2
Префикс может понадобиться, если писать SQL запросы напрямую. В этом случае нужно будет получить префикс таблиц и подставить его в SQL:
TV привязываются к шаблону, поэтому можно написать проверку, в которой проверить id шаблона ресурса. Если id шаблона нужный, то выполнять сохранение, в противном случае прервать выполнение кода.
Первую часть вопроса можно реализовать воспользовавшись рецептом, описанным в этой статье.
Т.е. открываете phpMyAdmin или какой-то другой инструмент для работы с базой данных. С помощью phpMyAdmin создаёте таблицу, например, modx_site_content_extend (modx_ — это префикс, который установлен для таблиц на сайте).
Тут, всё понятно. Поле «id» – это первичный ключ, resource – это id ресурса, tv1, tv2, tv3, и т.д. – значения tv полей.
После этого создаём в «/core/components» папку нашего приложения, например, extendresource. А в ней папку «model», а в ней папку «schema».
В папке «schema» создадим файл «extendresource.mysql.schema.xml».
Содержимое файла:
Далее скачиваем скрипт parse_schema.php и помещае его в корень проекта.
Открываем данный файл, вводим в него название «extendresource».
Выполняем данный файл. Всё компонент готов.
Далее создаём плагин со следующим содержимым:
На вкладке «Системные события» отмечаем галочками пункты: OnDocFormDelete, OnDocFormSave, OnDocPublished, OnDocUnPublished и OnResourceUndelete.
Данный плагин будет обновлять таблицу modx_site_content_extend при сохранении ресурса, публикации, снятие его с публикации и удалении.
Как видно id нет и значения не разделяются
И ошибки есть:
В руководстве есть опечатка «
modal» model.Подскажите пожалуйста в чём я допустил ошибку?
Предупреждение (Разбиение отсутствует) как с этим решить вопрос?
Как я понимаю сейчас при создание тв, если мне нужно чтобы его значения сохранялись в этой таблице, необходимо вручную добавить строку в таблице и указать название тв в плагине, правильно я понимаю?
В компонентах не чего не нужно править для работы с этой таблицей?
И нормально ли это что в таблице значения у тв без разделителя просто слитно в таком формате: СпичкиСтружка?
Т.к. таблица кастомная, то нужно писать свою логику для mFilter2.
Выводить значения из своей таблицы можно реализовать через сниппет или плагин.
Например, можно создать сниппет getExtendFields:
После этого поместить его вызов в шаблон:
Вывести поля в этом случае можно так: