Magento :: Макет в модуле - PullRequest
       34

Magento :: Макет в модуле

2 голосов
/ 25 августа 2011

Можно ли создать файл макета внутри модуля? Как?

Для чего:
Я хочу добавить некоторый статистический счетчик посещений для продуктов, и я не хочу переопределять класс продуктов, поскольку это уже сделано некоторым модулем, который я использую. Поэтому я подумал, что будет лучше иметь собственный модуль с блоком, который будет вызываться с помощью оператора макета. Конечно, я мог бы легко отредактировать свой личный local.xml или внести изменения в другой layout-xml в папке layout моей темы, но я хочу, чтобы эта функция была доступна во всех темах (независимо от выбранной темы).

Некоторые ограничения:

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

Я бы также принял разные подходы к загрузке счетчика посещений моей статистики (используя те же ограничения)

1 Ответ

5 голосов
/ 25 августа 2011

Да, это возможно.Просто создайте свой XML-файл макета по следующему пути: /design/frontend/default/default/layout/yourlayout.xml (или независимо от того, как называется ваша тема), и добавьте соответствующий оператор в свои модули, etc / config.xml:

<config> 
 <frontend>   
  <layout>
    <updates>
      <yourmoduleshortname>
         <file>yourlayout.xml</file>
      <yourmoduleshortname>
    </updates>
  </layout>  
 </frontend>
</config>

Этот образец для внешнего пользователя, но макеты adminhtml могут быть обновлены аналогичным образом.Если что-то не работает, убедитесь, что ваш макет находится в правильном каталоге темы / пакета.

Редактировать:

Второй подход:

Вы можете использовать свой собственный контроллер, который расширит функциональность ядра (один из контроллеров каталога) - просто переписайте его (или просто действие просмотра продукта).Внутри своего метода действия добавьте что-то вроде этого:

$thiss->getLayout()->createBlock('namespacename/block','layout-block-name',
array('template' => 'relativepathtotemplate.phtml'));
$this->getLayout()->getBlock('content')->append($block);
run-original-parent-code();

Третий подход:

Аналогичен предыдущему, но вы можете использовать некоторый наблюдатель событий и попробовать Mage::getSingleton('core/layout'), и вставьте туда свой блок.Не во всех случаях макет будет уже доступен (попробуйте семейство post_dispatch).

Я действительно не рекомендую второй и третий подход, потому что, если кто-то еще хочет найти источник этого «магического» блока, он, безусловно, будет выглядеть в каталоге int app / design / (...).Найти его в вашем контроллере или модели может быть очень сложно ...

Если вы не хотите отображать свой счетчик статистики, вы также можете использовать события (например, post_dispatch) для подсчета отправок контроллера.Просто создайте наблюдателя, прикрепленного к нему, и сохраните ваши данные в БД.

...