Jump to content

Ajouter un champ dans le back office dans les catégories


Recommended Posts

Bonjour,

Je suis en train de créer un module qui me permet d'ajouter un champ dans une catégorie.

Mon champ s'affiche bien dans le BO, par contre impossible d'enregistrer le contenu de ce champ dans la base de donnée.

J'ai l'erreur suivante qui apparait :  

Quote

Une erreur inattendue s'est produite. [Symfony\Component\Debug\Exception\ContextErrorException code 0] : Notice: Undefined index: footer_description.

Pourtant mon champ existe bien dans la base de donnée. J'ai bien fait un override de ma classe Category.php mais rien à faire j'ai toujours la même erreur.  J'ai même essayer en ajoutant mon nouveau champ directement dans la classe de base de prestashop mais ça n'y change rien. Je pense que le problème vient de mon module.

<?php
    /**
	/override/classes/Category.php
    */
    class Category extends CategoryCore
    {
       
       /** @var mixed string or array of Description */
        public $footer_description;
        

        public function __construct($idCategory = null, $idLang = null, $idShop = null)
        {  
           self::$definition['fields']['footer_description'] = array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml');
           parent::__construct($idCategory, $idLang, $idShop);
        }
    }

Puis le code de mon module

<?php
    /**
        * 2007-2021 PrestaShop
        *
        * NOTICE OF LICENSE
        *
        * This source file is subject to the Academic Free License (AFL 3.0)
        * that is bundled with this package in the file LICENSE.txt.
        * It is also available through the world-wide-web at this URL:
        * http://opensource.org/licenses/afl-3.0.php
        * If you did not receive a copy of the license and are unable to
        * obtain it through the world-wide-web, please send an email
        * to [email protected] so we can send you a copy immediately.
        *
        * DISCLAIMER
        *
        * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
        * versions in the future. If you wish to customize PrestaShop for your
        * needs please refer to http://www.prestashop.com for more information.
        *
        *  @author    PrestaShop SA <[email protected]>
        *  @copyright 2007-2021 PrestaShop SA
        *  @license   http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
        *  International Registered Trademark & Property of PrestaShop SA
    */
    
    if (!defined('_PS_VERSION_')) {
        exit;
    }
    
    class Categorycustomfields extends Module
    {
        protected $config_form = false;
        
        public function __construct()
        {
            $this->name = 'categorycustomfields';
            $this->tab = 'administration';
            $this->version = '1.0.0';
            $this->author = 'RC';
            $this->need_instance = 0;
            $this->bootstrap = true;
            
            parent::__construct();
            
            $this->displayName = $this->l('Category Custom Fields');
            $this->description = $this->l('Add custom fields to category');
            
            $this->confirmUninstall = $this->l('');
            
            $this->ps_versions_compliancy = array('min' => '1.7', 'max' => _PS_VERSION_);
        }
        
        /**
            * Don't forget to create update methods if needed:
            * http://doc.prestashop.com/display/PS16/Enabling+the+Auto-Update
        */
        public function install()
        {
            if (!parent::install()
            || !$this->alterCategorylangTable()
            //Installation des hooks
            || !$this->registerHook([
            'actionCategoryFormBuilderModifier',
            'actionAfterCreateCategoryFormHandler',
            'actionAfterUpdateCategoryFormHandler',
            ])
            ) {
                return false;
            }
            
            return true;
        }
        
        /**
            * Alter category_lang table, add module fields
            *
            * @return bool true if success or already done.
        */
        protected function alterCategorylangTable()
        {
            Db::getInstance()->execute('ALTER TABLE `'. _DB_PREFIX_.'category_lang` ADD `footer_description` text');
            return true;
        }
        
              
        public function uninstall()
        {
            include(dirname(__FILE__).'/sql/uninstall.php');
            
            return parent::uninstall();
        }
        
        
        
        /**
            * Modification du formulaire de la catégorie
            * @param array $params
        */
        public function hookActionCategoryFormBuilderModifier(array $params)
        {
            //Récupération du form builder
            $formBuilder = $params['form_builder'];            
            $locales = $this->get('prestashop.adapter.legacy.context')->getLanguages();         
                       
            $formBuilder->add($this->name . '_footer_description',
            \PrestaShopBundle\Form\Admin\Type\TranslateType::class, 
            [
            'type' => \PrestaShopBundle\Form\Admin\Type\FormattedTextareaType::class,            
            'label' => $this->l('Footer Description'), 
            'required' => false,
            'locales' => $locales,
            'hideTabs' => false,
            ]
            );
            
            
            //Définition des données du champ langue
            $languages = Language::getLanguages(true);
            foreach ( $languages as $lang){
                $params['data'][$this->name . '_footer_description'][$lang['id_lang']] = 'Custom value for lang '.$lang['iso_code'];
            }
            $params['data']['active'] = false;
            
            $formBuilder->setData($params['data']);
        }
        
        /**
            * Action effectuée après la création d'une catégorie
            * @param array $params
        */
        public function hookActionAfterCreateCategoryFormHandler(array $params)
        {
            $this->updateData($params['form_data'], $params);
        }
        
        /**
            * Action effectuée après la mise à jour d'une catégorie
            * @param array $params
        */
        public function hookActionAfterUpdateCategoryFormHandler(array $params)
        {
            $this->updateData($params['form_data'], $params);
        }
        
        /**
            * Fonction qui va effectuer la mise à jour
            * @param array $data
        */
        protected function updateData(array $data, $params)
        {
            $cat = new Category((int)$params['id']);
            $cat->footer_description = $data['footer_description'];
            $cat->update();
            
        }
        
    }

Si vous avez une piste je prends.Merci par avance

  • Thanks 1
Link to comment
Share on other sites

Nous souhaitons vous informer que vous devez modifier le tableau des catégories, c'est-à-dire ajouter une définition de colonne et de classe de catégorie pour enregistrer les données de champ. En outre, vous pouvez enregistrer les données de champ dans une nouvelle table que vous avez créée et mappée avec l'ID de catégorie en conséquence.

Link to comment
Share on other sites

  • 4 months later...

Bonjour @kiritti,

D'abord je vous remercie parque votre code m'a aide pour sur un problème que j'ai eu.

Ici le souci c'est au niveau de la fonction updateData():

  • au lieu de $data['footer_description']
  • vous devez avoir  $data[this->name . '_footer_description'] comme définit dans la fonction hookActionCategoryFormBuilderModifier(array $params).

Ça a fonctionné pour moi

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...