8 – COMMENT METTRE EN PLACE UN GRID EN BACK OFFICE DE MAGENTO 1 ?

Nous allons désormais ajourer les formulaires nécessaires à l’administration de notre table, le tout via l’interface du grid magento. Dans ce tutoriel nous allons voir une version assez basique pour apprendre les incontournables, nous verrons dans une prochain cours, comment customiser ce module pour obtenir un affichage plus complet et dynamique.

MODIFICATION DE L’APPEL DU GRID

Nous allons commencer par modifier l’appel du grid actuel dans le block produit, Valibus/Gestion/Block/Adminhtml/Produit.php

<?php
class Valibus_Gestion_Block_Adminhtml_Produit extends Mage_Adminhtml_Block_Widget_Grid_Container
{
public function __construct()
{
$this->_blockGroup = 'gestion';
$this->_controller = 'adminhtml_produit';
$this->_headerText = $this->__('Gestion historique');
$this->_addButtonLabel= $this->__('Add a Product');
parent::__construct();
$this->setSaveParametersInSession(true);
}
}<:code>

On ajoute ici un label pour le bouton add que l’on ne supprimer plus, et on active l’option saveparameterinsession. Le headertext est modifié au passage pour plus cohérence mais ce n’est ici que du cosmétique.La même function parameterinsession va d’ailleurs être également ajoutée dans l’édition du fichier Grid.php, Valibus/Gestion/Block/Adminhtml/Produit/Grid.php. On a modifie également la fonction de fin de fichier, getRowUrl pour qu’elle renvoie vers une fiche Produit.

public function __construct()
{

parent::__construct();
$this->setId('gestion_histo');
$this->setDefaultSort('created_time');
$this->setDefaultDir('ASC');
$this->setSaveParametersInSession(true);
}
public function getRowUrl($row)
{
return $this->getUrl('*/*/edit', array('id' => $row->getId()));
}

CRÉATION DU FORM CONTAINER

Nous allons maintenant créer l’ensemble des fichiers propres aux formulaires du grid, à commencer par le form container. Créons donc le fichier : 

<?php
class Valibus_Gestion_Block_Adminhtml_Produit_Edit extends Mage_Adminhtml_Block_Widget_Form_Container {
public function __construct(){
$this->_objectId='id';
$this->_blockGroup = 'gestion';
$this->_controller = 'adminhtml_produit';
$this->_updateButton('save', 'label', $this->__('Save the Item'));
$this->_updateButton('delete', 'label', $this->__('Delete the Item'));
parent::__construct();
}
public function getHeaderText()
{
if( Mage::registry('gestion_data') && Mage::registry('gestion_data')->getId() ) {
return $this->__("Edit Item with sku: '%s'", $this->htmlEscape(Mage::registry('gestion_data')->getSkuproduit()));
} else {
return $this->__('Add a new Item');
}
}
}

Comme vous le constatez on commence par définir un Id, un block_group et le controller se rapportant à nos fomulaires. On fait également un peu de cosmétique en redéfinissant le label de nos boutons.

La fonction getheaderText est elle implémentée pour afficher une en-tête différent en fonction d’un écran d’édit ou d’ajout. On passe par cela par un test de mage::registry(‘gestion_data’). Qui correspond pour l’explication à une variable de session.

AJOUT DES TABS DANS LE BACK OFFICE

<?php
class Valibus_Gestion_Block_Adminhtml_Produit_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs{
public function __construct(){
parent::__construct();
$this->setId('gestion_produit_edit_tabs');
$this->setDestElementId('edit_form');
$this->setTitle($this->__('Product history'));

}

protected function _beforeToHtml(){
$this->addTab('form_section',array(
'label'=>$this->__('Product information'),
'title'=>$this->__('Product information'),
'content'=>$this->getLayout()->createBlock('gestion/adminhtml_produit_edit_tab_form')->toHtml()
)
);
return parent::_beforeToHtml();
}
}

La partie tabs correspond aux onglet verticaux dans l’écran de gestion de notre Grid (il y en beaucoup d’utilisé lors de la création des produits du catalogue par exemple) Dans ce fichier (Valibus/Gestion/Block/Adminhtml/Produit/Edit/Tabs.php) on construit d’abord le container puis la partie function beforetohtml définie elle l’ajout des tabs proprement dit, via la fonction addTab.

CRÉATION DU FORMULAIRE

Passons désormais à la création du formulaire lui même, dans le fichier 

 <?php
class Valibus_Gestion_Block_Adminhtml_Produit_Edit_Form extends Mage_Adminhtml_Block_Widget_Form {
public function __construct(){
parent::__construct();
$this->setId('produit_histo_form');
$this->setTitle($this->__('Product History Information'));
}
protected function _prepareForm(){
$form = new Varien_Data_Form(array(
'id' => 'edit_form',
'action' => $this->getUrl('*/*/save',array('id'=>$this->getRequest()->getParam('id'))),
'method' => 'post'
)
);
$form->setUseContainer(true);
$this->setForm($form);
return parent::_prepareForm();
}
}

Cette partie définie donc la création du formulaire, que nous implémentons dans le fichier ci dessous, Valibus/Gestion/Block/Adminhtml/Produit/Edit/Tab/Form.php. On y définie les champs de notre formulaire, ainsi que le préremplissage en cas d’édit à l’aide du registry. (Rappelez vous que l’on utilise le même formulaire que l’on soit en processus d’édition ou d’ajout.)

 <?php
class Valibus_Gestion_Block_Adminhtml_Produit_Edit_Tab_Form extends Mage_Adminhtml_Block_Widget_Form {
protected function _prepareForm(){
$form=new Varien_Data_Form();
$this->setForm($form);
$fieldset = $form->addFieldset('gestion_form',array('legend'=>$this->__('Product information Form')));

$fieldset->addField('title','text',array(
'label' => $this->__('Title'),
'class' => 'required-entry',
'required' => true,
'name' => 'title'
));
$fieldset->addField('skuproduit','text',array(
'label' => $this->__('Product\'s SKU'),
'class' => 'required-entry',
'required' => true,
'name' => 'skuproduit'
));
if (Mage::getSingleton('adminhtml/session')->getGestionData()){
$form->setValues(Mage::getSingleton('adminhtml/session')->getGestionData());
Mage::getSingleton('adminhtml/session')->setGestionData(null);
}elseif(Mage::registry('gestion_data')){
$form->setValues(Mage::registry('gestion_data')->getData());
}
return parent::_prepareForm();
}
}

MODIFICATION DU CONTROLLER

Terminons ce tutoriel par la modification de notre controller, pour lui ajouter les functions newAction, editAction, saveAction, deleteAction

public function newAction(){
$this->_forward('edit');
}
public function editAction(){
$productId=$this->getRequest()->getParam('id');
$productModel=Mage::getModel('gestion/gestion')->load($productId);

if($productModel->getId() || $productId==0){

Mage::register('gestion_data',$productModel);

$this->loadLayout();
$this->_setActiveMenu('gestion/produit');
$this->_addBreadcrumb($this->__('Item Manager'), $this->__('Item Manager'));
$this->_addBreadcrumb($this->__('Item News'), $this->__('Item News'));
$this->getLayout()->getBlock('head')->setCanLoadExtJs(true);
$this->_addContent($this->getLayout()->createBlock('gestion/adminhtml_produit_edit'))
->_addLeft($this->getLayout()->createBlock('gestion/adminhtml_produit_edit_tabs'));
$this->renderLayout();
} else {
Mage::getSingleton('adminhtml/session')->addError($this->__('Item does not exist'));
$this->_redirect('*/*/');
}


}
public function saveAction()
{

if ( $this->getRequest()->getPost() ) {
try {
$postData = $this->getRequest()->getPost();
$gestionModel = Mage::getModel('gestion/gestion');

$gestionModel->setId($this->getRequest()->getParam('id'))
->setTitle($postData['title'])
->setSkuproduit($postData['skuproduit'])
->save();

Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('adminhtml')->__('Item was successfully saved'));
Mage::getSingleton('adminhtml/session')->setGestionData(false);

$this->_redirect('*/*/produit');
return;
} catch (Exception $e) {
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
Mage::getSingleton('adminhtml/session')->setGestionData($this->getRequest()->getPost());
$this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
return;
}
}
$this->_redirect('*/*/');

}
public function deleteAction()
{
if( $this->getRequest()->getParam('id') > 0 ) {
try {
$gestionModel = Mage::getModel('gestion/gestion');

$gestionModel->setId($this->getRequest()->getParam('id'))
->delete();

Mage::getSingleton('adminhtml/session')->addSuccess($this->__('Product was successfully deleted'));
$this->_redirect('*/*/produit');
} catch (Exception $e) {
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
$this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
}
}
$this->_redirect('*/*/');
}

Deux informations importantes ici, la redirection de l’action new vers edit à l’aide _forward, ainsi que l’utilisation de redirect implémentée pour notre propre controller et non pas avec un simple */*/.

Etape suivante : 9 – Mass Action dans le grid magento

Si ce ne tutoriel ne répond à votre demande plus précise, nous avons également un développeur magento à votre service.