decoled Posted January 9, 2015 Share Posted January 9, 2015 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 More sharing options...
herve25 Posted January 9, 2015 Share Posted January 9, 2015 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 More sharing options...
decoled Posted January 12, 2015 Author Share Posted January 12, 2015 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 More sharing options...
herve25 Posted January 12, 2015 Share Posted January 12, 2015 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 More sharing options...
decoled Posted January 12, 2015 Author Share Posted January 12, 2015 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 More sharing options...
herve25 Posted January 12, 2015 Share Posted January 12, 2015 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 More sharing options...
decoled Posted January 13, 2015 Author Share Posted January 13, 2015 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 More sharing options...
herve25 Posted January 13, 2015 Share Posted January 13, 2015 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 More sharing options...
decoled Posted January 13, 2015 Author Share Posted January 13, 2015 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 More sharing options...
herve25 Posted January 13, 2015 Share Posted January 13, 2015 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 More sharing options...
decoled Posted January 13, 2015 Author Share Posted January 13, 2015 Avec ce code, le client est bien uniquement professionnels. C'est bon. Pourtant, le groupe par défaut reste "particuliers"... Dans la table "customer", id_default_group est toujours "3" (id du groupe des particuliers). Link to comment Share on other sites More sharing options...
decoled Posted January 16, 2015 Author Share Posted January 16, 2015 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 More sharing options...
herve25 Posted January 16, 2015 Share Posted January 16, 2015 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 More sharing options...
zlataura Posted August 3, 2015 Share Posted August 3, 2015 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 More sharing options...
decoled Posted August 4, 2015 Author Share Posted August 4, 2015 Est-ce que vous avez bien créé un nouveau groupe pour les professionnels ? En mettant ce code, est-ce que cela change quelque chose ou rien ne se passe ? Link to comment Share on other sites More sharing options...
zlataura Posted August 4, 2015 Share Posted August 4, 2015 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 More sharing options...
Pedro Pinto Posted November 5, 2015 Share Posted November 5, 2015 et rien se passe.... tout est bon sauf le groupe. 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