Jump to content

Rajouter un bouton dans radio dans le formulaire d'inscription


Recommended Posts

Bonjour à tous,

Je dois rajouter un bouton radio dans mon formulaire d'inscription afin de savoir si le client est un professionnel ou un particulier. Pour cela, j'ai rajouté ce code dans le fichier authentification.tpl :

 
<div class="radio required control-group">
<label class="control-label">Vous êtes un :</label>
<div class="controls">
    <input type="radio" name="id_group" id="id_group3" value="3" {if $smarty.post.id_group == 3 OR !$smarty.post.id_group}checked="checked"{/if} />
     <label for="id_group3">Particulier</label>
     <input type="radio" name="id_group" id="id_group4" value="4" {if $smarty.post.id_statut == 4}checked="checked"{/if} />
     <label for="id_group4">Professionnel</label>
</div>
</div>
<div class="infosPro control-group">
     <div class="required text">
          <label class="control-label" for="societe">Nom de la société <sup>*</sup></label>
        <div class="controls">
        <input type="text" class="text" id="company" name="company" value="{if isset($smarty.post.company)}{$smarty.post.company}{/if}" />
        </div>
     </div>
     <div class="required text">
        <label class="control-label" for="siret">Numéro Siret <sup>*</sup></label>
         <div class="controls">
         <input type="text" class="text" id="siret" name="siret" value="{if isset($smarty.post.siret)}{$smarty.post.siret}{/if}" />
         </div>
     </div>
</div>
 
Les informations concernant la société et le siret, qui sont à saisir uniquement si le client choisit "professionnel", sont bien récupérées et ajoutées à la BDD mais pas le groupe... Les clients sont toujours inscrits en tant que particuliers même s'ils cochent le bouton professionnel.
 
J'ai fait plusieurs tests mais je n'ai toujours pas trouvé la solution. De plus, il y a tellement de fichiers dans Prestashop que je finis par m'y perdre.
 
Avez-vous des idées? Quel est le fichier qui permet de faire le traitement de ce formulaire? Quelle est la ligne de code à saisir pour que cette information soit enfin enregistrée?
 
Le site en question : www.deneoled.com
 
Merci d'avance,
Mathilde
Link to comment
Share on other sites

Bonjour,

 

Je pense que tu as déjà une erreur dans ton fichier, car ta donnée smarty.post ne correspond pas au nom de ton input.

 

<input type="radio" name="id_group" id="id_group4" value="4" {if $smarty.post.id_statut == 4} ...

 

Concernant le fichier qui traite ces données, il faut que tu regarde le fichier controllers/front/AuthController.php dans la fonction processSubmitAccount()

Link to comment
Share on other sites

Merci pour tes infos ;)

 

Effectivement, j'ai tellement la tête dans le guidon que j'ai oublié de remplacer "id_statut" en faisant le copier-coller. Cela dit, ça ne fonctionne toujours pas.

 

Pour le fichier de traitement des données, c'était bien le fichier que je modifiais. Voilà le code de la fonction processSubmitAccount() qui permet de traiter les groupes de clients :

$id_group = Tools::getValue('id_group');
if (!$customer->is_guest)
{
$this->context->customer = $customer;
$customer->cleanGroups();
// we add the guest customer in the default customer group
$customer->addGroups(array((int)Configuration::get('PS_CUSTOMER_GROUP')));
if (!$this->sendConfirmationMail($customer))
$this->errors[] = Tools::displayError('The email cannot be sent.');
}
else
{
$customer->cleanGroups();
// we add the guest customer in the guest customer group
$customer->addGroups(array((int)Configuration::get('PS_GUEST_GROUP')));
}

Est-ce qu'il y a des choses à modifier ou à rajouter?

Link to comment
Share on other sites

Ton champ id_group n'est pas traité dans le code de ton post.

Il faut que tu ajoute ton identifiant de groupe en paramètre dans la fonction addGroups

( Au passage il faut créer un override de ce fichier )

<?php 
$id_group = (int)Tools::getValue('id_group'); //Cast de la variable id group en Int
if (!$customer->is_guest)
{
$this->context->customer = $customer;
$customer->cleanGroups();
// we add the guest customer in the default customer group
$customer->addGroups(array((int)Configuration::get('PS_CUSTOMER_GROUP'),$id_group)); //Ajouter ici l'identifiant du groupe
if (!$this->sendConfirmationMail($customer))
$this->errors[] = Tools::displayError('The email cannot be sent.');
}
else
{
$customer->cleanGroups();
// we add the guest customer in the guest customer group
$customer->addGroups(array((int)Configuration::get('PS_GUEST_GROUP')));
Link to comment
Share on other sites

J'ai rajouté les morceaux de code manquants mais ça ne fonctionne toujours pas. Est-ce que le fait de créer un override de ce fichier y est pour quelque chose? Si oui, peux-tu m'indiquer comment faire?

 

Merci encore pour ton aide :)

Link to comment
Share on other sites

Voici un fichier d'override qui fonctionne pour gérer les groupes ( le code est assez long )
Ce fichier est à déposer dans override/controllers/front/AuthController.php

 

(Bien penser à supprimer le fichier cache/classes_index.php pour qu'il soit pris en compte )

<?php
class AuthController extends AuthControllerCore
{


	/**
	 * Process submit on an account
	 */
	protected function processSubmitAccount()
	{
		
		Hook::exec('actionBeforeSubmitAccount');
		$this->create_account = true;
		if (Tools::isSubmit('submitAccount'))
			$this->context->smarty->assign('email_create', 1);
		// New Guest customer
		if (!Tools::getValue('is_new_customer', 1) && !Configuration::get('PS_GUEST_CHECKOUT_ENABLED'))
			$this->errors[] = Tools::displayError('You cannot create a guest account..');
		if (!Tools::getValue('is_new_customer', 1))
			$_POST['passwd'] = md5(time()._COOKIE_KEY_);
		if (isset($_POST['guest_email']) && $_POST['guest_email'])
			$_POST['email'] = $_POST['guest_email'];
		// Checked the user address in case he changed his email address
		if (Validate::isEmail($email = Tools::getValue('email')) && !empty($email))
			if (Customer::customerExists($email))
				$this->errors[] = Tools::displayError('An account using this email address has already been registered.', false);
		// Preparing customer
		$customer = new Customer();
		$lastnameAddress = Tools::getValue('lastname');
		$firstnameAddress = Tools::getValue('firstname');		
		$_POST['lastname'] = Tools::getValue('customer_lastname');
		$_POST['firstname'] = Tools::getValue('customer_firstname');
		$addresses_types = array('address');
		if (!Configuration::get('PS_ORDER_PROCESS_TYPE') && Configuration::get('PS_GUEST_CHECKOUT_ENABLED') && Tools::getValue('invoice_address'))
			$addresses_types[] = 'address_invoice';

		$error_phone = false;
		if (Configuration::get('PS_ONE_PHONE_AT_LEAST'))
		{
			if (Tools::isSubmit('submitGuestAccount') || !Tools::getValue('is_new_customer'))
			{
				if (!Tools::getValue('phone') && !Tools::getValue('phone_mobile'))
					$error_phone = true;
			}
			elseif (((Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && Configuration::get('PS_ORDER_PROCESS_TYPE')) 
					|| (Configuration::get('PS_ORDER_PROCESS_TYPE') && !Tools::getValue('email_create'))
					|| (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && Tools::getValue('email_create')))
					&& (!Tools::getValue('phone') && !Tools::getValue('phone_mobile')))
				$error_phone = true;
		}

		if ($error_phone)
			$this->errors[] = Tools::displayError('You must register at least one phone number.');

		$this->errors = array_unique(array_merge($this->errors, $customer->validateController()));

		// Check the requires fields which are settings in the BO
		$this->errors = $this->errors + $customer->validateFieldsRequiredDatabase();

		if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount'))
		{
			if (!count($this->errors))
			{
				if (Tools::isSubmit('newsletter'))
					$this->processCustomerNewsletter($customer);

				$customer->firstname = Tools::ucwords($customer->firstname);
				$customer->birthday = (empty($_POST['years']) ? '' : (int)$_POST['years'].'-'.(int)$_POST['months'].'-'.(int)$_POST['days']);
				if (!Validate::isBirthDate($customer->birthday))
					$this->errors[] = Tools::displayError('Invalid date of birth.');

				// New Guest customer
				$customer->is_guest = (Tools::isSubmit('is_new_customer') ? !Tools::getValue('is_new_customer', 1) : 0);
				$customer->active = 1;
				
				if (!count($this->errors))
				{
					if ($customer->add())
					{
						if (!$customer->is_guest)
							if (!$this->sendConfirmationMail($customer))
								$this->errors[] = Tools::displayError('The email cannot be sent.');

						$this->updateContext($customer);

						$this->context->cart->update();
						Hook::exec('actionCustomerAccountAdd', array(
								'_POST' => $_POST,
								'newCustomer' => $customer
							));	
/**
 * Gestion spécifique des groupes utilisateurs
*/						 
						$id_group = Tools::getValue('id_group');
						$customer->addGroups(array((int)Configuration::get('PS_CUSTOMER_GROUP'),$id_group));
							
							
						if ($this->ajax)
						{
							$return = array(
								'hasError' => !empty($this->errors),
								'errors' => $this->errors,
								'isSaved' => true,
								'id_customer' => (int)$this->context->cookie->id_customer,
								'id_address_delivery' => $this->context->cart->id_address_delivery,
								'id_address_invoice' => $this->context->cart->id_address_invoice,
								'token' => Tools::getToken(false)
							);
							die(Tools::jsonEncode($return));
						}

						if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back))
							Tools::redirect(html_entity_decode($back));
						// redirection: if cart is not empty : redirection to the cart
						if (count($this->context->cart->getProducts(true)) > 0)
							Tools::redirect('index.php?controller=order&multi-shipping='.(int)Tools::getValue('multi-shipping'));
						// else : redirection to the account
						else
							Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account'));
					}
					else
						$this->errors[] = Tools::displayError('An error occurred while creating your account.');
				}
			}

		}
		else // if registration type is in one step, we save the address
		{
			$_POST['lastname'] = $lastnameAddress;
			$_POST['firstname'] = $firstnameAddress;
			$post_back = $_POST;
			// Preparing addresses
			foreach($addresses_types as $addresses_type)
			{
				$$addresses_type = new Address();
				$$addresses_type->id_customer = 1;

				if ($addresses_type == 'address_invoice')
					foreach($_POST as $key => &$post)
						if (isset($_POST[$key.'_invoice']))
							$post = $_POST[$key.'_invoice'];

				$this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController()));
				if ($addresses_type == 'address_invoice')
					$_POST = $post_back;

				if (!($country = new Country($$addresses_type->id_country)) || !Validate::isLoadedObject($country))
					$this->errors[] = Tools::displayError('Country cannot be loaded with address->id_country');
				$postcode = Tools::getValue('postcode');		
				/* Check zip code format */
				if ($country->zip_code_format && !$country->checkZipCode($postcode))
					$this->errors[] = sprintf(Tools::displayError('The Zip/Postal code you\'ve entered is invalid. It must follow this format: %s'), str_replace('C', $country->iso_code, str_replace('N', '0', str_replace('L', 'A', $country->zip_code_format))));
				elseif(empty($postcode) && $country->need_zip_code)
					$this->errors[] = Tools::displayError('A Zip / Postal code is required.');
				elseif ($postcode && !Validate::isPostCode($postcode))
					$this->errors[] = Tools::displayError('The Zip / Postal code is invalid.');
	
				if ($country->need_identification_number && (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni'))))
					$this->errors[] = Tools::displayError('The identification number is incorrect or has already been used.');
				elseif (!$country->need_identification_number)
					$$addresses_type->dni = null;

				if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount'))
					if (!($country = new Country($$addresses_type->id_country, Configuration::get('PS_LANG_DEFAULT'))) || !Validate::isLoadedObject($country))
						$this->errors[] = Tools::displayError('Country is invalid');
				$contains_state = isset($country) && is_object($country) ? (int)$country->contains_states: 0;
				$id_state = isset($$addresses_type) && is_object($$addresses_type) ? (int)$$addresses_type->id_state: 0;
				if ((Tools::isSubmit('submitAccount')|| Tools::isSubmit('submitGuestAccount')) && $contains_state && !$id_state)
					$this->errors[] = Tools::displayError('This country requires you to choose a State.');
			}
		}

		if (!@checkdate(Tools::getValue('months'), Tools::getValue('days'), Tools::getValue('years')) && !(Tools::getValue('months') == '' && Tools::getValue('days') == '' && Tools::getValue('years') == ''))
			$this->errors[] = Tools::displayError('Invalid date of birth');

		if (!count($this->errors))
		{
			if (Customer::customerExists(Tools::getValue('email')))
				$this->errors[] = Tools::displayError('An account using this email address has already been registered. Please enter a valid password or request a new one. ', false);
			if (Tools::isSubmit('newsletter'))
				$this->processCustomerNewsletter($customer);

			$customer->birthday = (empty($_POST['years']) ? '' : (int)$_POST['years'].'-'.(int)$_POST['months'].'-'.(int)$_POST['days']);
			if (!Validate::isBirthDate($customer->birthday))
					$this->errors[] = Tools::displayError('Invalid date of birth');

			if (!count($this->errors))
			{
				$customer->active = 1;
				// New Guest customer
				if (Tools::isSubmit('is_new_customer'))
					$customer->is_guest = !Tools::getValue('is_new_customer', 1);
				else
					$customer->is_guest = 0;
				if (!$customer->add())
					$this->errors[] = Tools::displayError('An error occurred while creating your account.');
				else
				{
					foreach($addresses_types as $addresses_type)
					{
						$$addresses_type->id_customer = (int)$customer->id;				
						if ($addresses_type == 'address_invoice')
							foreach($_POST as $key => &$post)
								if (isset($_POST[$key.'_invoice']))
									$post = $_POST[$key.'_invoice'];
		
						$this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController()));
						if ($addresses_type == 'address_invoice')
							$_POST = $post_back;
						if (!count($this->errors) && (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') || $this->ajax || Tools::isSubmit('submitGuestAccount')) && !$$addresses_type->add())
							$this->errors[] = Tools::displayError('An error occurred while creating your address.');
					}
					if (!count($this->errors))
					{
						if (!$customer->is_guest)
						{
												
							$this->context->customer = $customer;
							$customer->cleanGroups();
							// we add the guest customer in the default customer group
							$customer->addGroups(array((int)Configuration::get('PS_CUSTOMER_GROUP')));
							if (!$this->sendConfirmationMail($customer))
								$this->errors[] = Tools::displayError('The email cannot be sent.');
						}
						else
						{
							$customer->cleanGroups();
							// we add the guest customer in the guest customer group
							$customer->addGroups(array((int)Configuration::get('PS_GUEST_GROUP')));
						}
						$this->updateContext($customer);
						$this->context->cart->id_address_delivery = (int)Address::getFirstCustomerAddressId((int)$customer->id);
						$this->context->cart->id_address_invoice = (int)Address::getFirstCustomerAddressId((int)$customer->id);
						if (isset($address_invoice) && Validate::isLoadedObject($address_invoice))
							$this->context->cart->id_address_invoice = (int)$address_invoice->id;

						// If a logged guest logs in as a customer, the cart secure key was already set and needs to be updated
						$this->context->cart->update();

						// Avoid articles without delivery address on the cart
						$this->context->cart->autosetProductAddress();

						Hook::exec('actionCustomerAccountAdd', array(
								'_POST' => $_POST,
								'newCustomer' => $customer
							));
						if ($this->ajax)
						{
							$return = array(
								'hasError' => !empty($this->errors),
								'errors' => $this->errors,
								'isSaved' => true,
								'id_customer' => (int)$this->context->cookie->id_customer,
								'id_address_delivery' => $this->context->cart->id_address_delivery,
								'id_address_invoice' => $this->context->cart->id_address_invoice,
								'token' => Tools::getToken(false)
							);
							die(Tools::jsonEncode($return));
						}
						// if registration type is in two steps, we redirect to register address
						if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount'))
							Tools::redirect('index.php?controller=address');
							
						if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back))
							Tools::redirect(html_entity_decode($back));

						// redirection: if cart is not empty : redirection to the cart
						if (count($this->context->cart->getProducts(true)) > 0)
							Tools::redirect('index.php?controller=order&multi-shipping='.(int)Tools::getValue('multi-shipping'));
						// else : redirection to the account
						else
							Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account'));
					}
				}
			}
		}

		if (count($this->errors))
		{
			//for retro compatibility to display guest account creation form on authentication page
			if (Tools::getValue('submitGuestAccount'))
				$_GET['display_guest_checkout'] = 1;
			
			if (!Tools::getValue('is_new_customer'))
				unset($_POST['passwd']);
			if ($this->ajax)
			{
				$return = array(
					'hasError' => !empty($this->errors),
					'errors' => $this->errors,
					'isSaved' => false,
					'id_customer' => 0
				);
				die(Tools::jsonEncode($return));
			}
			$this->context->smarty->assign('account_error', $this->errors);
		}
	}


}

C'est pas super propre mais ça fonctionne.

( l'idéal serait de faire un module que tu peux greffer sur le hook actionCustomerAccountAdd cela ne nécessiterais aucune modification de code )

Link to comment
Share on other sites

Super ! Ca fonctionne ! Merci beaucoup.

 

Juste une dernière chose, je voudrais que le groupe par défaut soit le groupe Professionnel (id_group 4) et non Particulier (id_group 3), car le groupe pro bénéficie de tarifs préférentiels. Je vois 2 solutions. Soit le client garde les 2 groupes mais il faut mettre le groupe par défaut 4, soit il faut attribuer uniquement le groupe 4.

 

As-tu une idée de comment procéder?

Link to comment
Share on other sites

Dans ce cas mets ce code à la place

$id_group = Tools::getValue('id_group');
//Dans le cas ou le client a coché professionnel
if ( $id_group == 4 )
 $customer->addGroups(array($id_group));

Ou encore plus simple inverse les groupes ( 3 => Professionnels, 4 => particuliers )

Link to comment
Share on other sites

Ca ne fonctionne pas... Il attribue toujours les 2 groupes avec le groupe "particuliers" par défaut.

 

Je sais que dans la table customer, il y a un champ id_default_group. Est-ce qu'il ne serait pas possible de faire juste une requête pour modifier ce champ?

 

Je ne peux pas inverser mes groupes "professionnels" et "particuliers" car tous les particuliers seraient alors par défaut définis comme pros et auraient aussi les tarifs préférentiels...

Link to comment
Share on other sites

Dans ce cas essaye cela :

$id_group = Tools::getValue('id_group');
//Dans le cas ou le client a coché professionnel
if ( $id_group == 4 ) {
$customer->cleanGroups(); //Supression des groupes actuels du client
$customer->addGroups(array($id_group)); //Ajout du client au groupe professionnels
}


Link to comment
Share on other sites

Ca y est, j'ai réussi à définir le groupe par défaut à l'inscription. J'ai rajouté une condition dans la fonction addGroups de la classe Customer :

public function addGroups($groups)
{
foreach ($groups as $group)
{
$row = array('id_customer' => (int)$this->id, 'id_group' => (int)$group);
Db::getInstance()->insert('customer_group', $row, false, true, Db::INSERT_IGNORE); 


if ($group == 4)
{
Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'customer` SET id_default_group = 4 WHERE `id_customer` = '.(int)$this->id);
}
}
}

Merci encore pour ton aide précieuse ;)

Link to comment
Share on other sites

Je pense il qu'il y avait plus simple avec un code de ce genre

$id_group = Tools::getValue('id_group');
//Dans le cas ou le client a coché professionnel
if ( $id_group == 4 ) {
$customer->cleanGroups(); //Supression des groupes actuels du client
$customer->addGroups(array($id_group)); //Ajout du client au groupe professionnels
$customer->id_default_group = 4; // Groupe par défaut du client
}

Mais si ça marche c'est déjà l'essentiel :-)

Link to comment
Share on other sites

  • 6 months later...

Bonjour,

je voudrais faire la meme chose : ajouter des boutons radio dans mon formulaire d'inscription afin de savoir si le client est un professionnel ou un particulier

pouvez vous svp mettre un peu plus de details ?

j'ai teste le code que vous avez poste sur le forum et chez moi ne marche pas...

merci par avance pour votre aide

Link to comment
Share on other sites

par defaut presta propose 3 groupes et j'ai cree un groupe en plus pro id = 4

 

j'ai bien suivi vos recomandations :

1. modif authentification.tpl  : deux boutons radio client professionnel et particulier, plus champ siret et nom societe

2. creation override/controllers/front/AuthController.php et supprimer le fichier cache/classes_index.php

 

et rien se passe, le fichier que vous avez mis sur le forum AuthController.php, ne branche pas les boutons radio 

je pense que je loupe une etape...

merci

Link to comment
Share on other sites

  • 3 months later...

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