Layout 为新管理模块配置Magento布局

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

我正在尝试在Magento后端创建自定义报告;我的策略是,首先让我的新模块模仿管理面板中现有的报表/销售/订单功能,然后在我看到各个部分是如何组合在一起后进行必要的更改。我添加了我的新菜单项,模块加载了基本的管理布局和一些面包屑,因此模块配置和控制器配置设置足够正确。但是,没有加载布局块。这是问题代码。假设我在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>";
下面的文件位于app/code/local/BULX/Reports/Block/Test.php

class BULX_Reports_Block_Test extends Mage_Core_Block_Abstract
{
 protected function _toHtml() {
  echo 'to html';
 }
}
我得到了相同的结果:没有“to html”输出,没有get_类调用的输出

我在这里建议添加日志语句:

很明显,Magento在我的新模块中找不到任何布局块。Alan Storm的教程通常非常有用,但我在alanstorm.com/magento_admin_controllers中找不到我需要的内容(抱歉,没有足够的声誉来提供两个超链接);据我所知,我已经设置了相同的配置。一个困难是“report\u sales\u sales.grid”字符串没有出现在那些网格出现在管理中的很多地方的任何地方,它们是由我没有找到的结构动态生成的


我错过了什么?这是企业版,1.8。谢谢

检查文件
app/design/adminhtml/default/default/layout/sales.xml
中与请求的URL匹配的部分。它有一个“adminhtml/report\u sales\u sales”类型的块,这是一个网格容器,网格容器自动创建它们的子网格块


因此,缺少的块“report\u sales\u sales.grid”是通过在布局中定义“adminhtml/report\u sales\u sales”块创建的。因为您的页面是新的,所以它的URL在布局XML文件中还没有匹配的部分,所以没有网格容器,所以没有网格。将sales.xml中的
部分复制到您自己的布局文件中,并将其命名为与页面URL匹配的文件。

检查文件
app/design/adminhtml/default/default/layout/sales.xml
,查看与请求的URL匹配的部分
。它有一个“adminhtml/report\u sales\u sales”类型的块,这是一个网格容器,网格容器自动创建它们的子网格块

因此,缺少的块“report\u sales\u sales.grid”是通过在布局中定义“adminhtml/report\u sales\u sales”块创建的。因为您的页面是新的,所以它的URL在布局XML文件中还没有匹配的部分,所以没有网格容器,所以没有网格。将sales.xml中的
部分复制到您自己的布局文件中,并将其命名为与页面URL匹配的文件

  • 一般的PHP调试技巧,从不“回显”到浏览器,总是var_dump($var)。这将做一些聪明的事情,比如实际打印一个布尔false的“false”,而不是一个空白字符串,这就是我认为正在发生的事情

  • 您试图获取名为“report\u sales\u sales.grid”的块很可能返回false。这是因为此名称的块尚未添加到布局中

  • 我不确定,但我猜在执行链的某个位置添加了一个名为的块,该块由
    app/design/adminhtml/default/default/layout/sales.xml中的特定布局更新所引发

    存储单元ID 按订单创建 订单创建日期 按订单更新 订单更新日期 报告类型 笔记 订单更新日期报告是实时的,不需要刷新统计信息。

  • 最有可能的是,名为
    sales.report.grid.container
    (带有URI
    adminhtml/report\u sales\u sales
    ,与类Mage\u adminhtml\u block\u report\u sales\u sales相关)的块添加了一个子块(但不要引用我的话)

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

    你要么需要

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

  • 使用
    local.xml
    执行与上述相同的操作(注意,我不确定
    local.xml
    是否用于管理布局系统)

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

  • 一般的PHP调试技巧,从不“回显”到浏览器,总是var_dump($var)。这将做一些聪明的事情,比如实际打印一个布尔false的“false”,而不是一个空白字符串,这就是我认为正在发生的事情

  • 您试图获取名为“report\u sales\u sales.grid”的块很可能返回false。这是因为此名称的块尚未添加到布局中

  • 我不确定,但我猜在执行链的某个位置添加了一个名为的块,该块由
    app/design/adminhtml/default/default/layout/sales.xml中的特定布局更新所引发

    存储单元ID 按订单创建 订单创建日期 按订单更新 订单更新日期 报告类型
    $gridBlock = $this->getLayout()->getBlock('bulx_reports/test');
    
    class BULX_Reports_Block_Test extends Mage_Core_Block_Abstract
    {
     protected function _toHtml() {
      echo 'to html';
     }
    }