Донецкий техникум промышленной автоматики

Банери в Magento або робимо статичні блоки корисними

  1. Поділяємо на групи
  2. пануємо блоками

Проблеми - невід'ємна частина прогресу. Одна з них виникла переді мною, коли замовник захотів розміщувати банери на сайті під керуванням Magento. Думаю більшість з нас знає улюблені слова великого Цезаря: Розділяй і Пануй. Так давайте ж підемо його порадою.

Поділяємо на групи

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

Для початку напишемо sql-install для модуля. З його допомогою додамо нове поле в mysql таблицю cms_block і поставимо на нього індекс. Для того, щоб цей код виконався не забуваємо вказати в конфігураційному файлі модуля в секції resources setup модель!

$ Installer = $ this; $ Installer -> startSetup (); $ Installer -> run ( "ALTER TABLE {$ this-> getTable ( 'cms / block')} ADD COLUMN frk_group_id VARCHAR (255), ADD INDEX frk_group_idx (frk_group_id);"); $ Installer -> endSetup ();

Поле текстове, тому що в майбутньому знадобиться прописувати ім'я групи в layout-update-ах. Думаю не дуже читабельним буде побачити цифру посеред xml.

Оскільки переписуванням (реврайтом) Коровська класів заняття досить стрьомно, може спричинити за собою конфлікти з іншими розширеннями, потрібно знайти підходяще подія на яке можна повісити обсервера. Більш підходящого ніж adminhtml_block_html_before на жаль знайти не вдалося.

Обсервер просто додасть нове поле в форму, але складність в тому що потрібно визначити, який з блоків наша форма, саме та яка потрібна

<? Php class Freaks_Banners_Model_Observer {public function addGroupField (Varien_Event_Observer $ observer) {$ block = $ observer -> getEvent () -> getBlock (); $ Parent = $ block -> getParentBlock (); if (! $ parent || 'cms_block_edit'! = $ parent -> getNameInLayout ()) {return $ this; } $ Model = Mage :: registry ( 'cms_block'); $ Form = $ block -> getForm (); $ Form -> getElement ( 'base_fieldset') -> addField ( 'frk_group_id', 'select', array ( 'label' => Mage :: helper ( 'freaks_banners') -> __ ( 'Group'), 'title' => Mage :: helper ( 'freaks_banners') -> __ ( 'Group'), 'name' => 'frk_group_id', 'required' => false, 'options' => Mage :: helper ( 'freaks_banners') -> getBannerGroups (),), 'identifier'); $ Form -> setValues ​​($ model -> getData ()); return $ this; }}

Всі форми в адмінці Magento складаються з 2 частин: контейнера і блоку відповідає за виведення форми. Контейнер визначено в layout-е і має ім'я в нашому випадку cms_block_edit. Оскільки він є батьком для блоку контейнера форми, то можна досить просто його визначити і додати нове поле.

Метод getBannerGroups хелпера модуля повертає масив груп. Групи просто прописані в коді для основних регіонів в layout-е.

class Freaks_Banners_Helper_Data extends Mage_Core_Helper_Abstract {public function getBannerGroups () {return array ( '' => $ this -> __ ( 'Ungrouped'), 'main.top' => $ this -> __ ( 'Main Page Top'), ' category.top '=> $ this -> __ (' Category Top '),' search.top '=> $ this -> __ (' Search Top '),' cart.top '=> $ this -> __ ( 'Cart Top'), 'left' => $ this -> __ ( 'Left Column'), 'right' => $ this -> __ ( 'Right Column'),); }}

Робота в адміністративній частині завершена. Приступимо за написання класу, який вміє виводити статичні блоки по групі.

пануємо блоками

Блок класу успадковується від Mage_Core_Block_Template і має встановлений за замовчуванням файл шаблону. Так само має геттер і сетер для вказівки групи. Щоб отримати блоки з групи - існує метод getBannersCollection.

Тепер додамо в layout блоки, які будуть виводити специфічну групу банерів.

&lt;? Xml version = "1.0&quot;?> <Layout version = "0.1.0"> <default> <reference name = "left"> <block type = "freaks_banners / group" name = "banner.left"> <action method = "setGroup"> <group> left </ group> </ action> </ block> </ reference> <reference name = "right"> <block type = "freaks_banners / group" name = "banner.right" > <action method = "setGroup"> <group> right </ group> </ action> </ block> </ reference> </ default> <cms_index_index> <reference name = "content"> <block type = "freaks_banners / group "name =" banner.main.top "before =" - "> <action method =" setGroup "> <group> main.top </ group> </ action> </ block> </ reference> </ cms_index_index> <catalogsearch_result_index> <reference name = "root"> <block type = "freaks_banners / group" name = "banner.top" as = "banner_top"> <action method = "setGroup"> <group> search.top < / group> </ action> </ block> </ reference> </ catalogsearch_result_index> <catalog_category_view> <reference name = "root"> <Block type = "freaks_banners / group" name = "banner.top" as = "banner_top"> <action method = "setGroup"> <group> category.top </ group> </ action> </ block> </ reference> </ catalog_category_view> <checkout_cart_index> <reference name = "root"> <block type = "freaks_banners / group" name = "banner.top" as = "banner_top"> <action method = "setGroup"> <group> cart.top </ group> </ action> </ block> </ reference> </ checkout_cart_index> </ layout>

Щоб банери виводилися зверху на таких сторінках, як перегляд категорії, перегляд кошика і сторінка пошуку доведеться змінити стандартні файли layout-від сторінки, додавши відразу після

.................................................. .................................................. ...... &lt;? php echo $ this -> getChildHtml ( 'header')?> <div class = "main-container col1-layout" id = "content"> <div class = "main">

рядок

&lt;? Php echo $ this -> getChildHtml ( 'banner_top')?>

От і все. Тепер можна створювати банери з адмінки і відображати у вибраних регіонах на сайті. Результат, який вийшов у мене

Завантажити модуль можна тут .

Lt;?
Quot;?
Lt;?
Php echo $ this -> getChildHtml ( 'header')?
Php echo $ this -> getChildHtml ( 'banner_top')?