Commentaires

N'hésitez pas à me laisser un petit commentaire pour que l'on discute ensemble de cet article. Les commentaires doivent rester un lieu d’échange courtois et agréable.

Martin Charrier
25 mai 2020 12:29

Bonjour, merci pour ce tuto super simple à comprendre.
Cependant, je souhaite intégrer plusieurs champs et pas 1 seul. Mais mes modifications (sur protected function, la fonction hook et product.php font que le module ne parvient pas à s’installer, supposant que les modifs sur extra_fields.tpl n’influence pas l’installation. (je suis novice ne php). comment faire ? Merci

Pascal GAULT
25 mai 2020 12:54

Bonjour,

Pour rajouter un second champ par exemple, il faut modifier la fonction _installSql() et _unInstallSql() et aussi la classe (override) Product.php. Ce sont les seuls facteurs qui font que le module a du mal à s’installer.

Je te mets un exemple ci-dessous pour l’ajout d’un second champ :

  protected function _installSql() {
      $sqlInstall = "ALTER TABLE " . _DB_PREFIX_ . "product ADD composition TEXT NULL, ADD monsecondchamp TEXT NULL";
      $returnSql = Db::getInstance()->execute($sqlInstall);
      return $returnSql;
  }
  protected function _unInstallSql() {
      $sqlInstall = "ALTER TABLE " . _DB_PREFIX_ . "product DROP composition, DROP monsecondchamp";
      $returnSql = Db::getInstance()->execute($sqlInstall);

      return $returnSql;
  }

Et dans le Product.php :

<?php
class Product extends ProductCore
{
  public $composition;
  public $monsecondchamp;

  public function __construct(
    $id_product = null,
    $full = false,
    $id_lang = null,
    $id_shop = null,
    Context $context = null
  ) {
    self::$definition['fields']['composition'] = array(
      'type' => self::TYPE_HTML,
      'lang' => false,
      'required' => false,
      'validate' => 'isCleanHtml'
    );

    self::$definition['fields']['monsecondchamp'] = array(
      'type' => self::TYPE_HTML,
      'lang' => false,
      'required' => false,
      'validate' => 'isCleanHtml'
    );

    parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
  }
}

Ça devrait débloquer l’installation de ton module.

Gurvan MAHÉ
24 août 2020 09:40

Bonjour,
Ayant suivi votre tuto, j’ai maintenant réussi à ajouter un nouveau champs à mes produits.
Cependant j’aimerais que le moteur de recherche de Prestashop puisse indexer ce nouveau champs. Pour le moment, lorsque j’effectue une recherche avec des valeurs liées à ce nouveau champs, il n’y a aucun résultat…
Je voulais donc savoir si vous pouviez m’aider à résoudre ce petit problème ?

Merci beaucoup pour votre tuto simple et efficace !

Pascal GAULT
24 août 2020 10:20

Bonjour Gurvan,

Alors oui c’est tout à fait normal, Prestashop indexe uniquement le contenu qu’il a besoin.

C’est un sujet assez complexe de rajouter des champs personnalisés dans la recherche mais c’est faisable. Il n’y a pas de hook ou autre pour le faire sans réécrire une partie de la recherche Prestashop.

L’idée va être d’override la recherche de Prestashop (/classes/Search.php) pour rajouter ton(tes) nouveau(x) champ(s) à l’indexe de Prestashop.

A partir de là, Prestashop sera au courant de ces nouveaux champs et pourra proposer les produits correspondant côté front à tes utilisateurs.

Tu dois override trois classes dans ton override Search.php /override/classes/Search.php :

  • getProductsToIndex() : Récupère les produits en fonction des champs
  • indexation() : Moulinette d’indexation Prestashop
  • searchTag() : fonction de recherche de tag

Tu peux t’inspirer d’une conversation sur le forum de Prestashop qui en parle et qui fonctionne :
https://www.prestashop.com/forums/topic/618201-adding-product-custom-fields-to-search/

Je vais faire prochainement un article sur le sujet pour expliquer comment rajouter des champs produits personnalisés à la recherche ce qui permettra de compléter cet article.

Désolé de ne pas pouvoir t’aider plus pour le moment.

Bonne journée 😉

Gurvan MAHÉ
24 août 2020 16:12

Merci beaucoup pour votre réponse. C’est en effet ce que j’ai commencé à faire, mais je ne savais pas exactement quelles classes ajouter dans l’Override.
Je vais pouvoir continuer grâce à vos explications !
Encore merci pour votre aide !

Claire
28 sept. 2020 06:45

Bonjour,

Merci pour le tutoriel ! Je parviens à ajouter de simples champs textes ainsi que des champs éditeur HTML et à les sauvegarder en deux langues.

Mais j’aimerais pouvoir ajouter une liste déroulante (les options peuvent être directement saisies en dur dans le template du formulaire avec un label texte et une valeur numéraire qui serait la seule sauvegardée en DB) et n’ai pour l’instant pas vraiment une idée de comment faire.

Si vous avez le temps pour un exemple, ce serait super !

D’avance merci 🙂

Pascal GAULT
28 sept. 2020 07:57

Bonjour Claire,

En reprenant l’exemple de l’article, tu as uniquement deux fichiers à modifier pour parvenir à mettre en place une liste déroulante.

Dans ton fichier de vue /modules/composition/views/hook/admin/product/extra_fields.tpl, il va falloir changer le fonctionnement par quelque chose de la sorte :

<div class="form-group">
    <h4>Composition</h4>

    <select name="composition" class="form-control">
        <option value="1">Première valeur</option>
        <option value="2">Seconde valeur</option>
    </select>
</div>

Ensuite, dans l’override de la classe Product(/override/classes/Product.php), tu vas devoir retirer la validation ainsi que modifier le type de champ :

self::$definition['fields']['composition'] = array(
            'type' => self::TYPE_INT,
            'lang' => false,
            'required' => false,
        );

Avec ça, tout devrait fonctionner pour prendre en charge ta liste déroulante.

Bonne journée

Claire
28 sept. 2020 11:25

Bonjour Pascal,

Merci beaucoup pour cette rapide réponse. Cela m’a pris un peu de temps (je débute en PrestaShop, PHP et SQL) parce qu’il faut que je gère une partie des champs en multilingue mais c’est bon j’ai réussi à ajouter la liste et à sauvegarder la valeur dans la table product.

Si je peux me permettre une autre question, comment puis-je à l’ouverture de la page d’édition d’un produit pré-selectionner la valeur dans la liste avec la valeur que j’ai en DB ? Parce que pour l’instant c’est la première valeur qui s’affiche dans la liste.

Encore merci !

Pascal GAULT
29 sept. 2020 16:00

Pardon j’ai oublié cette partie, tu peux récupérer la valeur courante de la sorte :

<select name="composition" id="" class="form-control">
  <option value="1" {if $composition == "1"}selected{/if}>Première valeur</option>
  <option value="2" {if $composition == "2"}selected{/if}>Seconde valeur</option>
</select>
Nasandratra
27 oct. 2020 12:36

Bonjour,

Merci pour le tutoriel ! Je m’embrouille la pour la création du modules est-ce dans le fichiers modules du racines qu’on le met ou dans le thème. .

Pascal GAULT
27 oct. 2020 12:38

Bonjour,

C’est bien depuis la racine du site www/modules/ qu’il faut le créer et non pas dans www/themes/tontheme/modules

Yo
10 nov. 2020 08:56

Bonjour,
Merci beaucoup pour ce tutoriel.
Comment faire pour qu’en Front, dans un fichier .tpl, le {$product.composition} soit interprété en HTML ?

Merci 🙂

Pascal GAULT
10 nov. 2020 11:36

Bonjour,

C’est assez simple, on peut utiliser une fonction de Smarty qui se nomme nofilter. Car par défaut, Smarty empêche l’injection d’HTML dans la page pour nous proteger d’une attaque XSS

Tu peux donc afficher ta nouvelle variable sous cette forme :

{$product.composition nofilter}

Si tu veux faire les choses encore mieux, tu peux nettoyer le HTML avant de passer le nofilter :

{$product.composition|cleanHtml nofilter}

lucke
10 déc. 2020 07:08

Au top ce tuto Merci !!!!

Steven D.
1 mars 2021 08:59

Bonjour à tous !

Merci pour ce tuto 🙂

J’ai du loupé quelque chose car l’installation du module est impossible : “L’action install est impossible pour le module composition. Le module n’est pas valide et ne peut pas être chargé.” 🙁

Quelqu’un aurait une idée de mon erreur ??

Merci !

Steven D.

Pascal GAULT
1 mars 2021 23:24

Salut Steven,

Ca m’arrive souvent quand j’essaye de zipper le répertoire “composition”, alors qu’il faut zipper les fichiers à l’intérieur.

Sinon le plus simple reste de déplacer le répertoire directement dans le dossier module de ton Prestashop.

Philippe G.
19 mai 2021 13:24

Bonjour,

Merci pour ce tuto ! Il m’a bien aidé !

Mathieu C
15 juin 2021 10:24

Bonjour,

Super tuto, tout fonctionne très bien a une exception près me concernant, j’ai rajouté un total de 6 champs avec ce module mais dans le back-office après enregistrement la valeur assignée a un champ ne s’affiche pas alors qu’elle est bien enregistrée puisque je peux y accéder côté front-end.

Si quelqu’un aurait un idée de mon erreur 🙂

Merci beaucoup !

Mathieu C.

Pascal GAULT
15 juin 2021 10:29

Bonjour,

Il faudrait vérifier au niveau de la partie où tu passes les valeurs à la vue back que tout soit ok :

public function hookDisplayAdminProductsMainStepLeftColumnMiddle($params) {
    $product = new Product($params['id_product']);

    $this->context->smarty->assign(array(
      'composition' => $product->composition,
    ));

    return $this->display(__FILE__, 'views/hook/admin/product/extra_fields.tpl');
}

Et si tu pouvais nous donner la partie /modules/composition/views/hook/admin/product/extra_fields.tpl que l’on regarde si la valeur est bien comprise par Prestashop

Articles reliés

Retrouvez ci-dessous quelques articles qui pourrait vous intéresser.

02
oct
Remplacer [your-subject] [your-name] [your-email] dans Flamingo

Remplacer [your-subject] [your-name] [your-email] dans Flamingo

Si vous utilisez Flamingo pour sauvegarder les e-mails envoyés par vos formulaires Contact Form, il se peut que vous n’utilisiez pas les champs par défaut [your-subject], [your-name] et [your-email]. Nous allons voir comment override ces champs pour utiliser les vôtres. Chez inRage, nous utilisons par exemple les champs ci-dessous pour remplir nos différents formulaires :…

Lire la suite
16
mar
Créer un serveur MySQL de réplication (slave) des données existantes

Créer un serveur MySQL de réplication (slave) des données existantes

MySQL Master-Slave Replication est une procédure permettant de répliquer en temps réel les données d’un serveur MySQL vers un autre. Nous allons voir ensemble comment mettre cette combinaison en place. Nous ne sommes pas à l’abri d’un incident sur nos serveurs de production et cela même avec un backup journalier de nos bases de données. …

Lire la suite
inRage - Pascal GAULT
© 2008-2021 - inRage SARL. Tous droits réservés.
Code open-source inrage.fr disponible sur Code open-source disponible sur Github
Demandez un devis
06 51 89 89 17
SIRET : 813 430 592 00010
R.C.S : La Rochelle 813 430 592

10-14 rue Jean Perrin,
17000 LA ROCHELLE