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

1 Ответ

+3 голосов
от (559 баллов)
выбран от
 
Лучший ответ

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

Добро пожаловать на сайт. Здесь можно задавать вопросы по CMS PrestaShop и получать на них ответы.
...