Как в Prestashop разрулить конфликт слияния методов в переопределенных классах или как объединить переопределенные классы?

Вопрос относится к появлению, примерно, таких ошибок, когда производится установка модуля: «The method getProductsProperties in the class Product is already overridden». Модуль при этом не устанавливается. Что с этим делать?

 С выходом Prestashop 1.4 появилась возможность [переопределять обычное поведение системы](http://doc.prestashop.com/display/PS15/Overriding+default+behaviors) без вмешательства в программные классы ее ядра, то есть «хаки» или «[хардкод](http://en.wikipedia.org/wiki/Hard_code)» стали для 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:

* только для PS1.5 и более поздних версий – нужно обновить кэш зарегистрированных классов – см. вопрос «[Как обновить кэш зарегистрированных программных классов в Prestashop?](http://prestafaq.ru/7/%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-%D0%B7%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D1%8B%D1%85-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2-prestashop)»;
* переименовать класс «/modules/M1/override/classes/Product.php», например, так: «/modules/M1/override/classes/\_Product.php» (чтобы установщик его проигнорировал);

 После этого можно устанавливать модуль M1 (кнопка «Install»). После успешной установки переименовать класс из модуля M1 обратно как было.