Полезные функции и часто используемый программный код в 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.