magentoグリッドに合計行を追加する方法


7

magento adminで特定の製品(これはレポートグリッドではありません)の注文グリッドを使用する新しいモジュールを作成しています。そのための新しい注文グリッドを正常に作成しますが、販売のように、製品の合計価格を最後に取得したい>レポート。

画像をご覧ください

画像

どんな助けでも感謝します、ありがとう


何を達成しようとしているのかよくわかりませんが、出発点としては、Mage_Adminhtml_Block_Report_Product_Grid :: _ afterLoadCollection()をご覧ください。58行目(Magento 1.7.0.2 CE)で、このメソッドはMage_Reports_Model_Totals()をインスタンス化して入力します。このクラスを見てください。:また、全モデルについては、このMagestoreの記事をチェックblog.magestore.com/2012/09/07/...
エフゲニー・イワノフ

こんにちは@Keyurシャーは、あなたは、あなたが答えてくださいできますか?これを行っている。これは、どのように私は、グリッドの最後に合計を追加することができますか?
Zaheerabbas 2014

@Freedom私はこれを達成しています。オーバーライドsales / grid.phpを使用して合計を追加し、mazeUzでコードの下に追加することができます
Keyur Shah

ありがとうございましたが、下の画像のように「合計」タイトルは表示されず、チェックボックスが表示されます。コードに変更を加える必要がありますか?
Zaheerabbas 2014

@Freedom私の答えを確認してください。
Keyur Shah

回答:


10

1.簡単な方法で、これらのフィールドをグリッドクラス追加してください、私のものを見てください:

class SSD_Uzkart_Block_Adminhtml_Uzkart_Grid extends Mage_Adminhtml_Block_Widget_Grid
{
    protected $_countTotals = true;

    public function getTotals()
    {
        $totals = new Varien_Object();
        $fields = array(
            'uzkart_trans_amount' => 0, //actual column index, see _prepareColumns()
            'some_summarable_field' => 0,
            'another_countable_field' => 0,
        );
        foreach ($this->getCollection() as $item) {
            foreach($fields as $field=>$value){
                $fields[$field]+=$item->getData($field);
            }
        }
        //First column in the grid
        $fields['entity_id']='Totals';
        $totals->setData($fields);
        return $totals;
    }

    protected function _prepareColumns()
    {
        /**
         * another columns
         */

        $this->addColumn('uzkart_trans_amount', array(
            'header' => Mage::helper('uzkart')->__('Payment Amount'),
            'index' => 'uzkart_trans_amount',
            'type' => 'currency',
        ));

        /**
         * another columns
         */
    }

    /**
     * another methods
     */

}

私の結果 ここに画像の説明を入力してください

2.Magentoレポートの使用:(ただし、これは非常に複雑です)
レポートグリッドを作成する必要があります。Mage_Adminhtml_Block_Report_Customer_Orders_Gridレポートグリッドを参照して、独自の要素を挿入してみてください。カスタムレポートについてのすばらしいヒントを以下に示し
ます。http//codegento.com/2011/03/creating-custom-magento-reports
http://www.summasolutions.net/blogposts/custom-reports-magento


あなたの答えに感謝それは私にそれをたくさん助けてくれます@mageUz
Keyur Shah

ブーム最後にそれは完璧に動作します@mageUzに感謝します
Keyur Shah

こんにちは私はこのコードを使用しましたが、グリッドがCSVにエクスポートされるときにTOTALという単語を取得できません。
Milople Inc

こんにちは、これは私にとってはうまくいきましたが、レンダラーを使用している列の合計を取得できません。
ヨギタ2017

7

mageUzの答えは本当に良くてシンプルです。

合計行に表示される「アクション」列に問題があったので、もう少し詳しく調べました。だからここに...

1.合計などでアクション列を非表示にする

おそらくのためのバグのパラメータは、それが合計行でのアクションリンクを示して、検討の下で撮影されていません。これを解決するに は、アクション列宣言を追加 します。widget/grid.phtml'is_system''totals_label' => '',

'totals_label' => 'label',パラメータは、すべての列に使用することができ、それはそれはセットの場合でも、合計セルを上書きします。

つまり$fields['entity_id']='Totals';、mageUzの回答の行を省略して、 'entity_id'列(または選択した任意の列)に移動して、

'totals_label' => $this->__('Total'), (+多言語サポート)

2.同じ結果、わずかに異なるアプローチ

グリッドブロックに、保護された関数_prepareTotals($ columns)を追加します。次に、必要な行を合計コンマ区切りで_prepareCollection()関数で呼び出します。より明確にするために、Whatever / Grid.phpは次のようになります。

protected function _prepareCollection(){
  $collection = Mage::getResourceModel('mymodule/mymodel_collection');
  $this->setCollection($collection);
  $this->_prepareTotals('price,special_price'); //Add this Line with all the columns you want to have in totals bar
  return parent::_prepareCollection();
}

//Add following function
protected function _prepareTotals($columns = null){
  $columns=explode(',',$columns);
  if(!$columns){
    return;
  }
  $this->_countTotals = true;   
  $totals = new Varien_Object();
  $fields = array();
  foreach($columns as $column){
    $fields[$column]    = 0;    
  } 
  foreach ($this->getCollection() as $item) {
    foreach($fields as $field=>$value){
      $fields[$field]+=$item->getData($field);
    }
  }
  $totals->setData($fields);
  $this->setTotals($totals);
  return;
}

protected function _prepareColumns(){
  $this->addColumn('entity_id', array(
    'index'             => 'entity_id',
    'header'            => $this->__('ID'),
    'totals_label'      => $this->__('Total'), //Add this line to show "Total" in the beginning of the row
  ));

  $this->addColumn('name', array(
    'index'             => 'name',
    'header'            => $this->__('Name'),
  ));

  $this->addColumn('price', array(
    'index'             => 'price',
    'header'            => $this->__('Price'),
    'type'              => 'currency',
    'currency_code'     => $this->_getStore()->getBaseCurrency()->getCode(),
  ));

  $this->addColumn('special_price', array(
    'index'             => 'special_price',
    'header'            => $this->__('Special Price'),
    'type'              => 'currency',
    'currency_code'     => $this->_getStore()->getBaseCurrency()->getCode(),
  ));

  $this->addColumn('action',array(
    'header'        => $this->__('Action'),
    'width'         => '100',
    'type'          => 'action',
    'getter'        => 'getId',
    'actions'       => array(array(
                          'caption' => $this->__('edit'),
                          'url'     => array('base' => '*/*/edit'),
                          'field'       => 'product_id',
                      )),
    'filter'        => false,
    'sortable'      => false,
    'is_system'     => true,
    'totals_label'      => '' //Add this line to stop the action showing 
  ));
  return parent::_prepareColumns();
}

この方法を使用すると、エクスポートされたCSVファイルの合計に適切なデータが含まれていないようです。合計行にあるべきものは、グリッドの最初の行からです。
Denisa

-1

Yiorgos Moschovitisの回答は有効です(Magento v1.5.1)。これにより、合計はすべての行の合計になります。設定されたフィルターは無視されます。

変更が必要な鍵はprepareTotalsparent::_prepareCollection()

protected function _prepareCollection(){
  $collection = Mage::getResourceModel('mymodule/mymodel_collection');
  $this->setCollection($collection);
  $returnVal = parent::_prepareCollection();
  //the above line will alter the collection by adding the appropriate filters to the resource model
  $this->_prepareTotals('price,special_price'); //Add this Line with all the columns you want to have in totals bar
  return $returnVal;
}

残りのコードは同じです。

1つの欠点は、行の合計が現在表示されているページに制限されることです。

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