创建新的完全自定义报告


22

大多数Magento报告构建论坛,博客,教程等似乎都集中在获取现有的Magento报告以及复制或扩展它上。其中大多数是链接到特定数据集的网格,并且所有网格都包含标准过滤器,例如,从/到日期和期间(以及某些报告上的额外过滤器)。

但是,关于如何使用自定义过滤器创建完全自定义报告的信息似乎很少。

例如,客户想要一个带有两个自定义过滤器的报告,该报告仅报告两个简单的聚合指标。


1
:只是一个资源参考stackoverflow.com/questions/7030255/...
B00MER

即使是我要显示相同的空白页,也请提出建议。

Answers:


22

首先,您需要生成一个自定义模块,创建以下文件:

    /app/etc/modules/Mycompany_Mymodule.xml 
    /app/design/adminhtml/default/default/layout/mymodule.xml 
    /app/code/local/Mycompany/Mymodule/Block/adminhtml/Mymodule/Grid.php
    /app/code/local/Mycompany/Mymodule/Block/adminhtml/Mymodule.php 
    /app/code/local/Mycompany/Mymodule/Block/Mymodule.php 
    /app/code/local/Mycompany/Mymodule/controllers/Adminhtml/MymoduleController.php 
    /app/code/local/Mycompany/Mymodule/etc/config.xml 
    /app/code/local/Mycompany/Mymodule/Helper/Data.php 
    /app/code/local/Mycompany/Mymodule/Model/Mymodule.php

/app/etc/modules/Mycompany_Mymodule.xml上定义模块:

<?xml version="1.0"?>
<config>
    <modules>
        <Mycompany_Mymodule>
            <active>true</active>
            <codePool>local</codePool>
        </Mycompany_Mymodule>
    </modules>
</config>

完成将更新管理视图的布局文件(我总是首先这样做,因为我不想忘记它)。 /app/design/adminhtml/default/default/layout/mymodule.xml

<?xml version="1.0"?>
<layout version="0.1.0">
    <mymodule_adminhtml_mymodule_index>
        <reference name="content">
            <block type="mymodule/adminhtml_mymodule" name="mymodule" />
        </reference>
    </mymodule_adminhtml_mymodule_index>
</layout>

使用以下内容创建配置文件/app/code/local/Mycompany/Mymodule/etc/config.xml

<?xml version="1.0"?>
<!-- 
/**
 * @category   Mycompany
 * @package    Mycompany_Mymodule
 * @author     Damian Alberto Pastorini
 */
 -->
<config>
    <modules>
        <Mycompany_Mymodule>
            <version>0.1.0</version>
        </Mycompany_Mymodule>
    </modules>
    <admin>
        <routers>
            <mymodule>
                <use>admin</use>
                <args>
                    <module>Mycompany_Mymodule</module>
                    <frontName>mymodule</frontName>
                </args>
            </mymodule>
        </routers>
    </admin>
    <adminhtml>
        <menu>
            <report>
                <children>
                    <mymodule translate="title" module="mymodule">
                        <title>Mymodule Report</title>
                        <action>mymodule/adminhtml_mymodule</action>
                    </mymodule>
                </children>
            </report>
        </menu>
        <acl>
            <resources>
                <all>
                    <title>Allow Everything</title>
                </all>
                <admin>
                    <children>
                        <report>
                            <children>
                                <mymodule translate="title" module="mymodule">
                                    <title>Mymodule Report</title>
                                    <action>mymodule/adminhtml_mymodule</action>
                                </mymodule>
                            </children>
                        </report>
                    </children>
                </admin>
            </resources>
        </acl>
        <layout>
            <updates>
                <mymodule>
                    <file>mymodule.xml</file>
                </mymodule>
            </updates>
        </layout>
    </adminhtml>
    <global>
        <models>
            <mymodule>
                <class>Mycompany_Mymodule_Model</class>
                <resourceModel>mymodule</resourceModel>
            </mymodule>
        </models>
        <resources>
            <mymodule_setup>
                <setup>
                    <module>Mycompany_Mymodule</module>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </mymodule_setup>
            <mymodule_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </mymodule_write>
            <mymodule_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </mymodule_read>
        </resources>
        <blocks>
            <mymodule>
                <class>Mycompany_Mymodule_Block</class>
            </mymodule>
        </blocks>
        <helpers>
            <mymodule>
                <class>Mycompany_Mymodule_Helper</class>
            </mymodule>
        </helpers>
    </global>
</config>

在这里,我们定义控制器,菜单访问和权限,模型,块和帮助器。

创建网格并指定所有列/app/code/local/Mycompany/Mymodule/Block/adminhtml/Mymodule/Grid.php

<?php
 class Mycompany_Mymodule_Block_Adminhtml_Mymodule_Grid extends Mage_Adminhtml_Block_Report_Grid {

public function __construct() {
    parent::__construct();
    $this->setId('mymoduleGrid');
    $this->setDefaultSort('created_at');
    $this->setDefaultDir('ASC');
    $this->setSaveParametersInSession(true);
    $this->setSubReportSize(false);
}

protected function _prepareCollection() {
    parent::_prepareCollection();
    $this->getCollection()->initReport('mymodule/mymodule');
    return $this;
}

protected function _prepareColumns() {
    $this->addColumn('ordered_qty', array(
        'header'    =>Mage::helper('reports')->__('Quantity Ordered'),
        'align'     =>'right',
        'index'     =>'ordered_qty',
        'total'     =>'sum',
        'type'      =>'number'
    ));
    $this->addColumn('item_id', array(
        'header' => Mage::helper('mymodule')->__('Item ID'),
        'align' => 'right',
        'index' => 'item_id',
        'type'  => 'number',
        'total' => 'sum',
    ));
    $this->addExportType('*/*/exportCsv', Mage::helper('mymodule')->__('CSV'));
    $this->addExportType('*/*/exportXml', Mage::helper('mymodule')->__('XML'));
    return parent::_prepareColumns();
}

public function getRowUrl($row) {
    return false;
}

public function getReport($from, $to) {
    if ($from == '') {
        $from = $this->getFilter('report_from');
    }
    if ($to == '') {
        $to = $this->getFilter('report_to');
    }
    $totalObj = Mage::getModel('reports/totals');
    $totals = $totalObj->countTotals($this, $from, $to);
    $this->setTotals($totals);
    $this->addGrandTotals($totals);
    return $this->getCollection()->getReport($from, $to);
}
}

该文件最清晰,但是我为您提供了有关特定行的提示:

//此行指示用于获取数据的模型。

$this->getCollection()->initReport('mymodule/mymodule'); // it's used to indicate that this field must be totalized at the end. 
'total' =>'sum', // this is executed when you click on the rows grid, in case you return false (like the example) nothing will happen when you click on the rows grid. 
public function getRowUrl($row) {

下一步,创建网格容器块/app/code/local/Mycompany/Mymodule/Block/adminhtml/Mymodule.php

<?php
 class Mycompany_Mymodule_Block_Adminhtml_Mymodule extends Mage_Adminhtml_Block_Widget_Grid_Container {

public function __construct() {
    $this->_controller = 'adminhtml_mymodule';
    $this->_blockGroup = 'mymodule';
    $this->_headerText = Mage::helper('mymodule')->__('Mymodule Report');
    parent::__construct();
    $this->_removeButton('add');
}
}

在这里,我们添加此行以删除添加按钮://必须始终在该parent::__construct();行之后。$this->_removeButton('add');

创建一个块容器/app/code/local/Mycompany/Mymodule/Block/Mymodule.php

<?php
 class Mycompany_Mymodule_Block_Mymodule extends Mage_Core_Block_Template {

public function _prepareLayout() {
    return parent::_prepareLayout();
}

public function getMymodule() {
    if (!$this->hasData('mymodule')) {
        $this->setData('mymodule', Mage::registry('mymodule'));
    }
    return $this->getData('mymodule');
} 
}

创建控制器/app/code/local/Mycompany/Mymodule/controllers/Adminhtml/MymoduleController.php

<?php

 class Mycompany_Mymodule_Adminhtml_MymoduleController extends Mage_Adminhtml_Controller_Action {

protected function _initAction() {
    $this->loadLayout();
    return $this;
}

public function indexAction() {
    $this->_initAction()
            ->renderLayout();
}

public function exportCsvAction() {
    $fileName = 'mymodule.csv';
    $content = $this->getLayout()->createBlock('mymodule/adminhtml_mymodule_grid')
                    ->getCsv();
    $this->_sendUploadResponse($fileName, $content);
}

public function exportXmlAction() {
    $fileName = 'mymodule.xml';
    $content = $this->getLayout()->createBlock('mymodule/adminhtml_mymodule_grid')
                    ->getXml();
    $this->_sendUploadResponse($fileName, $content);
}

protected function _sendUploadResponse($fileName, $content, $contentType='application/octet-stream') {
    $response = $this->getResponse();
    $response->setHeader('HTTP/1.1 200 OK', '');
    $response->setHeader('Pragma', 'public', true);
    $response->setHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0', true);
    $response->setHeader('Content-Disposition', 'attachment; filename=' . $fileName);
    $response->setHeader('Last-Modified', date('r'));
    $response->setHeader('Accept-Ranges', 'bytes');
    $response->setHeader('Content-Length', strlen($content));
    $response->setHeader('Content-type', $contentType);
    $response->setBody($content);
    $response->sendResponse();
    die;
}
}

然后是空的辅助程序/app/code/local/Mycompany/Mymodule/Helper/Data.php

<?php
class Mycompany_Mymodule_Helper_Data extends Mage_Core_Helper_Abstract
{

}

最后,我们创建一个模型,该模型将带来/app/code/local/Mycompany/Mymodule/Model/Mymodule.php数据:

 <?php
    class Mycompany_Mymodule_Model_Mymodule extends Mage_Reports_Model_Mysql4_Order_Collection
{
    function __construct() {
        parent::__construct();
        $this->setResourceModel('sales/order_item');
        $this->_init('sales/order_item','item_id');
   }

    public function setDateRange($from, $to) {
        $this->_reset();
        $this->getSelect()
             ->joinInner(array(
                 'i' => $this->getTable('sales/order_item')),
                 'i.order_id = main_table.entity_id'
                 )
             ->where('i.parent_item_id is null')
             ->where("i.created_at BETWEEN '".$from."' AND '".$to."'")
             ->where('main_table.state = \'complete\'')
             ->columns(array('ordered_qty' => 'count(distinct `main_table`.`entity_id`)'));
        // uncomment next line to get the query log:
        // Mage::log('SQL: '.$this->getSelect()->__toString());
        return $this;
    }

    public function setStoreIds($storeIds)
    {
        return $this;
    }

    }
    ?>

这是一个自定义模型,可以从Magento核心模型获取数据,在这里您可以定义任何模型,或者如果您已经拥有自己的数据库/表,则可以从中获取报告数据。//此行重置默认情况下的原始查询。$this->_reset();

我试图添加所有这些文件,但是一旦单击报告的新菜单项,就会出现空白页。


1
它显示空白页。有解决的办法吗?
502_Geek '16

这个cpomes用空白页进行任何更新吗?
Yehuda Schwartz

只是进行编辑,意识到我是个白痴!请不要接受它:)
Wildcard 27年

有人解决了此空白页问题吗?
约翰·丰塞卡

我想生成销售订单项目报告,我必须做什么?
吉格斯帕玛(Jigs Parmar)'18年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.