在Magento外部加载块,并应用当前模板


Load block outside Magento, and apply current template

我有一个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之外渲染块(需要以下条件)?

  • 我希望设计更改的基本布局xml和商店的设计布局更新能够自动加载,所以我不需要(再次)手动指定模板路径和块类型
  • 我想按块的引用名称加载块,这样我就可以在布局xml文件中使用应用于它的属性

这个问题的目的是将它包装在一个函数中,并以在Magento模板上相同的方式渲染Magento之外的每个块。例如:

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

提前谢谢。

花了我几分钟的调试时间,但似乎相对容易。

<?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内部放置的。

但是,使用"默认"布局句柄可能会带来显著的性能成本,因为许多模块都将块放置在该句柄中。你可能想把你在外部网站上使用的所有块放在一个单独的布局句柄中,然后简单地加载它。

选择权在你。祝你好运