Почитать другие заметки или статьи

После установки компонента 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 по ссылке ниже:

https://vk.com/sitogon

С уважением, Владимир Егоров