Table des matières
...
Créer un module PrestaShop
...
Ce fichier mymondule.php
doit commencer avec le test suivant:
Code Block |
---|
if (!defined('_PS_VERSION_'))
exit;
|
...
Code Block |
---|
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;
}
}
?>
|
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 |
---|
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);
}
|
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 |
---|
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 -->
|
...
Code Block |
---|
title | mymodule_page.tpl |
---|
borderStyle | solid |
---|
|
Welcome to my shop!
|
Code Block |
---|
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');
?>
|
...
Code Block |
---|
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' );
?>
|
...
Code Block |
---|
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 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 :
Les commentaires sont formés avec un asterisque.
Code Block |
---|
{* Cette ligne est commentée. *}
{*
Cette ligne également !
*}
|
...
Code Block |
---|
title | mymodule.php (partial) |
---|
borderStyle | solid |
---|
|
...
$this->displayName = $this->l('My module');
$this->description = $this->l('Description of my module.');
...
|
...
Code Block |
---|
| xml |
---|
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>
|
...
Code Block |
---|
| xml |
---|
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>
|
...
Code Block |
---|
| xml |
---|
title | mymodule_page.tpl |
---|
| xml |
---|
|
<h4>Welcome!</h4>
...
Click me!
|
...
Code Block |
---|
| xml |
---|
title | mymodule.tpl |
---|
borderStyle | solid |
---|
| xml |
---|
|
<h4>{l s='Welcome!' mod='mymodule'}</h4>
...
{l s='Click me!' mod='mymodule'}
|
...
Code Block |
---|
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 \!';
|
...
Code Block |
---|
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;
}
}
?>
|
...
Code Block |
---|
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> ';
}
}
?>
|
...