Toutes les clefs pour réussir dans le e-commerce

Mes modules Prestashop

Ajouter des champs personnalisés aux adresses sous Prestashop

Prestashop propose un certain nombre de champs par défaut pour l’enregistrement des adresses, mais dans certains cas il peut être utile d’en ajouter de nouveaux. Je vais vous expliquer ici comment créer vos propres champs personnalisés.

Prérequis

Ce tuto a été réalisé sur Prestashop 1.4.8.2 et il vous faudra avoir accès à phpmyadmin pour ajouter vos champs.
Nous allons ici ajouter un champ nommé “iva_number” (utile pour la tva espagnole)

Override de la classe Address

La première étape consiste à étendre la classe Address, pour cela vous devez créer un fichier Address.php dans le dossier override/classes

voici le contenu de ce fichier:


class Address extends AddressCore
{
	public $iva_number;//on declare notre nouveau champs

	public	function __construct($id_address = NULL, $id_lang = NULL) {		
		$this->fieldsValidate['iva_number']='isGenericName';//on precise le type de champ
		parent::__construct($id_address);
	}

	public function getFields()
	{
		$fields=parent::getFields();
		$fields['iva_number'] = pSQL($this->iva_number);//on ajoute le champ pour la validation et l'enregistrement
		return $fields;	
	}

}

Ajout du champ dans la base de données

Vous devez ensuite ajouter ce nouveau champ à la table ps_address de votre base de données (ps étant le préfixe que vous avez choisi lors de l’installation).
Nommez ce champ exactement “iva_number” sinon prestashop sera incapable de le retrouver.
Vous pouvez utiliser la commande sql suivante ou utiliser phpmyadmin.


ALTER TABLE ps_address ADD 'iva_number' VARCHAR(128)

Modification des templates

Vous devez ensuite afficher votre champs dans le template address.tpl de votre thème.

Repérez dans ce fichier les lignes suivantes:


{if $field_name eq 'city'}
		<p class="required text">
			<label for="city">{l s='City'}</label>
			<input type="text" name="city" id="city" value="{if isset($smarty.post.city)}{$smarty.post.city}{else}{if isset($address->city)}{$address->city|escape:'htmlall':'UTF-8'}{/if}{/if}" maxlength="64" />
			<sup>*</sup>
		</p>
		<!-- If the merchant has not updated his layout address, country has to be verified - however it's deprecated -->
		{/if}

Et ajoutez ceci juste en dessous:


{if $field_name eq 'iva_number'}
		<p class="text">
			<label for="iva_number">{l s='Iva number'}</label>
			<input type="text" id="iva_number" name="iva_number" value="{if isset($smarty.post.iva_number)}{$smarty.post.iva_number}{else}{if isset($address->iva_number)}{$address->iva_number|escape:'htmlall':'UTF-8'}{/if}{/if}" />
		</p>
		{/if}

Il faut également modifier le template authentification.tpl à deux endroits.

repérez le code suivant (environ à la ligne 258)


{elseif $field_name eq "State:name" || $field_name eq 'state'}
						{assign var='stateExist' value=true}

						<p class="required id_state select">
							<label for="id_state">{l s='State'}</label>
							<select name="id_state" id="id_state">
								<option value="">-</option>
							</select>
							<sup>*</sup>
						</p>

et ajoutez le code suivant en dessous:


{elseif $field_name eq 'iva_number'}
						<p class="text">
							<label for="iva_number">{l s='Iva number'}</label>
							<input type="text" class="text" id="iva_number" name="iva_number" value="{if isset($smarty.post.iva_number)}{$smarty.post.iva_number}{/if}" />
						</p>

Faite de même un peu plus loin en repérant ce code (ligne 456 environ)


{elseif $field_name eq "State:name" || $field_name eq 'state'}
				{assign var='stateExist' value=true}
				<p class="required id_state select">
					<label for="id_state">{l s='State'}</label>
					<select name="id_state" id="id_state">
						<option value="">-</option>
					</select>
					<sup>*</sup>
				</p>

et en ajoutant ce code


{elseif $field_name eq 'Adress:iva_number' || $field_name eq 'iva_number'}
				<p class="text">
					<label for="iva_number">{l s='Iva number'}</label>
					<input type="text" class="text" id="iva_number" name="iva_number" value="{if isset($smarty.post.iva_number)}{$smarty.post.iva_number}{/if}" />
				</p>

Enfin il reste le template de l’admin à modifier il se trouve dans admin/tabs/adminAdresses.php
Il vous suffit de rajouter (après le champ city par exemple) le code suivant:


{if $field_name eq 'iva_number'}
		<p style="margin-left:50px;">{l s='Required for Ceuta, Canarias, Tenerife, Mallorca'}</p>
		<p class="text">
			<label for="iva_number">{l s='Iva number'}</label>
			<input type="text" id="iva_number" name="iva_number" value="{if isset($smarty.post.iva_number)}{$smarty.post.iva_number}{else}{if isset($address->iva_number)}{$address->iva_number|escape:'htmlall':'UTF-8'}{/if}{/if}" />	
		</p>		
		{/if}	

Réglages dans l’admin

Une fois toutes ces modifications effectuées rendez-vous dans l’admin du site rubrique “transporteur/pays”, cliquez sur l’icône pour modifier un pays puis cliquez sur le mot “address” qui se trouve à droite du champ “format de l’adresse” , vous verrez alors apparaître le champ “iva_number”, cliquez dessus pour l’ajouter aux champs requis pour ce pays.

Vous devez faire cette démarche pour l’ensemble des pays pour lesquels ce nouveau champ est nécessaire.

A noter

– J’ai rencontré des problèmes avec un champ dont le nom semblait ne pas plaire à Prestashop, je vous déconseille donc d’utiliser les lettres “id” dans vos noms de champ. Pour info, le problème se posait pour des noms comme “idcard_number”, “id_card_number”, “identification_card_number”, etc. Prestashop doit surement protéger le terme “id” mais bon, c’est un peu restrictif de ne pas pouvoir utiliser ces deux lettres…

– Lorsque vous cliquez sur votre nom de champ dans la rubrique “transporteur/pays”, cela va ajouter adress:iva_number dans votre champ. Prestashop n’aime pas trop cette nomenclature, vous risquez d’avoir un message d’erreur lors de l’enregistrement. Modifiez donc “adress:iva_number” en “iva_number”.

Poster un Commentaire

4 Commentaires sur "Ajouter des champs personnalisés aux adresses sous Prestashop"

Recevoir un email pour
avatar
Trier par:   plus récent | plus vieux | Plus de vote
Média Passion
Invité

Excellent tuto, le plus complet que j’ai pu trouver. Pas encore testé mais je le garde précieusement sous le coude :-)

Radhia
Invité
Radhia

bonjour,

merci pour ce tuto, mais il n’est pas compatible à presatshop 1.6 est ce que vous m’avez aidé et merci

Radhia
Invité
Radhia

oui mais dans presatashop 1.6 il y a les controllers et je n’ai pas trouvé la fonction getFields

wpDiscuz