Le principe que nous allons mettre en oeuvre est certes un peu radical, mais il fonctionne. Nous allons modifier la Grid.php qui affiche les commandes dans Magento de façon à pouvoir y ajouter un colonne Groupe Client (customer group) afin de pouvoir trier l'ensemble par ce filtre.

Préliminaires au travail

  • Si le compilateur est activé, on désactive
  • On fait une copie de /app/core/Mage/Adminhtml/Block/Sales/Order/Grid.php dans son rep local à savoir : app/code/local/Mage/Adminhtml/Bloc/Sales/Order/Grid.php
  • On vérifie que rien d'autres ne surcharge déjà cette Grid.php ou alors il faudra composer avec ça

Modifications à apporter à grid.php

dans la fonction _prepareColumns() on ajoute à l'endroit souhaité (là ou doit s'afficher la colonne)

$this->addColumn('customer_group_id', array( 'header'=> Mage::helper('customer')->__('Customer Group'), 'width' => '80px', 'index' => 'customer_group_id', 'renderer' => new Mage_Adminhtml_Block_Sales_Order_Renderer_CustomerGroup(), 'type' => 'options', 'options' => Mage_Adminhtml_Block_Sales_Order_Renderer_CustomerGroup::getCustomerGroupsArray(), ));

 

on ajoute également la fonction suivante dans la class, elle à pour but de modifier la fonction addColumnFilterToCollection() et de lui permettre de traiter les null.

     protected function _addColumnFilterToCollection($column) {
        
        if ($this->getCollection()) {
            $field = ( $column->getFilterIndex() ) ? $column->getFilterIndex() : $column->getIndex();
            if ($column->getFilterConditionCallback()) {
                call_user_func($column->getFilterConditionCallback(), $this->getCollection(), $column);
            }
            else {
                $cond = $column->getFilter()->getCondition();
                if ($field && isset($cond)) {
                    if (in_array('NULL', array_values($cond))) {
                        $this->getCollection()->addFieldToFilter($field, array('null' => true));
                    }
                    else {                        
                        $this->getCollection()->addFieldToFilter($field, $cond);
                    }
                }
            }
        }
        return $this;
    }

 

on modifie la fonction_prepareCollection() pour y adjoindre la table dans laquelle se trouve l'information que nous cherchons, à savoir le customer_group_id.

 

 protected function _prepareCollection()
    {
        $collection = Mage::getResourceModel($this->_getCollectionClass());
        $this->setCollection($collection);
        return parent::_prepareCollection();
    }

 

 

par

 

 protected function _prepareCollection()
       {
           $collection = Mage::getResourceModel($this->_getCollectionClass());

           $collection->getSelect()->join(
             array('oe'=>'sales_flat_order'),
             'oe.entity_id=main_table.entity_id',
             array('oe.customer_group_id')
           );
           $this->setCollection($collection);
           return parent::_prepareCollection();
       }

 

 

 

et pour finir dans ce fichier, on modifie

       

$this->addColumn('increment_id', array(
            'header'    => Mage::helper('sales')->__('Invoice #'),
            'index'     => 'increment_id',
            'type'      => 'text',
        ));

 



par

 

       

$this->addColumn('increment_id', array(
            'header'    => Mage::helper('sales')->__('Invoice #'),
            'index'     => 'increment_id',
            'filter_index'=>'main_table.increment_id',            
            'type'      => 'text',
        ));

 

 



Si vous ne faites pas ça, vous risquez d'avoir des erreurs en "cherchant" dans la grille. Magento ne sachant plus sur quel ID il doit travailler en priorité.

Ensuite il faut créer un répertoire Renderer en poursuivant l'arborescence décrite précédement, app/code/local/Mage/Adminhtml/Bloc/Sales/Order/Renderer/

Dans ce répertoire créer un fichier CustomerGroup.php, dans lequel vous inserez ce code

 

<?php
class Mage_Adminhtml_Block_Sales_Order_Renderer_CustomerGroup extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract {

    // Holds an associative array with customer_group_id and the associated label
    private static $_customerGroups = array(); // "singleton"

    public static function getCustomerGroupsArray() {
        // Make sure the static property is only populated once
        if (count(self::$_customerGroups) == 0) {
            $customer_group = new Mage_Customer_Model_Group();
            $customer_groups = $customer_group->getCollection()->toOptionHash();
            self::$_customerGroups = $customer_groups;
        }

        return self::$_customerGroups;
    }

    // Transforms the customer_group_id into corresponding label
    public function render(Varien_Object $row)
    {
        $val = $this->_getValue($row);
        $customer_groups = self::getCustomerGroupsArray();
        return isset($customer_groups[$val]) ? $customer_groups[$val] : false;
    }

}

 

All done. Au besoin videz le cache de Magento et testez l'ensemble.

Il existe d'autres méthodes pour accomplir ceci, certains vous proposent de modifier la structure de votre bdd et de ramener directement l'élément manquant dans la table appelée par la grid (https://inchoo.net/ecommerce/magento/programming-magento/adding-customer-group-column-to-sales-grid-in-magento/). D'autres encore d'utiliser un observer (http://www.atwix.com/magento/add-column-to-customers-grid-alternative-way/). A vous de voir ce qui vous convient le mieux.

PS : si vous avez compris ceci, vous pouvez facilement ajouter cette même colonne à invoice, shipment etc...

L'ensemble à été testé sur Magento 1.7.0.2

 

Recherche & Partage

Uni-Deal.com

En savoir plus sur notre société de services en logiciels ou nous demander des prestations / codes visitez uni-deal