Aujourd’hui on va essayer d’ajouter une colonne dans la liste des commandes mais on ne va pas surcharger la classe :
1 |
Mage_Adminhtml_Block_Sales_Order_Grid |
Puisque ce n’est pas recommandée dans Magento : quand une même classe est surchargée par 2 module cela cause un conflit, des fois bien sur on n’a pas le choix, contrairement a notre cas d’aujourd’hui
Alors on va utiliser un observer : l’événement qui nous intéresse est
1 |
adminhtml_block_html_before |
Donc on doit ajouter dans notre fichier config.xml :
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 |
<?xml version="1.0"?> <config> <modules> <Mahigento_Newcolumn> <version>0.1.0</version> </Mahigento_Newcolumn> </modules> <global> <models> <newcolumn> <class>Mahigento_Newcolumn_Model</class> </newcolumn> </models> <events> <adminhtml_block_html_before> <observers> <mahigento_newcolumn_grid> <type>singleton</type> <class>newcolumn/grid</class> <method>ajouter</method> </mahigento_newcolumn_grid> </observers> </adminhtml_block_html_before> </events> </global> </config> |
Comme vous remarqué ici on a déclaré le nom de la classe et le nom de la méthode à exécuter lorsque l’événement se produit, attaquons donc la méthode ‘ajouter’ de la classe Mahigento_Newcolumn_Model_Grid (Grid.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php class Mahigento_Newcolumn_Model_Grid { public function ajouter($observer) { $block = $observer->getEvent()->getBlock(); if($block instanceof Mage_Adminhtml_Block_Sales_Order_Grid){ $block->addColumn('shipping_description',array( 'header' => Mage::helper('sales')->__('Methode de livraison'), 'index' => 'shipping_description', 'type' => 'text', 'width' => '100px', ), 'real_order_id'); } } } } |
Alors cette fonction va ajouter une colonne ‘Méthode de livraison’ pour voire directement de quel mode de livraison s’agit- il sont avoir besoin d’ouvrir la commande, si on veut ajouter une autre information par exemple le mode de paiement
On va juste modifier la méthode addColumn :
1 2 3 4 5 6 |
$block->addColumn(‘payment_method',array( 'header' => Mage::helper('sales')->__('Méthode de paiement'), 'index' => ‘payment_method', 'type' => 'text', 'width' => '100px', )); |
La seul contrainte c’est que cette information doit être déjà dans la collection des commandes.
Si c’est pas le cas par exemple je veux ajouter l’email et le groupe client je doit alors modifier la collection :
Pour cela je vais ajouter la méthode:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public function getnewcollection (){ $collection = Mage::getResourceModel('sales/order_grid_collection'); $collection->getSelect() ->join(array('client' => $collection->getTable('customer/entity')), 'client.entity_id = main_table.customer_id', array('email','group_id')) ->join( array('order'=>$collection->getTable('sales/order')), 'order.entity_id=main_table.entity_id', array('shipping_description')); return $collection; } |
et puis :
1 |
$block->setCollection($this->getnewcollection());//affecter la nouvelle collection |
maintenant pour rendre mes nouvelles colonnes filtrables et tri-ables j’utilise ça :
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 |
public function FilterAndSort ($block,$newcolumns){ $filter=$block->getParam($block->getVarNameFilter(), null); $data = Mage::helper('adminhtml')->prepareFilterString($filter); $columns=$block->getColumns(); foreach($columns as $columnId => $column){ $field = ( $column->getFilterIndex() ) ? $column->getFilterIndex() : $column->getIndex(); if(in_array($columnId, $newcolumns)){ if (isset($data[$columnId]) && (!empty($data[$columnId]) || strlen($data[$columnId]) > 0) && $column->getFilter()) { $column->getFilter()->setValue($data[$columnId]); $cond = $column->getFilter()->getCondition(); if ($field && isset($cond)) { $block->getCollection()->addFieldToFilter($field , $cond); } } $columnIdNameSort = $block->getParam($block->getVarNameSort(), $block->_defaultSort); if(in_array($columnIdNameSort, $newcolumns)){ $dir= $block->getParam($block->getVarNameDir(), $block->_defaultDir); $dir = (strtolower($dir)=='desc') ? 'desc' : 'asc'; $column_s=$columns[$columnIdNameSort]; $column_s->setDir($dir); $column_s = $column_s->getFilterIndex() ? $column_s->getFilterIndex() : $column_s->getIndex(); $block->getCollection()->setOrder($column_s , $dir); } } } } |
et pour utiliser cette fonction :
1 |
$this->FilterAndSort($block,array('email','group','shipping_description')); |
Donc finalement notre class : Mahigento_Newcolumn_Model_Grid devient:
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 |
<?php class Mahigento_Newcolumn_Model_Grid { public function ajouter($observer) { $block = $observer->getEvent()->getBlock(); if ($block instanceof Mage_Adminhtml_Block_Sales_Order_Grid) { $block->addColumn('shipping_description',array( 'header' => Mage::helper('sales')->__('Methode de livraison'), 'index' => 'shipping_description', 'type' => 'text', 'width' => '100px', )); $groups = Mage::getResourceModel('customer/group_collection') ->addFieldToFilter('customer_group_id', array('gt'=> 0)) ->load() ->toOptionHash(); $block->addColumn('group', array( 'header' => Mage::helper('customer')->__('Group'), 'index' => 'group_id', 'type' => 'options', 'width' => '50px', 'options' => $groups, )); $block->addColumn('email', array( 'header' => Mage::helper('sales')->__('email'), 'index' => 'email', 'type' => 'text', 'width' => '50px', )); $block->setCollection($this->getnewcollection()); $this->FilterAndSort($block,array('email','group','shipping_description')); } } public function FilterAndSort ($block,$newcolumns){ ....... } public function getnewcollection (){ ....... return $collection; } } |
Bonjour
Article très intéressant. Cependant je ne suis pas encore très à l’aise avec tout ça, et je n’arrive pas à rajouter une colonne ID du client, pourriez vous m’aiguiller ?
Merci
Thomas
Bonjour,
)
j’ai oublier une balise dans le fichier config.xml et c’est corrigé pour ajouter l’id client il suffit de changer shipping_description par customer_id dans la methode addColumn(),
J’ai mit les fichiers du petit module pour téléchargement. (c’est la colonne Id client qui va s’ajouter
Merci pour ce tutorial.
est ce qu’il y a moyen de choisir le placement du rajout de la colonne, ou au moins de la rajouter à la fin plutôt qu’au début ?
J’ai trouvé… addColumnAfter. cool, ca fonctionne nickel
Ca fonctionne pour Magento 1.5.x, mais comment faire pour magento 1.3.2.4 ?
Merci
Bonjour,
Merci pour ce super tuto, tout fonctionne !
Par contre comment faire pour que TBTEnhanced grid exporte aussi la/les nouvelle(s) colonne(s) ?
Une idée ?