Child pages
  • Créer un module PrestaShop

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

...

Cette classe doit porter le même nom que le module et son dossier, en CamelCase : MyModule.
Qui plus est, cette classe doit étendre la classe Module, et donc hérite de toutes ses méthodes et attributs. Elle peut tout aussi bien étendre n'importe quelle classe dérivée de la classe Module : PaymentModule, ModuleGridEngine, ModuleGraph...

Code Block
borderStylesolid
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;
    }
  }
?>

...

Pour ce faire, nous allons changer le code de notre module, et ajouter ces lignes :

Code Block
borderStylesolid
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);
  }

...

Créons donc le fichier mymodule.tpl, et ajoutons-lui quelques lignes de code.

Code Block
borderStylesolid
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 -->

...

Tip

Vous devez vous efforcer d'utiliser des noms explicites et facilement reconnaissables pour vos fichiers TPL, afin de les trouver facilement dans le back-office – ce qui est particulièrement important lors de l'utilisation de l'outil interne de traduction.

Code Block
borderStylesolid
titlemymodule_page.tpl
borderStylesolid
Welcome to my shop!
Code Block
borderStylesolid
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');
?>

...

Par exemple, dans notre mymodule_page.php, nous pouvons créer une telle variable :

Code Block
borderStylesolid
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' );
?>

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

Code Block
borderStylesolid
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 gauche, et donc le contenu de tous les modules qui ont été attachés au point d'accroche de la colonne de gauche.

...

Les chaînes des fichiers PHP devront être affichées par le biais de la méthode l(), provenant de la classe abstraite Module.php.

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 devront être transformées en contenu dynamique, que Smarty remplacera par la traduction dans la langue choisie. Dans notre module d'exemple, ce fichier :

Code Block
xml
xml
borderStylesolid
titlemymodule.tpl (partial)
borderStylesolid
xml
<li>
  <a href="{$base_dir}modules/mymodule/mymodule_page.php" title="Click this link">Click me!</a>
</li>

...devient :

Code Block
xml
xml
borderStylesolid
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>

...et celui-ci:

Code Block
xml
xml
titlemymodule_page.tplxml
<h4>Welcome!</h4>
...
Click me!

...devient :

Code Block
xml
xml
borderStylesolid
titlemymodule.tpl
borderStylesolid
xml
<h4>{l s='Welcome!' mod='mymodule'}</h4>
...
{l s='Click me!' mod='mymodule'}

...

Les traductions sont enregistrées dans un nouveau fichier, fr.php (ou plus globalement, code-de-la-langue.php, qui est généré par PrestaShop et ressemble à ceci :

Code Block
borderStylesolid
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 \!';

...

  1. Ajoutez une nouvelle table à votre base de données PrestaShop, nommée ps_test. Donnez-lui deux champs :
    • id_test (INT 11) ;
    • test (VARCHAT 32).
  2. Créez un fichier vide nommé Test.php dans le dossier /classes de PrestaShop ;
  3. Ajoutez les lignes suivantes à ce fichier :
Code Block
borderStylesolid
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;
    }
  }
?>
  1. Créez un fichier vide nommé AdminTest.php, dans le dossier /admin/tabs de PrestaShop ;
  2. Ajouter les lignes suivantes à ce fichier :
Code Block
borderStylesolid
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> ';
    }
  }
?>

...