Magento : Ajouter des actions de masse à la grid des promotions panier

Cet article est assez ancien, malgré toute l'attention que j' apporte à mes contenus il est possible que celui-ci ne soit plus d'actualité.
N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.

Par défaut la grid d’administration des promotions panier ne permets pas d’exécuter d’actions de masses.
Dans le cas de désactivation multiples il est donc nécessaire de passer sur chaque règle pour la désactiver via l’administration ( ou de créer un script ), ce qui est relativement long et fastidieux

Pour optimiser cela voici comment rajouter des actions de masses à cette liste sans surcharge.
( Cette méthode est valide pour toutes les grids existantes et ne comportant pas d’actions de masse )

Nous allons pour cela créer un nouveau module, dans mon exemple je vais l’appeler Hhennes_Test.
( Je ne détaille pas la création totale du module mais uniquement les points spécifiques à la problématique )

Pour mettre nos actions de masse nous allons utiliser l’observer : adminhtml_block_html_before
Il faut donc mettre les lignes suivantes dans le fichier config.xml de notre module

<adminhtml>
        <events>
            <adminhtml_block_html_before>
                <observers>
                    <hhennes_test_add_massaction_promo_grid>
                        <type>singleton</type>
                        <class>hhennes_test/observer</class>
                        <method>addMassActionPromoGrid</method>
                    </hhennes_test_add_massaction_promo_grid>
                </observers>
            </adminhtml_block_html_before>
        </events>
    </adminhtml>

Dans l’événement nous appelons la fonction addMassActionPromoGrid du modèle hhennes_test/observer

Voici donc le code à mettre dans ce fichier Hhennes_Test/Model/Observer.php

<?php
 
/**
 * Hhennes_Test : Observer Model
 *
 * @author Herve <[email protected]>
 */
class Hhennes_Test_Model_Observer {
 
    /**
     * Ajout de paramètres d'actions de masse sur la grid des promotions panier
     * @param Varien_Event_Observer $observer
     */
    public function addMassActionPromoGrid($observer) {
 
        //On récupère le bloc qui est traité
        $block = $observer->getBlock();
    
        //On effectue uniquement une action si c'est la grid des promotions panier
        if ($block instanceof Mage_Adminhtml_Block_Promo_Quote_Grid) {
    
            //Définition des paramètes masseAction du bloc
            $block->setMassactionIdField('rule_id');
            $block->getMassactionBlock()->setFormFieldName('rules_id');
            $block->getMassactionBlock()->setUseSelectAll(false);
 
            //Ajout de l'action de masse "Suppression"
            $block->getMassactionBlock()->addItem('rule_delete', array(
                'label' => Mage::helper('hhennes_test')->__('delete'),
                'url' => $block->getUrl('hhennes_test/adminhtml_promoQuote/massDelete'), //Controller du module
                    )
            );
 
            //Ajout de l'action de masse "Changement de statut"
            $block->getMassactionBlock()->addItem('rule_status', array(
                'label' => Mage::helper('hhennes_test')->__('Change Status'),
                'url' => $block->getUrl('hhennes_test/adminhtml_promoQuote/massStatus'), //Controller du module
                'additional' => array(
                    'visibility' => array(
                        'name' => 'status',
                        'type' => 'select',
                        'class' => 'required-entry',
                        'label' => Mage::helper('salesrule')->__('Status'),
                        'values' => array(
                            '1' => Mage::helper('salesrule')->__('Active'),
                            '0' => Mage::helper('salesrule')->__('Inactive'),
                        ),
                    )),
            ));
 
            //Configuration et ajout de la colonne pour sélectionner les élément à traiter
            $massactionColumn = array(
                'index' => $block->getMassactionIdField(),
                'filter_index' => $block->getMassactionIdFilter(),
                'type' => 'massaction',
                'name' => $block->getMassactionBlock()->getFormFieldName(),
                'align' => 'center',
                'is_system' => true
            );
            $block->addColumn('massaction', $massactionColumn, 'promo_quote_grid');
 
        }
    }
 
}

Les actions de masses sont à présent bien disponibles sur la grid, comme vous pouvez le voir dans la capture suivante.

Action de masse grid

Pour finir, il est donc nécessaire de faire un controller Admin qui va se charger de traiter les actions de masse.
Voici donc le contenu à mettre dans le fichier Hhennes_Test/controllers/Adminhtml/PromoQuoteController.php

<?php
/**
 * Hhennes_Test : Adminhtml PromoQuote Controller
 *
 * @author Herve <[email protected]>
 */
class Hhennes_Test_Adminhtml_PromoQuoteController extends Mage_Adminhtml_Controller_Action {
 
    /**
     * Suppression de masse des promotions règles de promotions
     */
    public function massDeleteAction() {
 
        $rulesIds = $this->getRequest()->getParam('rules_id');
        
        //Si des règles sont selectionnées
        if (is_array($rulesIds)) {
 
            $rulesCollection = Mage::getModel('salesrule/rule')->getCollection()
                    ->addFieldToFilter('rule_id', array('in' => $rulesIds));
            
            //Suppression des règles
            foreach ($rulesCollection as $rule) {
                try {
                    $rule->delete();
                } catch (Exception $e) {
                    $this->_getSession()->addError($this->__($e->getMessage()));
                }
            }
            
            $this->_getSession()->addSuccess(
                    $this->__('Total of %d rule(s) have been deleted.', count($rulesIds))
            );
        } else {
            $this->_getSession()->addError($this->__('Error : no selected rule for delete.'));
        }
        
        //Redirection après les actions
        $this->_redirect('adminhtml/promo_quote');
    }
 
    /**
     * Changement de masse du statut des règles de promotions
     */
    public function massStatusAction(){
        
        $rulesIds = $this->getRequest()->getParam('rules_id');
        $status =  $this->getRequest()->getParam('status');
        
        //Si des règles sont selectionnées
        if (is_array($rulesIds)) {
 
            $rulesCollection = Mage::getModel('salesrule/rule')->getCollection()
                    ->addFieldToFilter('rule_id', array('in' => $rulesIds));
            
            //Suppression des règles
            foreach ($rulesCollection as $rule) {
                try {
                    $rule->load($rule->getId());
                    $rule->setIsActive($status);
                    $rule->save();
                } catch (Exception $e) {
                    $this->_getSession()->addError($this->__($e->getMessage()));
                }
            }
            
            $this->_getSession()->addSuccess(
                    $this->__('Total of %d rule(s) have been updated.', count($rulesIds))
            );
        } else {
            $this->_getSession()->addError($this->__('Error : no selected rule for status update.'));
        }
        
        //Redirection après les actions
        $this->_redirect('adminhtml/promo_quote');
        
    }
}

N’oubliez pas également de bien définir le controller dans le fichier config.xml 😉

 <admin>
        <routers>
            <hhennes_test>
                <use>admin</use>
                <args>
                    <module>Hhennes_Test</module>
                    <frontName>hhennes_test</frontName>
                </args>
            </hhennes_test>
        </routers>
    </admin>

Et le tour est joué, vous avez maintenant la possibilité d’activer/désactiver ou de supprimer plusieurs règles de promotions en un seul clic 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *