...
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 |
---|
borderStyle | solid |
---|
title | mymodule.php |
---|
borderStyle | solid |
---|
|
<?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 |
---|
borderStyle | solid |
---|
title | mymodule.php (partial) |
---|
borderStyle | solid |
---|
|
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 |
---|
borderStyle | solid |
---|
title | mymodule.tpl |
---|
borderStyle | solid |
---|
|
<!-- 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 |
---|
borderStyle | solid |
---|
title | mymodule_page.tpl |
---|
borderStyle | solid |
---|
|
Welcome to my shop!
|
Code Block |
---|
borderStyle | solid |
---|
title | mymodule_page.php |
---|
borderStyle | solid |
---|
|
<?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 |
---|
borderStyle | solid |
---|
title | mymodule_page.php |
---|
borderStyle | solid |
---|
|
<?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 |
---|
borderStyle | solid |
---|
title | mymodule_page.tpl |
---|
borderStyle | solid |
---|
|
{$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 |
---|
borderStyle | solid |
---|
title | mymodule.php (partial) |
---|
borderStyle | solid |
---|
|
...
$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 |
---|
borderStyle | solid |
---|
title | mymodule.tpl (partial) |
---|
borderStyle | solid |
---|
xml |
|
<li>
<a href="{$base_dir}modules/mymodule/mymodule_page.php" title="Click this link">Click me!</a>
</li>
|
...devient :
Code Block |
---|
| xml |
---|
| xml |
---|
borderStyle | solid |
---|
title | mymodule.tpl (partial) |
---|
borderStyle | solid |
---|
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 |
---|
title | mymodule_page.tpl | xml |
---|
|
<h4>Welcome!</h4>
...
Click me!
|
...devient :
Code Block |
---|
| xml |
---|
| xml |
---|
borderStyle | solid |
---|
title | mymodule.tpl |
---|
borderStyle | solid |
---|
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 |
---|
borderStyle | solid |
---|
title | mymodule.tpl |
---|
borderStyle | solid |
---|
|
<?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 \!';
|
...
- 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).
- Créez un fichier vide nommé
Test.php
dans le dossier /classes
de PrestaShop ; - Ajoutez les lignes suivantes à ce fichier :
Code Block |
---|
borderStyle | solid |
---|
title | Test.php |
---|
borderStyle | solid |
---|
|
<?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;
}
}
?>
|
- Créez un fichier vide nommé
AdminTest.php
, dans le dossier /admin/tabs
de PrestaShop ; - Ajouter les lignes suivantes à ce fichier :
Code Block |
---|
borderStyle | solid |
---|
title | AdminTest.php |
---|
borderStyle | solid |
---|
|
<?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> ';
}
}
?>
|
...