我有一个与外部网站集成的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)
加载块而没有结果($name
表示块的引用名称,如布局xml文件中所定义。)
所以问题是:
有没有办法在magento之外渲染一个块(具有以下必要条件)?
这个问题的目的是将它包装在一个函数中,并在Magento外部渲染每个块,就像在Magento模板上完成一样。例如:
<div id="sidebar-cart-container">
<?php echo $this->renderMagentoBlock('cart-block-reference-id'); ?>
</div>
提前致谢。
答案 0 :(得分:23)
花了我几分钟的调试,但似乎相对容易。
<?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内部。
但是使用'default'布局句柄会带来很大的性能成本,因为许多模块将它们的块放在这个句柄中。您可能希望将外部站点上使用的所有块放在单独的布局句柄中,然后只需加载它。
选择权在你手中。祝你好运。