Загрузите блок за пределами Magento и примените текущий шаблон


У меня есть установка Magento, которая интегрирована с внешним веб-сайтом, и я хочу, чтобы блок корзины покупок Magento отображался в заголовке этого внешнего сайта.

Я добился этого с помощью следующего кода:

<?php

require_once(dirname(__FILE__).'/store/app/Mage.php');

$app = Mage::app();
$session = Mage::getSingleton('core/session', array('name'=>'frontend'));

$block = $app
    ->getLayout()
    ->getBlockSingleton('checkout/cart_sidebar')
    ->setTemplate('checkout/cart/sidebar.phtml');

echo $block->toHtml();

Но я хочу (и верю, что это возможно) более приятный подход.

Мне не нравится тот факт, что я должен указывать шаблон вручную с помощью setTemplate(), что включает в себя жесткое кодирование расположения шаблонов и повторение того, что он определен где-то в другом месте (в xml-файлах макета дизайна). Я попытался загрузить блок через $app->getLayout()->getBlock($name) без результатов (were $name представляет ссылочное имя блока, как определено в xml-файлах макета).

Итак, вопрос в том,:

Есть ли способ отобразить блок за пределами magento (со следующими реквизитами)?

  • Я хочу, чтобы XML базового макета и обновления макета дизайна магазина с изменениями дизайна загружались автоматически, поэтому мне не нужно указывать путь к шаблону и тип блока (снова) вручную.
  • Я хочу загрузить блок по его ссылочному имени, чтобы я мог использовать свойства, примененные к нему в xml-файлах макета.

Цель этого вопроса - обернуть его в функцию и отобразить каждый блок за пределами Magento так же, как это делается в шаблонах Magento. Например:

<div id="sidebar-cart-container">
    <?php echo $this->renderMagentoBlock('cart-block-reference-id'); ?>
</div>

Заранее благодарю.

Author: azkotoki, 2011-06-14

1 answers

Мне потребовалось несколько минут на отладку, но это кажется относительно простым.

<?php

/*
 * Initialize magento.
 */
require_once 'app/Mage.php';
Mage::init();

/*
 * Add specific layout handles to our layout and then load them.
 */
$layout = Mage::app()->getLayout();
$layout->getUpdate()
    ->addHandle('default')
    ->addHandle('some_other_handle')
    ->load();

/*
 * Generate blocks, but XML from previously loaded layout handles must be
 * loaded first.
 */
$layout->generateXml()
       ->generateBlocks();

/* 
 * Now we can simply get any block in the usual way.
 */
$cart = $layout->getBlock('cart_sidebar')->toHtml();
echo $cart;

Пожалуйста, обратите внимание, что вы должны вручную указать, из каких дескрипторов макета вы хотите загружать блоки. Дескриптор макета "по умолчанию" будет содержать боковую панель, так как он размещен там изнутри checkout.xml .

Но использование дескриптора макета "по умолчанию" может привести к значительным затратам на производительность, поскольку многие модули помещают свои блоки в этот дескриптор. Возможно, вы захотите поместить все блоки, которые вы используете, на ваш внешний сайт в отдельном макете обрабатывается и просто загружается.

Выбор за вами. Удачи.

 23
Author: Daniel Sloof, 2013-11-01 00:22:49