Tuto PrestaShop : Rediriger après login vers étape suivante

PrestaShop
  • Accueil
  • Blog
  • Tuto PrestaShop : Rediriger après login vers étape suivante

Bonjour à tous ! Une rentrée mouvementée sur le web m’a contraint à moins de billets ces derniers temps. Moment idéal donc pour renouer avec une bonne astuce PrestaShop et notamment un tutoriel pour optimiser le tunnel de commande de PrestaShop !

 

How to redirect login to address step in PrestaShop ?

This is the question ! Et en français ça donne : comment rediriger l’étape de connexion vers l’étape adresse de PrestaShop ? Simple et efficace sur le papier mais moins évident lorsqu’il s’agit de mettre en place si on ne connait pas bien le CMS e-commerce.
Et pourtant : pourquoi cela n’est-il pas natif (installé par défaut) dans PrestaShop 1.5.6.2 ? Car bon c’est juste un peu évident d’aller à l’étape suivante plutôt que d’ajouter une étape supplémentaire, non ?
Rapide et précis, ce tutoriel consiste à créer un override du fichier /controllers/front/AuthController.php puis à remplacer les redirections natives par celles qui conduisent l’internaute à l’étape suivante :

Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'order?step=1'));

On obtient alors le fichier suivant /override/controllers/front/AuthController.php avec 2 modifications indiquées par le commentaire // REDIRECTION VERS ETAPE ADRESSE :
<?php
/*
* 2007-2013 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2013 PrestaShop SA
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/

class AuthController extends AuthControllerCore
{
 public $ssl = true;
 public $php_self = 'authentication';

/**
 * @var bool create_account
 */
 protected $create_account;

/**
 * Initialize auth controller
 * @see FrontController::init()
 */
 public function init()
 {
 parent::init();

if (!Tools::getIsset('step') && $this->context->customer->isLogged() && !$this->ajax)
 Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account'));

if (Tools::getValue('create_account'))
 $this->create_account = true;
 }

/**
 * Set default medias for this controller
 * @see FrontController::setMedia()
 */
 public function setMedia()
 {
 parent::setMedia();
 if (Context::getContext()->getMobileDevice() === false)
 $this->addCSS(_THEME_CSS_DIR_.'authentication.css');
 $this->addJqueryPlugin('typewatch');
 $this->addJS(_THEME_JS_DIR_.'tools/statesManagement.js');
 }

/**
 * Run ajax process
 * @see FrontController::displayAjax()
 */
 public function displayAjax()
 {
 $this->display();
 }

/**
 * Assign template vars related to page content
 * @see FrontController::initContent()
 */
 public function initContent()
 {
 parent::initContent();

$this->context->smarty->assign('genders', Gender::getGenders());

$this->assignDate();

$this->assignCountries();

$this->context->smarty->assign('newsletter', 1);

$back = Tools::getValue('back');
 $key = Tools::safeOutput(Tools::getValue('key'));
 if (!empty($key))
 $back .= (strpos($back, '?') !== false ? '&' : '?').'key='.$key;
 if ($back == Tools::secureReferrer(Tools::getValue('back')))
 $this->context->smarty->assign('back', html_entity_decode($back));
 else
 $this->context->smarty->assign('back', Tools::safeOutput($back));

 if (Tools::getValue('display_guest_checkout'))
 {
 if (Configuration::get('PS_RESTRICT_DELIVERED_COUNTRIES'))
 $countries = Carrier::getDeliveredCountries($this->context->language->id, true, true);
 else
 $countries = Country::getCountries($this->context->language->id, true);

 if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
 {
 // get all countries as language (xy) or language-country (wz-XY)
 $array = array();
 preg_match("#(?<=-)\w\w|\w\w(?!-)#",$_SERVER['HTTP_ACCEPT_LANGUAGE'],$array);
 if (!Validate::isLanguageIsoCode($array[0]) || !($sl_country = Country::getByIso($array[0])))
 $sl_country = (int)Configuration::get('PS_COUNTRY_DEFAULT');
 }
 else
 $sl_country = (int)Tools::getValue('id_country', Configuration::get('PS_COUNTRY_DEFAULT'));

 $this->context->smarty->assign(array(
 'inOrderProcess' => true,
 'PS_GUEST_CHECKOUT_ENABLED' => Configuration::get('PS_GUEST_CHECKOUT_ENABLED'),
 'PS_REGISTRATION_PROCESS_TYPE' => Configuration::get('PS_REGISTRATION_PROCESS_TYPE'),
 'sl_country' => (int)$sl_country,
 'countries' => $countries
 ));
 }

if (Tools::getValue('create_account'))
 $this->context->smarty->assign('email_create', 1);

if (Tools::getValue('multi-shipping') == 1)
 $this->context->smarty->assign('multi_shipping', true);
 else
 $this->context->smarty->assign('multi_shipping', false);

 $this->assignAddressFormat();

// Call a hook to display more information on form
 $this->context->smarty->assign(array(
 'HOOK_CREATE_ACCOUNT_FORM' => Hook::exec('displayCustomerAccountForm'),
 'HOOK_CREATE_ACCOUNT_TOP' => Hook::exec('displayCustomerAccountFormTop')
 ));

 // Just set $this->template value here in case it's used by Ajax
 $this->setTemplate(_PS_THEME_DIR_.'authentication.tpl');

if ($this->ajax)
 {
 // Call a hook to display more information on form
 $this->context->smarty->assign(array(
 'PS_REGISTRATION_PROCESS_TYPE' => Configuration::get('PS_REGISTRATION_PROCESS_TYPE'),
 'genders' => Gender::getGenders()
 ));

$return = array(
 'hasError' => !empty($this->errors),
 'errors' => $this->errors,
 'page' => $this->context->smarty->fetch($this->template),
 'token' => Tools::getToken(false)
 );
 die(Tools::jsonEncode($return));
 }
 }

/**
 * Assign date var to smarty
 */
 protected function assignDate()
 {
 // Generate years, months and days
 if (isset($_POST['years']) && is_numeric($_POST['years']))
 $selectedYears = (int)($_POST['years']);
 $years = Tools::dateYears();
 if (isset($_POST['months']) && is_numeric($_POST['months']))
 $selectedMonths = (int)($_POST['months']);
 $months = Tools::dateMonths();

if (isset($_POST['days']) && is_numeric($_POST['days']))
 $selectedDays = (int)($_POST['days']);
 $days = Tools::dateDays();

$this->context->smarty->assign(array(
 'one_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'),
 'onr_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), //retro compat
 'years' => $years,
 'sl_year' => (isset($selectedYears) ? $selectedYears : 0),
 'months' => $months,
 'sl_month' => (isset($selectedMonths) ? $selectedMonths : 0),
 'days' => $days,
 'sl_day' %<br />
3D> (isset($selectedDays) ? $selectedDays : 0)
 ));
 }

/**
 * Assign countries var to smarty
 */
 protected function assignCountries()
 {
 if (isset($this->create_account))
 {
 // Select the most appropriate country
 if (isset($_POST['id_country']) && is_numeric($_POST['id_country']))
 $selectedCountry = (int)($_POST['id_country']);
 /* FIXME : language iso and country iso are not similar,
 * maybe an associative table with country an language can resolve it,
 * But for now it's a bug !
 * @see : bug #6968
 * @link:http://www.prestashop.com/bug_tracker/view/6968/
 elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
 {
 $array = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
 if (Validate::isLanguageIsoCode($array[0]))
 {
 $selectedCountry = Country::getByIso($array[0]);
 if (!$selectedCountry)
 $selectedCountry = (int)(Configuration::get('PS_COUNTRY_DEFAULT'));
 }
 }*/
 if (!isset($selectedCountry))
 $selectedCountry = (int)(Configuration::get('PS_COUNTRY_DEFAULT'));

if (Configuration::get('PS_RESTRICT_DELIVERED_COUNTRIES'))
 $countries = Carrier::getDeliveredCountries($this->context->language->id, true, true);
 else
 $countries = Country::getCountries($this->context->language->id, true);
 $this->context->smarty->assign(array(
 'countries' => $countries,
 'PS_REGISTRATION_PROCESS_TYPE' => Configuration::get('PS_REGISTRATION_PROCESS_TYPE'),
 'sl_country' => (isset($selectedCountry) ? $selectedCountry : 0),
 'vat_management' => Configuration::get('VATNUMBER_MANAGEMENT')
 ));
 }
 }

/**
 * Assign address var to smarty
 */
 protected function assignAddressFormat()
 {
 $addressItems = array();
 $addressFormat = AddressFormat::getOrderedAddressFields(Configuration::get('PS_COUNTRY_DEFAULT'), false, true);
 $requireFormFieldsList = AddressFormat::$requireFormFieldsList;

foreach ($addressFormat as $addressline)
 foreach (explode(' ', $addressline) as $addressItem)
 $addressItems[] = trim($addressItem);

// Add missing require fields for a new user susbscription form
 foreach ($requireFormFieldsList as $fieldName)
 if (!in_array($fieldName, $addressItems))
 $addressItems[] = trim($fieldName);

foreach (array('inv', 'dlv') as $addressType)
 $this->context->smarty->assign(array($addressType.'_adr_fields' => $addressFormat, $addressType.'_all_fields' => $addressItems));
 }

/**
 * Start forms process
 * @see FrontController::postProcess()
 */
 public function postProcess()
 {
 if (Tools::isSubmit('SubmitCreate'))
 $this->processSubmitCreate();

if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount'))
 $this->processSubmitAccount();

if (Tools::isSubmit('SubmitLogin'))
 $this->processSubmitLogin();
 }

/**
 * Process login
 */
 protected function processSubmitLogin()
 {
 Hook::exec('actionBeforeAuthentication');
 $passwd = trim(Tools::getValue('passwd'));
 $email = trim(Tools::getValue('email'));
 if (empty($email))
 $this->errors[] = Tools::displayError('An email address required.');
 elseif (!Validate::isEmail($email))
 $this->errors[] = Tools::displayError('Invalid email address.');
 elseif (empty($passwd))
 $this->errors[] = Tools::displayError('Password is required.');
 elseif (!Validate::isPasswd($passwd))
 $this->errors[] = Tools::displayError('Invalid password.');
 else
 {
 $customer = new Customer();
 $authentication = $customer->getByEmail(trim($email), trim($passwd));
 if (!$authentication || !$customer->id)
 $this->errors[] = Tools::displayError('Authentication failed.');
 else
 {
 $this->context->cookie->id_compare = isset($this->context->cookie->id_compare) ? $this->context->cookie->id_compare: CompareProduct::getIdCompareByIdCustomer($customer->id);
 $this->context->cookie->id_customer = (int)($customer->id);
 $this->context->cookie->customer_lastname = $customer->lastname;
 $this->context->cookie->customer_firstname = $customer->firstname;
 $this->context->cookie->logged = 1;
 $customer->logged = 1;
 $this->context->cookie->is_guest = $customer->isGuest();
 $this->context->cookie->passwd = $customer->passwd;
 $this->context->cookie->email = $customer->email;

 // Add customer to the context
 $this->context->customer = $customer;

 if (Configuration::get('PS_CART_FOLLOWING') && (empty($this->context->cookie->id_cart) || Cart::getNbProducts($this->context->cookie->id_cart) == 0) && $id_cart = (int)Cart::lastNoneOrderedCart($this->context->customer->id))
 $this->context->cart = new Cart($id_cart);
 else
 {
 $this->context->cart->id_carrier = 0;
 $this->context->cart->setDeliveryOption(null);
 $this->context->cart->id_address_delivery = Address::getFirstCustomerAddressId((int)($customer->id));
 $this->context->cart->id_address_invoice = Address::getFirstCustomerAddressId((int)($customer->id));
 }
 $this->context->cart->id_customer = (int)$customer->id;
 $this->context->cart->secure_key = $customer->secure_key;
 $this->context->cart->save();
 $this->context->cookie->id_cart = (int)$this->context->cart->id;
 $this->context->cookie->write();
 $this->context->cart->autosetProductAddress();

Hook::exec('actionAuthentication');

// Login information have changed, so we check if the cart rules still apply
 CartRule::autoRemoveFromCart($this->context);
 CartRule::autoAddToCart($this->context);

if (!$this->ajax)
 {
 if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back))
 Tools::redirect(html_entity_decode($back));
 Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'order?step=1'));
 }
 }
 }
 if ($this->ajax)
 {
 $return = array(
 'hasError' => !empty($this->errors),
 'errors' => $this->errors,
 'token' => Tools::getToken(false)
 );
 die(Tools::jsonEncode($return));
 }
 else
 $this->context->smarty->assign('authentification_error', $this->errors);
 }

/**
 * Process the newsletter settings and set the customer infos.
 *%0<br />
A * @param Customer $customer Reference on the customer Object.
 *
 * @note At this point, the email has been validated.
 */
 protected function processCustomerNewsletter(&$customer)
 {
 if (Tools::getValue('newsletter'))
 {
 $customer->ip_registration_newsletter = pSQL(Tools::getRemoteAddr());
 $customer->newsletter_date_add = pSQL(date('Y-m-d H:i:s'));

if ($module_newsletter = Module::getInstanceByName('blocknewsletter'))
 if ($module_newsletter->active)
 $module_newsletter->confirmSubscription(Tools::getValue('email'));
 }
 }

/**
 * 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
 ));
 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));
 }

// REDIRECTION VERS ETAPE ADRESSE
 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'));
 Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'order?step=1'));
 // else : redirection to the account
 else
 Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'order?step=1'));
 }
 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;

// US customer%3<br />
A normalize the address
 if ($$addresses_type->id_country == Country::getByIso('US') && Configuration::get('PS_TAASC'))
 {
 include_once(_PS_TAASC_PATH_.'AddressStandardizationSolution.php');
 $normalize = new AddressStandardizationSolution;
 $$addresses_type->address1 = $normalize->AddressLineStandardization($$addresses_type->address1);
 $$addresses_type->address2 = $normalize->AddressLineStandardization($$addresses_type->address2);
 }

 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%<br />
20redirect 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 VERS ETAPE ADRESSE
 // 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'));
 Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'order?step=1'));
 // else : redirection to the account
 else
 Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'order?step=1'));
 }
 }
 }
 }

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);
 }
 }

/**
 * Process submit on a creation
 */
 protected function processSubmitCreate()
 {
 if (!Validate::isEmail($email = Tools::getValue('email_create')) || empty($email))
 $this->errors[] = Tools::displayError('Invalid email address.');
 elseif (Customer::customerExists($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);
 $_POST['email'] = $_POST['email_create'];
 unset($_POST['email_create']);
 }
 else
 {
 $this->create_account = true;
 $this->context->smarty->assign('email_create', Tools::safeOutput($email));
 $_POST['email'] = $email;
 }
 }

/**
 * Update context after customer creation
 * @param Customer $customer Created customer
 */
 protected function updateContext(Customer $customer)
 {
 $this->context->customer = $customer;
 $this->context->smarty->assign('confirmation', 1);
 $this->context->cookie->id_customer = (int)$customer->id;
 $this->context->cookie->customer_lastname = $customer->lastname;
 $this->context->cookie->customer_firstname = $customer->firstname;
 $this->context->cookie->passwd = $customer->passwd;
 $this->context->cookie->logged = 1;
 // if register process is in two steps, we display a message to confirm account creation
 if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE'))
 $this->context->cookie->account_created = 1;
 $customer->logged = 1;
 $this->context->cookie->email = $customer->email;
 $this->context->cookie->is_guest = !Tools::getValue('is_new_customer', 1);
 // Update cart address
 $this->context->cart->secure_key = $customer->secure_key;
 }

/**
 * sendConfirmationMail
 * @param Customer $customer
 * @return bool
 */
 protected function sendConfirmationMail(Customer $customer)
 {
 if (!Configuration::get('PS_CUSTOMER_CREATION_EMAIL'))
 return true;

return Mail::Send(
 $this->context->language->id,
 'account',
 Mail::l('Welcome!'),
 array(
 '{firstname}' => $customer->firstname,
 '{lastname}' => $customer->lastname,
 '{email}' => $customer->email,
 '{passwd}' => Tools::getValue('passwd')),
 $customer->email,
 $customer->firstname.' '.$customer->lastname
 );
 }
}

[box type= »alert » size= »large »]Il ne faut pas oublier de supprimer le fichier /cache/class_index.php pour vider le cache des classes et on est bon pour voir le résultat sur le site.[/box]
A vous de jouer à présent 🙂
 
[edit du 07/09/2015]
Voici le fichier modifié pour la version 1.6 de PrestaShop pour rediriger vers le panier dans ce cas : AuthController.php à placer dans le dossier www/override/controllers/front/ sans oublier de supprimer le fichier class_index.php toujours après modification.

11 commentaires sur “Tuto PrestaShop : Rediriger après login vers étape suivante

  1. Cool cette idée de tuto !
    Mais je ne comprends pas ce qu’il faut copier exactement.
    Quelles lignes faut-il rajouter ?
    Bonne journée

    1. Bonjour, il faut d’abord créer un override puis copier le code indiqué dans cet override. Il faut aussi penser à supprimer le fichier /cache/class_index.php pour vider le cache des classes 🙂

  2. Bonjour,
    comment je peux faire afin que quand mon panier est vide je puisse tomber sur la page « mon compte »?
    Merci
    Lucia

  3. Je n’ai pas donné la solution, mais une piste à savoir éditer le fichier shopping-cart.tpl puis identifier la condition et y placer un lien : si panier vide alors affichage du lien vers le compte client 🙂

  4. Bonjour Arnaud,
    Merci beaucoup pour ce tuto!
    Comme Rachel, après identification, on revient au panier plutôt qu’à l’adresse. J’ai bien supprimé le fichier class_index.php après modification de l’override.
    Je crois que le code indique bien un retour vers le panier en fait… Pourrais-tu faire les modifs ? Je n’en ai malheureusement pas les compétences :-/

  5. Bonjour, existe-t-il une solution sur Prestashop 1.7 ?
    Comment faire pour rediriger vers une catégorie une fois que l’on s’identifie ?
    Merci

    1. Bonjour Aurore,
      Je n’ai pas fait de tuto sur la 1.7 mais en s’apuyant sur ce tuto PrestaShop et en adaptant dans le controller AuthController de la nouvelle version ça doit fonctionner. Le principe est le même.
      Dans le code, le lien vers lequel redirigée sera sous la forme : Tools::redirect(‘votre url’);
      Bon courage 🙂

Laisser un commentaire

Consultez les autres articles