lordbdp Posted December 13, 2014 Share Posted December 13, 2014 (edited) Bonjour, Afin de proposer un catalogue papier ainsi qu'un rappel téléphonique mensuel aux clients, et n'utilisant pas le champs "Recevoir des offres de nos partenaires", j'ai tout simplement renommer l'intitulé de l'optin déjà en place ""Recevoir des offres de nos partenaires"" par "Recevoir notre catalogue papier". Pour cette partie cela marche puisque il n'y avait rien à modifier. Le problème arrive pour le 2e optin que j'ai ajouté. J'ai réalisé les modifications suivantes dans mon thème/ authentication.tplorder-opc-new-account.tpl identity.tpl En modifiant <div class="checkbox" > <label for="optin"> <input type="checkbox"name="optin" id="optin" value="1" {if isset($guestInformations) && isset($guestInformations.optin) && $guestInformations.optin}checked="checked"{/if} autocomplete="off"/> {l s='Receive special offers from our partners!'}</label> </div> par <div class="checkbox" > <label for="optin"> <input type="checkbox"name="optin" id="optin" value="1" {if isset($guestInformations) && isset($guestInformations.optin) && $guestInformations.optin}checked="checked"{/if} autocomplete="off"/> {l s='Receive our paper catalog!'}</label> </div> <div class="checkbox" > <label for="optin2"> <input type="checkbox"name="optin2" id="optin2" value="1" {if isset($guestInformations) && isset($guestInformations.optin) && $guestInformations.optin}checked="checked"{/if} autocomplete="off"/> {l s='Let us calling you mensualy!'}</label> </div> et j'ai créer un champs optin2 dans la table customers coté sql. Mais ça ne fonctionne pas. et je ne voit pas comment l'ajouter coté admin. Merci pour votre aide. Edited December 16, 2014 by lordbdp (see edit history) Link to comment Share on other sites More sharing options...
herve25 Posted December 14, 2014 Share Posted December 14, 2014 (edited) Bonjour, Le code changé dans tes tpl ne fonctionnera pas correctement avec le code que tu as fourni.( Dans le cas ou ton premier champ optin est coché , le second le sera aussi car la vérification est la même ) <input type="checkbox"name="optin" id="optin" value="1" {if isset($guestInformations) && isset($guestInformations.optin) && $guestInformations.optin}checked="checked"{/if} autocomplete="off"/><input type="checkbox"name="optin2" id="optin2" value="1" {if isset($guestInformations) && isset($guestInformations.optin) && $guestInformations.optin}checked="checked"{/if} autocomplete="off"/> Voici un exemple de code à mettre dans ton fichier authentification.tpl <div class="checkbox"> <input type="checkbox" name="optin" id="optin" value="1" {if isset($smarty.post.optin) && $smarty.post.optin == 1} checked="checked"{/if} autocomplete="off"/> <label for="optin">{l s='Receive special offers from our partners!'}</label> </div> <div class="checkbox"> <input type="checkbox" name="optin2" id="optin2" value="1" {if isset($smarty.post.optin2) && $smarty.post.optin2 == 1} checked="checked"{/if} autocomplete="off"/> <label for="optin2">{l s='Let us calling you mensualy!'}</label> </div> Pour gérer la mise à jour du champ il va falloir surcharger la classe Customer en créant un fichier dans override/classes/Customer.php avec un code de ce type <?php class Customer extends CustomerCore { /** Nouveau champ optin2 */ public $optin2; public function __construct($id = null) { //Chargement des paramètres du nouveau champ self::$definition['fields']['optin2'] = array('type' => self::TYPE_BOOL, 'validate' => 'isBool'); parent::__construct($id); } } ?> Edited December 14, 2014 by herve25 (see edit history) 1 Link to comment Share on other sites More sharing options...
lordbdp Posted December 14, 2014 Author Share Posted December 14, 2014 Merci pour la partie surcharge, pour le code de départ, je n'avais pas fait attention à la suite du code à modifier.... J'en profite pour poser une question concernant les overrides : Est-ce mieux de recopier toute la page php qu'on met en override ou juste la partie à modifier ? Link to comment Share on other sites More sharing options...
lordbdp Posted December 14, 2014 Author Share Posted December 14, 2014 Autre question : Comment afficher les champs avec le résultat coté BO ? Encore merci. Link to comment Share on other sites More sharing options...
herve25 Posted December 15, 2014 Share Posted December 15, 2014 Concernant les override, il n'est pas nécessaire de copier le contenu de la classe par défaut.Il faut seulement y mettre les fonctions qui changent ou les nouvelles fonctions et variables Pour afficher ton champ dans l'admin copie le fichier "admin/themes/default/template/controllers/customers/helpers/view/view.tpl" vers "override/controllers/admin/templates/customers/helpers/view/view.tpl" Et modifie le pour afficher ta nouvelle variable Link to comment Share on other sites More sharing options...
lordbdp Posted December 15, 2014 Author Share Posted December 15, 2014 OK. Bon à savoir car je recopiais toujours tout et réalisais les modifs ensuite... Et si j'ai bien suivi les cours tout .tpl peut être overridé s'il appartient à un module mais pas les natifs. C'est bien ça ?! Link to comment Share on other sites More sharing options...
herve25 Posted December 15, 2014 Share Posted December 15, 2014 Concernant les tpls il me semble qu'on peut tout surcharger ( les natifs via les thèmes ou les overrides, les modules via les thèmes ) Link to comment Share on other sites More sharing options...
lordbdp Posted December 15, 2014 Author Share Posted December 15, 2014 Concernant les override, il n'est pas nécessaire de copier le contenu de la classe par défaut. Il faut seulement y mettre les fonctions qui changent ou les nouvelles fonctions et variables Pour afficher ton champ dans l'admin copie le fichier "admin/themes/default/template/controllers/customers/helpers/view/view.tpl" vers "override/controllers/admin/templates/customers/helpers/view/view.tpl" Et modifie le pour afficher ta nouvelle variable ok ça marche ! ^^ Mais impossible de traduire les champs... J'arrive à les traduire coté FO mais pas BO. Et comment afficher aussi l'optin supplémentaire dans la vue générale des clients sans être obligé d'aller sur chaque fiche ? Merci encore. Link to comment Share on other sites More sharing options...
herve25 Posted December 16, 2014 Share Posted December 16, 2014 Concernant les traductions admin cela fonctionne très bien de mon côté, il faut bien mettre la chaine sous la forme ( par ex ) {l s='Opt in2:'} {if $customer->optin2}<img src="../img/admin/enabled.gif" />{else}<img src="../img/admin/disabled.gif" />{/if}<br /> et ensuite le traduire via les traductions backoffice. Pour afficher le champ optin2 dans le listing des clients, il faut faire un override du controller AdminCustomersController dans override/controllers/back/AdminCustomersController.php avec le code suivant : <?php /** * Surcharge de la classe AdminCustomersControllerCore */ class AdminCustomersController extends AdminCustomersControllerCore { /** * Surcharge de l'instanciation de la classe pour afficher le nouveau champ */ public function __construct() { $this->required_database = true; $this->required_fields = array('newsletter','optin'); $this->table = 'customer'; $this->className = 'Customer'; $this->lang = false; $this->deleted = true; $this->explicitSelect = true; $this->allow_export = true; $this->addRowAction('edit'); $this->addRowAction('view'); $this->addRowAction('delete'); $this->bulk_actions = array('delete' => array('text' => $this->l('Delete selected'), 'confirm' => $this->l('Would you like to delete the selected items?'))); $this->context = Context::getContext(); $this->default_form_language = $this->context->language->id; $genders = array(); $genders_icon = array(); $genders_icon[] = array('src' => '../genders/Unknown.jpg', 'alt' => ''); foreach (Gender::getGenders() as $gender) { $gender_file = 'genders/'.$gender->id.'.jpg'; if (file_exists(_PS_IMG_DIR_.$gender_file)) $genders_icon[$gender->id] = array('src' => '../'.$gender_file, 'alt' => $gender->name); else $genders_icon[$gender->id] = array('src' => '../genders/Unknown.jpg', 'alt' => $gender->name); $genders[$gender->id] = $gender->name; } $this->_select = ' a.date_add, IF (YEAR(`birthday`) = 0, "-", (YEAR(CURRENT_DATE)-YEAR(`birthday`)) - (RIGHT(CURRENT_DATE, 5) < RIGHT(birthday, 5))) AS `age`, ( SELECT c.date_add FROM '._DB_PREFIX_.'guest g LEFT JOIN '._DB_PREFIX_.'connections c ON c.id_guest = g.id_guest WHERE g.id_customer = a.id_customer ORDER BY c.date_add DESC LIMIT 1 ) as connect'; $this->fields_list = array( 'id_customer' => array( 'title' => $this->l('ID'), 'align' => 'center', 'width' => 20 ), 'id_gender' => array( 'title' => $this->l('Title'), 'width' => 70, 'align' => 'center', 'icon' => $genders_icon, 'orderby' => false, 'type' => 'select', 'list' => $genders, 'filter_key' => 'a!id_gender', ), 'lastname' => array( 'title' => $this->l('Last name'), 'width' => 'auto' ), 'firstname' => array( 'title' => $this->l('First Name'), 'width' => 'auto' ), 'email' => array( 'title' => $this->l('Email address'), 'width' => 140, ), 'age' => array( 'title' => $this->l('Age'), 'width' => 20, 'search' => false, 'align' => 'center' ), 'active' => array( 'title' => $this->l('Enabled'), 'width' => 70, 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false, 'filter_key' => 'a!active', ), 'newsletter' => array( 'title' => $this->l('News.'), 'width' => 70, 'align' => 'center', 'type' => 'bool', 'callback' => 'printNewsIcon', 'orderby' => false ), 'optin' => array( 'title' => $this->l('Opt.'), 'width' => 70, 'align' => 'center', 'type' => 'bool', 'callback' => 'printOptinIcon', 'orderby' => false ), //Nouveau champ Optin 2 'optin2' => array( 'title' => $this->l('Optin2.'), 'width' => 70, 'align' => 'center', 'type' => 'bool', 'callback' => 'printOptinIcon', 'orderby' => false ), 'date_add' => array( 'title' => $this->l('Registration'), 'width' => 150, 'type' => 'date', 'align' => 'right' ), 'connect' => array( 'title' => $this->l('Last visit'), 'width' => 100, 'type' => 'datetime', 'search' => false, 'havingFilter' => true ) ); $this->shopLinkType = 'shop'; $this->shopShareDatas = Shop::SHARE_CUSTOMER; //Appeler directement depuis la classe AdminController pour que les nouvelles données ne soient pas effacées AdminController::__construct(); // Check if we can add a customer if (Shop::isFeatureActive() && (Shop::getContext() == Shop::CONTEXT_ALL || Shop::getContext() == Shop::CONTEXT_GROUP)) $this->can_add_customer = false; } } Link to comment Share on other sites More sharing options...
lordbdp Posted December 16, 2014 Author Share Posted December 16, 2014 Pour la traduction coté BO j'avais laissé optin2 attaché. Une fois séparé ça fonctionne. Merci. En revanche coté liste clients pas de changement ensuite : Link to comment Share on other sites More sharing options...
herve25 Posted December 17, 2014 Share Posted December 17, 2014 Il faut supprimer le fichier "class_index" dans le dossier "cache" pour que l'override soit bien pris en compte.Et ça devrait marcher :-) Link to comment Share on other sites More sharing options...
lordbdp Posted December 17, 2014 Author Share Posted December 17, 2014 Quand je le supprime j'ai page blanche sur le site : Fatal error: Cannot redeclare Customer::__construct() in /home/mon_site/public_html/override/classes/Customer.php on line 17 et coté BO c'est une page blache quand je clique sur Clients : Fatal error: Cannot redeclare Customer::__construct() in /home/mon_site/public_html/override/classes/Customer.php on line 17 J'ai voulu ajouter un 3e optin, peut-être que le script change... Voilà ce que j'ai actuellement mis dans Customer.php <?php class Customer extends CustomerCore { /** Nouveau champ optin2 */ public $optin2; public function __construct($id = null) { //Chargement des paramètres du nouveau champ self::$definition['fields']['optin2'] = array('type' => self::TYPE_BOOL, 'validate' => 'isBool'); parent::__construct($id); } /** Nouveau champ optin3 */ public $optin3; public function __construct($id = null) { //Chargement des paramètres du nouveau champ self::$definition['fields']['optin3'] = array('type' => self::TYPE_BOOL, 'validate' => 'isBool'); parent::__construct($id); } } ?> Link to comment Share on other sites More sharing options...
herve25 Posted December 17, 2014 Share Posted December 17, 2014 Oui effectivement ton code de surcharge n'est pas bon, tu as dupliqué la méthode d'instanciation __construct de la classe. ( qui doit être unique )Pour ajouter tes champs il faut procéder de la manière suivante <?php class Customer extends CustomerCore { /** Nouveau champ optin2 */ public $optin2; /** Nouveau champ optin3 */ public $optin3; public function __construct($id = null) { //Chargement des paramètres des nouveaux champs self::$definition['fields']['optin2'] = array('type' => self::TYPE_BOOL, 'validate' => 'isBool'); self::$definition['fields']['optin3'] = array('type' => self::TYPE_BOOL, 'validate' => 'isBool'); parent::__construct($id); } } ?> 1 Link to comment Share on other sites More sharing options...
lordbdp Posted December 17, 2014 Author Share Posted December 17, 2014 Nickel ! Ca marche ! ^^ Juste pour ma culture (peut être pour ceux qui souhaitent ajouter d'autre optins aussi). Je me suis amusé à en ajouter d'autres pour voir ce que cela faisait mais après, sur la liste Clients, je n'ai que l'optin et la dernière optin qui sont affichés (j'avais testé jusqu'à optin6) : Si par la suite j'ai besoin d'ajouter des optins, j'en déduis qu'il faudra que je modifie le Customer.php à nouveau ? Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now