我必须开发一个模块来导出产品,订单,客户组合属性的集合。所以我认为而不是为此目的修改核心销售报告,以便更好地进行自定义功能。这些是我做的步骤,但我无法生产它。使用magento 1.4.1版本。
下的 /var/www/magento141/app/code/core/Mage/Reports/etc/adminhtml.xml 为菜单添加了这些行。
<ereaders translate="title" module="reports">
<title>Sales Report</title>
<children>
<ereaders translate="title" module="reports">
<title>Sales Report</title>
<action>adminhtml/report_sales/ereaders</action>
</ereaders>
</children>
</ereaders>
下的
/var/www/magento141/app/design/adminhtml/default/default/layout/sales.xml 为过滤条件添加了这些行。
<adminhtml_report_sales_ereaders>
<update handle="report_sales"/>
<reference name="content">
<block type="adminhtml/report_sales_sales" template="report/grid/container.phtml" name="sales.report.grid.container">
<block type="adminhtml/store_switcher" template="report/store/switcher/enhanced.phtml" name="store.switcher">
<action method="setStoreVarName"><var_name>store_ids</var_name></action>
</block>
<block type="sales/adminhtml_report_filter_form_order" name="grid.filter.form">
----
</block>
</block>
</reference>
</adminhtml_report_sales_ereaders>
然后从销售中复制所需的块,模型文件,并将所有这些文件重命名为/ var / www / magento141 / app / code / core / Mage / Adminhtml /中的ereaders。
然后在/var/www/magento141/app/code/core/Mage/Adminhtml/controllers/Report/SalesController.php
下放置电子阅读器的动作public function ereadersAction()
{
$this->_title($this->__('Reports'))->_title($this->__('Sales'))->_title($this->__('EReaders Sales'));
$this->_showLastExecutionTime(Mage_Reports_Model_Flag::REPORT_ORDER_FLAG_CODE, 'ereaders');
$this->_initAction()
->_setActiveMenu('report/sales/ereaders')
->_addBreadcrumb(Mage::helper('adminhtml')->__('EReaders Sales Report'), Mage::helper('adminhtml')->__('EReaders Sales Report'));
$gridBlock = $this->getLayout()->getBlock('report_sales_ereaders.grid');
$filterFormBlock = $this->getLayout()->getBlock('grid.filter.form');
$this->_initReportAction(array(
$gridBlock,
$filterFormBlock
));
$this->renderLayout();
}
这里当我使用var_dump ==&gt; //var_dump($this->getLayout()->getBlock('report_sales_ereaders.grid'));我只得到bool(假)。它不会调用ereaders网格,而是仅调用Sales中的静态加载块和网格。
我搜索了大部分与报告相关的文件,但仍然无法找到问题所在。 希望你们中的许多人经历过这些问题,请有人能告诉我哪里弄错了或遗失了什么。
答案 0 :(得分:1)
我没有在您的布局文件中看到名为“report_sales_ereaders.grid”的块,如果这是您要使用的名称,则应将“sales.report.grid.container”更改为“report_sales_ereaders.grid”。布局。 getBlock方法使用布局文件中的name属性来加载块。
如果仍有问题,请详细了解您在后台复制的块和模型。希望这有帮助。
答案 1 :(得分:1)
您没有名为'report_sales_ereaders.grid'的块,因为该块是由Magento在此动态创建的:
// class Mage_Adminhtml_Block_Widget_Grid_Container
protected function _prepareLayout()
{
$this->setChild( 'grid',
$this->getLayout()->createBlock( $this->_blockGroup.'/' . $this->_controller . '_grid',
$this->_controller . '.grid')->setSaveParametersInSession(true) );
return parent::_prepareLayout();
}
$ this-&gt; _controller是这里的关键。 然后在块中定义它,看看你的sales.xml是“adminhtml / report_sales_sales” 该块应该从 Mage_Adminhtml_Block_Widget_Grid_Container 扩展,你应该在该块的控制器中定义:: _ controller:
public function __construct()
{
$this->_blockGroup = 'something';
$this->_controller = 'report_sales_ereaders'; // THIS !!!
parent::__construct();
... // see a similar block from magento
}
还要注意上面的第一个代码(_prepareLayout),Mage_Adminhtml_Block_Widget_Grid_Container将尝试使用名为(uri)的块:
'something / report_sales_ereaders_grid'
因此您也需要该类,因此您可能希望使用<blocks>
下的yout config.xml中使用的节点更改“某些内容”
该块将具有名称(在布局中):“report_sales_ereaders.grid”
所以,根据你想要做的,你有两个选择:
1)在sales.xml布局中更改块的类型,因此它指向您自己的块(并在那里定义您的“_controller”我上面显示的内容等)。
2)改变
$gridBlock = $this->getLayout()->getBlock('report_sales_ereaders.grid');
到
$gridBlock = $this->getLayout()->getBlock('report_sales_sales.grid');
因为“report_sales_sales”是块“adminhtml / report_sales_sales”(Mage_Adminhtml_Block_Report_Sales_Sales
)中“_controller”的值。