Posts Tagged ‘prestashop’

Prestashop : Utilisation avancée des AdminController

Cet article est la suite est de celui qui présente le fonctionnement de base et qui est consultable ici : https://www.h-hennes.fr/blog/2018/11/15/prestashop-admincontroller-pour-un-module/
Il présente les fonctionnalités avancées disponibles dans un adminController réalisé dans le cadre d’un module et il aura vocation a être modifié ou complété au fur et à mesure.
Voici le détails des points qui seront évoqués :

Général :

  • Gestion de la toolbar
    • Changement du titre
    • Ajout d’un bouton d’action
  • Ajouter une action
  • Validation spécifique
  • Gestion d’images
  • Appels Ajax
  • Surcharger le template

Listing :

  • Champs active / non active
  • Ajouter un callback sur un champ
  • Ajouter des actions de masse personnalisée
  • Récupérer les données de plusieurs tables

Formulaire :

  • Lier des champs en ajax
  • Afficher des contenus totalement personnalisé

Options :

  • Traitement spécifique d’une option
  • Ensemble des cas d’affichage d’options

Général :

Gestion de la toolbar :

Ajouter un titre sur la page

Ce point est géré par la fonction initToolbarTitle

    /**
     * Affichage d'un titre personnalisé
     */
    public function initToolbarTitle()
    {
        parent::initToolbarTitle();
 
        switch ($this->display) {
            case '':
            case 'list': //Titre pour le listing
                array_pop($this->toolbar_title);
                $this->toolbar_title[] = $this->module->l('Custom Title for listing');
                break;
            case 'add': //Titre pour l'ajout et l'édition d'un objet
            case 'edit':
                array_pop($this->toolbar_title);
                if (($sample = $this->loadObject(true)) && Validate::isLoadedObject($sample)) {
                    $this->toolbar_title[] = sprintf($this->module->l('Editing sample %s'),$sample->name);
                } else {
                    $this->toolbar_title[] = $this->module->l('Creating a new sample');
                }
                break;
        }
    }

Title controller

Ajouter un bouton d’action :
Cet élément est géré par la fonction initPageHeaderToolbar

public function initPageHeaderToolbar()
    {
 
        //Bouton d'ajout ( standard )
        $this->page_header_toolbar_btn['new'] = array(
            'href' => self::$currentIndex .
Pas de commentaires

Prestashop : Passer des commandes via l’api

J’ai récemment du faire des tests de commandes via les Api de Prestashop et je n’ai pas trouvé de script tout fait qui le permettait.
Celui-ci utilise la librairie fournie par Prestashop et disponible sur github : https://github.com/PrestaShop/PrestaShop-webservice-lib/blob/master/PSWebServiceLibrary.php

En voici donc un basique qui va effectuer les actions suivantes :

  • Récupération de l’identifiant client ( création du client si nécessaire )
  • Récupération de l’identifiant de l’adresse du client ( création si nécessaire )
  • Création d’un panier
  • Passage de la commande

Ce script a été exécuté avec succès sur la version 1.7.3.3 de Prestashop et doit donc être compatible avec les versions suivantes.
Je n’ai pas constaté de changement fondamentaux dans l’api par rapport à Prestashop 1.6, pour lequel il devrait également fonctionner ( en changeant les produits )

N’hésitez pas à partager vos retours d’expériences sur l’utilisation de l’api de Prestashop

 
require_once('./PSWebServiceLibrary.php');
 
try {
 
    $host = 'https://yourshop.com';
    $apiKey = 'APIKEY';
 
    $webService = new PrestaShopWebservice($host, $apiKey, false);
 
    /**
     * On stocke ici les variables communes aux commandes créés via l'api
     */
 
      $customerEmail = '[email protected]'; //Email du client ( A dynamiser dans le cadre d'une utilisation complète )
      $carrierName = 'My carrier'; //Nom du transporteur dans prestashop ( utilisé pour récupérer son identifiant )
      $paymentLabel = 'Paiement par chèque'; // Nom du mode de paiement
      $paymentCode = 'ps_checkpayment'; //Module de paiement utilisé
 
    /**
     * Liste des produits qu'on souhaite ajouter au panier
     */
    $products = [
        [
            'reference' => 'demo_12',
            'qty' => 3,
        ],
        [
            'reference' => 'demo_19',
            'qty' => 1,
        ],
        [
            'reference' => 'demo_6',
            'qty' => 2,
            'combination' => [
                'reference' => 'demo_6'
            ]
        ],
    ];
 
    //Paramètres du client
    $customerDatas = [
        'firstname' => 'herve',
        'lastname' => 'test',
        'email' => '[email protected]',
        'passwd' => 'mypassword',
        'note' => 'Customer created with api',
    ];
 
    //Paramètres de l'adresse
    $addressDatas = [
        'alias' => 'addresse api',
        'id_customer' => $customerId,
        'firstname' => 'herve',
        'lastname' => 'test',
        'address1' => 'rue des tests',
        'address2' => 'encore rue des tests',
        'postcode' => '67000',
        'city' => 'strasbourg',
        'phone' => '063656565',
        'id_country' => 8,
    ];
 
 
    //On regarde si le client existe
    $searchCustomerXml = $webService->get([
        'resource' => 'customers',
        'filter' => ['email' => $customerEmail],
    ]);
 
    //Si il existe on récupère l'identifiant
    if (!
2 commentaires

Prestashop : créer un admin controller pour un module

Nous allons voir les différentes étapes pour réaliser facilement un controller admin basique lié à un module Prestashop.
Puis nous verrons ensuite les caractéristiques de base d’un controller admin, cet article sera complété par un autre pour voir les fonctionnalités avancées 😉

Note : A partir de la version 1.7.5 de Prestashop il est possible d’utiliser d’utiliser le framework symfony et de suivre le même fonctionnement que les nouveaux controller admin de prestashop, je ferais sans doute un article ultérieurement.
Ce tutoriel reste tout de même valide sur cette version et les suivantes pour l’instant.

Pour cela nous allons créer un module « samplemodule ».
Le code complet est visible sur github : https://github.com/nenes25/prestashop_samplemodule/tree/admin

Les prérequis suivants sont nécessaires pour réaliser un controller admin pour votre module :

  • Création d’une « Tab »
  • Utilisation d’un objet Prestashop héritant de la classe ObjectModel ( et de la base de données qui lui est associée )

Pour l’objet Prestashop nous partirons sur un objet fictif « Sample » avec les propriétés suivantes :

  • name : nom de l’objet
  • code : code de l’objet
  • email : email de l’objet
  • title : titre de l’objet ( différent en fonction de la langue )
  • description : description de l’objet ( différent en fonction de la langue )

Le code suivant sera dans le fichier classes/Sample.php du module

class Sample extends ObjectModel
{
 
    public $id;
    public $name;
    public $code;
    public $email;
    public $title;
    public $description;
 
    public static $definition = [
        'table' => 'hh_sample',
        'primary' => 'id_sample',
        'multilang' => true,
        'fields' => [
            // Champs Standards
            'name' => ['type' => self::TYPE_STRING, 'validate' => 'isName', 'size' => 255, 'required' => true],
            'code' => ['type' => self::TYPE_STRING, 'validate' => 'isLinkRewrite', 'size' => 255, 'required' => true],
            'email' => ['type' => self::TYPE_STRING, 'validate' => 'isEmail', 'size' => 255, 'required' => true],
            //Champs langue
            'title' => ['type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml', 'size' => 255,],
            'description' => ['type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml',],
        ],
    ];
}

 

Pour la création de la tab et de la base de donnée c’est le module qui se charge de gérer tout cela lors de son installation.…

5 commentaires

Prestashop : Ajouter un objet dans l’api

Nous allons voir comment ajouter un nouvel objet personnalisé dans l’api Prestashop via un module.
Cette méthodologie fonctionne sous Prestashop 1.7

L’objectif est d’ajouter de rendre un nouvel objet « Sample » qui pourra être manipulé via l’api.
Pour cela nous allons créer un module hhapisample

Ce module va ajouter une entité « sample » qui sera gérable via l’API.

Cette entité aura uniquement les paramètres suivants :

  • référence
  • nom ( multilingue )
  • description ( multilingue )

Voici le code de cette entité à placer dans le fichier classes/Sample.php du module.

/**
 * Classe d'exemple pour le webservice
 */
class Sample extends ObjectModel {
 
    /** @var string Référence du document */
    public $reference;
 
    /** @var string nom */
    public $name;
 
    /** @var string description */
    public $description;
 
    /**
     * Définition des paramètres de la classe
     */
    public static $definition = array(
        'table' => 'sample',
        'primary' => 'id_sample',
        'multilang' => true,
        'multilang_shop' => false,
        'fields' => array(
            'reference' => array('type' => self::TYPE_STRING, 'validate' => 'isCleanHtml', 'size' => 255),
            'name' => array('type' => self::TYPE_STRING, 'validate' => 'isCleanHtml', 'size' => 255 , 'lang' => true),
            'description' => array('type' => self::TYPE_STRING, 'validate' => 'isCleanHtml' , 'lang' => true),
        ),
    );
 
    /**
     * Mapping de la classe avec le webservice
     * 
     * @var type 
     */
    protected $webserviceParameters = [
        'objectsNodeName' => 'samples', //objectsNodeName doit être la valeur déclarée dans le hookAddWebserviceResources ( liste des entités )
        'objectNodeName' => 'sample', // Détail d'une entité
        'fields' => []
    ];
}

La définition du webservice est géré dans l’objet est configuré dans la variable $webserviceParameters
Pour rendre disponible cette entité, il faut greffer votre module sur le hook addWebserviceResources

/**
     * Ajout de la nouvelle entité au webservice
     * @param $params
     * @return array
     */
    public function hookAddWebserviceResources($params) {
        return [
            'samples' => [ //Nom du paramètre $webserviceParameters['objectsNodeName'] de la classe Objet
                'description' => 'Sample new entity for API',
                'class' => 'Sample'
            ],
        ];
    }

Une fois le module installé, vous pouvez-voir dans la liste des objets de l’api que l’entité sample est bien visible.…

Pas de commentaires

Prestashop 1.7 : Récupérer des informations personnalisées dans le panier

J’ai récemment fait face à un problème, car je souhaitais remontée un champ produit spécifique dans les informations du panier sur prestashop 1.7
( La modification décrite fonctionne également sur prestashop 1.6.1.x )

Après analyse, il s’avère que les informations disponibles sont remontées depuis la fonction getProducts de la classe Cart.

L’ensemble des champs remontés sont listé dans la requête sql de remontée des produits, et il n’est pas possible de récupérer nos nouveaux champs.

// Build query
$sql = new DbQuery();
 
// Build SELECT
$sql->select('cp.`id_product_attribute`, cp.`id_product`, cp.`quantity` AS cart_quantity, cp.id_shop, cp.`id_customization`, pl.`name`, p.`is_virtual`,
pl.`description_short`, pl.`available_now`, pl.`available_later`, product_shop.`id_category_default`, p.`id_supplier`,
p.`id_manufacturer`, m.`name` AS manufacturer_name, product_shop.`on_sale`, product_shop.`ecotax`, product_shop.`additional_shipping_cost`,
product_shop.`available_for_order`, product_shop.`show_price`, product_shop.`price`, product_shop.`active`, product_shop.`unity`, product_shop.`unit_price_ratio`,
stock.`quantity` AS quantity_available, p.`width`, p.`height`, p.`depth`, stock.`out_of_stock`, p.`weight`,
p.`available_date`, p.`date_add`, p.`date_upd`, IFNULL(stock.quantity, 0) as quantity, pl.`link_rewrite`, cl.`link_rewrite` AS category,
CONCAT(LPAD(cp.`id_product`, 10, 0), LPAD(IFNULL(cp.`id_product_attribute`, 0), 10, 0), IFNULL(cp.`id_address_delivery`, 0), IFNULL(cp.`id_customization`, 0)) AS unique_id, cp.id_address_delivery,
product_shop.advanced_stock_management, ps.product_supplier_reference supplier_reference');
 
// Build FROM
$sql->from('cart_product', 'cp');
 
...
1 commentaire

Prestashop : Modifier les listings dans l’administration

En complément d’un de mes précédents articles sur comment ajouter des nouveaux champs dans le listing des produits ( pour prestashop 1.7 ), nous allons voir comment effectuer cette action sur les autres controllers de l’administration.

Les listing des controllers concernés sont ceux qui utilisent encore l’ancienne infrastructure et les anciennes méthodes ( Clients, adresses, commandes , employés … )

Ce tutoriel fonctionne à partir de la version 1.6.0.2 de Prestashop et utilise le hook dynamique action.$this->controller_name.ListingFieldsModifier

Pour les versions inférieures il sera nécessaire de faire un override du controller concerné et d’ajouter les informations directement à la suite des paramètres de classe
$this->_select,
$this->_join,
$this->_where

Exécuté par via le code suivant dans la fonction getList de la classe AdminController

Hook::exec('action'.$this->controller_name.'ListingFieldsModifier', array(
'select' => &$this->_select,
'join' => &$this->_join,
'where' => &$this->_where,
'group_by' => &$this->_group,
'order_by' => &$this->_orderBy,
'order_way' => &$this->_orderWay,
'fields' => &$this->fields_list,
));

Les paramètres sont passés par référence au hook ce qui permets de modifier directement les variables qui seront appellées depuis un module.…

2 commentaires

Prestashop 1.7 : Dynamisez vos contenus wysiwyg

La problématique n’est pas nouvelle sur Prestashop, et c’est un point qui me frustre assez souvent et pour lequel j’avais déjà fait un module en 2014 ( cf. https://www.h-hennes.fr/blog/2014/01/18/prestashop-liens-dynamiques-vers-les-pages-cms-dans-lediteur-tinymce/ )
Ce module n’est malheureusement plus fonctionnel sur Prestashop 1.7.

Dans les éditeurs de contenus, il n’est pas possible  des mettre des liens ou des contenus dynamiques.
La bonne nouvelle cependant c’est que la version 1.7 de Prestashop apporte de nouveaux hooks qui vont permettre de modifier ces contenus avant l’affichage des éléments, et donc sans surcharge  🙂

Les éléments dont les contenus sont modifiables sont les suivants :

  • Pages cms
  • Catégories cms
  • Contenu produit
  • Contenu catégorie
  • Contenu Fabriquants
  • Contenu fournisseurs

Pour l’exemple on va partir sur le besoin suivant :

Je souhaite afficher un élément de configuration  dans l’ensemble des contenus noté ci-dessous.
Ce sera la configuration PS_SHOP_EMAIL , qui correspond à l’émail par défaut de la boutique.

Pour afficher cette variable il faudra intégrer dans les zones de contenus le code suivant :

{{configuration name=PS_SHOP_EMAIL}}

Le but du module sera donc de remplacer cet élément par sa valeur de configuration.…

4 commentaires

Eicaptcha : Ajout d’une configuration avancées des sélecteurs

J’ai eut beaucoup de retours ces dernières semaines sur le non-fonctionnement de mon module de captcha sur les thèmes différents de default-boostrap ( celui par défaut ).
Ceci était du au fait que j’avais stocké directement dans le code des sélecteurs css spécifiques à ce thème.

Vous pouvez le voir sur l’extrait de code suivant :

<script type="text/javascript">
 $(document).ready(function(){
 //Add div where the captcha will be displayed
 $(".submit").before("<div id=\"captcha-box\"></div>"); // <= sélecteur stocké en dur
 
 //Manage form submit 
 $("#submitMessage").click(function(){ // <= sélecteur stocké en dur
 ...
 </script>

La nouvelle version qui sortira dans les prochains jours corrigera ce problème, en permettant d’éditer ces informations directement depuis l’administration.…

14 commentaires

Prestashop : Modules gratuits pour optimiser votre seo

Dans l’ensemble de mes derniers projets prestashop, j’ai été confronté à la mise en place de redirections et la nécessiter d’édition du fichier robots.txt

La bonne nouvelle c’est qu’il existe des modules gratuits pour cela et qu’il font très bien le job pour toutes les versions de prestashop.
Il est directement possible d’éditer ces fichiers depuis l’administration, ce qui est rapide et  donne la main au webmaster pour les gérer directement.

C’est l’occasion pour moi de les partager :-), je les inclus dorénavant dans  mon installation de base.

Module édition de .htaccess :

htaccess editor

https://dh42.com/free-prestashop-modules/prestashop-htaccess-module/

Module édition du fichier robots.txt :

Robots.txt editor

https://dh42.com/free-prestashop-modules/prestashop-robots-txt-module/

2 commentaires

Prestashop 1.7 : Nettoyer la liste des modules

Dans le listing des modules Prestashop, un point m’a toujours dérangé.
Des modules partenaires et payants remontent et se mélangent aux modules installés sur le site, ce qui fait que c’est souvent le bordel pour s’y retrouver.
J’avais déjà cherché un peu comment remédier à ce point sur la version 1.6 sans trouver de solution satisfaisante …

La bonne nouvelle sur cette version 1.7, c’est que ça devient relativement facile à faire  !  ( Par contre je n’ai pas dit que c’était propre 😉 )

La modification doit être réalisée dans une partie de Prestashop qui n’est pas suchargeable, il est donc nécessaire de modifier le fichier coeur

src/Core/Addon/Module/ModuleRepository.php

Dans la fonction getList() , mettez le contenu suivant :

public function getList()
    {
        //On ne renvoie que la liste des modules sur le disque ( c'est à dire physiquement présents sur le serveur)
        return $this->getModulesOnDisk();
        /*
         Ancien Code
        return array_merge(
            $this->getAddonsCatalogModules(),
            $this->getModulesOnDisk()
        );*/
    }

Voici un aperçu de la page des modules avant  la modification

Liste des modules avant modification

Et après 🙂

Liste modules après filtre

Seuls les modules physiquement présents sur le serveur sont listés, ce qui est beaucoup plus clair et plus propre de mon point de vue.…

4 commentaires


Compte Github