Переопределение блоков (block) в Magento

Magento, Программирование, Руководства

Метки (теги) : , , ,

Автор: admin

Если Вам нужно создать модуль для magento как отдельную самостоятельную единицу, который бы не менял ядро самой magento, вам скорее всего потребуется переопределять контроллеры (controllers) или модели (models), или блоки (blocks).

Как переопределить модель толково описано здесь

Из того, что там написано мне было не совсем очевидно как переопределить blocks у модулей административной панели (Adminhtml). Какое-то время я рылся по сети в поисках ответа. Еще пол дня я доставал Дмитрия Федюка своими вопросами по этой теме. В итоге нашел решение данной проблеме (моей проблеме, так как думаю для многих программеров это была не проблема).

Например, мы хотим на странице списков, (товары, заказы и т.д.) th заголовкам таблицы добавить новый класс “myclass”.

Это можно сделать в этом файле  app\code\core\Mage\Adminhtml\Block\Widget\Grid\Column.php

public function getHeaderCssClass()
{
$class = $this->getData(‘header_css_class’);
if (($this->getSortable()===false) || ($this->getGrid()->getSortable()===false)) {
$class .= ‘ no-link’;
}
if ($this->isLast()) {
$class .= ‘ last’;
}
return $class.’ myclass’;
}
Но таким образом при обновлении ядра наши изменения затрутся.
Чтобы переопределить этот блок, нам нужно в нашем модуле сделать так:
допустим это путь к нашему модулю app/code/local/Mycompany/MyModule
желательно (не обязательно) при переопределении сохранять оригинальную структуру  папок и файлов начиная с папки Block. Это нужно для того, чтобы более явно выделить то что вы переопределяли в ядре с помощью вашего модуля.
Получили такую структуру app/code/local/Mycompany/MyModule/Block/Adminhtml/Widget/Grid/Column.php
В нашем файле Column.php переопределяем метод getHeaderCssClass() так
class Mycompany_MyModule_Block_Adminhtml_Widget_Grid_Column extends Mage_Adminhtml_Block_Widget_Grid_Column
{
public function getHeaderCssClass()
{
$class = parent::getHeaderCssClass();
$class = $class . ‘ myclass’;
return $class;
}
}
Далее идем в конфигурационный файл нашего модуля app/code/local/Mycompany/MyModule/etc/config.xml
и между тегами <global></global> пишем
<blocks>
<adminhtml>
<rewrite>
<widget_grid_column>Mycompany_MyModule_Block_Adminhtml_Widget_Grid_Column</widget_grid_column>
</rewrite>
</adminhtml>
</blocks>
<blocks></blocks> – говорит magento, что мы собираемся переопределить блок.
<adminhtml></adminhtml> – будем менять в админке (backend). Если нужно во фронтэнде (frontend), то вместо <adminhtml></adminhtml> пишется название модуля, например <сatalog></сatalog>.
<rewrite></rewrite> – указывает на сам факт переопределения (перезаписи).
<widget_grid_column></widget_grid_column> – формируется из иерархии названий папок и названия файла в конце (начиная с папки Adminhtml/Block или “корневая папка frontend модуля”/Block) (это и есть то, что переопределяем).
Mycompany_MyModule_Block_Adminhtml_Widget_Grid_Column – наш класс который является наследником оригинального ядрового класса, и в котором мы переопределяем метод getHeaderCssClass() как показано выше.
Всё. Теперь осталось только очистить кеш, и перезагрузить страницу списков.
Есть вопросы или хотите поругать милости прошу в комменты…

Комментарии:

Оставить комментарий