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

12

我有一个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模板相同的方式呈现每个块。例如:

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

先行致谢。

1个回答

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;
请注意,您必须手动指定要从哪些布局句柄加载块。 'default'布局句柄将包含侧边栏,因为它是从checkout.xml中放置在那里的。
但是,使用“default”布局句柄可能会带来显着的性能成本,因为许多模块将其块放置在此句柄中。您可能希望将您在外部网站上使用的所有块放置在单独的布局句柄中,并仅加载该布局句柄。
选择权在您手中。祝你好运。

2
谢谢,它有效了!然而,在管理->系统->设计中,我无法看到任何设计更改。在管理->系统->配置->设计中进行了修复设置。还请注意,在Mage::init()之后,如果没有以下行,则无法查看购物车内容: Mage::getSingleton('core/session', array('name'=>'frontend')); - azkotoki
我在使用这个程序时遇到了问题——它在 $layout->generateBlocks(); 处崩溃了。你有什么想法吗? - aendra
@DanielSloof 我想这会有所帮助,是吧?“致命错误:Mage_Core_Model_Session_Abstract::getMessages():脚本尝试执行不完整对象的方法或访问属性。请确保在调用unserialize()之前加载了对象的类定义“Mage_Core_Model_Message_Collection”,或提供一个__autoload()函数来加载类定义,在/home/aendrew/workspace/project/magento/app/code/core/Mage/Core/Model/Session/Abstract.php的第215行。”我在http://stackoverflow.com/questions/13588483/上开了一个新问题。 - aendra
如果我需要将块翻译成特定语言怎么办? - Marek Maurizio
@MarekMaurizio 翻译是绑定到storeview的,因此您将使用Mage::init('the_storeview_code', 'store')而不是Mage::init()。 - Daniel Sloof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接