Tutorial création d’un module Prestashop avec « devpro »

Une fois n’est pas coutume, je vais donc expliquer comment créer un module Prestashop avec « devpro » qui est un sous-module « mini-framework » développé par mes soins.



A quoi sert « devpro », quels sont ses principaux avantages et pourquoi l’avoir créé ?

Lorsque je crée des modules Prestashop je suis à chaque fois confrontés aux mêmes problématiques. Je me demande comment organiser les répertoires dans mon module. Quand je crée un formulaire, il faut taper toutes les balises HTML, il faut aussi gérer le chargement des données dans le formulaire. Si le champ du formulaire est multilingue, il faut faire des boucles sur les langues, charger des fichiers JS etc… Si on a des erreurs à gérer il faut faire des « if truc après le $_POST » ou encore si l’on doit créer des liens dans le back-office il faut toujours faire appel à certaines variables globales et j’en passe.
Bilan, à chaque fois je dois me replonger dans le code pour voir comment il faut faire telle ou telle opération, alors que celles-ci pourraient être plus simple à gérer. J’ai donc ensuite créé « devpro » qui permet de réduire une partie des tâches rébarbatives, tout en laissant une certaine souplesse.

Et on va coder quoi ?
Quelque chose de pas trop compliqué, un module qui permet d’afficher des blocs multilingues sur différents emplacements de votre shop.

Encore une chose ?

Oui, je précise que le module « devpro » est un prototype, je l’utilise pour l’instant pour le module Freenewsletter, il va donc être optimisé en fonction des besoins et évoluer avec le temps.

Les sources
16.08.2011 : « Devpro » a subi quelques modifications, je vous conseille de télécharger directement l’archive avec le projet d’exemple.
Télécharger le projet complet d’exemple « Superblock »
Télécharger uniquement le module « devpro »
Télécharger via le shop
Attention : vous devez extraire le module « devpro » dans « /modules/ », il sera inclus ensuite dans le projet.

1. La structure de base du module


Voilà la structure de bases de notre module qui va s’appeler « superblock » situé dans « /modules/ ». Regardons ensemble de plus près :

css : fichiers « css » relatifs au module
form/bo : pour les pages  qui concernent la navigation dans le back-office
form/front : pour les pages qui concernent la navigation sur la partie publique
form/front/tpl : fichiers « .tpl » liés au fichier « .php » placés dans  form/front
img : images relatives au module
js : fichiers « js » relatifs au module

2. Le fichier « superblock.php »
Le fichier « superblock.php » situé sous « /modules/superblock » sert à l’initialisation du module. Voyons ses différentes sections de plus près.

<?php
class Superblock extends Module{

    private $_html = '';

    function __construct(){
        $this->name = 'superblock';
        $this->tab = 'Tools';
        $this->version = 0.1;
        parent::__construct();
        $this->displayName = $this->l('Module Superblock');
        $this->description = $this->l('Manipulez vos block multilingues');
        // Devpro
        include(_PS_ROOT_DIR_.'/modules/devpro/init.php');
    }

Ici on défini les informations liées au module et on inclus « devpro » directement dans le constructeur ce qui va permettre de prendre en charge automatiquement certains traitements.

    function install(){
        $this->createDB();
        if(!parent::install() || !$this->registerHook('leftColumn') || !$this->registerHook('rightColumn') || !$this->registerHook('home'))
            return false;
        else
            return true;
    }

    function createDB(){
       Db::getInstance()->Execute('
       CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'superblock` (
        `id_superblock` int(11) NOT NULL,
        `title` varchar(255) NOT NULL,
        `content` text NOT NULL,
        `position` varchar(32) NOT NULL,
        `id_lang` int(11) NOT NULL,
        KEY `id_superblock` (`id_superblock`)
       )ENGINE=MyISAM DEFAULT CHARSET=latin1;');
    }

La fonction « install » est appelée quand on installe un module (oui c’est logique), d’abord on crée la base de données avec « createDB », puis on enregistre des « Hook » pour ce module. C’est-à-dire des emplacements dans lequel le module pourra s’afficher. Dans notre cas on autorise la colonne de gauche, droite et le centre.

    function uninstall(){
        Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'superblock`');
        if(!parent::uninstall() || !Configuration::deleteByName('SUPERBLOCK_FLAG'))
            return false;
        return true;
    }

La fonction « uninstall » désinstalle le module, dans notre cas elle supprime la table « ps_superblock » et retire aussi un paramètre que l’on définira plus tard dans le projet. Il est important de tout supprimer ce qu’on a crée avec le module, afin que le marchand puisse avoir toujours une base de donnée clean (pas tous les développeurs le font correctement).

  function getContent(){
       return $this->_html;
    }

La fonction « getContent » se charge d’afficher du contenu dans le back-office, tout le html est assigné à $this->html qui sera ensuite affiché automatiquement. Vous pouvez laisser la fonction tel quel.

  function hookLeftColumn($params){
        return Front::loadTpl('block',__FUNCTION__);
    }

    function hookRightColumn($params){
        return Front::loadTpl('block',__FUNCTION__);
    }

    function hookHome($params){
        return Front::loadTpl('block',__FUNCTION__);
    }

Les fonctions « hook », servent a exécuter du code quand les différents emplacements sont appelés. En gros quand votre site va charger « colonne de gauche », il fera appel à la fonction « hookLeftColum » de votre module. Ici on utilise « Front::load » qui charge automatiquement le fichier « block.php » et « block.tpl » destinés à la partie publique du site.

Comme fichier final on obtient donc ceci :

<?php
class Superblock extends Module{

    private $_html = '';

    function __construct(){
        $this->name = 'superblock';
        $this->tab = 'Tools';
        $this->version = 0.1;
        parent::__construct();
        $this->displayName = $this->l('Module Superblock');
        $this->description = $this->l('Manipulez vos block multilingues');
        // Devpro
        include(_PS_ROOT_DIR_.'/modules/devpro/init.php');
    }

    function install(){
        $this->createDB();
        if(!parent::install() || !$this->registerHook('leftColumn') || !$this->registerHook('rightColumn') || !$this->registerHook('home'))
            return false;
        else
            return true;
    }

    function createDB(){
       Db::getInstance()->Execute('
       CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'superblock` (
        `id_superblock` int(11) NOT NULL,
        `title` varchar(255) NOT NULL,
        `content` text NOT NULL,
        `position` varchar(32) NOT NULL,
        `id_lang` int(11) NOT NULL,
        KEY `id_superblock` (`id_superblock`)
       )ENGINE=MyISAM DEFAULT CHARSET=latin1;');
    }

    function uninstall(){
        Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'superblock`');
        if(!parent::uninstall() || !Configuration::deleteByName('SUPERBLOCK_FLAG'))
            return false;
        return true;
    }

    function getContent(){
       return $this->_html;
    }

    function hookLeftColumn($params){
        return Front::loadTpl('block',__FUNCTION__);
    }

    function hookRightColumn($params){
        return Front::loadTpl('block',__FUNCTION__);
    }

    function hookHome($params){
        return Front::loadTpl('block',__FUNCTION__);
    }

}
?>

2. Le formulaire par défaut

Dans chaque module, on a toujours un formulaire par défaut dans le back-office (quand on clique sur le lien « configurer » du module). Avec « devpro » vous devez avoir votre fichier « default.php » sous « /superblock/form/bo/ », il sera pris automatiquement.  Dans notre cas cette page est chargée d’afficher la liste des différents blocs avec la possibilité de les modifier, d’en créer de nouveaux, ainsi que l’accès à une page de configuration.

$id = Tools::getValue('id');
$action = Tools::getValue('action');

// suppression du block
if(!empty($id) && $action=='del'){
    Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'superblock
                                WHERE `id_superblock`="'.$id.'"');
    Form::msgConfirm($this->l('Block supprimé'));
}

On récupère les paramètres passés via « get » et si on a une action de suppression on supprime le block dans la base de données.

$this->_html.= Html::linkBo($this->l('Accédez à la configuration'),array('form'=>'configuration'),array('img'=>'config.png')).'<br/><br/>';
$this->_html.= Html::linkBo($this->l('Nouveau bloc'),array('form'=>'superblock'),array('img'=>'add.png')).'<br/><br/>';

Pour afficher un lien vers la page de configuration ou vers la création d’un nouveau block, on fait appel à la classe « Html::linkBo » et l’on passe des paramètres comme le titre du lien, les paramètres £_GET et si le lien doit avoir une image on peut le lui spécifier (très pratique).

$blocks = Db::getInstance()->ExecuteS('SELECT * FROM '._DB_PREFIX_.'superblock WHERE `id_lang`="'.$cookie->id_lang.'"');
$this->_html.=
'<table class="table">
<tr>
    <th>'.$this->l('Id').'</th>
    <th>'.$this->l('Titre bloc').'</th>
    <th>'.$this->l('Position').'</th>
    <th>'.$this->l('Action').'</th>
</tr>';
foreach($blocks as $b){
    $this->_html.=
    '<tr>
        <td>'.$b['id_superblock'].'</td>
        <td>'.$b['title'].'</td>
        <td>'.$b['position'].'</td>
        <td>'.
            Html::linkBo(null,array('form'=>'superblock','id'=>$b['id_superblock']),array('img'=>'edit.png','title'=>$this->l('Modifier le bloc'))).
            Html::linkBo(null,array('form'=>'default','action'=>'del','id'=>$b['id_superblock']),array('img'=>'del.png','title'=>$this->l('Supprimer'))).'
        </td>
    </tr>';
}
$this->_html.=
'</table>';

Là rien de particulier on liste tous les blocs de la base de données.
Par contre, le lien pour modifier un bloc est important, on passe un « id » et le nom du formulaire « superblock » qui appellera automatiquement le fichier placé sous /form/bo/superblock.

Comme fichier final on obtient donc ceci :

<?php
$id = Tools::getValue('id');
$action = Tools::getValue('action');

// suppression du block
if(!empty($id) && $action=='del'){
    Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'superblock
                                WHERE `id_superblock`="'.$id.'"');
    Form::msgConfirm($this->l('Block supprimé'));
}

$this->_html.= Html::linkBo($this->l('Accédez à la configuration'),array('form'=>'configuration'),array('img'=>'config.png')).'<br/><br/>';
$this->_html.= Html::linkBo($this->l('Nouveau bloc'),array('form'=>'superblock'),array('img'=>'add.png')).'<br/><br/>';

$blocks = Db::getInstance()->ExecuteS('SELECT * FROM '._DB_PREFIX_.'superblock WHERE `id_lang`="'.$cookie->id_lang.'"');
$this->_html.=
'<table class="table">
<tr>
    <th>'.$this->l('Id').'</th>
    <th>'.$this->l('Titre bloc').'</th>
    <th>'.$this->l('Position').'</th>
    <th>'.$this->l('Action').'</th>
</tr>';
foreach($blocks as $b){
    $this->_html.=
    '<tr>
        <td>'.$b['id_superblock'].'</td>
        <td>'.$b['title'].'</td>
        <td>'.$b['position'].'</td>
        <td>'.
            Html::linkBo(null,array('form'=>'superblock','id'=>$b['id_superblock']),array('img'=>'edit.png','title'=>$this->l('Modifier le bloc'))).
            Html::linkBo(null,array('form'=>'default','action'=>'del','id'=>$b['id_superblock']),array('img'=>'del.png','title'=>$this->l('Supprimer'))).'
        </td>
    </tr>';
}
$this->_html.=
'</table>';

?>

3. Le formulaire d’édition/création de bloc
Vous pouvez créer un nouveau fichier « superblock.php » sous « /form/bo/ ».

$id = Tools::getValue('id');

// Charge les donneés en session
$data = Db::getInstance()->ExecuteS('SELECT * FROM '._DB_PREFIX_ .'superblock WHERE id_superblock="'.$id.'"');
$data['position'] = array('hookLeftColumn'=>$this->l('Colonne gauche'),'hookRightColumn'=>$this->l('Colonne droite'),'hookHome'=>$this->l('Bloc central Home'));
$positions = $data['position'];
Session::loadData(array_merge($data,$positions));

// Retour
$this->_html.= Html::linkBo($this->l('Retour à la liste des blocs'),array('form'=>'default'),array('img'=>'list.png')).'<br/><br/>';

On récupère l’id dans tous les cas (sert à savoir si on est en mode édition ou création). Puis on charge les données avec « Session::loadData » qui fera automatiquement l’attribution des données avec le formulaire.
Un lien retour à la page par défaut est présent, on peut le faire avec un lien indiquant le ‘form’=>’default’.

// Formulaire
$Form = new Form();
$this->_html.=
$Form->init('superblock',null,'post',array('fields_multilang'=>array('title','content')),$this->l('Super Block')).
$Form->select('position',$this->l('Emplacement'),$positions,'position').
$Form->text('title',$this->l('Titre du bloc'),array('validation'=>array('notEmpty'))).
$Form->textarea('content',$this->l('Contenu du bloc')).
$Form->submit('formSuperBlock');

On crée le formulaire, ce qui est important de noter c’est que le premier paramètre de chaque champ = nom du champ = nom du champ dans la base de données. Vous ne pouvez pas appeler votre champ « contenu » si dans votre base de données il s’appelle « content ». Dans le « Form->init » on indique les champs multilingues, qui sont le « title » et « content ». On exige aussi que le champ titre soit rempli grâce à une règle de validation.

// Si le formulaire est validé
if(Form->isSubmit('formSuperBlock')){
    $languages = Language::getLanguages();
    // Création
    if(empty($id)){
        $id_superblock = Tool::nextID('superblock');
        foreach($languages as $l){
            Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_ .'superblock (id_superblock,title,content,position,id_lang)
                                        VALUES ("'.pSQL($id_superblock).'",
                                                "'.pSQL(Tools::getValue('body_title_'.$l['id_lang'])).'",
                                                "'.pSQL(Tools::getValue('body_content_'.$l['id_lang'])).'",
                                                "'.pSQL(Tools::getValue('position')).'",
                                                "'.$l['id_lang'].'"
                                                )'
                                        );
        }
        Form::msgConfirm($this->l('Le block été ajouté'),'default');
    // Modification
    }else{
        foreach($languages as $l){
            Db::getInstance()->Execute('UPDATE '._DB_PREFIX_ .'superblock s
                                        SET s.`title`="'.pSQL(Tools::getValue('body_title_'.$l['id_lang'])).'",
                                            s.`content`="'.pSQL(Tools::getValue('body_content_'.$l['id_lang'])).'",
                                            s.`position`="'.pSQL(Tools::getValue('position')).'"
                                        WHERE s.`id_superblock`="'.$id.'"
                                        AND s.`id_lang`="'.$l['id_lang'].'"');
        }
        Form::msgConfirm($this->l('Le block a été modifiée'),'default');
    }
}

Ici on traite les données une fois validées en mode création ou modification. On fait ensuite un traitement en boucle sur les données (sur les langues) car on a un formulaire multilingue.

Comme fichier final on obtient donc ceci :

<?php

$id = Tools::getValue('id');

// Charge les donneés en session
$data = Db::getInstance()->ExecuteS('SELECT * FROM '._DB_PREFIX_ .'superblock WHERE id_superblock="'.$id.'"');
$data['position'] = array('hookLeftColumn'=>$this->l('Colonne gauche'),'hookRightColumn'=>$this->l('Colonne droite'),'hookHome'=>$this->l('Bloc central Home'));
$positions = $data['position'];
Session::loadData(array_merge($data,$positions));

// Retour
$this->_html.= Html::linkBo($this->l('Retour à la liste des blocs'),array('form'=>'default'),array('img'=>'list.png')).'<br/><br/>';

// Formulaire
$Form = new Form();
$this->_html.=
$Form->init('superblock',null,'post',array('fields_multilang'=>array('title','content')),$this->l('Super Block')).
$Form->select('position',$this->l('Emplacement'),$positions,'position').
$Form->text('title',$this->l('Titre du bloc'),array('validation'=>array('notEmpty'))).
$Form->textarea('content',$this->l('Contenu du bloc')).
$Form->submit('formSuperBlock');

// Si le formulaire est validé
if(Form->isSubmit('formSuperBlock')){
    $languages = Language::getLanguages();
    // Création
    if(empty($id)){
        $id_superblock = Tool::nextID('superblock');
        foreach($languages as $l){
            Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_ .'superblock (id_superblock,title,content,position,id_lang)
                                        VALUES ("'.pSQL($id_superblock).'",
                                                "'.pSQL(Tools::getValue('body_title_'.$l['id_lang'])).'",
                                                "'.pSQL(Tools::getValue('body_content_'.$l['id_lang'])).'",
                                                "'.pSQL(Tools::getValue('position')).'",
                                                "'.$l['id_lang'].'"
                                                )'
                                        );
        }
        Form::msgConfirm($this->l('Le block été ajouté'),'default');
    // Modification
    }else{
        foreach($languages as $l){
            Db::getInstance()->Execute('UPDATE '._DB_PREFIX_ .'superblock s
                                        SET s.`title`="'.pSQL(Tools::getValue('body_title_'.$l['id_lang'])).'",
                                            s.`content`="'.pSQL(Tools::getValue('body_content_'.$l['id_lang'])).'",
                                            s.`position`="'.pSQL(Tools::getValue('position')).'"
                                        WHERE s.`id_superblock`="'.$id.'"
                                        AND s.`id_lang`="'.$l['id_lang'].'"');
        }
        Form::msgConfirm($this->l('Le block a été modifiée'),'default');
    }
}

?>

4. Le formulaire de configuration du module
Vous pouvez créer un nouveau fichier « configuration.php » sous « /form/bo/ ».


Ce formulaire permet d’activer ou non le drapeau sur les blocs multilingues.

Comme fichier final on obtient ceci :

<?php
$flag = Configuration::get('SUPERBLOCK_FLAG');
Session::loadData(array('flag'=>$flag));

// Retour
$this->_html.= Html::linkBo($this->l('Retour à la liste des blocs'),array('form'=>'default'),array('img'=>'list.png')).'<br/><br/>';

$Form = new Form();
$this->_html.=
$Form->init(null,null,'post',array('fields_simple'=>array('flag')),$this->l('Configuration')).
$Form->checkbox('flag',$this->l('Afficher le drapeau de la langue sur le titre du bloc')).
$Form->submit('formConfiguration');

// sauve la configuration
if(Form->isSubmit('formConfiguration')){
    Configuration::updateValue('SUPERBLOCK_FLAG',Tools::getValue('flag'));
    Form::msgConfirm($this->l('La configuration a été modifiée'),'default');
}
?>

Il y a passablement de « déjà vu » là dedans, en gros ce qui est important de retenir, c’est qu’ici on utilise un champ qui n’est pas multilingue et on le spécifique dans « $Form->init ». Sinon pour stocker une valeur de configuration on passe via la classe « Configuration » de Prestashop qui est bien utile. La fonction « Form::msgConfirm » redirige sur le formulaire principal et affiche un message à l’utilisateur.

5. Afficher les blocs sur la partie publique

On crée un fichier block.php sous /form/front/ qui contiendra le code suivant :

<?php
$blocks = Db::getInstance()->ExecuteS('SELECT * FROM '._DB_PREFIX_ .'superblock s
                                    WHERE `s`.id_lang="'.$cookie->id_lang.'"
                                    AND `s`.position="'.Session::read('hookName').'"');

$flag='';
if(Configuration::get('SUPERBLOCK_FLAG')){
    $flag = Html::img('../../../img/l/'.$cookie->id_lang.'.jpg');
}

$html='';
foreach($blocks as $block){
    $html.='
    <div class="block">
        <h4>'.$flag.' '.$block['title'].'</h4>
        <p class="block_content">'
        .$block['content'].'
        </p>
    </div>';
}

$smarty->assign('html',$html);
?>

On sélectionne les blocs assignés au « hook » qui est en train d’être exécuté. Si la configuration est active au niveau du « drapeau de langue » on ajoute l’image dans le titre du bloc. On assigne ensuite le tout à une variable smarty.

Puis dans le fichier « /form/front/tpl/block.tpl » on affiche la variable html qui contient le code html des blocs.

{$html}

Qu’est-ce que ça donne ?
Maintenant vous pouvez créer différents blocs et les voir sur l’accueil. Il s’agit d’un exemple simple, le but de cet exercice n’est pas de reproduire le module Addblocks de Sotew, mais de montrer le fonctionnement d’un module avec « devpro ».

Les avantages pour l’avenir
Prenons mon cas, j’ai dû convertir 15 modules pour la version 1.4, par exemple il a fallu redéfinir dans chacun l’appel à l’éditeur Tinymce, ici on modifie une fois dans « devpro » et c’est fini. Si l’ensemble de vos modules l’utilisent cela fourni un gain de temps, car vous avez toujours la même stratégie de développement et n’avez pas besoin de redéfinir certains processus « rébarbatifs ».

Je veux  modifier « devpro » !
Les classes/fonctions sont commentées, si vous avez l’habitude du PHP vous devriez vous en sortir. Cet outil va bien sûr se développer avec le temps, je proposerai donc de nouvelles versions.

Alors, il y’a que des avantages à utiliser « devpro » ?
L’inconvénient majeur est le suivant, vous modifiez quelque chose dans le module « devpro » et vous faites un bug. Vous avez 10 modules qui utilisent « devpro » et bien les 10 vont planter. Et oui, c’est ça l’inconvénient majeur de ce système.

Bilan final
Je vais continuer d’utiliser cette structure, car elle me permet d’aller plus vite dans le développement de mes modules, je trouve aussi plus propre cette manière de travailler, mais il s’agit là d’un avis purement personnel.

Notez mon billet, Google va adorer :
1 étoiles - J'aime pas !2 étoiles - Bof !3 étoiles - Bien !4 étoiles - Très bien !5 étoiles - Génial ! (2 votes, moyenne : 3,00 sur 5)
Loading...

25 commentaires sur “Tutorial création d’un module Prestashop avec « devpro »”

  1. Bonjour,
    Félicitations! le meilleur article que j’ai lu sur le sujet: clair, propre, concis.
    Tbarkllah 3lik, comme on dit chez nous, Bravo.
    Keep the good work and good luck.

  2. Bonjour,
    J’avais commencé a ‘jouer’ avec des modules que j’avais téléchargé dans le passé. En regardant la module Superblock j’ai remarqué que les textes dans les formes, ni celles de BO, ni celles du FO peuvent être tradui dans une autre langue. Ils ne même s’affiche pas dans le Tools/Traduction du PS (les versions 1.3, pas encore essayé version 1.4).
    Est il une certaine façon d’obtenir ça, ou il y a une ‘bug’ dans Devpro?
    A part de ça Devpro est bien utile.

    1. Bonjour,
      Normalement si vous passez à la fonction (Pour un libellé ou autres)

      $this->l(‘Mon texte à traduire’);

      cela devrait être traduisible en back-office.

  3. Super! C’est l’article le plus constructif sur PS que j’ai lu depuis longtemps.
    Je mets ton site dans mon bookmark et je garde un œil sur ta boutique.
    Bon chance

  4. Le code de création d’un module avec devpro est limpide mais je suis je suis un débutant avec presta shop 1.4.x, et le module ‘superblock’ plante mon BO, je suis suppose qu’il va falloir que je modifie la structure des modules presta shop pour pourvoir utilisé ‘devpro’. Comment faire.

  5. Bonjour,
    sous Prestashop 1.4.1 le superblock ne fonctionne pas correctement avec tiny_mce.
    Les barres d’outils s’affichent bien mais aucune mise en forme n’est conservée à l’enregistrement. une idée ?

    j’ai dû, par ailleurs, restaurer mon module editorial et le tab cms avec les version de la 4.0.17 car tiny ne fonctionnait plus sur ces 2 éléments.
    Votre script form.php du devpro me parait pourtant conforme au niveau de l’appel javascript mais cela doit être au niveau de la validation qu’il y a un problème. Je ne suis pas assez calé en php pour trouver l’origine du problème.

    Suis-je le seul a avoir ce problème ?

    Merci de votre aide

    1. Bonjour,
      C’est un outil gratuit, il faudra que je pousse plus loin le concept, à voir aussi comment Prestashop va évoluer avec son produit afin de voir s’il faut continuer à maintenir cet outil.

        1. Oui tout à fait, il faut que je pense à mettre à jour le tutorial, car Devpro a subit des modifications importantes dans son noyau. Je pensais ouvrir un site uniquement pour mettre en valeur ce module, mais je peine encore à mesurer si cela sera toujours d’actualité pour la version 1.5 de Prestashop par exemple. S’ils effectuent une grosse factorisation du code, ce module n’aura plus lieu d’être, mais pour le moment je ne pense pas que c’est leur priorité.

          1. Je pense que tu as raison car j’ai regardé un peu le code de prestashop 1.5 et c’est surtout pour gérer les multi-boutique, le code n’a pas l’air de changer.
            Je l’ai pas mal modifié également pour y ajouter gestion ajax (page, form) plus d’autres trucs sympa ce qui me facilite la tâche.
            En tout cas merci.

  6. Bonjour
    Je viens de tester votre modul devpro avec superblock.

    les attributs du text contenu dans le superblock ne sont pas sauvegardées couleurs, gras, etc …

    1. Bonjour,

      Pouvez vous essayez de remplacer le code ci-dessous de manière à ajouter le paramètre « true » à la fonction « pSQL ».
      « ‘.pSQL(Tools::getValue(‘body_content_’.$l[‘id_lang’])).' »
      par
      « ‘.pSQL(Tools::getValue(‘body_content_’.$l[‘id_lang’]),true).' »

    1. Les classes sont automatiquement incluses en front lorsqu’un module utilisant devpro est exécuté (elle sont incluses dans le constructeur).
      Il ne me semble pas avoir vu de ralentissement particulier, surtout une fois le cache activé (actuellement je trouve le front assez lent sans cache).

  7. Bonjour,

    Merci beaucoup pour cet excellent tuto!!!
    J’essaie tout simplement d’ajouter un champ date à mon back office, mais j’ai beaucoup de mal…
    J’ai donc ajouter dans le fichier superblock.php de form/bo/ la ligne suivante:
    $Form->text(‘date’,$this->l(‘Date’),array(‘class’=>’hasDatepicker’))
    Seulement rien de différent ne se passe, le champ date se comporte comme un champ text banal sans l’affichage du calendrier souhaité…
    Y a-t-il une solution ?

    Bien cordialement,

    1. Bonjour,

      Le module « devpro » a bien évolué entre temps, il faudra que je refasse un article à ce sujet, n’hésitez pas à m’envoyer un email pour recevoir la dernière version.

      1. bonjour je me lance dans la création d’une boutique avec prestashop et je suis intéressé par la dernier version de devpro, merci et bon travail pour faciliter les aménagements et personnalisations
        cordialement

    1. Bonjour,

      Actuellement, je déconseille son utilisation, je constate qu’il y a eu passablement des modifications sur Prestashop 1.5 et que cela n’est pas intéressant de le maintenir (sauf pour les modules déjà développés avec… on s’adapte).
      Mais sinon je pense qu’il faut vraiment se servir du système interne fourni par Prestashop, car ça devient trop difficile à le maintenir entre les différentes versions.

      1. Effectivement, c’est bien trop consommateur en terme de temps de le maintenir…. J’y ai passé mon après midi d’hier … Sans résultats ! 🙂
        Merci pour le partage de données en tout cas, il m’a été bien utile dans les versions précédentes de prestashop !

Laisser un commentaire

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