So fügen Sie eine Gesamtzeile in ein Magento-Raster ein

7

Ich erstelle ein neues Modul, das ein Bestellraster für ein bestimmtes Produkt verwendet (dies ist nicht das Berichtsraster). In Magento Admin habe ich erfolgreich ein neues Bestellraster dafür erstellt, aber ich möchte am Ende den Gesamtpreis für das Produkt erhalten, wie im Verkauf > melden.

Bitte siehe Bild

Bild

Jede Hilfe wird geschätzt ,, Danke

Keyur Shah
quelle
Ich verstehe nicht ganz, was Sie erreichen wollen, aber als guten Ausgangspunkt können Sie sich Mage_Adminhtml_Block_Report_Product_Grid :: _ afterLoadCollection () ansehen. In Zeile 58 (Magento 1.7.0.2 CE) instanziiert und füllt diese Methode Mage_Reports_Model_Totals (). Schauen Sie sich diese Klasse an. Überprüfen Sie auch diesen Magestore-Artikel über Gesamtmodelle: blog.magestore.com/2012/09/07/…
Evgeni Ivanov
Hallo @Keyur Schah haben Sie das getan? Sie bitte beantworten THIS wie kann ich am Ende des Gitters insgesamt hinzufügen?
Zaheerabbas
@ Freiheit ich erreiche dies. Sie können die Summe mit überschreibenden sales / grid.php hinzufügen und den folgenden Code von mazeUz
Keyur Shah
Vielen Dank, aber es zeigt nicht den Titel "Summen" an, wie auf dem Bild unten zu sehen, sondern das Kontrollkästchen. Möchten Sie Änderungen am Code vornehmen?
Zaheerabbas
@Freedom kannst du bitte meine Antwort überprüfen?
Keyur Shah

Antworten:

10

1.Sipmle Weg, fügen Sie diese Felder zu Ihrer Gürtelklasse hinzu, siehe meine:

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
     */

}

Mein Ergebnis Geben Sie hier die Bildbeschreibung ein

2.Verwenden von Magento-Berichten: (Aber dieser ist so kompliziert)
Sie sollten ein Berichtsraster erstellen. Siehe Mage_Adminhtml_Block_Report_Customer_Orders_GridBerichtsraster und versuchen Sie, das eigene Element zu impfen. Hier finden Sie großartige Tipps zu benutzerdefinierten Berichten:
http://codegento.com/2011/03/creating-custom-magento-reports
http://www.summasolutions.net/blogposts/custom-reports-magento

mageUz
quelle
danke für deine antwort es hilft mir sehr +1 dafür @mageUz
Keyur Shah
boom Endlich funktioniert es einwandfrei groß danke @mageUz
Keyur Shah
Hallo, ich habe diesen Code verwendet, kann aber das beschriebene Wort TOTAL nicht erhalten, wenn das Raster in CSV exportiert wird.
Milople Inc
Hallo, das hat bei mir funktioniert, aber ich kann nicht alle Spalten abrufen, die Renderer verwenden.
Yogita
7

Die Antwort von mageUz ist wirklich gut und einfach.

Ich hatte einige Probleme mit der Spalte "Aktion", die in der Summenzeile angezeigt wird, also habe ich mich etwas weiter damit befasst. Hier ist es also...

1. Blenden Sie die Aktionsspalte in Summen und mehr aus

Aufgrund wahrscheinlich ein Fehler in widget/grid.phtmldem 'is_system'wird der Parameter nicht in Betracht genommen, so zeigt es den Aktionslink in der Zeile Summen. Um dies zu lösen, fügen Sie einfach 'totals_label' => '', Ihre Aktionsspaltendeklaration hinzu.

Der 'totals_label' => 'label',Parameter kann in allen Spalten verwendet werden und überschreibt die Summenzelle, auch wenn sie festgelegt ist.

Das heißt, Sie können die $fields['entity_id']='Totals';Zeile der Antwort von mageUz weglassen, zur Spalte 'entity_id' (oder einer beliebigen Spalte, die Sie auswählen) gehen und hinzufügen

'totals_label' => $this->__('Total'), (+ mehrsprachige Unterstützung)

2. Gleiches Ergebnis, etwas anderer Ansatz

Fügen Sie in Ihrem Rasterblock eine geschützte Funktion _prepareTotals ($ column) hinzu. Rufen Sie es dann in der Funktion _prepareCollection () mit den gewünschten Zeilen als durch Kommas getrennte Summen auf. Um klarer zu sein, sollte Ihre Whatever / Grid.php ungefähr so ​​aussehen

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();
}
Yiorgos Moschovitis
quelle
Mit dieser Methode scheint die Summe aus der exportierten CSV-Datei nicht die richtigen Daten zu enthalten. Was in der gesamten Zeile sein sollte, stammt aus der ersten Zeile des Rasters.
Denisa
-1

Die Antwort von Yiorgos Moschovitis funktioniert jedoch (Magento v1.5.1). Dies führt dazu, dass die Summe die Summe ALLER Zeilen ist. Die eingestellten Filter werden ignoriert.

Der Schlüssel, der geändert werden musste, war, den prepareTotalsNACH dem zu setzenparent::_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;
}

Der Rest des Codes ist der gleiche.

Der einzige Nachteil ist, dass die Zeilensummen auf die aktuell angezeigte Seite beschränkt sind.

user3338098
quelle