在 Magento 之外加载块,并应用当前模板
我有一个与外部网站集成的 Magento 安装,我希望 Magento 的购物车块显示在这个外部网站的标题上.
我使用以下代码实现了这一点:
<?phprequire_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');回声 $block->toHtml();
但是,我想要(并且相信这是可能的)更好的方法.
我不喜欢我必须通过 setTemplate()
手动指定模板的事实,这涉及硬编码模板位置并重复它在其他地方(在设计的布局 xml 文件中)定义的内容.我尝试通过 $app->getLayout()->getBlock($name)
加载块,但没有结果($name
表示块的引用名称,如在布局 xml 文件中定义).
所以问题是:
有没有办法在 magento 之外渲染一个块(具有以下必要条件)?
- 我希望自动加载基本布局 xml 和商店的设计更改的设计布局更新,因此我不需要(再次)手动指定模板路径和块类型.
- 我想通过引用名称加载块,这样我就可以在布局 xml 文件中使用应用于它的属性.
这个问题的目的是将它包装在一个函数中,并以与在 Magento 模板上所做的相同的方式在 Magento 之外渲染每个块.例如:
<?php echo $this->renderMagentoBlock('cart-block-reference-id');?>
提前致谢.
解决方案花了我几分钟的调试时间,但似乎相对容易.
getLayout();$layout->getUpdate()->addHandle('默认')->addHandle('some_other_handle')-> 加载();/** 生成块,但必须是来自先前加载的布局句柄的 XML* 首先加载.*/$layout->generateXml()->generateBlocks();/** 现在我们可以简单地以通常的方式获取任何块.*/$cart = $layout->getBlock('cart_sidebar')->toHtml();回声 $cart;
请注意,您必须手动指定要从中加载块的布局句柄.默认"布局句柄将包含侧边栏,因为它位于 checkout.xml 中.
但是使用默认"布局句柄会带来显着的性能成本,因为许多模块将它们的块放置在此句柄中.您可能希望将您在外部站点上使用的所有块放在一个单独的布局句柄中,然后简单地加载它.
选择权在你.祝你好运.
I have a Magento installation which is integrated with an external website, and I want the Magento's shopping cart block to be displayed on the header of this external site.
I have achieved this with the following code:
<?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();
But, I want (and believe that it's possible) a nicer approach.
I dislike the fact that I must specify the template manually via setTemplate()
, which involves hard-coding template locations and repeating something that it's defined somewhere else (in the design's layout xml files). I tried loading the block via $app->getLayout()->getBlock($name)
with no results (were $name
represents the block's reference name, as defined in the layout xml files).
So the question is:
Is there any way to render a block outside magento (with the following requisites)?
- I want the base layout xml and the store's design layout updates of the design changes to be loaded automatically, so i don't need to specify the template path and the block type (again) manually.
- I want to load the block by it's reference name, so I can make use of the properties applied to it on the layout xml files.
The purpose of this question is to wrap it in a function, and render every block outside Magento the same way it's done on the Magento templates. For example:
<div id="sidebar-cart-container">
<?php echo $this->renderMagentoBlock('cart-block-reference-id'); ?>
</div>
Thanks in advance.
解决方案Took me a couple minutes of debugging, but it seems relatively easy.
<?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;
Please note that you must manually specify which layout handles you want to load blocks from. The 'default' layout handle will contain the sidebar since it is placed there from inside checkout.xml.
But using the 'default' layout handle can come with a significant performance cost since many modules place their blocks in this handle. You may want to put all the blocks that you use on your external site in a separate layout handle and simply load that.
The choice is yours. Good luck.
相关文章