Comment ajouter un nouveau champ produit dans Prestashop

Ajouter un nouveau champ dans les fiches produits de Prestashop n’est pas très compliqué en soit quand on sait où le faire.

L’avantage de cette méthode, c’est quelle peut aussi bien fonctionner sur la version 1.6 de Prestashop que sur la version 1.7.

Nous allons avoir besoin de modifier la classe Produit de Prestashop sous forme d’override ainsi que la partie affichage sur notre formulaire de fiche produit dans la vue.

Création de notre module

Pour la première étape, nous allons devoir créer un nouveau module que nous allons nommer composition dans le répertoire /modules/composition.

<?php
if (!defined('_PS_VERSION_')) {
  exit;
}

class Composition extends Module
{
  public function __construct()
  {
    $this->name = 'composition';
    $this->tab = 'others';
    $this->version = '1.0.0';
    $this->author = 'Pascal GAULT';
    $this->need_instance = 0;
    $this->ps_versions_compliancy = [
      'min' => '1.6',
      'max' => _PS_VERSION_
    ];
    $this->bootstrap = true;

    parent::__construct();

    $this->displayName = $this->l('Customize Admin Product');
    $this->description = $this->l('Allows us to add others fields to product');

    $this->confirmUninstall = $this->l('Are you sure you want to uninstall?');
  }
}

Nous allons rajouter quelques méthodes à notre modules, une pour l’installation / désinstallation et une autre pour le hook que nous allons avoir besoin pour modifier notre vue de l’administration des produits.

Après la méthode __construct(), ajoutons donc ces méthodes d’installation.

public function install() {
    if (!parent::install()
    || !$this->_installSql()
    || !$this->registerHook('displayAdminProductsMainStepLeftColumnMiddle') ) { 
        return false; 
    } 
    
    return true; 
}

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

Ici, rien de bien compliqué, nous allons définir que lorsque l’on installe notre module, nous allons modifier la structure de la table ps_product pour y rajouter notre champ composition.

Il nous reste une dernière modification dans ce fichier, c’est au niveau du hook nous permettant d’afficher notre bloc dans le backoffice.

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');
}

Nous allons donc intervenir au niveau du hook hookDisplayAdminProductsMainStepLeftColumnMiddle pour y injecter notre vue personnalisée.

Création de notre vue personnalisée

Suite à l’ajout de notre hook, on créer notre vue personnalisée dans le répertoire /modules/composition/views/hook/admin/product/extra_fields.tpl

<div class="form-group">
  <h4>Composition</h4>
  <div class="translations tabbable">
    <div class="translationsFields tab-content bordered">
      <div class="tab-pane translation-label-fr active">
        <textarea class="rte autoload_rte" name="composition">
          {$composition}
        </textarea>
      </div>
    </div>
  </div>
</div>

Override Product

Il ne nous reste plus qu’à prévenir Prestashop de notre nouveau champ en surchargeant la classe du core via une override. Ajoutons un fichier à l’emplacement /override/classes/Product.php avec ce contenu

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

  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'
    );

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

Thème

Au niveau du front, vous avez maintenant la possibilité d’appeler directement $product->composition

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *