0

我必须开发一个模块来导出产品、订单、客户组合属性的集合。因此,我认为与其为此目的修改核心销售报告不如做一个自定义功能。这些是我所做的步骤,但我无法制作它。为此使用了 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>

然后从 sales 复制所需的块、模型文件,并将它们全部重命名为 /var/www/magento141/app/code/core/Mage/Adminhtml/ 下的电子阅读器。

然后在 /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 ==> //var_dump($this->getLayout()->getBlock('report_sales_ereaders.grid')); 我只得到 bool(false)。它不调用电子阅读器网格,而不是仅从销售中加载块和网格。

我搜索了大多数与报告相关的文件,但仍然无法找出问题所在。希望你们中的许多人都经历过这些问题,请谁能告诉我哪里出错或遗漏了什么。

4

2 回答 2

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->_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) 的块:

'东西/report_sales_ereaders_grid'

所以你也需要那个类,因此你可能想用你的 config.xml 中使用的节点来改变“一些东西”<blocks>

该块将具有名称(在您的布局内):“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”的值。

于 2012-03-15T01:59:05.327 回答
1

我在布局文件中没有看到名为“report_sales_ereaders.grid”的块,如果这是您要使用的名称,您应该在布局中将“sales.report.grid.container”更改为“report_sales_ereaders.grid”。getBlock 方法使用布局文件中的 name 属性来加载块。

如果您仍然有问题,请详细了解您在后台复制的块和模型。希望这可以帮助。

于 2010-12-23T15:48:23.527 回答