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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *