Magento – це дуже потужна і, спочатку, складна для програмування CMS. Сильний вплив на це має те, що двигун побудований на складному фреймворку Zend. За допомогою даного посту ми хочемо внести деяку ясність в програмний код Мадженто і спробуємо розглянути найбільш корисні функції при програмуванні в Magento.
Те, як Мадженто «компонує» макет сторінок – це найбільш яскрава відмінна характеристика Magento серед інших подібних двигунів. На відміну від інших CMS все макети в Мадженто визначаються за допомогою внутрішніх XML-тегів. Тут ми вже писали про будову макетів в Magento, тому, щоб краще розуміти суть питання, рекомендуємо спочатку ознайомитися з цим матеріалом.
Найбільш «універсальний» XML-файл в темі – це локальний файл макета local.xml
. Він вантажиться останнім і тому функції, що описані в ньому, мають більший пріоритет і можуть перевизначати «дефолтні» функції. Розглянемо основні функції, які можуть бути використані в цьому файлі (ну, або в інших файлах макета).
За допомогою простого XML-коду у файлі макета ми можемо додавати як CSS файли, так і JS в будь-сторінки і/або блоки в Magento. Найяскравіша перевага від використання даного методу – це те, що в цьому випадку ми можемо гарантувати, що файли CSS і JS завантажуються тільки в потрібних нам макетах. А це допомагає знизити кількість запитів до сервера і також скорочує час завантаження сторінки.
Приклад коду для додавання файлу CSS в блок head макета:
<reference name="head"> <action method="addItem"> <type>skin_css</type> <name>css/style.css</name> <params/> </action> </reference>
У прикладі ім’я лінку (reference
) містить ім’я блоку (head
), в який додається потрібний файл CSS. Для додавання CSS-файлу в параметрі type
вказується skin_css
, а для додавання JS-файлу в параметрі потрібно вказувати skin_js
. У прикладі тег <params/>
порожній, але якщо нам потрібні додаткові дані при підключенні файлу (наприклад, закоментоване підключення для Internet Explorer), тоді вказаний код:
<params/><if>lt IE 9</if>
перетвориться в підключення на сайті виду:
<!--[if lt IE 9]> <link rel="stylesheet" type="text/css" href="css/styles.css" media="all" /> <![endif]-->
Нижче представлений приклад коду, за допомогою якого ви можете відключити блок в одному референсі і призначити цей блок іншому референсу.
<!-- Відключення блоку --> <reference name="pershiy-blok"> <action method="unsetChild"> <name>block_name</name> </action> </reference> <!-- Підключення блоку до іншого блоку --> <reference name="drugiy-blok"> <action method="insert"> <name>block_name</name> </action> </reference>
Якщо вам потрібно лише видалити блок, тоді використовуйте тільки першу частину зазначеного коду. І, якщо вам потрібно лише призначити блок вже існуючому іншому блоку, тоді використовуйте другу частину коду.
CMS-блоки дозволяють користувачеві виводити будь-який вміст в блоці через додавання контенту в блок з панелі адміністратора. Створюєте в адмінці CMS-блок з потрібним вмістом, а вивід блоку в макеті робиться за допомогою такого коду в будь-якому потрібному референсі:
<!-- Вивід CMS-блоку --> <block type="cms/block" name="nazva_bloka"> <action method="setBlockId"> <block_id>id_cms_bloka</block_id> </action> </block>
Інша важлива функція, яка досить часто використовується в файлах XML, — це призначення шаблону для різних блоків макета. Приклад коду:
<!-- Визначення шаблону --> <block type="cms/template" name="nazva_bloka" template="page/html/pevniy-shablon.phtml"/>
Якщо вам потрібно перевизначити шаблон для сторінки, ви можете використовувати такий код:
<!-- Зміна шаблону для сторінки --> <reference name="root"> <action method="setTemplate"> <template>page/pevniy-shablon.phtml</template> </action> </reference>
XML-файли – це, свого роду, фундамент для шаблону в Magento, а PHP-код – це «несучі стіни», які наповнюють блоки макетів корисним змістом.
Розглянемо загальні функції, які використовуються практично на всіх сторінках шаблону.
Врахуйте, що не всі функції працюють у всіх шаблонах, — для деяких функцій потрібно додаткове оголошення через XML-макети і/або через модулі.
Досить часто при створенні або редагуванні шаблонів доводиться вставляти статичний текст. Щоб забезпечити підтримку перекладу цього тексту на інші мови, використовуйте вставку тексту в шаблонах у вигляді:
<?php echo $this->__('Text'); ?>
Сторінки товарів і категорій – це те, для чого і створювалися всі CMS електронної комерції, тобто вони найбільш важливі на сайті. І розробнику Мадженто доведеться більшу частину часу працювати саме з шаблонами цих сторінок. Нижче наведені деякі найбільш часто використовувані функції в шаблонах цих сторінок.
З шаблону сторінки категорії можна отримати назву поточної категорії за допомогою такої функції:
$_category = Mage::getModel('catalog/layer')->getCurrentCategory();
або так:
$_current_category = Mage::registry('current_category');
Коли потрібна певна категорія, тоді вона викликається через її ID:
$_category = Mage::getModel('catalog/category')->load($category_id);
Подібним чином ми можемо отримати доступ до певного товару по його ID:
$_product = Mage::getModel('catalog/product')->load($product_id);
В Magento у товарів на відміну від ID є ще інший унікальний ідентифікатор, — його SKU (артикул). Оскільки SKU – це атрибут товару, ми можемо отримати доступ до товару по його артикулу так:
$_product = Mage::getModel('catalog/product')->loadByAttribute('sku', $product_sku);
З шаблону товару ми можемо отримати назву товару, наприклад, так:
$prodName = $_product->getName();
І дані певного атрибута (якщо його вибірка була підключена в модулі):
$attributeData = $_product->getData('my_attribute');
Нижче представлена функція допоможе отримати доступ до зображень товару за допомогою параметрів, що настроюються (розмір, стиль і т.д.). Зверніть увагу, що ця функція буде працювати тільки в файлі product/view/media.phtml
(або ж в іншому шаблоні, якщо він попередньо оголошений в XML-макеті).
$this->helper('catalog/image')->init($_product, $_image_attribute_name)->keepFrame(false) //якщо true, гарантується, що зображення має розміри зазначені в $width/$height ->constrainOnly(true) // якщо true, гарантується, що висота або ширина зображення не перевищують його фактичну ширину або висоту ->keepAspectRatio(true) // якщо true, гарантуватиме, що коефіцієнт висоти і ширини зображення не змінюється ->resize($_image_width, $_image_height); // наведені тут параметри використовуються для вказівки ширини і висоти картинки (зміна картинки під ці розміри).
Дуже часто потрібно отримати посилання на ту чи іншу частину сайту (сторінки, папку та ін.). Ми можемо використовувати два різних підходи для генерації багатьох з цих URL-адрес. Перший – використовуючи функції отримання посилань (наприклад, getBaseUrl
, getSkinUrl
і т.д.), а інший підхід – за допомогою хелперу/моделі. Другий метод складніше, тому для прикладу будемо використовувати метод getURL
. Наприклад, щоб отримати URL-адресу сайту, можете використовувати цю просту функцію:
$url = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
Подібним чином ми можемо отримати URL-адресу поточної сторінки:
$url = Mage::helper('core/url')->getCurrentUrl();
Таким же чином ми можемо динамічно генерувати URL-адресу будь-якої конкретної сторінки, використовуючи наступний код:
$url = $this->getUrl('page.html');
Оскільки більшість файлів CSS, JavaScript і картинок знаходяться в каталозі skin
, посилання на цей каталог досить популярні. Приклад коду:
$url = $this->getSkinUrl('images/kartinka.jpg');
Якщо вам потрібен безпечний доступ до будь-якого файлу в каталозі skin
, використовуйте додатковий параметр масиву ('_ secure' => true)
:
$url = $this->getSkinUrl( 'images/kartinka.jpg', array('_secure'=>true) );
Нижче наведені деякі інші приклади доступу до URL-адрес каталогів:
Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA); // шлях до папки media в корені сайту Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS); // шлях до папки js в корені сайту <?php echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_SKIN);?> // шлях до папки skin - інший спосіб
Оскільки ці сторінки також дуже важливі для сайту електронної комерції, розглянемо і їх.
Для підрахунку кількості товарів в Кошику, використовуйте такий код:
<?php $_cartQty = $this->getSummaryCount() ? $this->getSummaryCount() : 0 ?>
(якщо Кошик порожній, тоді кількість дорівнює 0)
За допомогою циклу foreach
в коді нижче, ви можете виводити недавно додані товари в Кошик:
<?php $_items = $this->getRecentItems(); ?> <?php if(count($_items)): ?> <?php foreach($_items as $_item): ?> <?php echo $this->getItemHtml($_item); ?> <?php endforeach; ?> <?php else: ?> <?php echo $this->__('You have no items in your shopping cart.') ?> <?php endif; ?>
Щоб показати проміжний підсумок вартості товарів в Кошику, використовуйте такий код:
<?php echo Mage::helper('checkout')->formatPrice($this->getSubtotal()); ?>
І, нарешті, ви можете використовувати ці дві функції для створення динамічних посилань на сторінку Оформлення замовлення та Кошика відповідно:
<?php echo $this->getCheckoutUrl(); ?> // генерує посилання на сторінку Оформлення замовлення <?php echo $this->getUrl('checkout/cart'); ?> // генерує посилання на сторінку Кошика
Іноді розробнику потрібно звертатися до сесій. В Magento змінні сесій можуть бути легко збережені, завантажені та видалені як змінні кеша. Нижче наведено практичне пояснення.
$msgOne = "Це перше повідомлення"; $msgTwo = "Це друге повідомлення"; Mage::getSingleton('core/session')->setValueOne($msgOne); Mage::getSingleton('core/session')->setValueTwo($msgTwo);
Тепер ми зберегли в кеш $msgOne
як ValueOne і $msgTwo
як ValueTwo. Щоб викликати їх, будемо використовувати наступні функції:
$extractedValueOne = Mage::getSingleton('core/session')->getValueOne(); $extractedValueTwo = Mage::getSingleton('core/session')->getValueTwo();
Видаляємо значення змінних сесії:
Mage::getSingleton('core/session')->unsValueOne(); Mage::getSingleton('core/session')->unsValueTwo();
Зі змінних сесії, наприклад, ми можемо визначати, чи залогінився клієнт, чи ні:
$logged_in = Mage::getSingleton('customer/session')->isLoggedIn();
Досить часто потрібно тестувати вивід і значення змінних. У Мадженто це можна зробити різними способами (деякі функції працюють не у всіх файлах):
print_r($zminna); Zend_Debug::dump(($zminna->debug()); Zend_Debug::dump($zminna); var_dump($zminna);
Оскільки Мадженто – це величезна CMS, — всі її функції не можна помістити в один пост. Тому, тут представлені лише часто використовувані. Сподіваюся, що для кожного читача нашого блогу знайшлося щось потрібне в цьому короткому огляді корисних функцій Magento.
Якщо хочеш пізнати людину, не слухай, що про неї говорять інші, послухай, що вона говорить…
Вибачення — не означає, що ти не правий, а інша людина має рацію. Це всього…
Атмосферу паперової книги, запах свіжого чорнила і паперу, що трохи залежався, складно замінити гаджетами. Але…