Два модуля Prestashop используют одинаковое имя и дают «Невозможно повторно определить класс» фатальная ошибка

Как избежать фатальной ошибки «Cannot redeclare class», когда два модуля используют одно и то же имя класса в prestashop?

Например, у меня есть модуль, который объявляет и использует вспомогательный класс Foo.
Я устанавливаю новый модуль, который имеет другой класс помощника, но с тем же именем Foo. Так что это приводит к фатальной ошибке «Cannot redeclare class», когда я захожу на страницу модулей. Я даже не могу удалить этот новый модуль.

1

Решение

Что ж, вам придется отредактировать один из этих двух модулей и изменить его объявление класса и каждое вхождение этого класса в другие его файлы php.

В следующей версии Prestashop (1.7) понятие пространств имен будет введено с использованием Symfony 2 Framework.

0

Другие решения

При создании модулей, использующих пользовательские классы / объектные модели, вам необходимо Пространство имен их. В PrestaShop вы не можете использовать PHP Пространство имен функция (потому что ядро ​​PrestaShop не приспособлено для работы с ним), но вы можете сделать это по-старому, добавив префикс имени вашего класса. Например:

// Your module:
class MyModule extends Module

// Your custom ObjectModel:
class Message extends ObjectModel

Имя класса Message является очень Обобщенный, и в большинстве своем он вступит в конфликт с каким-то другим модулем, который плохо выбрал название своих классов.

Чтобы предотвратить это, вы должны добавить префиксы ваших классов:

class MM_Message extends ObjectModel

В этом случае MM_ коротка для MyModule, Это гораздо реже конфликтует с другими модулями или классами. В случае, если лучшим способом будет префикс всего имени модуля:

class MyModule_Message extends ObjectModule

Также назовите вашу таблицу базы данных в соответствии с: ps_my_module_message, Это также облегчает навигацию по таблице базы данных. Префикс имен классов — это очень хорошая практика, на самом деле, я делаю это все время. Обратной стороной могут быть более длинные имена классов.

P.S Если вы хотите удалить конфликтующий модуль, вам необходимо временно отключить один из них. Хорошим способом было бы временно переименовать папку модуля во что-то другое (папку модуля, которую вы хотите оставить), а затем удалить другой модуль. После этого восстановите исходное имя папки. Переименование папки модуля предотвратит его загрузку.
Технически вы можете попытаться отключить его в бэк-офисе, если он не загружен в BO

2

По вопросам рекламы [email protected]