Наследование плагином объектов другого плагина

Небольшая заметка о том, как правильно нужно указать в массиве наследования в создаваемом плагине запись о наследовании части функционала другого плагина.

Теория

Обычный короткий вид наследования похож на этот код:
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 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.