...
Code Block |
---|
public function hookLeftColumn( $params ) { global $smarty; return $this->display(__FILE__, 'mymodule.tpl'); } |
Ma 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.
...
Fichier / Dossier | Description |
---|---|
img_ps_dir | URL for the PrestaShop image folder. |
img_cat_dir | URL for the categories images folder. |
img_lang_dir | URL for the languages images folder. |
img_prod_dir | URL for the products images folder. |
img_manu_dir | URL for the manufacturers images folder. |
img_sup_dir | URL for the suppliers images folder. |
img_ship_dir | URL for the carriers (shipping) images folder. |
img_dir | URL for the theme's images folder. |
css_dir | URL for the theme's CSS folder. |
js_dir | URL for the theme's JavaScript folder. |
tpl_dir | URL for the current theme's folder. |
modules_dir | URL the modules folder. |
mail_dir | URL for the mail templates folder. |
pic_dir | URL for the pictures upload folder. |
lang_iso | ISO code for the current language. |
come_from | URL for the visitor's origin. |
shop_name | Shop name. |
cart_qties | Number of products in the cart. |
cart | The cart. |
currencies | The various available currencies. |
id_currency_cookie | ID of the current currency. |
currency | Currency object (currently used currency). |
cookie | User cookie. |
languages | The various available languages. |
logged | Indicates whether the visitor is logged to a customer account. |
page_name | Page name. |
customerName | Client name (if logged in). |
priceDisplay | Price display method (with or without taxes...). |
roundMode | Rounding method in use. |
use_taxes | Indicates whether taxes are enabled or not. |
If you need to have all of the current page's Smarty variables displayed, add the following functionSi vous avez besoin d'afficher toutes les variables Smarty de la page, ajouter la fonction suivante :
Code Block |
---|
{debug} |
Comments are based on asterisk:Les commentaires sont formés avec un asterisque.
Code Block |
---|
{* ThisCette stringligne isest commentedcommentée. out *} {* ThisCette stringligne iségalement too! *} |
Unlike with HTML comments, commented-out Smarty code is not present in the final output file.
Module translation
Our module's text strings are written in English, but we might want French shop owners to use our module too. We therefore have to translate those strings into French, both front-office and back-offices ones. This could be a tedious task, but Smarty and PrestaShop's own translation make it far easier.
Strings in PHP files will need to be displayed through the l()
method, from the Module.php
abstract classA la différence des commentaires HTML, le code Smart commenté n'apparaît pas dans le fichier final.
Traduction d'un module
Les chaînes de texte de notre module sont écrites en anglais, mais nous vondrons sans doute que les français puissent également utiliser notre module. Nous devons donc traduire ces chaînes en français, à la fois celle du front-office et celle du back-office. Cela pourrait être une tâche laborieuse, mais Smarty et les propres outils de traduction de PrestaShop facilitent cela.
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 | ||||
---|---|---|---|---|
| ||||
... $this->displayName = $this->l( 'My module' ); $this->description = $this->l( 'Description of my module.' ); ... |
Strings in TPL files will need to be turned into dynamic content, which Smarty will replace by the translation for the chosen language. In our sample module, this fileLes chaînes des frichiers TPL devront être transformée en contenu dynamique, qui Smarty remplacera par le traduction dans la langue choisie. Dans notre module d'exemple, ce fichier :
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<li> <a href="{$base_dir}modules/mymodule/mymodule_page.php" title="Click this link">Click me!</a> </li> |
...becomesdevient :
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<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> |
...and this oneet celui-ci:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<h4>Welcome!</h4> ... Click me! |
...becomesdevient :
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<h4>{l s='Welcome!' mod='mymodule'}</h4> ... {l s='Click me!' mod='mymodule'} |
The translation tool needs the mod
parameter in order to match the string to translate with its translation.
Strings are delimited with single quotes. If a string contains single quotes, they should be escaped using a backslash ().
This way, strings can be directly translated inside PrestaShop: go to the "Tools" tab, its "Translations" sub-tab, and in the "Modify translations" drop-down menu, choose "Module translations", then click the French flag in order to translate modules into French.
The next page displays all the strings for all the currently-installed modules. Modules that have all their strings already translated have their fieldset closed, whereas if at least one string is missing in a module's translation, its fieldset is expanded.
In order to translate your module's strings (the ones that were "marked" using the l()
method), simply find your module in the list (use the browser's in-page search), and fill the empty fields.
Once all strings for your module are correctly translated, click on the "Update translation" button, either at the top or the bottom of the page.
Tip |
---|
Each field has an icon on its right. This enables you to get an suggestion from Google Translate. You can hover the mouse over it to see the translation, and click it to fill the field with the translation. Automatic translation are not always accurate; use with caution. |
The translations are saved in a new file, fr.php
(or languageCode.php
, which is generated by PrestaShop and looks like thisL'outil de traduction a besoin du paramètre mod
pour faire la correspondance entre les chaînes et leurs traductions.
Les chaînes sont délimitées par des apostrophes. Si une chaîne contient des guillemets, ils devront être échappé à l'aide d'un backlash :
.
Ainsi, les chaînes peuvent être directement traduites dans PrestaShop : allez dans l'onglet "Outils", son sous-onglet "Traductions", et dans le menu déroulant "Modifier les traductions", choisissez "Traductions de module", puis cliquez sur le drapeau français pour commencer à traduire les modules en Français.
La page suivante affichera toutes les chaîens de tous les modules actuellement installés. Les modules dont toutes les chaînes sont déjà traduites ont leur bloc de chaînes replié, tandis que ceux ayant au moins une chaîne manquante ont le leur déplié. Afin de traduire les chaînes de votre module (celles qui ont été "marquées" avec la méthodes l()
), trouvez simplement votre module dans la liste (utiliser la recherche de votre navigateur), et remplissez les champs vides.
Une fois que toutes les chaînes sont correctement traduites, cliquez sur le bouton "Mettre à jour la traduction", qui se trouve en haut et en bas de la page.
Tip |
---|
Chaque champ dispose d'une icône à sa droite. Elle vous permet d'obtenir une suggestion depuis Google Translate. Vous pouvez le survoler avec votre souris pour voir la suggestions, et cliquer sur l'icône pour appliquer la suggestion au champ. Les traductions automatiques ne sont pas toujours précises, vérifiez bien ce qui vous est proposé. |
Les traductions sont enregistrées dans un nouveau fichier, fr.php
(ou plus globalement, code-de-la-langgue.php
, qui est généré par PrestaShop et ressemble à ceci :
Code Block | ||||
---|---|---|---|---|
| ||||
<?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 \!'; |
Warning |
---|
This file must not be edited manually! It can only be edited through the PrestaShop translation tool. |
Now that we have a translation, we can click on the French flag in the front-office (provided the language has indeed been installed), and get the expected result: the module's strings are now in French.
They are also translated in French when the back-office is in French.
Tip |
---|
The translated strings can only be taken into account by the PrestaShop tool, the PHP and TPL files have to be located at the root of the module's folder. |
Creating the module's back-office tab, and its class
In this section you will learn how to give your module its own tab or sub-tab, in a matter of minutes.
Follow these steps:
...
Ce fichier ne doit pas être modifié manuellement ! Il ne doit être modifié que via l'outil de traduction de PrestaShop. |
Maintenant que vous disposez d'une traduction, vous pouvez cliquer sur le drapeau français dans le front-office (pourvu que vous ayez effectivement activé la langue), et obtenir le résultat suivant : un module traduit en français.
Les chaînes sont également traduites en français quand le back-office est en français.
Tip |
---|
Pour que les chaînes à traduire soient prises en compte par l'outil de traduction de PrestaShop, il faut que les fichiers PHP et TPL soient à la racine du dossier du module. |
Créer l'onglet d'administration du module, et sa classe
Dans cette section, nous allons voir comment donner à votre module son propre onglet ou sous-onglet, en quelques minutes.
Suivez les étapes suivantes :
- Ajoutez une nouvelle table à votre base de données PrestaShop, nommée
ps_test
. Donnez-lui deux champs :id_test
(INT 11) ;test
(VARCHAR VARCHAT 32)
- .
- Créez un fichier vide nommé
Test.php
in PrestaShop's dans le dossier/classes
folder.Add the following lines to that file de PrestaShop ; - Ajoutez les lignes suivantes à ce fichier :
Code Block | ||||
---|---|---|---|---|
| ||||
<?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; } } ?> |
- Create a blank file named Créez un fichier vide nommé
AdminTest.php
in PrestaShop's , dans le dossier/admin/tabs
.Add the following lines to that file de PrestaShop ; - Ajouter les lignes suivantes à ce fichier :
Code Block | ||||
---|---|---|---|---|
| ||||
<?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> '; } } ?> |
Put the files online, then create the tab by going to the "Employee" tab, then its "Tabs" sub-tab. Click the "Add new" button, and fill-in the fields with the class' name, "AdminTest". Do not confuse "class" with "modules"! Choose an icon (like one from the FamFamFam pack), choose where the tab should go, and save. You're set! Now start customizing it to your needs!
Troubleshooting
If your module does not work as expected, here are a few ways to find help.
PrestaShop official forum
Join our forum at Mettez ces fichiers en ligne, puis créez l'onglet en vous rendant dans l'onglet "Employés", puis son sous-onglet "Onglets". Cliquez sur le bouton "Ajouter", et remplissez les champs avec le nom de la classe, "AdminTest". Ne confondez pas "class" et "modules" ! Choisissez l'icône (par exemple une provenant du pack FamFamFam), choisissez où l'onglet devra aller, et enregistrez. C'est fait ! Vous êtes libre maintenant d'optimiser cela.
En cas de problème
Si votre module ne marche pas comme prévu, voici quelques possibilités pour obtenir de l'aide :
Le forum officiel de PrestaShop
Rejoignez notre forum à l'adresse http://www.prestashop.com/forums/, and search for an answer using the relevant keywords. If your search needs refining, use the advanced search form. And if your search doesn't yield anything useful, create a new thread, where you can be as wordy as necessary when writing your question; you will need to registered first.
Some forums keep certain threads pinned on top of all threads; they contain some useful information, so be sure to read them through.
Our bug-tracker
if it turns out your issue stems from a PrestaShop bug rather than your code, please do submit the issue in the PrestaShop bug-trackeret lancez une recherche sur les mots clés en rapport avec votre problème. Si la recherche a besoin d'être précisée, utilisée le formulaire de recherche avancée. Et si aucune recherche ne vous apporte de réponse utile, lancez une nouvelle discussion, où vous pourrez être aussi prolixe que nécessaire au moment de décrire votre situation ; il vous faut bien sûr être d'abord membre du forum.
Certains forums conservent des discussion en tête des autres discussions : ils contiennent des informations utiles, lisez-les bien.h.
Notre bug-tracker
S'il se trouve que votre problème vient d'un bug de PrestaShop plutôt que de votre code, envoyez un rapport de bug sur le bug-tracker de PrestaShop : http://forge.prestashop.com/ (you will need to register). This enables you to discuss the issue directly with the PrestaShop developers.
Official PrestaShop websites
...
il vous faudra vous enregistrer). Cela vous permet de discuter le problème directement avec les développeurs PrestaShop.
Sites officiels PrestaShop
Adresse | Description |
---|---|
Official website for the PrestaShop tool, its community, and the company behind it Site officiel de l'application PrestaShop, de sa communauté, et de la société qui le maintient. | |
Marketplace for themes and modules Place de marché pour les thèmes et modules. | |
Host your shop with us Laissez-nous héberger votre boutique ! |