Jump to content

[SOLVED]How to make address and phone field not required? PS 1.4.5.1


Recommended Posts

Hi :)

to remove the address from required you must edit classes/address.php (remove the adress from that line like this)

protected $fieldsRequired = array('id_country', 'alias', 'lastname', 'firstname', 'city');

 

Tbh, I never tried to remove telephone as required field, and as you see, the code for this is not there.

 

Now I dont have time, but if no one else suggest a solution, I'll spare some time and will try to find how to do this.

  • Like 3
Link to comment
Share on other sites

Hello again :) Good news, that was easy. Just made a quick search in the prestashop files and found how to disable the phone.

 

Go to controllers/AuthControler.php and remove this

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

let me know if this works for you

  • Like 2
Link to comment
Share on other sites

  • 2 weeks later...
  • 2 weeks later...
  • 3 weeks later...

Hello again :) Good news, that was easy. Just made a quick search in the prestashop files and found how to disable the phone.

 

Go to controllers/AuthControler.php and remove this

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

let me know if this works for you

 

Thanks Snade for Your solution!

This help me, and working fine (PS 1.4.6.2).

 

But I try to use overriding to modify code without actually modifying the original files.

see: http://doc.prestasho...roller+Override

 

I made copy of AuthController.php and saved it to /override/controllers/AuthController.php

Then I modify new AuthController.php. It contain "class AuthController extends AuthControllerCore"

with only one method "public function preProcess()"

 

class AuthController extends AuthControllerCore
{
public function preProcess()
{
 parent::preProcess();

/* ... orignal code ... */

  $_POST['firstname'] = $_POST['customer_firstname'];
/* dissabled by Your suggestion  
  if (!Tools::getValue('phone') AND !Tools::getValue('phone_mobile'))
  {
$this->errors[] = Tools::displayError('You must register at least one phone number');
  }
*/

/* ... rest of original code */

 }
}

 

But this not work! Probably I made some mistake.

I used overriding for e.g. class Validate extends ValidateCore

and it work.

Where is problem?

thanks

Bru.

Link to comment
Share on other sites

  • 1 month later...
Hello again :) Good news, that was easy. Just made a quick search in the prestashop files and found how to disable the phone. Go to controllers/AuthControler.php and remove this
 if (!Tools::getValue('phone') AND !Tools::getValue('phone_mobile')) $this->errors[] = Tools::displayError('You must register at least one phone number'); 

let me know if this works for you

 

Hi,

 

I tried doing this, but upon clicking submit, I get a blank page saying "Fatal Error". Any clues?

Link to comment
Share on other sites

(PS 1.4.7.3)

Hi,

here in an example for overriding from PHP manual

 

cite from PHP manual about "extends"

It is not possible to subtract from a class, that is,

to undefine any existing functions or variables.

 

If you have a class that extends an other

and both classes have a function with the same name

then visibility to both classes should be the same,

else you will have a fatal error.

 

create new php page with folowing code

<?php

class test
{
 public function __construct()
 {
echo '__construct() from class test was run<br />';
 }

 public function name()
 {
$this->showName('Hello Bru');
 }

 public function showName($name)
 {
echo 'my name in private "test" is ' . $name;
 }
}

class extendTest extends test
{
 public function __construct()
 {
parent::__construct();
echo '__construct() from clas extendTest was run<br /><br />';
 }

 public function showName($name)
 {
echo 'my name in "extendTest" is ' . $name;
 }
}

$test = new extendTest();
$test->name();

when you run code above in some internet browser you will see:

__construct() from class test was run

__construct() from clas extendTest was run

 

my name in "extendTest" is Hello Bru

 

 

but this analogy not work for class AuthController. Why?

;)

bru

Link to comment
Share on other sites

  • 2 months later...

Hello again :) Good news, that was easy. Just made a quick search in the prestashop files and found how to disable the phone.

 

Go to controllers/AuthControler.php and remove this

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

let me know if this works for you

 

Hi, using OPC and have removed the telephone and mobile fields and this works great for delivery address, but if i try and enter a different invoice address, it comes up with the error...

 

There is 2 error(s):

  1. phone is invalid.
  2. mobile phone is invalid.

i can't find where it does the validation for the invoice telephone and mobile in order to disable it as you did in the authcontroller for delivery address.

 

thanks

Link to comment
Share on other sites

{SOLVED} have fixed this problem. I don't need any telephone numbers stored, so have removed the validation by editing /classes/address.php

 

around line 107 in the

 

protected $fieldsValidate = array

 

section, i commented out the following

 

'phone' => 'isPhoneNumber', 'phone_mobile' => 'isPhoneNumber',

 

and now works a treat.

Link to comment
Share on other sites

  • 2 months later...

Hi :)

to remove the address from required you must edit classes/address.php (remove the adress from that line like this)

protected $fieldsRequired = array('id_country', 'alias', 'lastname', 'firstname', 'city');

 

Tbh, I never tried to remove telephone as required field, and as you see, the code for this is not there.

 

Now I dont have time, but if no one else suggest a solution, I'll spare some time and will try to find how to do this.

 

Hi folks

 

just comment I have followed your tutorial. I have modified

 

/*protected $fieldsRequired = array('id_country', 'alias', 'lastname', 'firstname', 'address1', 'city');*/

 

in Address.php

 

but then Prestashop still ask me about State and shows an error

 

This country needs a state

 

or something like that

 

But I was able to register only with email,name,lastname,password, country, state. I am really close to the goal, how can I avoid now State an Country ????

 

Thanks!

Link to comment
Share on other sites

  • 2 months later...
  • 2 months later...

You'll find that in your theme authentication.tpl

 

Look for,

<label for="firstname">{l s='First name'} <sup>*</sup></label>

 

Remove the *

 

also in the same file, instead of editing the php files you can change,

 

p class="required text">

 

to

 

<p class="text">

 

to remove required field.

Edited by Bill Dalton (see edit history)
Link to comment
Share on other sites

In my case I just took out the phone and left mobile phone.

 

The reason I did it that way is because "Phone" isn't a required field as long as "Mobile" is filled in. And Mobile can appear twice if they need to add a billing address. But the problem with "Mobile is, what if the customer doesn't have a mobile phone? I solved that problem in Translations, I put the English translation for Mobile to Telephone.

 

The Translation system in PS lets you change most text and fields all without coding.

Link to comment
Share on other sites

Thanks Bill is it somewhere else as well as authentication.tpl because I tried that already. I managed to get the "You must register at least one phone number" to go but the * are still there

 

For the postcode where it says

<p class="required postcode text">

do you change that to

<p class="postcode text"> or <p class="text"> ?

thanks

Edited by idoityourself (see edit history)
Link to comment
Share on other sites

  • 5 months later...
Guest cornelm

Hi guys,

I need some help. What should i do to make DNI field optional and not required? I'm very confused - i don't know which files must be modified. I read so many solutions...

 

PrestaShop™ 1.5.4.1 - default theme

 

Thanks!

Link to comment
Share on other sites

can you please open the /classes/Address.php file and check the object definition?

you've got there something like:

'dni' =>	 array('type' => self::TYPE_STRING, 'validate' => 'isDniLite', 'size' => 16),

 

you've got the same?

 

@cornelm i think that the problem is somewhere else, but im waiting for your answer related to the object definition

everything depends on it :)

Link to comment
Share on other sites

Guest cornelm

'dni' =>	 array('type' => self::TYPE_STRING, 'validate' => 'isDniLite', 'size' => 16),

 

Also, please see enclosed entire content of address.php

 

Thank you vekia for your help - I just know what to do.... :D

PS: my shop in my signature.

address.php.txt

Edited by cornelm (see edit history)
Link to comment
Share on other sites

Guest cornelm

If i switch to "no", dni field disappear - i wanna be optional (but not required). Thank you for your help i guess i will get some help from a programmer because this basic features (registration form) of prestashop is not that simple to customize.

Now i have this settings

post-338168-0-26636100-1374733914_thumb.jpg

Link to comment
Share on other sites

Guest cornelm

I still have the problem: DNI field is REQUIRED cannot make it optional. Maybe i will find a paid module for this sh**t.

 

Maybe after PrestaShop 3.5 you could say:

:P :P

 

#What do you consider to be PrestaShop’s main assets?

- A particular advantage of the shop is that it is very easy to use & configure. From a person who is has coding experience, it is not so important. However, for those who do not have programming skills etc., the fact that the store is very easy to use is very important. In this way, everyone is able to run their own online shop without any advanced knowledge.

Link to comment
Share on other sites

  • 1 month later...

If editing the authentication.tpl didn't work are you using a third party module for checkout? If so they may have a custom auth.tpl.

 

Change :

<p class="required postcode text">

to

<p class="text">

Prestashop 1.5.5 - Default theme

 

Did anybody found the solution ?

 

I only sell digital goods.

I want only the email to appear (mandatory field) and the option to subscribe to the newsletter, and that's it.

I made the changes in authentication.tpl : I removed (deleted lines) for non requiered fields, it's ok.

But I still have error messages about mandatory fields (first name, lastname, etc...) when the customers wants to continue with next step.

I guess there are controls in a php file... ?

Please help. Thanks.

Link to comment
Share on other sites

  • 1 month later...
  • 2 years later...

In prestashop v 1.6.0.5 thema default-bootstrap

 

in file prestashop-> controllers-> front-> AuthController.php  which I do modify the code below to not make compulsory one of two phones?

 

Thank you in advance!

 

 

 

 

 

<?php
/*
* 2007-2014 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:
* 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 [email protected] 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 <[email protected]>
*  @copyright  2007-2014 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 AuthControllerCore extends FrontController
{
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 (!$this->useMobileTheme())
$this->addCSS(_THEME_CSS_DIR_.'authentication.css');
$this->addJqueryPlugin('typewatch');
$this->addJS(array(
_THEME_JS_DIR_.'tools/vatManagement.js',
_THEME_JS_DIR_.'tools/statesManagement.js',
_THEME_JS_DIR_.'authentication.js',
_PS_JS_DIR_.'validate.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' => (isset($selectedDays) ? $selectedDays : 0)
));
}
 
/**
* Assign countries var to smarty
*/
protected function assignCountries()
{
// Select the most appropriate country
if (isset($_POST['id_country']) && is_numeric($_POST['id_country']))
$selectedCountry = (int)($_POST['id_country']);
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) : 'my-account'));
}
}
}
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.
*
* @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));
}
 
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);
}
}
 
/**
* 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
);
}
}
Link to comment
Share on other sites

  • 3 weeks later...
  • 1 year later...
×
×
  • Create New...