2010-12-21 72 views
0

我必须开发一个模块来导出产品,订单,客户组合属性的集合。所以我认为,不要为了这个目的修改核心销售报告,而是更好地进行自定义功能。这些是我做过的步骤,但我无法制作它。用于此的magento 1.4.1版本。Magento管理员自定义销售报告

/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 /应用/代码/核心/法师/ 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'));我只得到布尔(虚假)。它不会调用电子书阅读器网格,而不是从销售中继续加载块和网格。

我搜索了大部分与报告相关的文件,我仍然无法找出问题所在。 希望你们中的许多人经历过这些问题,请任何人都可以告诉我在哪里犯错或缺少什么。

回答

1

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

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

+0

完美,谢谢。 – Elamurugan 2010-12-24 06:57:25

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(); 
} 

$此 - > _控制器是这里的关键。 然后你在块中定义它,看到你的sales.xml是“adminhtml/report_sales_sales”。
该块应该从Mage_Adminhtml_Block_Widget_Grid_Container延伸,你应该定义:: _该块的contrusctor内部控制器:

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'

,所以你需要一个类也一样,一d所以你可能要改变“东西”在YOUT 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” 是 “_controller” 块“adminhtml/report_sales_sales” 内部Mage_Adminhtml_Block_Report_Sales_Sales)的值。