Login action :

* Add account
* If user has checked "I'm a new customer", we must verify if it's a new email address.
This commit is contained in:
touffies
2013-10-14 12:25:12 +02:00
parent d58f63990a
commit 7695c19b40
4 changed files with 77 additions and 34 deletions

View File

@@ -193,31 +193,34 @@ class CustomerController extends BaseFrontController
$form = $this->validateForm($customerLoginForm, "post"); $form = $this->validateForm($customerLoginForm, "post");
$authenticator = new CustomerUsernamePasswordFormAuthenticator($request, $customerLoginForm); try {
$customer = $authenticator->getAuthentifiedUser(); $authenticator = new CustomerUsernamePasswordFormAuthenticator($request, $customerLoginForm);
$this->processLogin($customer); $customer = $authenticator->getAuthentifiedUser();
$this->redirectSuccess($customerLoginForm); $this->processLogin($customer);
$this->redirectSuccess($customerLoginForm);
} catch (UsernameNotFoundException $e) {
$message = "1.Wrong email or password. Please try again";
} catch (WrongPasswordException $e) {
$message = "2.Wrong email or password. Please try again";
} catch (AuthenticationException $e) {
$message = "3.Wrong email or password. Please try again";
}
} catch (FormValidationException $e) { } catch (FormValidationException $e) {
if ($request->request->has("account")) { // If User is a new customer
$account = $request->request->get("account"); $form = $customerLoginForm->getForm();
$form = $customerLoginForm->getForm(); if ($form->get('account')->getData() == 0 && !$form->get("email")->getErrors()) {
if ($account == 0 && $form->get("email")->getData() !== null) { $this->redirectToRoute("customer.create.view", array("email" => $form->get("email")->getData()));
$this->redirectToRoute("customer.create.view", array("email" => $form->get("email")->getData())); } else {
} $message = sprintf("Please check your input: %s", $e->getMessage());
} }
$message = sprintf("Please check your input: %s", $e->getMessage());
} catch (UsernameNotFoundException $e) {
$message = "Wrong email or password. Please try again";
} catch (WrongPasswordException $e) {
$message = "Wrong email or password. Please try again";
} catch (AuthenticationException $e) {
$message = "Wrong email or password. Please try again";
} catch (\Exception $e) { } catch (\Exception $e) {
$message = sprintf("Sorry, an error occured: %s", $e->getMessage()); $message = sprintf("Sorry, an error occured: %s", $e->getMessage());
} }

View File

@@ -151,6 +151,11 @@ class Form extends AbstractSmartyPlugin
$template->assign("options", $formFieldView->vars); $template->assign("options", $formFieldView->vars);
/* access to choices */
if (isset($formFieldView->vars['choices'])) {
$template->assign("choices", $formFieldView->vars['choices']);
}
$value = $formFieldView->vars["value"]; $value = $formFieldView->vars["value"];
/* FIXME: doesnt work. We got "This form should not contain extra fields." error. /* FIXME: doesnt work. We got "This form should not contain extra fields." error.
// We have a collection // We have a collection

View File

@@ -22,10 +22,18 @@
/*************************************************************************************/ /*************************************************************************************/
namespace Thelia\Form; namespace Thelia\Form;
use Symfony\Component\Validator\Constraints;
use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\ExecutionContextInterface;
use Thelia\Core\Translation\Translator; use Thelia\Core\Translation\Translator;
use Thelia\Model\Base\CustomerQuery;
/**
* Class CustomerLogin
* @package Thelia\Form
* @author Manuel Raynaud <mraynaud@openstudio.fr>
*/
class CustomerLogin extends BaseForm class CustomerLogin extends BaseForm
{ {
protected function buildForm() protected function buildForm()
@@ -33,8 +41,14 @@ class CustomerLogin extends BaseForm
$this->formBuilder $this->formBuilder
->add("email", "email", array( ->add("email", "email", array(
"constraints" => array( "constraints" => array(
new NotBlank(), new Constraints\NotBlank(),
new Email() new Constraints\Email(),
new Constraints\Callback(array(
"methods" => array(
array($this,
"verifyExistingEmail")
)
))
), ),
"label" => Translator::getInstance()->trans("Please enter your email address"), "label" => Translator::getInstance()->trans("Please enter your email address"),
"label_attr" => array( "label_attr" => array(
@@ -42,18 +56,40 @@ class CustomerLogin extends BaseForm
), ),
"required" => true "required" => true
)) ))
->add("account", "choice", array(
"choices" => array(
0 => Translator::getInstance()->trans("No, I am a new customer."),
1 => Translator::getInstance()->trans("Yes, I have a password :")
),
"label_attr" => array(
"for" => "account"
),
"data" => 0
))
->add("password", "password", array( ->add("password", "password", array(
"constraints" => array( "constraints" => array(
new NotBlank() new Constraints\NotBlank()
), ),
"label" => Translator::getInstance()->trans("Please enter your password"), "label" => Translator::getInstance()->trans("Please enter your password"),
"label_attr" => array( "label_attr" => array(
"for" => "password" "for" => "password"
), ),
"required" => true 'required' => false
)) ));
->add("remember_me", "checkbox") }
;
/**
* If the user select "I'am a new customer", we make sure is email address does not exit in the database.
*/
public function verifyExistingEmail($value, ExecutionContextInterface $context)
{
$data = $context->getRoot()->getData();
if ($data["account"] == 0) {
$customer = CustomerQuery::create()->findOneByEmail($value);
if ($customer) {
$context->addViolation("A user already exists with this email address. Please login or if you've forgotten your password, go to Reset Your Password.");
}
}
} }
public function getName() public function getName()

View File

@@ -41,17 +41,16 @@
{/form_field} {/form_field}
<fieldset> <fieldset>
{form_field form=$form field="account"}
<legend>{intl l="Do you have an account?"}</legend> <legend>{intl l="Do you have an account?"}</legend>
<div class="radio radio-account0" > {foreach $choices as $choice}
<label for="account0"> <div class="radio radio-account{$choice->value}">
<input type="radio" name="account" id="account0" data-toggle="password" value="0"> {intl l="No, I am a new customer."} <label for="{$label_attr.for}{$choice->value}">
</label> <input type="radio" name="{$name}" id="{$label_attr.for}{$choice->value}" data-toggle="password" value="{$choice->value}"{if $value === {$choice->value}} checked{/if}> {$choice->label}
</div> </label>
<div class="radio radio-account1"> </div>
<label for="account1"> {/foreach}
<input type="radio" name="account" id="account1" data-toggle="password" value="1" checked> {intl l="Yes, I have a password :"} {/form_field}
</label>
</div>
{form_field form=$form field="password"} {form_field form=$form field="password"}
<div class="form-group group-password{if $error} has-error{/if}"> <div class="form-group group-password{if $error} has-error{/if}">
<label for="{$label_attr.for}" class="sr-only">{$label}</label> <label for="{$label_attr.for}" class="sr-only">{$label}</label>