まず、カスタムモジュールを生成し、次のファイルを作成する必要があります。
/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コアモデルからデータを取得するカスタムモデルです。ここでは、任意のモデルを定義できます。または、既に独自のDB /テーブルを取得している場合は、そこからレポートデータを取得できます。//この行は、デフォルトの元のクエリをリセットします。$this->_reset();
これらすべてのファイルを追加しようとしましたが、レポートの新しいメニュー項目をクリックすると、空白のページが表示されます。