Как правильно работать с блоками в Magento
Одним из популярнейших движков для создания интернет магазина является Magento. Он имеет достаточно мощную и продуманную архитектуру. В основе данного движка лежит Zend Framework, что не очень то радует начинающих веб-программистов. Разработка интернет магазина может превратится в сущий кошмар если хоть немного отойти от традиций разработки под эту CMS. В данной статье проливается свет на такой аспект как блоки в Magento.
Начнем знакомство с блоками с их классификации. Существуют следующие виды блоков:
- Статические
- Динамические
- Динамические с вашими данными
- Структурные блоки
Статический блок Magento
Данный тип блоков создается через админку (CMS -> Статичные блоки->добавить статический блок).
Заполнив все поля можно вставлять блок в движок. Особое внимание обратите на поле идентификатор, так как именно по нем распознается наш блок. Для примера я буду пользоваться идентификатором block_ident, но вообще здесь можно задать любое удобное название.
Для вставки блока в файл шаблона необходимо прописать в нем следующий код:
<?php
echo $this->getLayout()->createBlock(‘cms/block’)->setBlockId(‘block_ident’)->toHtml();
?>
Чтобы вставить блок через визуальный редактор страниц пишем следующий текст
{{block type=”cms/block” block_id=”block_ident” template=”cms/block_content.phtml”}}
Для вставки в XML макет
<block type=”cms/block” name=”cms_static_block”>
<action method=”setBlockId”>
<block_id>block_ident</block_id>
</action>
</block>
Динамический блок
Перед созданием динамического блока следует определится какие данные нам понадобятся от движка. В зависимости от выбранного типа блока, Magento подтягивает все необходимые данные в блок, облегчая тем самым работу с ними. В приведенном примере мы создадим блок с отзывами о товаре для их последующей публикации на странице товара.
Для начала в xml макетах найдем нужный нам тип блока. В данном случае им будет review/product_view_list в файле layout.xml. Мы будет добавлять наш блок на страницу товара, поэтому нам нужно отредактировать local.xml в папке layout нашей темы (/app/design/frontend/ТУТ_НАЗВАНИЕ_ТЕМЫ/layout/local.xml)
<?xml version=”1.0”?>
<layout>
<catalog_product_view>
<reference name=”content”>
<block type=”review/product_view_list” name=”product.info.product_reviews” as=”product_reviews” template=”review/product/view/product_reviews.phtml”/>
<block type=”review/form” name=”product.review.form” as=”product_review_form”>
<block type=”page/html_wrapper” name=”product.review.form.fields.before” as=”form_fields_before”>
<action method=”setMayBeInvisible”><value>1</value></action>
</block>
</block>
</reference>
</catalog_product_view>
</layout>
Получив содержимое блока можно приступить к созданию списка отзывов. Создадим файл
app/design/frontend/ТУТ_НАЗВАНИЕ_ТЕМЫ/template/review/product/view/product_reviews.phtml со следующим содержанием:
<?php
$product = $this->getProduct();
$items = $this->getReviewsCollection()->getItems();
?>
<div id=”reviews”>
<h3><?=$this->__(‘Reviews’);?></h3>
<?php if(count($items)): ?>
<?php foreach($items AS $review):?>
<div class=”review-item”>
<div class=”review-title”>
<?=$this->htmlEscape($review->getTitle());?>
<?php
// Получаем среднее значение всех голосов для суммарного рейтинга
$votes = $review->getRatingVotes();
$avg = 0;
if(count($votes)) {
foreach($votes AS $vote) {
$avg = $avg + $vote->getPercent();
}
$avg = round($avg/count($votes));
}
?>
<div class=”rating-entry”>
<img class=”rating-image” src=”<?=$this->getSkinUrl(‘img/rating-‘.round($avg/20).’.png’);?>”
alt=”<?=$this->__('Rating')?>” />
<span class=”author”>
<?=$this->__(‘by %s’, $this->htmlEscape($review->getNickname()));?></span>
</div>
</div>
<div class=”content”>
<?=nl2br($this->htmlEscape($review->getDetail()));?>
</div>
</div>
<?php endforeach; ?>
<?php else: ?>
<p class=”no-reviews”><?=$this->__(‘No reviews for this product!’);?></p>
<?php endif; ?>
</div>
<?=$this->getChildHtml(‘review_form’);?>
Теперь остается только добавить наш блок к странице товара (/app/design/frontend/НАША_ТЕМА/template/catalog/product/view.phtml). Для этого в нужном месте необходимо добавить код <?=$this->getChildHtml(‘product_reviews’);?>.
Для вставки в другой файл шаблона необходимо прописать в нем
<?=$this->getLayout()->createBlock(‘review/product_view_list’)->setTemplate(‘review/product/view/product_reviews.phtml’)->toHtml();?>
Для вставки в HTML/CMS поле
{{block type=”review/product_view_list” template=”review/product/view/product_reviews.phtml”}}
И так далее.
Динамический блок с вашими данными
Допустим нам нужно вывести самые продаваемые товары на главной странице сайта. В стандартном наборе блоков такая функция не реализована, поэтому придется создавать тип блока с нуля. Для примера создадим файл /app/code/local/Mage/Catalog/Block/Product/Mostpopular.php со следующим содержанием
<?php
class Mage_Catalog_Block_Product_Mostpopular extends
Mage_Catalog_Block_Product_Abstract
{
public function __construct()
{
parent::__construct();
$store_id = Mage::app()->getStore()->getId();
$products = Mage::getResourceModel(‘reports/product_collection’)
->addOrderedQty()
->addAttributeToSelect(array(‘name’,’small_image’))
->setStoreId($store_id)
->addStoreFilter($store_id)
->setOrder(‘ordered_qty’,’ASC’);
Mage::getSingleton(‘catalog/product_status’)
->addVisibleFilterToCollection($products);
Mage::getSingleton(‘catalog/product_visibility’)
->addVisibleInCatalogFilterToCollection($products);
$products->setPageSize(5)->setCurPage(1);
$this->setProductCollection($products);
}
}
?>
Тип блока создали, теперь необходимо создать файл шаблона для перебора товаров. Обратите внимание на 2 последние строчки. Они устанавливают коллекцию для показа в нашем шаблоне. Давайте создадим его (/app/design/frontend/НАША_ТЕМА/template/catalog/product/mostpopular.phtml). Вставим в него следующее содержимое:
<?php
if(($products = $this->getProductCollection()) && $products->getSize()):?>
<?php $collectionSize = count($products->getItems());?>
<h3><?=$this->__(‘Most popular products’) ?></h2>
<?php
foreach($products->getItems() AS $product):?>
<div>
<div class=”product-item”><a href=”<?=$product->getProductUrl();?>”><img src=”<?=$this->helper(‘catalog/image’)->init($product,’small_image’)->resize(120);?>” alt=”<?=$this->htmlEscape($product->getName());?>”></a></div>
<div class=”prpduct-rating”><?=$this->getReviewsSummaryHtml($product);?></div>
<div class=”title”><a href=”<?=$product->getProductUrl();?>”>
<?=$this->htmlEscape($product->getName());?></a></div>
</div>
<?php endforeach; ?>
<?php else: ?>
<h3><?=$this->__(‘Most popular products’);?></h3>
<div><?=$this->__(‘No popular product found!’);?></div>
<?php endif;?>
Данный шаблон может подключатся, как и предыдущий.
Структурный блок
Основное назначение структурных блоков размещение в них кода для вывода набора остальных блоков Magento. Вы наверное заметили, копая XML макеты такие блоки как “left” “right”, “header”, “footer”? Это собственно и есть структурные блоки. Для добавления структурного блока в local.xml вашей темы нужно прописать в макете следующее:
<block type=”core/text_list” name=”block_name” as=”block_x”/>
Атрибут “name” используется для ссылки в вашем макете. Атрибут “as” при вызове функции getChildHtml() в файле шаблона. Напоследок приведу пример вызова данной функции в коде шаблона:
<?php
echo $this->getChildHtml(‘block_x’);
?>