완전히 새로운 사용자 정의 보고서 작성


22

대부분의 Magento Report 빌딩 포럼, 블로그, 자습서 등은 모두 기존 Magento Report를 가져 와서 복사하거나 확장 하는 데 중점을두고 있습니다. 이들 중 대부분은 특정 데이터 세트에 연결되는 그리드이며, 모두 표준 필터, 예를 들어 날짜 및 기간 (일부 보고서의 추가 필터)을 포함합니다.

그러나 사용자 정의 필터를 사용하여 완전히 사용자 정의 보고서를 작성하는 방법에 대한 정보는 거의 없습니다.

예를 들어 고객은 두 개의 간단한 집계 메트릭 에 대해 다시 보고하는 두 개의 사용자 지정 필터가 있는 보고서를 원합니다 .



같은 빈 페이지를 표시하려면 어떻게해야하는지 제안하십시오.

답변:


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

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 코어 모델에서 데이터를 가져 오는 사용자 지정 모델입니다. 여기에서 모델을 정의하거나 이미 고유 한 DB / 테이블 을 보유한 경우 보고서 데이터를 얻을 수 있습니다. //이 줄은 기본적으로 제공되는 원래 쿼리를 재설정합니다.$this->_reset();

이러한 파일을 모두 추가하려고했지만 보고서의 새 메뉴 항목을 클릭하면 빈 페이지가 나타납니다.


1
빈 페이지가 표시됩니다. 이 문제를 해결할 아이디어가 있습니까?
502_Geek

이것은 빈 페이지와 함께 업데이트가 있습니까?
Yehuda Schwartz

그냥 편집하고 내가 바보라는 걸 깨달았 어! 받아들이지 마십시오 :)
Wildcard27

빈 페이지 문제를 해결 한 사람이 있습니까?
존 폰세카

판매 주문 항목 보고서를 생성하고 싶습니다. 어떻게해야합니까?
Jigs Parmar

1

그냥 폴더 이름 바꾸기 adminhtmlAdminhtml다음과 같은 경로에 따라 :

app / code / local / Mycompany / Mymodule / Block / adminhtml / Mymodule.php

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.