Child pages
  • Créer un module PrestaShop

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • Le fichier de démarrage : nom_du_module.php
  • Le fichier de configuration du cache : config.xml
  • Les contrôleurs spécifiques au module, stockés dans le dossier /controllers
  • Les classes de surcharge, stockées dans le dossier /override (installation et désinstallation automatique par copie ou par fusion du code)
  • Les fichiers de vue (templates, JavaScript, CSS, etc.). Ils peuvent être placés dans ces dossiers du module :
    • dossier /views/css pour les fichiers CSS. Si le module doit être compatible avec PrestaShop 1.4, les fichiers CSS doivent être placés à la racine du module, dans un dossier /css.
    • dossier /views/img pour les fichiers image. Si le module doit être compatible avec PrestaShop 1.4, les fichiers image doivent être placés à la racine du module, dans un dossier /img.
    • dossier /views/js pour les fichiers JavaScript. Si le module doit être compatible avec PrestaShop 1.4, les fichiers JS doivent être placés à la racine du module, dans un dossier /js.
    • dossier /views/templates/admin  pour les fichiers utilisés par les contrôleurs admin du module.
    • dossier /views/templates/front pour les fichiers utilisés par les contrôleurs front du module.
    • dossier /views/templates/hook pour les fichiers utilisés par les hooks du module.
    À partir de la v1.5, les fichiers JavaScript et CSS peuvent être placés dans ces sous-dossiers :
    • dossier /views/css pour les fichiers CSS.
    • dossier /views/js pour les fichiers JavaScript.v  

      Info

      Vous pouvez placer vos fichiers CSS, JavaScript et images dans n'importe lequel des dossiers autorisés. Efforcez-vous surtout d'être cohérent, et en cas d'overload, de toujours utiliser le même chemin que le code original.

  • Logo du module en 16x16 : logo.jpg (format JPG ou GIF)
  • Logo du module en 32x32 : logo.png (format PNG)
  • Fichiers de traduction : fr.php, en.php, es.php, etc. À partir de la v1.5, tous ces fichiers peuvent être placés dans le dossier /translations.

...

Cette classe doit porter le même nom que le module et son dossier, en CamelCase (lire http://fr.wikipedia.org/wiki/CamelCase) : MyModule.
De plus, cette classe doit étendre la classe Module, afin d'hériter de ses méthodes et attributs. Elle peut tout aussi bien étendre l'une des classes dérivées de Module pour des besoins spécifiques : PaymentModule, ModuleGridEngine, ModuleGraph...

Code Block
borderStylesolid
titlemymodule.php
borderStylesolid
<?php
if (!defined('_PS_VERSION_'))
  exit;

class MyModule extends Module
{
}
?>

...

Remplissons maintenant notre classe avec les lignes de démarrage essentielles :

Code Block
borderStylesolid
titlemymodule.php
borderStylesolid
<?php
if (!defined('_PS_VERSION_'))
  exit;

class MyModule extends Module
{
  public function __construct()
  {
    $this->name = 'mymodule';
    $this->tab = 'front_office_features';
    $this->version = '1.0';
    $this->author = 'Firstname Lastname';
    $this->need_instance = 0;
    $this->ps_versions_compliancy = array('min' => '1.5', 'max' => '1.5');	
    $this->dependencies = array('blockcart');

    parent::__construct();

    $this->displayName = $this->l('My module');
    $this->description = $this->l('Description of my module.');

    $this->confirmUninstall = $this->l('Are you sure you want to uninstall?');

    if (!Configuration::get('MYMODULE_NAME'))		
      $this->warning = $this->l('No name provided');
  }
}
?>

...

Voici notre fichier template, situé dans /views/templates/hook/mymodule.tpl :

Code Block
borderStylesolid
titlemymodule.tpl
borderStylesolid
<!-- Block mymodule -->
<div id="mymodule_block_left" class="block">
  <h4>Welcome!</h4>
  <div class="block_content">
    <p>Hello, 
       {if isset($my_module_name) && $my_module_name}
           {$my_module_name}
       {else}
           World
       {/if}
       !        
    </p>    
    <ul>
      <li><a href="{$my_module_link}" title="Click this link">Click me!</a></li>
    </ul>
  </div>
</div>
<!-- /Block mymodule -->

...

Voici nos deux fichiers :

Code Block
borderStylesolid
titledisplay.php
borderStylesolid
<?php
class mymoduledisplayModuleFrontController extends ModuleFrontController
{
  public function initContent()
  {
    parent::initContent();
    $this->setTemplate('display.tpl');
  }
}
Code Block
borderStylesolid
titledisplay.tpl
borderStylesolid
Welcome to my shop!

Explorons display.php, notre premier contrôleur front-end PrestaShop, placé dans le sous-dossier /controllers/front du dossier du module :

...

Note

Jusqu'à PrestaShop 1.4, les développeurs qui souhaitaient intégrer un fichier template dans le thème du site devaient utiliser des appels include() pour chaque portion de la page. Voici le code 1.4 de notre display.php ci-dessus :

Code Block
borderStylesolid
titledisplay.php
borderStylesolid
<?php
// Ce fichier doit être placé à la racine du dossier du module
global $smarty;
include('../../config/config.inc.php');
include('../../header.php');

$smarty->display(dirname(__FILE__).'/display.tpl');

include('../../footer.php');
?>

Comme vous pouvez le voir, cela n'est plus nécessaire avec PrestaShop 1.5 : vous pouvez et même devriez utiliser un contrôleur front-end, et le contrôleur (Contrôleur) et son template (Vue) devraient avoir le même nom : display.php est lié à display.tpl.

...

Par exemple, nous pouvons créer la variable $my_module_message en PHP directement dans la méthode hookDisplayLeftColumn(), et la faire s'afficher par notre fichier template.

Code Block
borderStylesolid
titlemymodule.php
borderStylesolid
public function hookDisplayLeftColumn($params)
{
    $this->context->smarty->assign(
        array(
            'my_module_name' => Configuration::get('MYMODULE_NAME'),
            'my_module_link' => $this->context->link->getModuleLink('mymodule', 'display'),
            'my_module_message' => $this->l('This is a simple text message') // Ne pas oublier de mettre la chaîne dans la méthode de traduction l()
        )
    );
    
    return $this->display(__FILE__, 'mymodule.tpl');
}

Partant de là, nous pouvons demander à Smarty d'afficher le contenu de cette variable dans notre fichier TPL.

Code Block
borderStylesolid
titlemymodule.tpl
borderStylesolid
{$my_module_message}

PrestaShop ajoute ses propres variables. Par exemple, {$hook_left_column} sera remplacé par le contenu de la colonne de gauche, ce qui signifie le contenu de tous les modules qui ont été attachés au hook de la colonne de gauche.

...

Les chaînes des fichiers PHP doivent être affichées à l'aide de la méthode l(), qui provient de la classe abstraite Module, et est donc disponible au sein de tous les modules.

Code Block
borderStylesolid
titlemymodule.php (partial)
borderStylesolid
...
$this->displayName = $this->l('My module');
$this->description = $this->l('Description of my module.');
...

Les chaînes des fichiers TPL doivent être transformées en contenu dynamique, que Smarty remplacera par la traduction dans la langue choisie. Dans notre exemple, le fichier mymodule.tpl...

Code Block
borderStylesolid
titlemymodule.tpl (partial)
borderStylesolid
<li>
  <a href="{$base_dir}modules/mymodule/mymodule_page.php" title="Click this link">Click me!</a>
</li>
<!-- Block mymodule -->
<div id="mymodule_block_left" class="block">
  <h4>{l s='Welcome!' mod='mymodule'}</h4>
  <div class="block_content">
    <p>Hello, 
       {if isset($my_module_name) && $my_module_name}
           {$my_module_name}
       {else}
           World
       {/if}
       !        
    </p>    
    <ul>
      <li><a href="{$my_module_link}" title="Click this link">Click me!</a></li>
    </ul>
  </div>
</div>
<!-- /Block mymodule -->	 

...devient...

Code Block
borderStylesolid
titlemymodule.tpl (partial)
borderStylesolid
<li>
  <a href="{$base_dir}modules/mymodule/mymodule_page.php" title="{l s='Click this link' mod='mymodule'}">{l s='Click me!' mod='mymodule'}</a>
</li>
<!-- Block mymodule -->
<div id="mymodule_block_left" class="block">
  <h4>{l s='Welcome!' mod='mymodule'}</h4>
  <div class="block_content">
    <p>
      {if !isset($my_module_name) || !$my_module_name}
        {capture name='my_module_tempvar'}{l s='World' mod='mymodule'}{/capture}
        {assign var='my_module_name' value=$smarty.capture.my_module_tempvar}
      {/if}
      {l s='Hello %1$s!' sprintf=$my_module_name mod='mymodule'}    
    </p>    
    <ul>
      <li><a href="{$my_module_link}"  title="{l s='Click this link' mod='mymodule'}">{l s='Click me!' mod='mymodule'}</a></li>
    </ul>
  </div>
</div>
<!-- /Block mymodule -->

...

Code Block
titledisplay.tpl
Welcome to this page!

...devient...

Code Block
borderStylesolid
titledisplay.tpl
borderStylesolid
{l s='Welcome to this page!' mod='mymodule'}

...

PrestaShop enregistre alors votre traduction dans un nouveau fichier, nommé sous la forme codeDeLaLangue.php (par exemple, /mymodule/fr.php). Le fichier de traduction ressemble à ceci :

Code Block
borderStylesolid
titlefr.php
borderStylesolid
<?php
global $_MODULE;
$_MODULE = array();
$_MODULE['<{mymodule}prestashop>mymodule_2ddddc2a736e4128ce1cdfd22b041e7f'] = 'Mon module';
$_MODULE['<{mymodule}prestashop>mymodule_d6968577f69f08c93c209bd8b6b3d4d5'] = 'Description du module.';
$_MODULE['<{mymodule}prestashop>mymodule_533937acf0e84c92e787614bbb16a7a0'] = 'Êtes-vous certain de vouloir désinstaller ce module ? Vous perdrez tous vos réglages !';
$_MODULE['<{mymodule}prestashop>mymodule_0f40e8817b005044250943f57a21c5e7'] = 'Aucun nom fourni';
$_MODULE['<{mymodule}prestashop>mymodule_fe5d926454b6a8144efce13a44d019ba'] = 'Valeur de configuration non valide.';
$_MODULE['<{mymodule}prestashop>mymodule_c888438d14855d7d96a2724ee9c306bd'] = 'Réglages mis à jour';
$_MODULE['<{mymodule}prestashop>mymodule_f4f70727dc34561dfde1a3c529b6205c'] = 'Réglages';
$_MODULE['<{mymodule}prestashop>mymodule_2f6e771db304264c8104cb7534bb80cd'] = 'Valeur de configuration';
$_MODULE['<{mymodule}prestashop>mymodule_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer';
$_MODULE['<{mymodule}prestashop>mymodule_630f6dc397fe74e52d5189e2c80f282b'] = 'Retour à la liste';
$_MODULE['<{mymodule}prestashop>display_86e88cbccafa83831b4c6685501c6e58'] = 'Bienvenue sur cette page !';
$_MODULE['<{mymodule}prestashop>mymodule_9a843f20677a52ca79af903123147af0'] = 'Bienvenue !';
$_MODULE['<{mymodule}prestashop>mymodule_f5a7924e621e84c9280a9a27e1bcb7f6'] = 'Monde';
$_MODULE['<{mymodule}prestashop>mymodule_3af204e311ba60e6556822eac1437208'] = 'Bonjour %s !';
$_MODULE['<{mymodule}prestashop>mymodule_c66b10fbf9cb6526d0f7d7a602a09b75'] = 'Cliquez sur ce lien';
$_MODULE['<{mymodule}prestashop>mymodule_f42c5e677c97b2167e7e6b1e0028ec6d'] = 'Cliquez-moi !';

...