Как правильно работать с блоками в Magento

12:18 16 окт. 2015

Как правильно работать с блоками в 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’);

?>

 


Теги: шаблоны CMS Magento
Категория Web-мастер   |   0 комм.
Нет результатов.