Magento Grid durch Felder erweitern (add grid col)

Gepostet am November 11, 2013

Wie folgt erweitert man ein Grid in Magento.

Rufen Sie die jeweilige „Grid.php“ auf bzw. duplizieren Sie die Grid Datei in den code/local Ordner um das entsprechende Grid zu überschreiben.
Grundsätzlich wird die Funktion „_prepareCollection()“ zum Erweitern der Collection und die Funktion „_prepareColumns()“ zum definieren der Spalten verändert.

Als Beispiel verwende ich die Bestell-Übersicht und füge dort den Firmennamen aus der Order-Address Tabelle hinzu:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
################# Standard Funktion #######################
protected function _prepareCollection()
    {
        $collection = Mage::getResourceModel($this->_getCollectionClass());
        $this->setCollection($collection);
        return parent::_prepareCollection();
    }
 
################# Anzeigen des SQL Abfrage #######################
protected function _prepareCollection()
    {
        $collection = Mage::getResourceModel($this->_getCollectionClass());
        $this->setCollection($collection);
        echo $collection->getSelect();
        return parent::_prepareCollection();
    }
/*
SELECT  `main_table` . *
FROM  `mage_sales_flat_order_grid` AS  `main_table` 
*/
 
################# Felder zu aktuellen Abfrage hinzufügen #######################
protected function _prepareCollection()
    {
        $collection = Mage::getResourceModel($this->_getCollectionClass());
        $this->setCollection($collection);
 
        $collection->addAttributeToSelect('billing_name'); //erweitert den Select
 
        echo $collection->getSelect();
        return parent::_prepareCollection();
    }
/*
SELECT `main_table`.`billing_name` 
FROM `mage_sales_flat_order_grid` AS `main_table`
*/
 
################# Hinzufügen eines Joins #######################
protected function _prepareCollection()
    {
        $collection = Mage::getResourceModel($this->_getCollectionClass());
        $this->setCollection($collection);
 
        $collection->getSelect()->join( array('sorder'=>'mage_sales_flat_order'), 
                            'main_table.increment_id = sorder.increment_id',
                            array('sorder.entity_id as orderid') ); 
 
        $collection->getSelect()->join( array('oadress'=>'mage_sales_flat_order_address'), 
                            'sorder.entity_id = oadress.parent_id AND oadress.address_type = "billing"',
                            array('oadress.company as company') ); 
 
        echo $collection->getSelect();
        return parent::_prepareCollection();
    }
/*
SELECT `main_table`.*, `sorder`.`entity_id` AS `orderid`, `oadress`.`company` 
FROM `mage_sales_flat_order_grid` AS `main_table` 
 
INNER JOIN `mage_sales_flat_order` AS `sorder` 
ON main_table.increment_id = sorder.increment_id 
 
INNER JOIN `mage_sales_flat_order_address` AS `oadress` 
ON sorder.entity_id = oadress.parent_id 
AND oadress.address_type = "billing"
 
Da in der Grid Tabelle nur eine increment_id steht, muss man über die Order-Tabelle gehen, 
um die entity_id der Bestellung zu ermitteln
*/
 
################# Join im Detail #######################
$collection->getSelect()->join( array('TABELLENALIAS'=>'JOIN_TABELLENNAME'), 
                           'ON ABFRAGE',
                            array('TABELLENALIAS.FELDNAME as SELECTNAME') ); 
 
################# Probleme mit Filtern #######################
/*
Bei einem Grid wird meist nur eine Tabelle abgerufen "order_grid". Fügen wir nun 
per Join eine weitere Tabelle hinzu, kann es bei der Filterung zu einem Fehler kommen. Da 
der Filter versucht auf ein Feld zuzugreifen, welches nicht der "main_table" zugeordnet werden 
kann. Bsp:
 
WHERE beispielfeld LIKE '%test%'
es müsste aber heißen:
WHERE main_table.beispielfeld LIKE '%test%'
 
Somit müssen wir die benötigten Feldnamen direkt mit Alias definieren
*/
 
$collection->addFilterToMap('company', 'oadress.company');
$collection->addFilterToMap('increment_id', 'main_table.increment_id');
 
/* Gesamt: */
protected function _prepareCollection()
    {
        $collection = Mage::getResourceModel($this->_getCollectionClass());
        $this->setCollection($collection);
 
        $collection->addFilterToMap('company', 'oadress.company');
        $collection->addFilterToMap('increment_id', 'main_table.increment_id');
 
        $collection->getSelect()->join( array('sorder'=>'mage_sales_flat_order'), 
                            'main_table.increment_id = sorder.increment_id',
                            array('sorder.entity_id as orderid') ); 
 
        $collection->getSelect()->join( array('oadress'=>'mage_sales_flat_order_address'), 
                            'sorder.entity_id = oadress.parent_id AND oadress.address_type = "billing"',
                            array('oadress.company as company') ); 
 
        return parent::_prepareCollection();
    }
 
################# Ansicht erweitern #######################
protected function _prepareColumns()
    {
 
        //...
 
        $this->addColumn('company', array(
            'header' => Mage::helper('sales')->__('Company'),
            'index' => 'company',
        ));
 
        //...

Tags: ,

Leave a Reply

 

Posts of Current Category



Facebook: