エクスポートに列を追加しますが、グリッドから隠れていますか?
質問
カスタムレポートを作成しました。レポートには、CSV形式でエクスポートされるときに必要なかなりの数のフィールドがあります。
私が理解しようとしているのは、フロントエンドグリッド上のいくつかのフィールドのレンダリングを省略する方法があるかどうかです。それらのほとんどは、管理者のフィルタリングプロセスにとってそれほど重要ではなく、Magentoの外側でさらに解析するためにレポートがダウンロードされた場合にのみ使用されます。
これは、実際のグリッドとエクスポートされたCSVを生成するものであるため、このタイプの機能がグリッドクラスに存在することを期待しますが、可視性に対処するように見えるものはありません。
このクラスのカスタムレポートのメソッドをオーバーライドする前に、AddColumnプロパティアレイを介してある種の「表示」プロパティを追加するよりも簡単なこれを達成するためのあまり知られていない方法はありますか?
TL、DRは、フィールドをエクスポートする簡単な方法(たとえば、CSVまたはXML)がありますが、管理グリッドから省略されていますか?
解決
個別のブロック定義を作成します - たとえば、グリッドブロックをCSVに固有の別のブロックに複製します。私はこれを呼びます Csvgrid.php
それ以外の Grid.php
- 通常の機能と同じ機能がすべて含まれています Grid.php
含まれていますが、1つの列を省略します。
コントローラーで:
public function exportCsvAction()
{
$fileName = 'myreport_'.date('Y_m_d_h_i_s').'.csv';
$content = $this->getLayout()->createBlock('mymodule/adminhtml_reports_csvgrid')->getCsv();
}
グリッドを複製するときは、配置します Csvgrid.php
と同じ物理ディレクトリに Grid.php
しかし、それに応じて名前を変更します - クラス名を変更することを忘れないでください!
編集:
だからそれはそうだと思う Mage_Adminhtml_Block_Widget_Grid
呼ばれるメソッドがあります removeColumn
- 定義されています:
/
**
* Remove existing column
*
* @param string $columnId
* @return Mage_Adminhtml_Block_Widget_Grid
*/
public function removeColumn($columnId)
{
if (isset($this->_columns[$columnId])) {
unset($this->_columns[$columnId]);
if ($this->_lastColumnId == $columnId) {
$this->_lastColumnId = key($this->_columns);
}
}
return $this;
}
私の推測はそうだからです Mage_Adminhtml_Block_Report_Grid
拡張 Mage_Adminhtml_Block_Widget_Grid
この方法を継承し、使用できるはずです。その場合、新しいブロックグリッドを作成し、現在のレポートがあるグリッドを拡張します。そこからあなたはあなた自身を使うことができます prepareColumns
メソッド、呼び出します parent::_prepareColumns()
そして、電話してください removeColumn
..
幸運を祈ります。
他のヒント
セットを使用できます column_css_class
と header_css_class
なので no-display
隠したい列に。これにより、列が管理グリッドから列を非表示にします。ただし、この列はエクスポートされたCSVまたはXMLに存在します。
$this->addColumn('YOUR_COLUMN_ID', array(
'header' => Mage::helper('YOUR_HELPER_NAME')->__('YOUR_COLUMN_NAME'),
'width' => '150px',
'index' => 'YOUR_COLUMN_INDEX',
'column_css_class'=>'no-display',
'header_css_class'=>'no-display',
));
方法があります _afterLoadCollection()
Mage/adminhtml/block/widget/grid.phpで、エクスポートまたは表示用の列を削除/追加できるようにします $this->_isExport
.
ノート: これをに追加します _prepareCollection()
コレクションフィルターが提出されていないため、機能しません。その結果、コレクション全体がフィルタリングを差し引いたものになります。
protected function _afterLoadCollection() {
if(!$this->_isExport) {
$this->removeColumn('columnToRemove');
}
}
レポートにこれらのフィールドのみが必要な場合は、レポートのみを追加してみませんか?グリッドブロックには、収集モデルを返すGetCollectionメソッドがあり、レポートに必要なフィールドを追加できます。
これを行う簡単な方法はです
grid.phpファイル(app/core/mage/adminhtml/block/sales/order/grid.php)に戻る
次に、以下のようにカスタム列を追加します。
//New columns added but hidded
$this->addColumn('custom_column', array(
'header' => Mage::helper('sales')->__('Custom Column'),
'index' => 'custom_column',
'column_css_class'=>'no-display',
'header_css_class'=>'no-display',
));
また、変更を加えました
protected function _prepareCollection()
{
$collection = Mage::getResourceModel($this->_getCollectionClass());
$collection->getSelect()->joinLeft('sales_flat_order', 'main_table.entity_id = sales_flat_order.entity_id',array('custom_column'));
$this->setCollection($collection);
return parent::_prepareCollection();
}
これは、カスタム列の値をコレクションに追加する必要があることを意味します。そのためには、グリッドコレクションテーブルでテーブルに参加する必要があります。
次に、バックエンドをチェックして、注文をエクスポートします。カスタム列が追加されます。