Правим проблему работы кастомного класса mFilter2 при выносе папки core за корневой каталог

На днях обнаружил в mSearch2 при вызове сниппета mFilter2 и выставлении в настройке «mse2_filters_handler_class» кастомного класса (соответственно создав в необходимой директории файл и расширив в нем стандартный класс филтров), при вынесении папки core за корневой каталог (к примеру на уровень выше), то мы получаем неправильные пути для поиска файлов кастомных классов в mFelter2, поэтому наш кастомный класс не работает. Вот к примеру:

modx_core_path у нас:
/home/s12187/core/
modx_base_path у нас:
/home/s12187/www/
Получаем ошибку в логе:
[2017-12-14 08:53:22] (ERROR @ /home/s12187/core/components/msearch2/model/msearch2/msearch2.class.php : 243) [mSearch2] Custom path is not exists: "/home/s12187/www/home/s12187/core/components/msearch2/custom/filters"


Т.е. если папка core у нас находится на уровень выше, чем modx_base_path, а не находится в нем, то путь до папки с кастомными файлами mSearch2 склеивается с modx_base_path и на выходе мы получаем, что файлы кастомных классов ищутся в несуществующем каталоге:
/home/s12187/www/home/s12187/core/components/msearch2/custom/filters


Хотел написать в ТП на modstore, чтоб Василий поправил это в последующих версиях, но там уже закончился срок поддержки, а продлевать нет необходимости, т.к. проблему решил сам, но хотелось бы, чтоб в следующей версии это было решено из коробки, так что под катом выкладываю временное решение для тех, кто с этим тоже столкнется и в надежде, что Василий тоже увидит и поправит в следующих версиях.

Решение
В файле:
/core/components/msearch2/model/msearch2/msearch2.class.php
На 231 строке меняем:
if (strpos($customPath, MODX_BASE_PATH) === false) {
			$customPath = MODX_BASE_PATH . ltrim($customPath, '/');
		}
на:
if (strpos($customPath, MODX_BASE_PATH) === false && strpos(MODX_CORE_PATH, MODX_BASE_PATH) === true) {
			$customPath = MODX_BASE_PATH . ltrim($customPath, '/');
		}


Раз уж опубликовал этот пост в раздел пошаговые инструкции, то немного описания)
В данном изменении мы плюсом добавляем еще одно условие, в котором ищем вхождение подстроки MODX_BASE_PATH в MODX_CORE_PATH если да, то склеиваем, если нет, то оставляем.
Простыми словами, если базовый путь:
/home/s12187/www/
Содержится в пути папки core:
/home/s12187/www/core/
То всё работает как раньше, а если папка core вынесена за базовый путь, как в нашем случае, то
/home/s12187/www/
не будет найдена в
/home/s12187/core/
и склейки не будет.

Внимание!!! Эти изменения ВОЗМОЖНО могут повлиять на что то другое в работе mSearch2, т.к. у меня не было времени разобрать, при каком условии у нас $customPath будет не полным путем, но у меня пока всё работает без проблем. Ну и не забываем, что, пока эта проблема не исправлена Василием, то при обновлениях все затрется.

Ну и чтоб не было лишних вопросов, от тех, кто не в курсе, типа «зачем вообще может понадобиться выносить папку core за корневую директорию?», скажу сразу, что для безопасности (как это сделано во многих фреймворках «из коробки», к примеру в laravel), а еще ее плюсом, даже там лучше переименовать (перенос и переименование для меня уже, как правило для своих проектов, ну еще конечно не забываем про правильные права доступа).
Как расширять класс фильтров есть на docs.modx.pro
Роман Воропаев (Volk)
14 декабря 2017, 07:47
modx.pro
2
1 869
+8

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

Василий Наумкин
14 декабря 2017, 11:50
+4
но хотелось бы, чтоб в следующей версии это было решено из коробки
Спасибо, исправлю.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
3