Добавление блоков в Magento
В этой статье будет рассказано, как добавлять новые статические, или динамические блоки к вашему шаблону magento, а именно:
Динамический блок с вашими данными
Следуя примерам, вы так же узнаете как добавить блок последний комментариев на вашу страницу товара и блок часто просматриваемых товаров на главную страницу вашего магазина.
Создайте статический блок через CMS -> Статичные блоки, в панели администрирования Magento, нажмите кнопку добавить новый блок.
Как только вы закончите, вы можете включить ваш статический блок в шаблон, в html-содержимое поля, или XML-файл макета (layout).
<?php echo $this->getLayout()->createBlock('cms/block')->setBlockId('static_block')->toHtml() ?>
{{block type="cms/block" block_id="static_block" template="cms/content.phtml"}}
<block type="cms/block" name="cms_static_block"><action method="setBlockId"><block_id>static_block</block_id></action></block>
В данном случае static_block является полем "Идентификатор", при создании нового статического блока.
Динамический блок (PHTML)
При создании динамического блока вам необходимо знать, какие данные вам нужны от magento. Возможно, вам придётся пройти через некоторые XML файлы макетов, чтобы выяснить необходимый тип блока. Тип блока потянет за собой доступ к необходимым данным, в вашем шаблоне. В этом примере мы будем реконструировать список отзывов о продукте, для отображения на странице товара.
Находим интересующий нас тип блока списка отзывов о продукте: review/product_view_list в layoyt.xml. Я хочу добавить мой блок на страницу товара, значит мне нужно открыть catalog.xml или отредактировать local.xml файл вашей темы (/app/design/frontend/YOUR_THEME/layout/local.xml).
<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>
Сейчас, когда у меня есть содержимое блока, я могу создать список отзывов о продукте:
/app/design/frontend/YOUR_THEME/template/review/product/view/product_reviews.phtml
$_product = $this->getProduct();
$_items = $this->getReviewsCollection()->getItems();
<div id="product-reviews">
<h2><?php echo $this->__('Latest Reviews') ?></h2>
<?php if(count($_items)): ?>
<?php foreach ($_items as $_review):?>
<div class="review-header">
<span class="review-title"><?php echo $this->htmlEscape($_review->getTitle()) ?></span>
// Get the average of all the votes for the final rating
$_votes = $_review->getRatingVotes();
foreach($_votes as $_vote) {
$_avgVote += $_vote->getPercent();
$_avgVote = round($_avgVote / count($_votes));
<table class="rating-table"><tr><td>
<img class="review-rating" src="<?php echo $this->getSkinUrl('images/rating-' . round($_avgVote / 20) . '.png') ?>" alt="Rated <?php echo round($_avgVote / 20) ?> / 5">
<span class="review-author"><?php echo $this->__('by %s on', $this->htmlEscape($_review->getNickname())) ?> <?php echo date('F j, Y', strtotime($this->formatDate($_review->getCreatedAt()))) ?></span>
<div class="review-content">
<?php echo nl2br($this->htmlEscape($_review->getDetail())) ?>
<p class="no-reviews"><?php echo $this->__('There are no reviews for this product. You could be the first to review!') ?></p>
<?php echo $this->getChildHtml('review_form') ?>
Теперь, как мы можем отобразить этот блок на странице товара? Нам необходимо отредактировать ещё один файл:
/app/design/frontend/YOUR_THEME/template/catalog/product/view.phtml
Добавьте <?php echo $this->getChildHtml('product_reviews') ?> к вашей view.phtml странице. Вот и всё! Теперь вы можете показать последние отзывы на вашей странице товара, без необходимости посещать страницу обзора товаров.
<?php echo $this->getLayout()->createBlock('review/product_view_list')->setTemplate('review/product/view/product_reviews.phtml')->toHtml() ?>
{{block type="review/product_view_list" template="review/product/view/product_reviews.phtml"}}
Смотрите пример кода выше.
Динамический блок с вашими данными
Например, вы хотите показать самые продаваемые товары на главной странице. Из коробки, нет никакого способа, чтобы получить эти данные из существующего типа блока magento. Вам необходимо будет создать тип блока с нуля. В этом примере мы создадим новый файл, он будет находится здесь:
/app/code/local/Mage/Catalog/Block/Product/Bestseller.php
class Mage_Catalog_Block_Product_Bestseller extends Mage_Catalog_Block_Product_Abstract
public function __construct()
$storeId = Mage::app()->getStore()->getId();
$products = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect(array('name', 'price', 'small_image'))
->addStoreFilter($storeId)
->setOrder('ordered_qty', 'desc');
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products);
$products->setPageSize(5)->setCurPage(1);
$this->setProductCollection($products);
Теперь у вас есть тип блока. Далее нам нужно создать файл шаблона, для перебора коллекции товаров. Обратите внимание на следующие строки:
$products->setPageSize(5)->setCurPage(1);
$this->setProductCollection($products);
Это позволит установить коллекцию продуктов для показа в нашем шаблоне, как показано ниже:
/app/design/frontend/YOUR_THEME/template/catalog/product/bestsellers.phtml
<?php if (($_products = $this->getProductCollection()) && $_products->getSize()): ?>
<?php $_collectionSize = count($_products->getItems()) ?>
<h2 style="margin: 0"><?php echo $this->__('Best Sellers') ?></h2>
<?php foreach ($_products->getItems() as $_product): ?>
<div class="grid-image"><a href="<?php echo $_product->getProductUrl() ?>"><img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(118) ?>" alt="<?php echo $this->htmlEscape($_product->getName()) ?>"></a></div>
<div class="grid-rating"><?php echo $this->getReviewsSummaryHtml($_product) ?></div>
<div class="grid-title"><a href="<?php echo $_product->getProductUrl() ?>"><?php echo $this->htmlEscape($_product->getName()) ?></a></div>
<div class="grid-price"><?php echo $this->getPriceHtml($_product, false, '-new') ?></div>
<h2><?php echo $this->__('Best Sellers') ?></h2>
<p><?php echo $this->__('No best sellers were found. Clear your cache, reindex and make sure you've sold some products!') ?></p>
Теперь вы можете включить ваш блок самых продаваемых товаров:
<?php echo $this->getLayout()->createBlock('catalog/product_bestseller')->setTemplate('catalog/product/bestsellers.phtml')->toHtml() ?>
{{block type="catalog/product_bestseller" template="catalog/product/bestsellers.phtml"}}
<block type="catalog/product_bestseller" name="product.bestsellers" as="bestsellers" template="catalog/product/bestsellers.phtml"/>
Включите в макет и ссылку на ваш выбор, а затем можете использовать:
<?php echo $this->getChildHtml('bestsellers') ?>
Структурные блоки используются для хранения блоков с содержимым и размещения их в вашей теме magento. Заметили ли вы именные ссылки в файлах макетов, таких как “left”, “content”, “right”, “header” и “footer”? Это и есть структурные блоки. Вы можете добавить их в свой page.xml файл макета, или local.xml файл макета вашей темы так:
<block type="core/text_list" name="my_structural_block" as="structure_block"/>
Атрибут “name” для ссылки в вашем макете. Атрибут “as” используется для getChildHtml() в файле вашего шаблона.
После добавления структурного блока в XML макет, вы можете добавлять блоки с содержимым внутри <reference name="my_structural_block">. Для отображения вашего структурного блока в шаблоне, используйте <?php echo $this->getChildHtml('structure_block') ?>.