Quantcast
Channel: Backend – Marcel Schmidt Wiki / Neuigkeiten
Viewing all articles
Browse latest Browse all 10

Magento Grid durch Felder erweitern (add grid col)

$
0
0

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',
        ));
 
        //...

Viewing all articles
Browse latest Browse all 10