Plonger dans le développement PrestaShop
Table des matières
/*<![CDATA[*/ div.rbtoc1597316603924 {padding: 0px;} div.rbtoc1597316603924 ul {list-style: disc;margin-left: 0px;} div.rbtoc1597316603924 li {margin-left: 0px;padding-left: 0px;} /*]]>*/
Plonger dans le développement PrestaShop
Accéder à la base de données
La structure de la base de données
Les tables de la base de données de PrestaShop sont nommées avec le préfixe ps_
. Notez que cet aspect peut être personnalisé durant l'installation initiale.
Tous les noms de table sont en lettres caractères minuscules, et les mots sont séparés par le caractère souligne ("_
").
Quand une table crée un lien entre deux entités, les noms des deux entités sont mentionnés dans le nom de la table. Par exemple, ps_category_produc
t fait le lien entre les produits et leur catégorie.
Quelques détails à noter :
Utilisez le champ
id_lang
pour stocker la langue associée à un enregistrement.Utilisez le champ
id_shop
pour stocker la boutique associée à un enregistrement.Les tables qui contiennent des traductions doivent avoir un nom se terminant par le suffixe
_lang
. Par exemple,ps_product_lang
contient toutes les traductions de la tableps_product
.Les tables qui contiennent des enregistrements liés à une boutique spécifique doivent avoir un nom se terminant par le suffixe
_shop
. Par exemple,ps_category_shop
contient la position de chaque catégorie en fonction de la boutique.
La classe ObjectModel
C'est là l'objet principal du modèle objet de PrestaShop. Il peut être surchargé en prenant quelques précautions.
C'est une classe de type Active Record (http://fr.wikipedia.org/wiki/Active_record_%28patron_de_conception%29). Les attributs d'une table ou d'une vue sont encapsulés dans une classe. Ainsi l'objet, instance de la classe, est lié à un enregistrement de la base. Après l'instanciation d'un objet, un nouvel enregistrement est ajouté à la base au moment de l'écriture. Chaque objet récupère ses données depuis la base; quand un objet est mis à jour, l'enregistrement auquel il est lié l'est aussi. La classe implémente des accesseurs pour chaque attribut.
Définir le modèle
Vous devez utiliser la variable statique $definition
afin de définir le modèle.
Par exemple :
Un modèle pour de nombreuses boutiques et langues
Pour disposer d'un objet dans plusieurs langues :
Pour disposer d'un objet dépendant de la boutique en cours :
Pour disposer d'un d'objet dépendant de la boutique en cours, et dans plusieurs langues :
Les principales méthodes
La moindre surcharge de ces classes peut avoir une influence sur la manière dont les autres classes et méthodes se comportent. À utiliser avec précaution.
Nom et paramètres de la méthode
Description
__construct($id = NULL, $id_lang = NULL)
Construit l'objet.
add($autodate = true, $nullValues = false)
Enregistre l'objet en cours dans la base de données (ajout ou mise à jour).
delete()
Supprime l'objet en cours de la base de données.
deleteSelection($selection)
Supprime plusieurs objets de la base de données.
getFields()
Prépare les champs pour les classes ObjectModel (ajout, mise à jour).
getValidationRules($className = _CLASS_)
Renvoie les règles de validation objet (validité des champs).
save($nullValues = false, $autodate = true)
Enregistre l'objet en cours dans la base de données (ajout ou mise à jour).
toggleStatus()
Modifie l'état de l'objet dans la base de données.
update($nullValues = false)
Met à jour l'objet en cours dans la base de données.
validateFields($die = true, $errorReturn = false)
Vérifie la validité des champs avant une interaction avec la base de données.
La classe DBQuery
La classe DBQuery permet de construire des requêtes, et donc vous aide à mettre en place vos requêtes SQL. Par exemple :
Voici certaines méthodes de cette classe :
Method name and parameters
Description
__toString()
Générer et récupérer la requête.
string build()
Générer et récupérer la requête.
from(string $table, mixed $alias = null)
Régler la table de la clause FROM.
groupBy(string $fields)
Ajouter une restriction GROUP BY.
having(string $restriction)
Ajouter une restriction sur la clause HAVING (les restrictions seront séparées par une déclaration AND).
innerJoin(string $table, string $alias = null, string $on = null)
Ajouter une clause INNER JOIN, par exemple $this->innerJoin('product p ON ...')
join(string $join)
Ajouter une clause JOIN, par exemple $this->join('RIGHT JOIN'._DB_PREFIX_.'product p ON ...');
leftJoin(string $table, string $alias = null, string $on = null)
Ajouter une clause LEFT JOIN
leftOuterJoin(string $table, string $alias = null, string $on = null)
Ajouter une clause LEFT OUTER JOIN.
limit(string $limit, mixed $offset = 0)
Limiter les résultats de la requête.
naturalJoin(string $table, string $alias = null)
Ajouter une clause NATURAL JOIN.
orderBy(string $fields)
Ajouter une restriction ORDER B.
select(string $fields)
Ajouter des champs à la sélection de la requête.
where(string $restriction)
Ajouter une restriction dans la clause WHERE (les restrictions seront séparées par une déclaration AND).
Le Répartiteur (dispatcher)
Le Répartiteur est l'une des principales nouveautés techniques de la version 1.5. Il gère les redirections d'URL. Au lieu d'utiliser une multitude de fichiers à la racine du dossier de PrestaShop, comme product.php
, order.php
ou category.php
, un seul est utilisé : index.php
. Partant de là, les adresses internes auront cet aspect : index.php?controller=category
, index.php?controller=product
, etc.
Par ailleurs, le Répartiteur a été conçu pour prendre en compte la réécriture d'URL. Ainsi, quand la réécriture d'URL est désactivée, PrestaShop utilisera la forme d'adresse suivante :
...et lorsque la réécriture d'URL est activée (aussi appelée "URL simplifiées"), le Répartiteur de PrestaShop sera capable d'utiliser la forme suivante :
Ce système offre plusieurs avantages :
Il est plus facile d'ajouter un contrôleur.
Vous pouvez utiliser des routes personnalisées pour vos URL simplifiées (ce qui est bien mieux pour le référencement !).
Il n'y a qu'un point d'entrée dans le logiciel, ce qui améliore sa fiabilité, et facilite les développements à venir.
Le Répartiteur utilise trois nouvelles classes abstraites : Controller
, FrontController
et AdminController
(ces deux dernières héritant de la première).
De nouvelles routes peuvent être créées en surchargeant la méthode loadRoutes()
.
L'administrateur de la boutique peut changer l'URL d'un contrôleur en passant par la page de préférences "SEO & URLs".
Contrôleurs
Dans l'architecture MVC, un contrôleur gère la synchronisation des évènements entre la Vue et le Modèle, et les garde à jour. Il reçoit les évènements de tous les utilisateurs, et déclenche les actions à accomplir. Si une action a besoin de voir des données modifiées, le contrôleur "demandera" au Modèle de modifier ces données, et en retour le Modèle notifiera la Vue que les données ont été changées, afin que la Vue puisse se mettre à jour.
Tous les contrôleurs de PrestaShop sont en fait des surcharges de la classe Controller
par le biais d'une autre classe qui en hérite, comme AdminController
, ModuleAdminController
, FrontController
ou ModuleFrontController
.
La classe FrontController
Quelques-unes des propriétés de la classe :
Propriété
Description
$template
Nom du modèle pour le contenu de la page.
$css_files
Tableau contenant une liste des fichiers CSS.
$js_files
Tableau contenant une liste des fichiers JavaScript.
$errors
Tableau des erreurs qui ont survenu.
$guestAllowed
Indique si le client qui s'est déconnecté peut accéder à cette page.
$initialized
Indique si la fonction init()
a été appelée.
$iso
Le code ISO de la langue actuellement sélectionnée.
$n
Le nombre d'éléments par page.
$orderBy
Le champ à utiliser pour le tri.
$orderWay
Indique si le tri doit être ascendant ou descendant ("ASC" ou "DESC").
$p
Le numéro de la page actuelle.
$ajax
Si le paramètre ajax est détecté dans la requête, cette variable sera à true
.
Ordre d'exécution des fonctions du contrôleur
__contruct()
: configure toutes les variables des membres du contrôleur.init()
: initialise le contrôleur.setMedia()
ousetMobileMedia()
: ajoute tous les détails liés à JavaScript et aux CSS à la page, afin qu'ils puissent être combinés, compressés et mis en cache (voire l'outil CCC de PrestaShop, dans la page "Performances" du back-office).postProcess()
: gèreajaxProcess
.initHeader()
: appelé avantinitContent()
.initContent()
: initialise le contenu.initFooter()
: appelé aprèsinitContent()
.display()
oudisplayAjax()
: affiche le contenu.
Contrôleurs existants
Nom de fichier du contrôleur
Description
AddressController.php
Utilisé par address.php pour modifier l'adresse d'un client.
AddressesController.php
Utilisé par addresses.php pour récupérer les adresses d'un client.
AuthController.php
Utilisé par authentication.php pour la connexion d'un client.
BestSalesController.php
Utilisé par best-sales.php pour récupérer les meilleures ventes.
CartController.php
Utilisé par cart.php pour gérer le panier du client.
CategoryController
Utilisé par category.php pour récupérer les catégories de produits.
CMSController.php
Utilisé par cms.php pour récupérer une page CMS.
CompareController.php
Utilisé par products-comparison.php pour comparer les produits.
ContactController.php
Utilisé par contact-form.php pour envoyer des messages.
DiscountController.php
Utilisé par discount.php pour récupérer les réductions d'un client.
GuestTrackingController.php
Utilisé par guest-tracking.php pour gérer les commandes de clients non-inscrits (guest).
HistoryController.php
Utilisé par history.php pour récupérer les commandes d'un client.
IdentityController.php
Utilisé par identity.php pour récupérer les informations personnelles d'un client.
IndexController.php
Utilisé par index.php pour afficher la page d'accueil.
ManufacturerController.php
Utilisé par manufacturer.php pour récupérer les fabricants.
MyAccountController.php
Utilisé par my-account.php pour gérer le compte d'un client.
NewProductsController.php
Utilisé par new-products.php pour récupérer les nouveaux produits.
OrderConfirmationController.php
Utilisé par order-confirmation.php pour confirmer une commande.
OrderController.php
Utilisé par order.php pour gérer la commande en cinq étapes.
OrderDetailController.php
Utilisé par order-detail.php pour récupérer la commande d'un utilisateur.
OrderFollowController.php
Utilisé par order-follow.php pour récupérer les retours d'un client.
OrderOpcController.php
Utilisé par order-opc.php pour gérer la commande en une étape.
OrderReturnController.php
Utilisé par order-return.php pour récupérer un retour marchandise.
OrderSlipController.php
Utilisé par order-slip.php pour récupérer les bons d'achat d'un client.
PageNotFoundController.php
Utilisé par 404.php pour gérer la page "page introuvable".
ParentOrderController.php
Gère le code de commande partagé.
PasswordController.php
Utilisé par password.php pour mettre à zéro un mot de passe perdu.
PricesDropController.php
Utilisé par prices-drop.php pour obtenir les produits ayant une réduction.
ProductController.php
Utilisé par product.php pour récupérer un produit.
SearchController.php
Utilisé par search.php pour obtenir des résultats de recherche.
SitemapController.php
Utilisé par sitemap.php pour récupérer le sitemap.
StoresController.php
Utilisé par stores.php pour récupérer les informations de la boutique.
StoresController.php
Utilisé par supplier.php pour récupérer les fournisseurs.
Surcharger un contrôleur
Grâce à l'héritage objet, vous pouvez modifier le comportement d'un contrôleur, ou en ajouter de nouveaux.
Les contrôleurs de PrestaShop sont tous stockés dans le dossier /controllers
, et utilisent le suffixe "Core".
Par exemple, lorsque vous travaillez avec le contrôleur de catégorie :
Fichier :
/controllers/CategoryController.php
Classe :
CategoryControllerCore
Si vous souhaitez modifier un contrôleur, vous devez d'abord créer une nouvelle classe sans le suffixe "Core", et placer ce fichier dans le dossier /override/controllers
.
Par exemple, lorsque vous surchargez le contrôleur de catégorie :
Fichier :
/override/controllers/front/CategoryController.php
Classe :
CategoryController
Vues
PrestaShop utilise le moteur de template Smarty pour générer ses vues : http://www.smarty.net/
Les vues sont stockées dans des fichiers .tpl
.
Le nom d'une vue est généralement le même que le nom du code qui l'utilise. Par exemple, 404.php
utilise 404.tpl
.
Surcharger une vue
Il n'y a pas de concept d'héritage dans les vues, donc pas moyen de surcharger une vue.
Si vous souhaitez modifier un vue, vous devez réécrire son fichier template, et le placer dans le dossier du thème.
Cookies
PrestaShop utilise des cookies cryptés pour stocker toutes ses informations de session, pour les visiteurs/clients comme pour les employés/administrateurs.
La classe Cookie (/classes/Cookie.php
) est utilisée pour lire et écrire les cookies.
Pour accéder aux cookies depuis le code de PrestaShop, vous pouvez faire comme suit :
Toutes les informations stockées dans le cookie sont disponibles par le biais de ce code :
Si vous avez besoin d'accéder au cookie de PrestaShop depuis du code en dehors de PrestaShop, vous pouvez utiliser ce code :
Données stockées dans le cookie d'un visiteur/client
Token
Description
date_add
L'heure et la date de création du cookie (au format YYYY-MM-DD HH:MM:SS).
id_lang
L'identifiant de la langue sélectionnée.
id_currency
L'identifiant de la devise sélectionnée.
last_visited_category
L'identifiant de la dernière catégorie de produits visitée.
ajax_blockcart_display
Indique si le block panier est ouvert ou fermé.
viewed
Les identifiants des derniers produits vus, séparés par une virgule.
id_wishlist
L'identifiant de la liste d'idées cadeaux actuellement affichée dans le bloc.
checkedTOS
Indique si la case "Conditions générales de vente" a bien été cochée (oui : 1 ; non : 0).
id_guest
L'identifiant invité du visiteur non connecté.
id_connections
L'identifiant de connexion de la session en cours du visiteur.
id_customer
L'identifiant du visiteur une fois connecté.
customer_lastname
Le nom de famille du client.
customer_firstname
Le prénom du client.
logged
Indique si le client est connecté ou non.
passwd
Le hash MD5 de _COOKIE_KEY_
dans config/settings.inc.php
, et le mot de passe utilisé par le client pour se connecter.
L'adresse e-mail que le client a utilisé pour se connecter.
id_cart
L'identifiant du panier actuellement affiché dans le bloc Panier.
checksum
Le checksum Blowfish utilisé pour déterminer si le cookie a été modifié par un tiers. Si ce checksum ne correspond pas, le client sera déconnecté et son cookie effacé.
Données stockées dans le cookie d'un employé/administrateur
Token
Description
date_add
L'heure et la date de création du cookie (au format YYYY-MM-DD HH:MM:SS).
id_lang
L'identifiant de la langue sélectionnée.
id_employee
L'identifiant de l'employé.
lastname
Le nom de famille de l'employé.
firstname
Le prénom de l'employé.
L'adresse e-mail que l'employé a utilisé pour se connecter.
profile
L'identifiant du profil qui détermine les menus auxquels l'employé à accès.
passwd
Le hash MD5 de _COOKIE_KEY_
dans config/settings.inc.php
, et le mot de passe utilisé par l'employé pour se connecter.
checksum
Le checksum Blowfish utilisé pour déterminer si le cookie a été modifié par un tiers. Si ce checksum ne correspond pas, le client sera déconnecté et son cookie effacé.
Les hooks
Les hooks sont une manière d'associer du code à des évènements PrestaShop spécifiques.
La plupart du temps, ils sont utilisés pour insérer du contenu dans une page.
Par exemple, la page d'accueil du thème par défaut de PrestaShop dispose des hooks suivants :
Hook name
Description
displayHeader
Affiche le contenu dans l'en-tête de la page.
displayTop
Affiche le contenu dans la zone supérieure de la page.
displayLeftColumn
Affiche le contenu dans la colonne latérale gauche de la page.
displayHome
Affiche le contenu dans la zone centrale de la page.
displayRightColumn
Affiche le contenu dans la colonne latérale droite de la page.
displayFooter
Affiche le contenu dans le pied de page de la page.
Les hooks peuvent également être utilisés pour lancer des actions spécifiques en fonction des circonstances (ex. : envoyer un e-mail au client).
Vous pouvez obtenir une liste complète des hooks disponibles dans PrestaShop 1.5 en lisant le chapitre "Les hooks de PrestaShop 1.5" de ce Guide du Développeur.
Utiliser les hooks
...au sein d'un contrôleur
Un hook peut facilement s'appeler depuis un contrôleur : vous devez simplement utiliser son nom dans la méthode hookExec()
: Module::hookExec('NomDuHook');
Par exemple :
...au sein d'un module
Pour associer votre code à un hook, vous devez créer une méthode publique, commençant par le mot-clé "hook" suivi, au choix, de "display" ou "action", et le nom du hook que vous souhaitez utiliser.
Cette méthode doit ne recevoir qu'un argument : un tableau des informations contextuelles envoyées au hook.
Pour que votre module réponde à l'appel du hook, ce hook doit être enregistré dans PrestaShop. L'enregistrement de hook se fait avec la méthode registerHook()
. L'enregistrement se fait généralement pendant l'installation du module.
Créer votre propre hook
Vous pouvez créer de nouveaux hooks pour PrestaShop en ajoutant un enregistrement de hook comme vu précédemment. Il n'est plus nécessaire de réaliser une insertion en base de données comme pour les versions précédentes.
Last updated