Child pages
  • Créer un module PrestaShop

Versions Compared

Key

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

Table des matières

Table of Contents
maxLevel2

...

Créer un module PrestaShop

...

Ce fichier mymondule.php doit commencer avec le test suivant:

Code Block

if (!defined('_PS_VERSION_'))
  exit;

...

Code Block
titlemymodule.php
borderStylesolid

<?php
if (!defined('_PS_VERSION_'))
  exit;

class MyModule extends Module
  {
  public function __construct()
    {
    $this->name = 'mymodule';
    $this->tab = 'Test';
    $this->version = 1.0;
    $this->author = 'Firstname Lastname';
    $this->need_instance = 0;

    parent::__construct();

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

  public function install()
    {
    if (parent::install() == false)
      return false;
    return true;
    }
  }
?>

Examinons chaque ligne de l'objet MyModule...

Code Block

public function __construct()

Définit la constructeur de la classe.

Code Block

$this->name = 'mymodule';
$this->tab = 'Test';
$this->version = 1.0;
$this->author = 'PrestaShop';

...

  • Un attribut 'nom'. Il s'agit d'un identifiant interne, donc il est préférable de s'assurer qu'il est unique, sans caractères spéciaux ni espaces, et de le garder en minuscule.
  • Un attribut 'tab'. C'est le nom du tableau qui contiendra ce module dans la liste des modules du back-office de PrestaShop. Vous pouvez utiliser un nom existant, comme Products, Blocks ou Stats, ou en choisir un personnalisé, comme nous l'avons fait ici. Dans ce dernier cas, un nouveau tableau sera ajouté avec votre titre.
  • Un numéro de version pour le module, qui est affiché dans la liste de modules.
  • Un attribut 'author'. Le nom de l'auteur est affiché dans la liste de modules de PrestaShop.
Code Block

$this->need_instance = 0;

Le drapeau need_instance indique s'il faut oui ou non charger la classe du module lors du chargement de la page "Modules" dans le back-office. S'il est à 0, le module n'est pas chargé, et donc la page des modules utilisera moins de ressources. Si vos modules ont besoin d'afficher un avertissement dans la page des modules, alors vous devez mettre cet attribut à 1.

Code Block

parent::__construct();

Appelle le constructeur du parent. Cela doit être fait avant tout appel à la méthode $this->l(), et après avoir créé $this->name.

Code Block

$this->displayName = $this->l('My module');

Assigne un nom public au module, nom qui sera affiché dans la liste des modules, dans le back-office.
La méthode l() fait partie des outils de traduction de PrestaShop, et est expliquée plus bas.

Code Block

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

Assigne une description publique pour le module, qui sera affichée dans la liste des modules.

Code Block

public function install()
  {
  return (parent::install());
  }

...

De la même manière, le module devrait contenir une méthode uninstall(), afin de disposer d'un processus de désinstallation personnalisé. Cette méthode pourrait être comme suit :

Code Block

public function uninstall()
  {
  if (!parent::uninstall())
    Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'mymodule`');
  parent::uninstall();
  }

...

Code Block
titlemymodule.php (partial)
borderStylesolid

public function install()
  {
  if (parent::install() == false OR !$this->registerHook('leftColumn'))
    return false;
  return true;
  }

...

public function hookLeftColumn($params)
  {
  global $smarty;
  return $this->display(__FILE__, 'mymodule.tpl');
  }

public function hookRightColumn($params)
  {
  return $this->hookLeftColumn($params);
  }

Explorons lignes ajoutées/modifiées :

Code Block

if (parent::install() == false OR !$this->registerHook('leftColumn'))
  return false;
return true;

...

De fait, cette ligne peut se lire comme suit : si l'installation ou l'accrochage échouent, nous en informons PrestaShop.

Code Block

public function hookLeftColumn($params)
  {
  global $smarty;
  return $this->display(__FILE__, 'mymodule.tpl');
  }

La méthode hookLeftColumn() fait en sorte que le module puisse s'accrocher au point d'accroche de la colonne de gauche du thème.
$smarty est la variable globale du système de modèle Smarty, utilisé par PrestaShop, et à laquelle nous devons accéder.
La méthode display() renvoie le contenu du fichier de template mymodule.tpl, s'il existe.

Code Block

public function hookRightColumn($params)
  {
  return $this->hookLeftColumn($params);
  }

...

Code Block
titlemymodule.tpl
borderStylesolid

<!-- Block mymodule -->
<div id="mymodule_block_left" class="block">
  <h4>Welcome!</h4>
  <div class="block_content">
    <ul>
      <li><a href="{$base_dir}modules/mymodule/mymodule_page.php" title="Click this link">Click me!</a></li>
    </ul>
  </div>
</div>
<!-- /Block mymodule -->

...

Code Block
titlemymodule_page.tpl
borderStylesolid

Welcome to my shop!
Code Block
titlemymodule_page.php
borderStylesolid

<?php
global $smarty;
include('../../config/config.inc.php');
include(../../header.php');

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

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

...

Code Block
titlemymodule_page.php
borderStylesolid

<?php
global $smarty;

include('../../config/config.inc.php');
include('../../header.php');

$mymodule = new MyModule();
$message = $mymodule->l('Welcome to my shop!');
$smarty->assign('messageSmarty', $message ); // creation of our variable
$smarty->display(dirname(__FILE__).'/mymodule_page.tpl');

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

...

Code Block
titlemymodule_page.tpl
borderStylesolid

{$messageSmarty}

PrestaShop comprend un certain nombre de variables. Par exemple {$HOOK_LEFT_COLUMN} sera remplacé par le contenu de la colonne de de gauche, et donc le contenu de tous les modules qui ont été attachés au point d'accroche de la colonne de gauche.

...

Si vous avez besoin d'afficher toutes les variables Smarty de la page, ajouter la fonction suivante :

Code Block

{debug}

Les commentaires sont formés avec un asterisque.

Code Block

{* Cette ligne est commentée. *}

{*
Cette ligne également !
*}

...

Code Block
titlemymodule.php (partial)
borderStylesolid

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

...

Code Block
xml
titlemymodule.tpl (partial)
borderStylesolid
xml

<li>
  <a href="{$base_dir}modules/mymodule/mymodule_page.php" title="Click this link">Click me!</a>
</li>

...

Code Block
xml
titlemymodule.tpl (partial)
borderStylesolid
xml

<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>

...

Code Block
xml
titlemymodule_page.tpl
xml

<h4>Welcome!</h4>
...
Click me!

...

Code Block
xml
titlemymodule.tpl
borderStylesolid
xml

<h4>{l s='Welcome!' mod='mymodule'}</h4>
...
{l s='Click me!' mod='mymodule'}

...

Code Block
titlemymodule.tpl
borderStylesolid

<?php

global $_MODULE;
$_MODULE = array();
$_MODULE['<{mymodule}prestashop>mymodule_2ddddc2a736e4128ce1cdfd22b041e7f'] = 'Mon module';
$_MODULE['<{mymodule}prestashop>mymodule_d6968577f69f08c93c209bd8b6b3d4d5'] = 'Description de mon module';
$_MODULE['<{mymodule}prestashop>mymodule_c66b10fbf9cb6526d0f7d7a602a09b75'] = 'Cliquez sur ce lien';
$_MODULE['<{mymodule}prestashop>mymodule_f42c5e677c97b2167e7e6b1e0028ec6d'] = 'Cliquez-moi \!';
$_MODULE['<{mymodule}prestashop>mymodule_page_c0d7cffa0105851272f83d5c1fe63a1c'] = 'Bienvenue dans ma boutique \!';

...

Code Block
titleTest.php
borderStylesolid

<?php
class Test extends ObjectModel 
  {
  /** @var string Name */
  public $test;

  protected $fieldsRequired = array('test');
  protected $fieldsSize = array('test' => 64);
  protected $fieldsValidate = array('test' => 'isGenericName');
  protected $table = 'test';
  protected $identifier = 'id_test';

  public function getFields() 
    {
    parent::validateFields();
    $fields['test'] = pSQL($this->test);
    return $fields;
    }
  }
?>

...

Code Block
titleAdminTest.php
borderStylesolid

<?php
include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php');

class AdminTest extends AdminTab
  {
  public function __construct()
    {
    $this->table = 'test';
    $this->className = 'Test';
    $this->lang = false;
    $this->edit = true;
    $this->delete = true;
    $this->fieldsDisplay = array(
      'id_test' => array(
        'title' => $this->l('ID'),
        'align' => 'center',
        'width' => 25),
      'test' => array(
        'title' => $this->l('Name'),
        'width' => 200)
    );

    $this->identifier = 'id_test';

    parent::__construct();
    }

  public function displayForm()
    {
    global $currentIndex;

    $defaultLanguage = intval(Configuration::get('PS_LANG_DEFAULT'));
    $languages = Language::getLanguages();
    $obj = $this->loadObject(true);

    echo '
      <script type="text/javascript">
        id_language = Number('.$defaultLanguage.');
      </script>';

    echo '
      <form action="' . $currentIndex . '&submitAdd' .  $this->table . '=1&token=' . $this->token . '" method="post" class="width3">
        ' . ($obj->id ? '<input type="hidden" name="id_' . $this->table . '" value="' . $obj->id . '" />' : '').'
        <fieldset><legend><img src="../img/admin/profiles.png" />' . $this->l('Profiles') . '</legend>
          <label>'.$this->l('Name:').' </label>
          <div class="margin-form">';
    foreach ( $languages as $language )
      echo '
          <div id="name_' . $language['id_lang'|'id_lang'] . '" style="display: ' . ($language['id_lang'|'id_lang'] == $defaultLanguage ? 'block' : 'none') . '; float: left;">
            <input size="33" type="text" name="name_' . $language['id_lang'|'id_lang'] . '" value="' . htmlentities( $this->getFieldValue( $obj, 'name', intval( $language['id_lang'|'id_lang'] ) ), ENT_COMPAT, 'UTF-8' ) . '" /><sup>*</sup>
          </div>';
    $this->displayFlags( $languages, $defaultLanguage, 'name', 'name' );
    echo '
          <div class="clear"></div>
        </div>
        <div class="margin-form">
          <input type="submit" value="'.$this->l('Save').'" name="submitAdd'.$this->table.'" class="button" />
        </div>
        <div class="small"><sup>*</sup> '.$this->l('Required field').'</div>
      </fieldset>
    </form> ';
    }
  }
?>

...