Загрузите блок за пределами 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>
Заранее благодарю.
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 .
Но использование дескриптора макета "по умолчанию" может привести к значительным затратам на производительность, поскольку многие модули помещают свои блоки в этот дескриптор. Возможно, вы захотите поместить все блоки, которые вы используете, на ваш внешний сайт в отдельном макете обрабатывается и просто загружается.
Выбор за вами. Удачи.