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

azk*_*oki 12 php integration 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();
Run Code Online (Sandbox Code Playgroud)

但是,我希望(并且相信这是可能的)一种更好的方法.

我不喜欢这样一个事实:我必须手动指定模板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>
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Dan*_*oof 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;
Run Code Online (Sandbox Code Playgroud)

请注意,您必须手动指定要从中加载块的布局句柄."默认"布局句柄将包含侧边栏,因为它位于checkout.xml内部.

但是,使用"默认"布局句柄会带来显着的性能成本,因为许多模块将其块放在此句柄中.您可能希望将您在外部站点上使用的所有块放在单独的布局句柄中,然后只需加载它.

这是你的选择.祝好运.

  • 谢谢,它的确有效!然而,我无法在管理 - >系统 - >设计中看到任何设计更改.修复了在管理 - >系统 - >配置 - >设计中的设置.另请注意,在Mage :: init()`之后,我无法看到没有以下行的购物车内容:`Mage :: getSingleton('core/session',array('name'=>'frontend')); ` (2认同)