2010-10-19 51 views
1

我试图在Magento后端创建一个自定义报告;我的策略是首先让我的新模块在管理面板中模拟现有的Reports/Sales/Orders功能,然后在看到这些部分如何组合在一起后进行所需的更改。我添加了我的新菜单项,并且该模块加载了基本的管理布局和一些面包屑,因此模块配置和控制器配置设置得当。但是,布局块未加载。这是问题代码。假设我有相关的块文件的副本,在应用程序/代码/本地/ BULX /报告/座/报告/销售/销售/ Grid.php:为新的管理模块配置Magento布局

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'); 

与应用程序/代码以下文件/本地/ BULX /报告/座/ 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'字符串不会出现在任何地方 - 这些网格出现在管理员的很多地方,并且它们是通过我没有找到的结构动态构建的。

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

回答

4
  1. 一般的PHP调试提示,从来没有“回声”浏览器,总是var_dump($ var)。这会做一些聪明的事情,比如实际上打印出“假”而不是空白字符串,这是我认为在这里发生的事情。

  2. 试图获取名为“report_sales_sales.grid”的块很可能返回false。这是因为这个名称的块没有被添加到布局。

  3. 我不能肯定,但我的猜测是此名称的块地方加入由特定的布局更新掀起执行链中app/design/adminhtml/default/default/layout/sales.xml

    store_ids created_at_order 订单创建日期 updated_at_order Order Upda ted日期 report_type 说明 订单更新日期报表是实时的,不需要统计刷新。

最有可能的,块名为sales.report.grid.container(与URI adminhtml/report_sales_sales这coresponds到类Mage_Adminhtml_Block_Report_Sales_Sales)增加了一个子块(但不可以引用我这句话)

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

你要么需要

  1. 配置您的模块来使用,增加了块你把手

  2. 使用自定义布局文件一个local.xml做同样的(注意,我不确定local.xml是用于管理布局系统)

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

+0

管理员布局手柄是否始终必须以adminhtml开头?也许这是我的问题:我的句柄执行bulxreport_index_sales,但也许它应该是adminhtml_bulxreport_index_sales。但是,这似乎也不起作用。不幸的是,我不得不把它搁置几天,并且不能再补充几次 – kevinpaulconnor 2010-10-26 12:57:48

3

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

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

+0

好的,这是有道理的。我在模块配置中定义了bulxreports.xml,并将adminhtml_report_sales_sales部分复制到其中,并将其重命名为bulxreports_index_sales,但没有任何效果。我应该重新命名传递给getBlock的参数以匹配url吗?我还能找什么? – kevinpaulconnor 2010-10-19 17:21:57

+0

尝试从Alanstorm.com安装LayoutViewer,它会告诉您在当前请求中使用哪些布局句柄。或者他的商业扩展。 – 2010-10-21 23:40:58

+0

LayoutViewer非常棒,我经常在前端使用它。我没有意识到它在管理面板中的作用 - 谢谢。 – kevinpaulconnor 2010-10-26 12:56:54