エクスポートする列を追加しますが、グリッドから非表示にしますか?


8

カスタムレポートを作成しました。レポートには、CSV形式でエクスポートするときに必要なフィールドが多数含まれています。

私が理解しようとしているのは、フロントエンドグリッドの一部のフィールドのレンダリングを省略する方法があるかどうかです。それらのほとんどは、管理者のフィルタリングプロセスではそれほど重要ではなく、Magentoの外部でさらに解析するためにレポートがダウンロードされる場合にのみ使用されます。

これが実際のグリッドを生成し、後でエクスポートされたCSVを生成するものであるため、これはグリッドクラスに存在するタイプの機能であると期待しますが、可視性を処理するように見えるものは何もありません。

カスタムレポートのこのクラスのメソッドに移動してオーバーライドする前に、addColumnプロパティ配列を介してある種の「showInGrid」プロパティを追加するよりも簡単な、これを実現するあまり知られていない方法はありますか?

TL、DRは、フィールドをエクスポートする(たとえば、CSVまたはXML)簡単な方法はありますが、管理グリッドから除外されますか?


回答:


3

個別のブロック定義を作成します-たとえば、グリッドブロックを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..を呼び出すことができます。

幸運を祈ります。


これは間違いなく機能しますが、コレクションを共有するより受け入れられた方法があることを望みましたが、ブロックの特定のインスタンスに使用される列を制限しました(グリッドの表示、CSV / XMLエクスポートの生成など)。回答で提案した方法で実際にレポートを実装しましたが、よりエレガントな解決策を探したいと思いました。
wlvrn 2013年

問題はコレクションではなく、コレクションに_prepareColumns存在しないインデックスを参照することです。'removeColumn'メソッドがありますが、グリッドクラスを拡張してを呼び出しparent::_prepareColumns()、独自のremoveColumnsメソッドを挿入します。
philwinkle 2013年

@philwinkle:実際、私はこのメソッドmagento.stackexchange.com/a/171754/51361を使用して 、注文グリッドにカスタムフィールドを追加しています。しかし、エクスポートすると、カスタムの追加された列の値はエクスポートされません。このエラーを解決するにはどうすればよいですか?
宝石

5

非表示にする列に対して、set column_css_classおよびheader_css_classas 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',
  ));

4

方法がある_afterLoadCollection()とエクスポートまたは表示のために列を追加/削除するためにオーバーライドすることができメイジ/ Adminhtml /ブロック/ウィジェット/ Grid.phpでは$this->_isExport

注:_prepareCollection()コレクションフィルターが送信されていないため、これをに追加しても機能しません。その結果、コレクション全体がダンプされ、フィルターが除外されます。

protected function _afterLoadCollection() {
    if(!$this->_isExport) {
        $this->removeColumn('columnToRemove');
    }
}

1

これらのフィールドのみをレポートに必要とする場合は、それらをレポートにのみ追加しないのはなぜですか?グリッドブロックには、コレクションモデルを返すgetCollectionメソッドがあり、レポートに必要なフィールドを追加できます。


グリッドビューは、ユーザーがレポート(日付範囲、SKUなど)にフィルターを適用できるようにするのに役立ちます。フィルターを使用すると、表示されるデータセットを絞り込むことができますが、実際のエクスポートに、顧客情報や、バンドル注文を構成する構成アイテムなどを含めることができます。必要なすべてのデータを含むコレクションを作成してから、管理ビューのグリッドビューにその一部のみを表示し、エクスポートにすべてのデータを含めることを許可する方がはるかに簡単です(だれかが思うでしょう)。残念ながら、収集方法はグリッドビューに密接に関連付けられています。
wlvrn 2013年

私はグリッドがどのように機能しているか、そしてなぜそれが役立つのかを理解しています、つまり、csvエクスポートは個別のアクションです。そこでグリッドを作成し、そのgetCsvを使用して出力を準備します。したがって、csvファイルにのみ必要なフィールドは、getCsvの直前にグリッドコレクションに追加できます。これは、実際に表示せずに一般的なグリッド表示に対して実行するよりも、パフォーマンスに悪影響を与えることはありません
Petar Dzhambazov

0

これを行う簡単な方法は

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

つまり、カスタム列の値をコレクションに追加する必要があります。そのために、グリッドコレクションテーブルとテーブルを結合する必要があります。

次に、バックエンドをチェックして、注文をエクスポートします。カスタム列が追加されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.