Наследование плагином объектов другого плагина
Небольшая заметка о том, как правильно нужно указать в массиве наследования в создаваемом плагине запись о наследовании части функционала другого плагина.
Обычный короткий вид наследования похож на этот код:
Эта запись указывает на наследование сущности Custom модуля Test из ядра. В плагине расположение к наследуемой сущности должно быть создано также: модуль Test и сущность Custom.
Но существует расширенный вариант записи наследования с указанием нового имени наследуемого модуля:
таким образом наследуемая плагином Name сущность будет иметь новое имя Newcustom в новом модуле Newtest.
Чтобы не указывать имя плагина можно использовать укороченный вариант переименования:
В этом случае движок автоматически подставит PluginName в запись сущности.
Обычно наследуемые модули не меняют имя для однозначности понимания и быстрого ориентирования. Исключения составляют случаи, когда имя модуля или сущности уже занято плагином до момента необходимости создания наследования.
Но в случае когда с помощью одного плагина нужно наследовать, например, сущность другого плагина, переименование в записи наследования необходимо т.к. без него движок не может корректно разобрать новое имя наследуемой сущности (баг? фича?).
Примечание: на самом деле он может разобрать, но имя получается некорректное и имеет префикс нового плагина, старого, имя модуля и, наконец, сущности. Но движок не понимает дальше 3 уровня «подчеркивания» в вызовах, поэтому падает при не нахождении нового наследуемого класса.
Поэтому верная запись наследования одним плагином сущности другого будет следующая:
или полный вариант:
где PluginOld — наследуемый плагин, а PluginNew — плагин, расширяющий сущность PluginOld_ModuleTest_EntityCustom плагина PluginOld.
В такой записи движок корректно распознает наследование.
Кстати, вот запись объявления класса новой расширяемой сущности:
Надеюсь, кому-то эта статья окажеться полезной.
Это кросспост из гида по лс.
Теория
Обычный короткий вид наследования похож на этот код:
protected $aInherits = array( 'entity' => array('ModuleTest_EntityCustom') );
Эта запись указывает на наследование сущности Custom модуля Test из ядра. В плагине расположение к наследуемой сущности должно быть создано также: модуль Test и сущность Custom.
Но существует расширенный вариант записи наследования с указанием нового имени наследуемого модуля:
protected $aInherits = array( 'entity' => array('ModuleTest_EntityCustom' => 'PluginName_ModuleNewtest_EntityNewcustom') );
таким образом наследуемая плагином Name сущность будет иметь новое имя Newcustom в новом модуле Newtest.
Чтобы не указывать имя плагина можно использовать укороченный вариант переименования:
protected $aInherits = array( 'entity' => array('ModuleTest_EntityCustom' => '_ModuleNewtest_EntityNewcustom') );
В этом случае движок автоматически подставит PluginName в запись сущности.
В реальности
Обычно наследуемые модули не меняют имя для однозначности понимания и быстрого ориентирования. Исключения составляют случаи, когда имя модуля или сущности уже занято плагином до момента необходимости создания наследования.
Наследование плагином плагина
Но в случае когда с помощью одного плагина нужно наследовать, например, сущность другого плагина, переименование в записи наследования необходимо т.к. без него движок не может корректно разобрать новое имя наследуемой сущности (баг? фича?).
Примечание: на самом деле он может разобрать, но имя получается некорректное и имеет префикс нового плагина, старого, имя модуля и, наконец, сущности. Но движок не понимает дальше 3 уровня «подчеркивания» в вызовах, поэтому падает при не нахождении нового наследуемого класса.
Поэтому верная запись наследования одним плагином сущности другого будет следующая:
protected $aInherits = array( 'entity' => array('PluginOld_ModuleTest_EntityCustom' => '_ModuleTest_EntityCustom') );
или полный вариант:
protected $aInherits = array( 'entity' => array('PluginOld_ModuleTest_EntityCustom' => 'PluginNew_ModuleTest_EntityCustom') );
где PluginOld — наследуемый плагин, а PluginNew — плагин, расширяющий сущность PluginOld_ModuleTest_EntityCustom плагина PluginOld.
В такой записи движок корректно распознает наследование.
Кстати, вот запись объявления класса новой расширяемой сущности:
class PluginNew_ModuleTest_EntityCustom extends PluginNew_Inherits_PluginOld_ModuleTest_EntityCustom { // новые методы }
Надеюсь, кому-то эта статья окажеться полезной.
Это кросспост из гида по лс.
0 комментариев