Полезные функции и часто используемый программный код в Magento
Magento – это очень мощная и, поначалу, сложная для программирования CMS. Сильное влияние на это имеет то, что движок построен на сложном фреймворке Zend. С помощью данного поста мы хотим внести некоторую ясность в программный код Мадженто и попытаемся рассмотреть наиболее полезные функции при программировании в Magento.
Полезные функции языком XML
То, как Мадженто «компонует» макет страниц – это наиболее яркая отличительная характеристика Magento среди других подобных движков. В отличие от других CMS все макеты в Мадженто определяются с помощью внутренних XML-тегов. Здесь мы уже писали об устройстве макетов в Magento, поэтому, чтобы лучше понимать суть вопроса, рекомендуем сначала ознакомиться с этим материалом.
Самый «универсальный» XML-файл в теме – это локальный файл макета local.xml
. Он подгружается последним и поэтому функции, описанные в нем, имеют больший приоритет и могут переопределять «дефолтные» функции. Рассмотрим основные функции, которые могут быть использованы в этом файле (ну, или в других файлах макета).
Добавление файлов CSS/JS на любые страницы
С помощью простого 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="perviy-blok"> <action method="unsetChild"> <name>block_name</name> </action> </reference> <!-- Подключение блока к другому блоку --> <reference name="drugoy-blok"> <action method="insert"> <name>block_name</name> </action> </reference>
Если вам нужно лишь удалить блок, тогда используйте только первую часть указанного кода. И, если вам нужно лишь назначить блок уже существующему другому блоку, тогда используйте вторую часть кода.
CMS-блоки позволяют пользователю выводить любое содержимое в блоке через добавление контента в блок из панели администратора. Создаете в админке CMS-блок с нужным содержанием, а вывод блока в макете делается с помощью такого кода в любом нужном референсе:
<!-- Вывод CMS-блока --> <block type="cms/block" name="nazvaniye_bloka"> <action method="setBlockId"> <block_id>id_cms_bloka</block_id> </action> </block>
Изменение шаблона страницы/блока
Другая важная функция, которая довольно часто используется в файлах XML, — это назначение шаблона для разных блоков макета. Пример кода:
<!-- Определение шаблона --> <block type="cms/template" name="nazvaniye_bloka" template="page/html/nekiy-shablon.phtml"/>
Если вам нужно переопределить шаблон для страницы, вы можете использовать такой код:
<!-- Изменение шаблона для страницы --> <reference name="root"> <action method="setTemplate"> <template>page/nekiy-shablon.phtml</template> </action> </reference>
Полезные PHP-функции в Мадженто
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($peremennaya); Zend_Debug::dump(($peremennaya->debug()); Zend_Debug::dump($peremennaya); var_dump($peremennaya);
Поскольку Мадженто – это огромная CMS, — все ее функции нельзя поместить в один пост. Поэтому, здесь представлены только самые часто используемые. Надеюсь, что для каждого читателя нашего блога нашлось что-то нужное в этом кратком обзоре полезных функций Magento.