Думаю майже всі починають своє знайомство з Magento з редагування стандартної теми, додавання нових блоків або зміни старих. Це частина View з трійки букаф MVC і вона досить складна для новачків, по-цьому пропоную розібратися що це за файли xml в директорії layout.
Сторінка - цеглинка до цеглинки
В Magento сторінки будуються за допомогою блоків з використанням шаблонів, які мають розширення * .phtml. Будь phtml файл є дійсним html кодом. Кінцевий результат створюється шляхом декорації, тобто вставки одного блоку в інший. Хороший малюнок для розуміння суті був знайдений в Гайд по Symfony1.4
Тут все працює так само. У постачання стандартної теми є 4 layout-a: 1 колонка, 2 колонки з leftbar, 2 колонки з rightbar, 3 колонки.
Майже кожен модуль має layout-update - xml файл, який вносить додатковий функціонал в частину View. Файли layout-ів мають кілька основних директив: handle, reference, block, action, remove. Розглянемо кожен з них окремо.
Дослівно можна сказати, що це гачок, на який можна повісити кілька блоків. Але я собі це уявляю, як подія, на яке вішається блок і при його (події) появі блок буде оброблений і виведений користувачеві. Handle -и генеруються контролером. Відрив клас Mage_Core_Controller_Varien_Action побачимо, що на будь-який екшен генерується 4 стандартних handle-а: default (в методі loadLayout) і ще 3, один з яких відповідає за обрану тему, другий за поточний модуль, контролер і екшен і третій за поточний store (в методі addActionLayoutHandles)
Також подивившись більш детально на методи loadLayout і renderLayout можна здогадатися, що handle-и можна генерувати динамічно в залежності від певних умов, як робиться в Mage_Catalog_CategoryController
Основне опис всіх сторінок знаходиться в page.xml. Якщо відкрити його, то побачимо наші handle -и (default. Print. Page_empty. Page_one_column. Etc)
За допомогою даної директиви можна звернеться до блоку і викликати у нього певні екшени або додати дочірні блоки, як наприклад в прикладі вище, handle = page_one_column. Ми звертаємося до самого верхнього за структурою блоку root і встановлюємо йому інший шаблон для відображення.
Ця директива має атрибут name. в якому вказуємо ім'я блоку, до якого хочемо звернеться. Майже всі блоки мають своє унікальне ім'я. При написанні своїх layout-update -ів давайте імена всім блокам, які в майбутньому потрібно буде змінювати.
Блок - серце всієї структури. Має кілька атрибутів:
- type - Magento шлях, який вказує на клас блоку. Наприклад, "cms / block" вказує на клас Mage_Cms_Block_Block. який знаходиться в app / code / core / Mage / Cms / Block / Block.php. Якщо Ви не маєте потребу в специфічній логіки обробки блоку, а просто хочете вивести якийсь шаблон, то використовуйте "core / template"
- name - унікальне ім'я блоку, потрібно для того щоб потім можна було звертатися до нього за допомогою директиви reference
- as - псевдонім для імені блоку, потрібно якщо хочемо звернеться до блоку з коду, за допомогою методів батьківського блоку getChild або getChildHtml.
- ifconfig - конфігураційний шлях, блок буде показаний тільки, якщо значення настройки одно true
- after - вказує ім'я блоку після якого потрібно вивести даний
- before - вказує ім'я блоку перед яким потрібно вивести даний. Якщо вказати знак мінуса ( "-"), то блок буде виведений найпершим з усіх у своєму батьку
- template - вказує шаблон для блоку
- translate - вказує теги (ноди, вузли), вміст яких потрібно перевести. Теги прописуються через пробіл
Наприклад, виведемо на головній список всіх новинок
Існує кілька стандартних імен блоків: root. left. right. content.
За допомогою цієї директиви можна викликати методи блоку, після його ініціалізації. Має атрибут method. в якому вказується ім'я методу. Аргументи перераховуються в тегах, імена тегів ніяк не використовуються. У метод аргументи передаються в такій черговості, в якій вони були прописані в xml файлі, наприклад встановимо інший шаблон руту
За допомогою цієї директиви можна видаляти блоки. Має один атрибут name - ім'я блоку, який потрібно видалити. Наприклад, видалимо настирливі банери зі стандартної теми
Ставимо крапки над і
Що ж робити, якщо потрібно додати дочірній блок в контент, але не виправляючи файл page.xml. Потрібно використовувати reference!
Все що знаходиться всередині reference можна вважати, що воно знаходиться всередині блоку з заданим ім'ям.
Block може знаходиться всередині іншого блоку або reference -а (тоді він є дочірнім блок і доступ до нього з батьківського можна отримати через метод getChild. Перший параметр якого - еліас блоку, тобто вміст атрибута as. По-цьому якщо Ви плануєте звернеться до блоку з коду прописуйте йому еліас), також він може знаходиться всередині handle (так як блок з ім'ям root. дивитися page.xml).
P.S .. ось і все. Сподіваюся матеріал сильно допоможе початківцям, по-кільки все це я сам проходив набиваючи власні гулі. Планую написати серію статей про конфігураційних файлах в Magento. чекайте продовження
UPD: забув згадати про тезі update. Має один атрибут handle. да-да це ім'я саме тієї самої директиви, про яку говорилося вище. Директива може знаходиться тільки всередині іншого handle -а, переносить всі блоки з зазначеного handle -а в той, в якому вона прописана, наприклад
Всі директиви з customer_account будуть використані і в customer_account_edit handle -е. Застосовується для того, щоб уникнути дублювання однакових директив.
Сергію, з оновленням freaksidea, дуже подобається твої статті. Хотів би для уточнити. Як зрозуміти де описуються всі директиви такі як remove.
Або де handle default, print, page_empty, page_one_column, etc. атрибути block? з actions (і) теж не зовсім зрозуміло. ніби як вони описуються в Block'e. такі ось як
insider / insider.js
в Mage_Core_Page_Block_Html_Head
а ось де допустимо method = "setImgSrc"
з catalog.xml.
У загальному Сергію звідки черпати. якщо не важко.
директиви можуть бути описані де завгодно, в одному з файлів layout-update-ів. Всі ці файли при відкритті сторінки об'єднуються і отримуємо один великий XML.
Оновив статтю сподіваюся опис допоможе зрозуміти