Magento дублировать класс переписать - PullRequest
5 голосов
/ 18 марта 2011

Я использую два разных модуля Magento, скажем First_Module и Second_Module, которые переопределяют один и тот же класс. Я хотел бы объединить их функциональность.
Мое предположение состояло в том, что я мог бы расширить дублирующий класс с First_Module из того же класса в Second_Module, что, в свою очередь, расширяет исходный класс. Я думаю, что для этого First_Module должно зависеть от Second_Module, поэтому я добавил в конфигурацию модуля <depends>Second_Module</depends>.

Теперь я ожидаю, что загрузчик конфигурации сначала загрузит Second_Module, и его недействительный тег для дублирующего класса будет переопределен тем же оператором в конфигурации First_Module. Но, похоже, это не так. Первый rewrite, кажется, используется.

Я делаю / понимаю что-то не так или это просто так? Может быть, я должен просто удалить переписать из второго модуля из конфигурации (что я, скорее всего, не сделать, чтобы сохранить его как можно более оригинальным).

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 18 марта 2011

Автозагрузчик класса Magento не предназначен для нескольких переопределений одного класса, потому что эта концепция на самом деле не имеет никакого смысла.Не было бы никакого способа обеспечить, чтобы второе переопределение учитывало первое, и поэтому они вообще его не реализовывали.

Кроме того, обычно нельзя полагаться на наличие двух отдельных установленных модулей (вне основных модулей).), так что ваша способность приспосабливаться к другим переопределениям будет в лучшем случае хрупкой.

Если вы хотите достичь этого, сначала обратитесь к системе делегирования событий Magento.Многие слушатели могут оперировать одним событием, поэтому это может быть естественным для вас.

Кроме того, как кто-то еще недавно указал в вопросе, вы можете создать два подкласса одного класса и использовать каждый из них, а не оригинал.Это не позволит вам изменить поведение существующей системы, но если вам просто нужны расширения для основных классов, этого может быть достаточно.В этом случае вы будете вызывать эти классы напрямую (как в Mage::getClass("mymodule/extended_customer");.

Надежда, которая проливает немного света на ситуацию.

Спасибо, Джозеф Мастей

1 голос
/ 15 декабря 2011

Так же, как ответ от Джозефа, который может спасти вас от многих неприятностей, вы можете просто сделать второй класс перезаписи (тот, который не виден системой переписывания magento), быть предком переписанных видимых классов ( сначала прочитайте config, как указано Джозефом), поэтому, если оба класса не влияют на одни и те же методы, у вас останутся обе функции и одна перезапись ..

Я обычно делаю так для расширения «Универсальный пароль клиента», которое мои клиенты находят действительно полезным, но случается так, что оно переписывает модель клиента, и, исходя из опыта, это клиент - это класс, который его переписывают чаще, чем многие коммерческие расширения. или нет ..

...