PrestaShop 1.6 - создаем свой модуль - уникальные имена классов
- Категория: Код
- – Автор: Игорь (Администратор)
PrestaShop 1.6 включает в себя массу удобных механизмов для создания и поддержки своих модулей. Однако, как и у любых подходов, у них есть плюсы и минусы, о которых стоит лучше узнать как можно раньше, ведь сталкиваться с ними "после" всегда неприятно.
В рамках предыдущих статей я уже писал о небольшой полезной памятке и локализации модулей. В сегодняшней же заметке я расскажу об уникальности имен классов PrestaShop 1.6, а так же покажу из-за чего это происходит и с какими проблемами вы можете столкнуться.
Начну немного издалека. В php попытка определить два класса с одинаковыми именами приводит к ошибке. Поэтому если вы не первый день пишите свои скрипты и модули, то, вероятно, стараетесь задумываться об уникальности имен. Причин тому много. Чтобы не было конфликтов с другими скриптами и расширениями, чтобы всегда можно было понять к чему относится класс и так далее.
Однако, когда речь идет о создании своих модулей в CMS, где, в принципе, допускается возможность переопределения ядровых файлов, а с ними и классов, может быть немного удивительным тот момент, что все имена классов вашего модуля, включая каталог "classes", должны быть уникальными.
Примечание: Не стоит считать, что раз есть такое ограничение, то престашоп не является продуманной системой. Это отнюдь не так, ведь гибкость и удобство всегда будут чем-то обеспечиваться.
Но, обо всем по порядку.
PrestaShop 1.6 - уникальные имена классов
Первый момент - это, конечно, само название класса модуля. Об этом написано в любой инструкции, включая и документацию PrestaShop 1.6. Уникальность в данном случае не вызовет ни у кого удивления.
Второй момент - имена классов контроллеров самого модуля, т.е. не перезаписывающие ядровые контроллеры, должны быть уникальными. И тут так же все понятно, так как, например, в админке (бэк-офисе) в url в параметрах указывается только token и controller.
Третий момент. Все имена классов внутри каталога "classes" вашего модуля так же должны быть уникальными. И вот почему. Кстати, подобного рода ограничение есть и у плагинов WordPress, правда там немного из-за других причин.
Примечание: В теории и отчасти в практике, возможно, вы не столкнетесь с проблемами, если будете подключать классы только внутри ваших контроллеров. Однако, все же советую прочитать дальнейшие пояснения и не использовать простые имена вида "Condition" (кстати, с таким классом, у вас, вероятно, возникнут ошибки, так как такой класс есть в одном из модулей, установленных по умолчанию).
Тут важно вспомнить то, каким образом описываются характеристики вашего модуля. Они прописываются внутри конструктора главного класса вашего модуля. Соответственно, чтобы их получить и определить доступный список действий с модулем, PrestaShop необходимо загружать их все внутри страницы "Модули и услуги" (Modules and Services).
Следующий важный момент это то, что классы других модулей легко могут загружаться после установки и регистрации в хуках. К примеру, если добавляете в header подключение стилей своего модуля, то стоит помнить, что все необходимые классы вашего модуля так же загружаются.
Вернемся к странице с модулями. Вероятно, часть людей уже начала догадываться. Правильно, речь идет о том, что все загружаемые классы через конструкции вида "require_once" будут так же подключаться в момент считывания характеристик модуля. Так что если подключаемые классы разных модулей имеют одинаковые имена, то страничка с модулями будет падать с "Fatal Error", ведь вы пытаетесь определить один и тот же класс. Если такое произошло, то вам необходимо просто удалить последний загруженный вами модуль из каталога "modules" или же если вы создавали свои классы, то подкорректировать имена классов вашего модуля.
В этом всем вы легко можете сами убедиться. Достаточно открыть файл config\defines.inc.php и подправить две строчки:
Замените в этих строчках значение с false в true. Сохраните файл. После этого откройте страницу с модулями и посмотрите какие классы были загружены (внизу страницы будет полный список).
Как видите, гарантировать что имена ваших дополнительных классов не пересекутся с классами других модулей нельзя (помните про хуки). Кроме того, если вы пишите второй (третий и так далее) модуль и у них есть общие классы вида "SomeUtils", то эти два модуля автоматически становятся несовместимыми и приводят к ошибкам. Поэтому уникальность должна быть в рамках любого модуля.
Теперь, вы знаете больше об уникальности имен классов PrestaShop 1.6, а так же какие есть особенности и с какими проблемами вы можете столкнуться.
☕ Понравился обзор? Поделитесь с друзьями!