为新管理模块配置Magento布局

时间:2010-10-19 15:12:58

标签: layout magento module admin

我正在尝试在Magento后端创建自定义报告;我的策略是首先让我的新模块模仿管理面板中现有的Reports / Sales / Orders功能,然后在我看到这些部分如何组合在一起后进行必要的更改。我添加了新的菜单项,模块加载了基本的管理布局和一些面包屑,因此模块配置和控制器配置设置得足够正确。但是,未加载布局块。这是问题代码。假设我在app / code / local / BULX / Reports / Block / Report / Sales / Sales / Grid.php上有相关块文件的副本:

class BULX_Reports_IndexController extends Mage_Adminhtml_Report_SalesController { 

  public function salesAction {

  //...otherwise identical to parent class

  //should load reference to Grid block
  $gridBlock = $this->getLayout()->getBlock('report_sales_sales.grid');

  /* in original Mage module, will output Mage_Adminhtml_Block_Report_Sales_Sales_Grid
     in BULX_Report, outputs nothing. */
  echo get_class($gridBlock)."<br>";

我的配置文件有

<global>
  <blocks>
    <bulx_reports>
      <class>BULX_Reports_Block</class>
    </bulx_reports>
  </blocks>
  ...
</global>

如果我将代码更改为

$gridBlock = $this->getLayout()->getBlock('bulx_reports/test');

在app / code / local / BULX / Reports / Block / Test.php中使用以下文件

class BULX_Reports_Block_Test extends Mage_Core_Block_Abstract
{
 protected function _toHtml() {
  echo 'to html';
 }
}

我得到了相同的结果:没有'到'html'输出,没有来自get_class调用的输出

我按照此处的建议添加了日志语句: http://www.fontis.com.au/blog/magento/magento-debugging-loading-blocks-layouts-and-config-files

很明显,Magento在我的新模块中没有找到任何布局块。 Alan Storm的教程通常非常有帮助,但我在alanstorm.com/magento_admin_controllers中找不到我需要的东西(抱歉没有足够的声誉来拥有两个超链接);据我所知,我已经设置了相同的配置。一个难点是'report_sales_sales.grid'字符串没有出现在任何地方 - 这些网格出现在管理员的很多地方,它们是由我找不到的结构动态构建的。

我错过了什么?这是Enterprise Edition,1.8。谢谢!

2 个答案:

答案 0 :(得分:4)

  1. 一般的PHP调试提示,永远不会“回显”到浏览器,总是var_dump($ var)。这将做一些聪明的事情,比如实际打印出“false”表示布尔值为false而不是空字符串,这就是我认为这里发生的事情。

  2. 您尝试获取名为“report_sales_sales.grid”的块很可能返回false。那是因为此名称的块尚未添加到布局中。

  3. 我不确定,但我的猜测是这个名称的一个块被添加到app/design/adminhtml/default/default/layout/sales.xml

    中特定布局更新引发的执行链中的某处

                                                    store_ids                                                                created_at_order                     订单创建日期                                                       updated_at_order                     订单更新日期                                                       报告类型                     注意                     订单更新日期报告是实时的,不需要统计刷新。                                            

  4. 最有可能的是,名为sales.report.grid.container的块(带有adminhtml/report_sales_sales的URI与Mage_Adminhtml_Block_Report_Sales_Sales类相对应)会添加一个子块(但不要引用我)

    更重要的是,你在这里的一般方法是好的,但你没有足够复制。对Magento页面的请求使用Layout句柄“adminhtml_report_sales_sales”运行。对页面的请求将使用类似“adminhtml_report_index_sales”的布局句柄运行,这意味着上面的布局块不会加载到系统中。 (如果没有意义,请阅读Layout Handles。)

    您需要

    1. 将模块配置为使用自定义布局文件,为句柄添加块

    2. 使用local.xml执行与上述操作相同的操作(请注意,我不确定管理员布局系统使用local.xml

    3. 务实地在控制器操作中添加所需的块。

答案 1 :(得分:3)

检查文件app/design/adminhtml/default/default/layout/sales.xml以查找与所请求的网址匹配的<adminhtml_report_sales_sales>部分。它有一个类型为“adminhtml / report_sales_sales”的块,它是一个网格容器,网格容器自动创建它们的子网格块。

因此,通过在布局中定义“adminhtml / report_sales_sales”块来创建丢失的块“report_sales_sales.grid”。由于您的页面是新的,因此URL的布局XML文件中还没有匹配的部分,因此没有网格容器,因此没有网格。将sales.xml中的<adminhtml_report_sales_sales>部分复制到您自己的布局文件中,并将其命名为与您的网页网址相匹配。