Comment développer une extension

Introduction

Ce tutoriel fait suite au tutoriel de création d'extension

Ici nous allons voir comment développer votre extension

Prenons pour exemple la simple génération d'un formulaire de contact qui enverra via email le contenu du message saisi dans le formulaire.

Création de l'extension

Commençons par créer une extension normal/formContact

(voir en détail dans le tutoriel précédent)

  
./new.sh normal/formContact
   


Nous avons donc notre répertoire normal/formContact


Paramétrage

Le fichier main.php

  
<?php
class module_mods_normal_formContact extends abstract_moduleBuilder{

   protected $sModule='mods_normal_formContact';
   protected $sModuleView='mods/normal/formContact';

   private $msg=null;
   private $detail=null;
   private $tError=null;
    



Fichier info.ini

  
title
.fr='Cr&eacute;er un formulaire de contact'
title.en='Create a contact form'
category='modules'
version=1.0.0
author
=mika
   



Création des templates

Dans le répertoire src, on va créer nos fichiers de template, ici c'est assez simple, on va créer un module avec une vue et un controller pour envoyer l'email
Dans src, on a donc notre module


Fichier src/example/main.php

  
<?php
class module_#MODULE# extends abstract_module{
  
   
public function before(){
       $this->oLayout=new _layout('template1');
      
       
//$this->oLayout->addModule('menu','menu::index');
   }

   public function _contact(){
       $message=$this->processMail();

       $oView=new _view('#MODULE#::contact');
       $oView->message=$message;
      
       
return $oView;
   }
   private function processMail(){
       if(!_root::getRequest()->isPost()){
           return null;
       }

       $sEmail=_root::getParam('email');
       $sContent=_root::getParam('content');

       $oMail=plugin_mail();
       $oMail->setFrom('Formulaire de contact','#from#');
       $oMail->addTo('#to#');
       $oMail->setBody($sContent);
       $oMail->send();
   }

   public function after(){
       $this->oLayout->show();
   }
  
  
}
    


Notez que l'on utilise ici des tags pour faciliter le remplacement lors de la génération

La vue: src/example/view/contact.php

  
<form action="" method="POST">
<
p>Votre message</p>
<
textarea name="content"></textarea>

<
input type="submit" value="envoyer"/>
</
form>

<?
php if($this->message):?>
<p><?php echo $this->message?></p>
<?php endif;?>
   


Création des fichiers de remplacement

Pour faciliter les rechercher/remplacer, on créer pour chaque fichier dans src le même nom suffixé par .xml

Par exemple pour notre src/example/main.xml

  
<main>
   <patterns>
       <pattern>#MODULE#</pattern>
      
       
<pattern>#from#</pattern>
       <pattern>#to#</pattern>

   </patterns>
  
   
<path>
       <directory>module/#MODULE#</directory>
   </path>
   <target>module/#MODULE#/main.php</target>
</main>
    


Ce fichier a deux fonctions: indiquer sa destination (avec des parties eventuellement disponibles) ainsi que le/les mots qu'il faudra rechercher/remplacer

Création de l'interface de l'extension

Cette fois on édite le fichier view/index.php

  
<div class="table">
<
form action="" method="POST">
   <table>
       <tr>
           <th><?php echo tr('module')?></th>
           <td><input name="module"  style="width:200px;"/></td>
       </tr>
       <tr>
           <th><?php echo tr('emailFrom')?></th>
           <td><input name="emailFrom"  style="width:200px;"/></td>
       </tr>
       <tr>
           <th><?php echo tr('emailTo')?></th>
           <td><input name="emailTo"  style="width:200px;"/></td>
       </tr>
   </table>
   <input type="submit" value="<?php echo tr('generer')?>"/>
</form>
</div>
<p class="msg"><?php echo $this->msg?></p>
<p class="detail"><?php echo $this->detail?></p>
   


Et bien sur le fichier de traitement main.php

  &lt;?php
class module_mods_all_example extends abstract_moduleBuilder{

   protected $sModule='mods_all_example';
   protected $sModuleView='mods/all/example';

   private $msg=null;
   private $detail=null;
   private $tError=null;
  
   
public function _index(){
       $tMessage=$this->process();

       $oTpl$this->getView('index');
       //$oTpl->var=$var;
      
       $oTpl
->msg=$this->msg;
       $oTpl->detail=$this->detail;
       $oTpl->tError=$this->tError;
      
       
return $oTpl;
   }
   private function process(){
       if(_root::getRequest()->isPost()==false){
           return null;
       }

       $sModule=_root::getParam('module');
       $emailFrom=_root::getParam('emailFrom');
       $emailTo=_root::getParam('emailTo');


       $this->msg=tr('formulaireGenererAvecSuccess');
       $this->detail=trR('CreationDuRepertoireVAR',array('#REP#'=>'module/'.$sModule.'/'));
       $this->detail=trR('CreationDuFichierVAR',array('#FICHIER#'=>'module/'.$sModule.'/main.php'));
       $this->detail=trR('CreationDuRepertoireVAR',array('#REP#'=>'module/'.$sModule.'/view/'));
       $this->detail=trR('CreationDuFichierVAR',array('#FICHIER#'=>'module/'.$sModule.'/view/contact.php'));
      
  
       
//creation repertoire
       $this->projectMkdir('module/'.$sModule);

       /*SOURCE*/$oSourceMain=$this->getObjectSource('example/main.php');
       /*SOURCE*/$oSourceMain->setPattern('#MODULE#',$sModule);
       /*SOURCE*/$oSourceMain->setPattern('#emailFrom#',$emailFrom);
       /*SOURCE*/$oSourceMain->setPattern('#emailTo#',$emailTo);
       /*SOURCE*/$oSourceMain->save();

       $this->projectMkdir('module/'.$sModule.'/view');

       /*SOURCE*/$oSourceViewContact=$this->getObjectSource('example/view/contact.php');
       /*SOURCE*/$oSourceViewContact->save();

   }

}
    



Dans l'idée: en premier, on "charge" le fichier de template avec:

  
/*SOURCE*/$oSourceMain=$this->getObjectSource('example/main.php');
    


Cette ligne charge le fichier avec un suffixe .xml, ici (example/main.php.xml)

Ensuite on défini les rechercher/remplacer

  
/*SOURCE*/$oSourceMain->setPattern('#MODULE#',$sModule);
/*SOURCE*/$oSourceMain->setPattern('#emailFrom#',$emailFrom);
    



Enfin on enregistre

  
/*SOURCE*/$oSourceMain->save();
    



PS: vous pouvez bien sur regarder comment sont développés les extensions actuelles pour vous donner des idées ;)