После установки компонента Virtuemart 4.2 на Joomla 5, в административной панели можно наблюдать ошибку "You must specify a non-empty path to clean". Ошибка отображается во всех разделах административной панели компонента и что либо исправить путём нажатия кнопок и изменения настроек не представляется возможным.
Львиная доля проблем компонента Virtuemart заключается в том, что его разработчики начинают работать с переменной, как с массивом, далее обращаются к ней, как к строке... и так далее.
Подобный бардак мог иметь место под PHP 5 и старые версии Joomla.
Однако, на сегодняшний день требования к коду изменились и на месте некогда популярного компонента мы получаем дырку с ошибками.
Вернемся к нашей проблеме.
Откуда она берётся и кто её вызывает?
Причиной ошибки является попытка очистить так называемый безопасный путь, который задается в настройках Virtuemart, от лишних слешей с помощью встроенного в Joomla метода clean класса Path.
Однако, этот самый метод готов принять для обработки исключительно строку, а Virtuemart, в лучших своих традициях, отправляет целое число.
Отправка осуществляется в файле:
/administrator/components/com_virtuemart/helpers/shopfunctions.php
на 1322 строке
Рассмотрим исходный код
Мы видим, что в переменную $safaPath происходит попытка "положить" безопасный путь из настроек компонента.
При этом стоит условие: если путь не указан, то он равен нулю.
А поскольку после установки Virtuemart никто физически не мог указать этот путь, потому что чтобы его указать нужно посетить раздел настроек, а посетить его не представляется возможным, мы имеем то, что имеем.
А именно: число 0, вместо строки.
Как исправить?
Допишем условие, где будем проверять переменную на число и если она будет являться таковым, превратим ее в пустую строку.
$safePath = $sPath==0 ? VmConfig::get('forSale_path',0):$sPath; // Наше условие, где мы проверяем переменную на число if (is_numeric($safePath)) { $safePath = ''; } // Конец условия if(VmConfig::$installed==false or vRequest::getInt('nosafepathcheck',false) or vRequest::getWord('view')== 'updatesmigration') { //vmdebug('checkSafePathBase for not executed '.$safePath); return 0; } $safePath = JPath::clean($safePath);
Далее осталось зайти в административную панель и установить безопасный путь в настройках Virtuemart.
Заключение
Если у вас остались вопросы и предложения, с радостью выслушаю их в своей группе VK по ссылке ниже:
С уважением, Владимир Егоров