Jump to content

[Résolu] Modifier et cloner l'optin "Recevoir des offres de nos partenaires"


Recommended Posts

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.tpl
order-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 by lordbdp (see edit history)
Link to comment
Share on other sites

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 by herve25 (see edit history)
  • Like 1
Link to comment
Share on other sites

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

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

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

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

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

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);
}
}
?>
  • Like 1
Link to comment
Share on other sites

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) :

2014-12-17_2042.png

 

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

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...