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

0 голосов
Вопрос относится к появлению, примерно, таких ошибок, когда производится установка модуля: «The method getProductsProperties in the class Product is already overridden». Модуль при этом не устанавливается. Что с этим делать?
спросил 23 Дек, 14 от zapalm (178 баллов) в категории Исключение неисправностей

1 Ответ

+1 голос

С выходом 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 обратно как было.

ответил 23 Дек, 14 от zapalm (178 баллов)
Добро пожаловать на сайт. Здесь можно задавать вопросы по CMS PrestaShop и получать на них ответы.