С выходом Prestashop 1.4 появилась возможность переопределять обычное поведение системы без вмешательства в программные классы ее ядра, то есть «хаки» или «хардкод» стали для PS прошлым (почти). Все программные классы, которые переопределяют стандартное поведение PS находятся в директории «/override». В этих классах находятся методы, которые переопределяют (заменяют/подменяют – частично или полностью) соответствующие методы классов ядра PS.
Указанная проблема относится к PS1.5 и более поздним версиям (в PS1.4 установка переопределенных классов делается вручную). Из-за чего происходит конфликт? Из-за того, что один и тот же метод пытаются переопределить сразу несколько модулей, которые при инсталляции вносят свою реализацию в переопределяемый класс. При такой проблеме вы получите типовое сообщение: «The method XXX in the class YYY is already overridden». Решение – нужно вручную объединить код двух или нескольких методов, поставляемыми модулями. Иногда здесь не обойтись без программиста.
Пример, как разрулить конфликт.
Есть класс «/override/classes/Product.php» пока не содержащий переопределенные методы, который предназначен для переопределения поведения родного класса PS «/classes/Product.php»:
class Product extends ProductCore
{
}
Есть модуль M1, который мы пытаемся установить и поставляющий собственную реализацию класса «/modules/M1/override/classes/Product.php»:
class Product extends ProductCore
{
public static function getProductsProperties($id_lang, $query_result)
{
// какой-то код #1
}
}
И есть второй модуль M2, который уже был установлен ранее вместе с переопределенным классом «/modules/M2/override/classes/Product.php»:
class Product extends ProductCore
{
public static function getProductsProperties($id_lang, $query_result)
{
// какой-то код #2
}
}
Теперь, когда мы разобрались, что оба модуля переопределяют один и тот же метод getProductsProperties(), объединяем код и помещаем его в класс «/override/classes/Product.php»:
class Product extends ProductCore
{
public static function getProductsProperties($id_lang, $query_result)
{
// какой-то код #1
// какой-то код #2
}
}
К сожалению, и в этом случае может быть проблема, например, когда «какой-то код #2» делает нерабочим «какой-то код #1», в связи с этим модуль M1 станет работать некорректно. В этом случае нужно обратиться к какому-нибудь программисту.
Осталось еще кое-что сделать перед установкой модуля M1:
После этого можно устанавливать модуль M1 (кнопка «Install»). После успешной установки переименовать класс из модуля M1 обратно как было.