Magento模块 - 覆盖控制器,添加模板

时间:2010-03-05 17:08:03

标签: php magento e-commerce

我目前正在开发一个Magento扩展,我已经覆盖了一个核心控制器,它工作正常。

我现在已经向我的控制器添加了一个新动作。问题是每当我调用动作时都会产生一个空白页面。如果我回应一些东西,它会正确显示。

因此,我挖掘了Customer模块和控制器的核心。我在那里看到像indexAction()这样的方法以这种方式实现布局:

<?php
public function indexAction()
{
  $this->loadLayout();
  $this->_initLayoutMessages('customer/session');
  $this->_initLayoutMessages('catalog/session');

  $this->getLayout()->getBlock('content')->append(
      $this->getLayout()->createBlock('customer/account_dashboard')
  );
  $this->getLayout()->getBlock('head')->setTitle($this->__('My Account'));
  $this->renderLayout();
}

我将此转移到我自己的动作,现在正确地呈现了布局。现在提出问题:

无论我在->createBlock('...')调用中输入什么内容,都不会在内容区域中呈现任何内容。

如何指定我自己的块的位置作为页面内容呈现,同时仍然使用布局进行装饰?

我试图摆弄/design/frontend/base/default/layout/myaddon.xml中的xml文件但却无法真正发挥作用。

1 个答案:

答案 0 :(得分:6)

在单个StackOverflow帖子中覆盖整个Magento布局系统有点多,但您应该能够通过以下方式实现您想要的目标。

    $block = $this->getLayout()->createBlock('Mage_Core_Block_Text');
    $block->setText('<h1>This is a Test</h1>');
    $this->getLayout()->getBlock('content')->append($block);

从上面开始,你应该能够建立你需要的东西。您的想法是创建自己的块,然后将它们附加到布局中的现有块。理想情况下,您要创建自己的块类来实例化(而不是Mage_Core_Block_Text),并使用其内部模板机制加载phtml文件(将HTML生成与代码生成分开)。

如果你对学习布局系统如何工作的内部感兴趣,你可能会比我在这个主题上写的an article更糟糕。