Правим проблему работы кастомного класса 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
14 декабря 2017, 10:47    Volk   
2    252 +8

Комментарии (3)

  1. Василий Наумкин 14 декабря 2017, 11:50 # +4
    но хотелось бы, чтоб в следующей версии это было решено из коробки
    Спасибо, исправлю.
    1. Василий Наумкин 20 декабря 2017, 10:16 # +3
      Исправил, выложил обновление.
      1. Volk 20 декабря 2017, 14:46 # 0
        Спасибо
    Вы должны авторизоваться, чтобы оставлять комментарии.