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_product 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 table ps_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 :

/**
* Exemple du modèle CMS (CMSCore) 
*/
public static $definition = array(
  'table' => 'cms',
  'primary' => 'id_cms',
  'multilang' => true,
  'fields' => array(
    'id_cms_category'  => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
    'position'         => array('type' => self::TYPE_INT),
    'active'           => array('type' => self::TYPE_BOOL),
    // Lang fields
    'meta_description' => 
        array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
    'meta_keywords'    => 
        array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
    'meta_title'       => 
        array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'required' => true, 'size' => 128),
    'link_rewrite'     =>
        array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isLinkRewrite', 'required' => true, 'size' => 128),
    'content'          => 
        array('type' => self::TYPE_HTML,   'lang' => true, 'validate' => 'isString', 'size' => 3999999999999),
  ),
);

Un modèle pour de nombreuses boutiques et langues

Pour disposer d'un objet dans plusieurs langues :

'multilang' => true

Pour disposer d'un objet dépendant de la boutique en cours :

'multishop' => true

Pour disposer d'un d'objet dépendant de la boutique en cours, et dans plusieurs langues :

'multilang_shop' => true

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.

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 :

$sql = new DbQuery();
$sql->select('*');
$sql->from('cms', 'c');
$sql->innerJoin('cms_lang', 'l', 'c.id_cms = l.id_cms AND l.id_lang = '.(int)$id_lang);
$sql->where('c.active = 1');
$sql->orderBy('position');
return Db::getInstance()->executeS($sql);

Voici certaines méthodes de cette classe :

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 :

http://myprestashop.com/index.php?controller=category&id_category=3&id_lang=1
http://myprestashop.com/index.php?controller=product&id_product=1&id_lang=1

...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 :

http://myprestashop.com/en/3-music-ipods
http://myprestashop.com/en/1-ipod-nano.html

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 :

Ordre d'exécution des fonctions du contrôleur

  1. __contruct() : configure toutes les variables des membres du contrôleur.

  2. init() : initialise le contrôleur.

  3. setMedia() ou setMobileMedia() : 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).

  4. postProcess() : gère ajaxProcess.

  5. initHeader() : appelé avant initContent().

  6. initContent() : initialise le contenu.

  7. initFooter() : appelé après initContent().

  8. display() ou displayAjax() : affiche le contenu.

Contrôleurs existants

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 :

$this->context->cookie;

Toutes les informations stockées dans le cookie sont disponibles par le biais de ce code :

$this->context->cookie->variable;

Si vous avez besoin d'accéder au cookie de PrestaShop depuis du code en dehors de PrestaShop, vous pouvez utiliser ce code :

include_once('chemin_vers_prestashop/config/config.inc.php');
include_once('chemin_vers_prestashop/config/settings.inc.php');
include_once('chemin_vers_prestashop/classes/Cookie.php');
$cookie = new Cookie('ps'); // Utilisez "psAdmin" pour accéder au cookie d'un employé.

Données stockées dans le cookie d'un visiteur/client

Données stockées dans le cookie d'un employé/administrateur

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 :

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 :

$this->context->smarty->assign('HOOK_LEFT_COLUMN', Module::hookExec('leftColumn'));

...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.

public function hookDisplayNomDuHook($params)
{
    // Votre code.
}

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.

public function install()
{
    return parent::install() && $this->registerHook('NomDuHook');
}

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