La version 1.4 de Prestashop a la vie dure. Il m’arrive encore très souvent de devoir faire des adaptations sur cette version alors qu’il existe deux versions majeures supplémentaires sorties depuis. Aujourd’hui j’ai dû ajouter une seconde description à afficher en bas des pages de catégories avec comme particularité qu’elle devait accepter le code html (idéal pour le référencement). Voici comment faire.
Override de la classe Category
<?php class Category extends CategoryCore { public $description_bottom; public function __construct($id_category = null, $id_lang = null) { $this->fieldsValidateLang['description_bottom']='isString'; parent::__construct($id_category, $id_lang); } public function getTranslationsFieldsChild() { $fieldsArray = array('name', 'description','description_bottom', 'link_rewrite', 'meta_title', 'meta_keywords', 'meta_description'); $fields = array(); $languages = Language::getLanguages(false); $defaultLanguage = Configuration::get('PS_LANG_DEFAULT'); foreach ($languages as $language) { $fields[$language['id_lang']]['id_lang'] = $language['id_lang']; $fields[$language['id_lang']][$this->identifier] = (int)($this->id); foreach ($fieldsArray as $field) { if (!Validate::isTableOrIdentifier($field)) die(Tools::displayError()); /* Check fields validity */ if (isset($this->{$field}[$language['id_lang']]) AND !empty($this->{$field}[$language['id_lang']])) $fields[$language['id_lang']][$field] = pSQL($this->{$field}[$language['id_lang']], true); elseif (in_array($field, $this->fieldsRequiredLang)) $fields[$language['id_lang']][$field] = pSQL($this->{$field}[$defaultLanguage]); else $fields[$language['id_lang']][$field] = ''; } $fields[$language['id_lang']]['description_bottom'] = (isset($this->description_bottom[$language['id_lang']])) ? pSQL($this->description_bottom[$language['id_lang']], true) : ''; } return $fields; } }
Via la fonction « __construct » on ajoute le champ « description_bottom » qui est défini avec un validateur de type « isString » pour accepter le html.
La fonction « getTranslationsFieldsChild » quant à elle permet de valider les champs de type « lang » tout en conservant l’html pour le champ « description_bottom ».
Modification du formulaire
Pour modifier le formulaire vous devez éditer le fichier « /tabs/AdminCategories.php » qui se trouve dans le dossier de votre backoffice.
Ligne 234 environ vous allez trouver le code suivant
foreach ($this->_languages AS $language) echo ' <div class="lang_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $this->_defaultFormLanguage ? 'block' : 'none').'; float: left;"> <textarea name="description_'.$language['id_lang'].'" rows="10" cols="100">'.htmlentities($this->getFieldValue($obj, 'description', (int)($language['id_lang'])), ENT_COMPAT, 'UTF-8').'</textarea> </div>';
Ajoutez-y à la suite ce code
echo '</div> <p class="clear"></p> <label>'.$this->l('Description basse:').' </label> <div class="margin-form translatable">'; foreach ($this->_languages AS $language) echo ' <div class="lang_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $this->_defaultFormLanguage ? 'block' : 'none').'; float: left;"> <textarea name="description_bottom_'.$language['id_lang'].'" rows="10" cols="100" class="rte">'.$this->getFieldValue($obj, 'description_bottom', (int)($language['id_lang'])).'</textarea> </div>'; // TinyMCE global $cookie; $iso = Language::getIsoById((int)($cookie->id_lang)); $isoTinyMCE = (file_exists(_PS_ROOT_DIR_.'/js/tiny_mce/langs/'.$iso.'.js') ? $iso : 'en'); $ad = dirname($_SERVER["PHP_SELF"]); echo ' <script type="text/javascript"> var iso = \''.$isoTinyMCE.'\' ; var pathCSS = \''._THEME_CSS_DIR_.'\' ; var ad = \''.$ad.'\' ; </script> <script type="text/javascript" src="'.__PS_BASE_URI__.'js/tiny_mce/tiny_mce.js"></script> <script type="text/javascript" src="'.__PS_BASE_URI__.'js/tinymce.inc.js"></script>';
Ce code va afficher le nouveau textarea accompagné de l’éditeur tinyMCE.
Ajout du champ dans la base de données
Afin que les données soient correctement enregistrées vous devez ajouter le champ correspondant à votre base de données dans la table « category_lang ».
Il faut créer un champ de type text avec comme nom « description_bottom ».
Modification du template
Enfin ouvrez le fichier « category.tpl » et ajouter le code suivant à l’emplacement où vous désirez voir apparaître la nouvelle description.
{if isset($category->description_bottom) && $category->description_bottom!=""} <div class="categoryDescBottom" style="clear:both">{$category->description_bottom}</div> {/if}
Voilà désormais vous aurez une description supplémentaire acceptant le code html dans vos catégories.
Merci daYmo pour son post sur le forum de Prestashop qui m’a fait gagner un temps certain !