Implemented front-office login

This commit is contained in:
franck
2013-07-17 18:49:23 +02:00
parent 4842d0c006
commit 8296051937
58 changed files with 1626 additions and 1407 deletions

View File

@@ -4,7 +4,7 @@
/* Thelia */
/* */
/* Copyright (c) OpenStudio */
/* email : info@thelia.net */
/* email : info@thelia.net */
/* web : http://www.thelia.net */
/* */
/* This program is free software; you can redistribute it and/or modify */
@@ -17,7 +17,7 @@
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* */
/*************************************************************************************/
@@ -39,30 +39,28 @@ use Thelia\Model\ConfigQuery;
use Thelia\Tools\Redirect;
use Symfony\Component\Validator\Exception\ValidatorException;
use Thelia\Core\Security\Exception\AuthenticationException;
use Thelia\Core\Template\ParserContext;
use Thelia\Core\Security\Exception\UsernameNotFoundException;
class Customer implements EventSubscriberInterface
{
/**
* @var Thelia\Core\Security\SecurityContext
*/
private $securityContext;
protected $securityContext;
public function __construct(SecurityContext $context) {
$this->securityContext = $context;
/**
* @var Thelia\Core\Template\ParserContext
*/
protected $parserContext;
$context->setContext(SecurityContext::CONTEXT_FRONT_OFFICE);
public function __construct(SecurityContext $securityContext, ParserContext $parserContext) {
$this->securityContext = $securityContext;
$this->parserContext = $parserContext;
}
private function getSecurityContext($context) {
$this->securityContext->setContext($context === false ? SecurityContext::CONTEXT_FRONT_OFFICE : $context);
return $securityContext;
}
public function create(ActionEvent $event)
{
$event->getDispatcher()->dispatch(TheliaEvents::BEFORE_CREATECUSTOMER, $event);
$request = $event->getRequest();
@@ -94,25 +92,35 @@ class Customer implements EventSubscriberInterface
$data["password"],
$request->getSession()->getLang()
);
$event->getDispatcher()->dispatch(TheliaEvents::AFTER_CREATECUSTOMER, $event);
// Connect the newly created user,and redirect to the success URL
$this->processSuccessfulLogin($event, $customer, $customerCreation, true);
} catch (\PropelException $e) {
Tlog::getInstance()->error(sprintf('error during creating customer on action/createCustomer with message "%s"', $e->getMessage()));
$event->setFormError($customerCreation);
$message = "Failed to create your account, please try again.";
}
//Customer is create, he is automatically connected
}
else {
$event->setFormError($customerCreation);
$message = "Missing or invalid data";
}
}
else {
$message = "Wrong form method !";
}
$event->getDispatcher()->dispatch(TheliaEvents::AFTER_CREATECUSTOMER, $event);
$this->parserContext->set('customer_creation_error_message', $message);
$event->setFormError($customerCreation);
}
public function modify(ActionEvent $event)
{
$event->getDispatcher()->dispatch(TheliaEvents::BEFORE_CHANGECUSTOMER, $event);
$request = $event->getRequest();
$customerModification = new CustomerModification($request);
@@ -140,15 +148,44 @@ class Customer implements EventSubscriberInterface
$data["zipcode"],
$data["country"]
);
} catch(\PropelException $e) {
$event->getDispatcher()->dispatch(TheliaEvents::AFTER_CHANGECUSTOMER, $event);
// Update the logged-in user, and redirect to the success URL (exits)
// We don-t send the login event, as the customer si already logged.
$this->processSuccessfulLogin($event, $customer, $customerModification);
}
catch(\PropelException $e) {
Tlog::getInstance()->error(sprintf('error during modifying customer on action/modifyCustomer with message "%s"', $e->getMessage()));
$event->setFormError($customerModification);
$message = "Failed to change your account, please try again.";
}
} else {
$event->setFormError($customerModification);
}
else {
$message = "Missing or invalid data";
}
}
else {
$message = "Wrong form method !";
}
$this->parserContext->set('customer_change_error_message', $message);
$event->setFormError($customerModification);
}
/**
* Perform user logout. The user is redirected to the provided view, if any.
*
* @param ActionEvent $event
*/
public function logout(ActionEvent $event)
{
$event->getDispatcher()->dispatch(TheliaEvents::CUSTOMER_LOGOUT, $event);
$this->getSecurityContext()->clear();
}
/**
@@ -170,39 +207,33 @@ class Customer implements EventSubscriberInterface
try {
$user = $authenticator->getAuthentifiedUser();
// Success -> store user in security context
$this->getSecurityContext()->setUser($user);
// Log authentication success
AdminLog::append("Authentication successufull", $request, $user);
// Get the success URL to redirect the user to
$successUrl = $form->getForm()->get('success_url')->getData();
if (null == $successUrl) $successUrl = ConfigQuery::read('base_url', '/');
// Redirect to the success URL
return Redirect::exec(URL::absoluteUrl($successUrl));
}
$this->processSuccessfulLogin($event, $user, $form);
}
catch (ValidatorException $ex) {
$message = "Missing or invalid information. Please check your input.";
}
catch (UsernameNotFoundException $ex) {
$message = "This email address was not found.";
}
catch (AuthenticationException $ex) {
$message = "Login failed. Please check your username and password.";
}
catch (\Exception $ex) {
$message = sprintf("Unable to process your request. Please try again (%s).", $ex->getMessage());
$message = sprintf("Unable to process your request. Please try again (%s in %s).", $ex->getMessage(), $ex->getFile());
}
// Store the form name in session (see Form Smarty plugin to find usage of this parameter)
$request->getSession()->setErrorFormName($form->getName());
// Put the message in the ParserContext to make it available to the template
$this->parserContext->set('customer_login_error_message', $message);
// A this point, the same view is displayed again.
}
public function changePassword(ActionEvent $event)
{
// TODO
}
/**
@@ -230,8 +261,36 @@ class Customer implements EventSubscriberInterface
return array(
"action.createCustomer" => array("create", 128),
"action.modifyCustomer" => array("modify", 128),
"action.loginCustomer" => array("login", 128)
"action.loginCustomer" => array("login", 128),
"action.logoutCustomer" => array("logout", 128),
);
}
/**
* Stores the current user in the security context, and redirect to the
* success_url.
*
* @param CustomerModel $user the logged user
*/
protected function processSuccessfulLogin(ActionEvent $event, CustomerModel $user, BaseForm $form, $sendLoginEvent = false)
{
// Success -> store user in security context
$this->getSecurityContext()->setUser($user);
if ($sendLoginEvent) $event->getDispatcher()->dispatch(TheliaEvents::CUSTOMER_LOGIN, $event);
// Redirect to the success URL
return Redirect::exec($form->getSuccessUrl());
}
/**
* Return the security context, beeing sure that we're in the CONTEXT_FRONT_OFFICE context
*
* @return SecurityContext the security context
*/
protected function getSecurityContext() {
$this->securityContext->setContext(SecurityContext::CONTEXT_FRONT_OFFICE);
return $this->securityContext;
}
}

View File

@@ -94,8 +94,9 @@ class BaseAdminController extends ContainerAware
catch (AuthenticationException $ex) {
// User is not authenticated, and templates requires authentication -> redirect to login page
// (see Thelia\Core\Template\Smarty\Plugins\Security)
Redirect::exec(URL::absoluteUrl('admin/login')); // FIXME shoud be a parameter
// We user login_tpl as a path, not a template.
Redirect::exec(URL::absoluteUrl($ex->getLoginTemplate()));
}
}

View File

@@ -44,7 +44,7 @@ class SessionController extends BaseAdminController {
$this->getSecurityContext()->clear();
// Go back to login page.
return Redirect::exec(URL::absoluteUrl('admin/login'));
return Redirect::exec(URL::absoluteUrl('/admin/login')); // FIXME - should be a parameter
}
public function checkLoginAction()
@@ -62,15 +62,10 @@ class SessionController extends BaseAdminController {
$this->getSecurityContext()->setUser($user);
// Log authentication success
AdminLog::append("Authentication successufull", $request, $user);
// Get the success URL to redirect the user to
$successUrl = $form->getForm()->get('success_url')->getData();
if (null == $successUrl) $successUrl = 'admin/home';
AdminLog::append("Authentication successuful", $request, $user);
// Redirect to the success URL
return Redirect::exec(URL::absoluteUrl($successUrl));
return Redirect::exec($form->getSuccessUrl());
}
catch (ValidatorException $ex) {

View File

@@ -20,7 +20,9 @@
<service id="thelia.action.customer" class="Thelia\Action\Customer" scope="request">
<tag name="kernel.event_subscriber"/>
<argument type="service" id="thelia.securityContext"/>
<argument type="service" id="thelia.parser.context"/>
</service>
</services>

View File

@@ -58,16 +58,24 @@
<argument type="service" id="request" />
</service>
<!-- Parser context -->
<service id="thelia.parser.context" class="Thelia\Core\Template\ParserContext" scope="request">
<argument type="service" id="request" />
</service>
<!-- Parser configuration -->
<service id="thelia.parser" class="Thelia\Core\Template\Smarty\SmartyParser" scope="request">
<argument type="service" id="request" />
<argument type="service" id="event_dispatcher"/>
<argument type="service" id="thelia.parser.context"/>
<argument >false</argument>
<argument >%kernel.environment%</argument>
<argument >%kernel.debug%</argument>
</service>
<!-- Smarty parser plugins -->
<service id="smarty.plugin.assetic" class="Thelia\Core\Template\Smarty\Plugins\Assetic" >

View File

@@ -48,9 +48,14 @@ final class TheliaEvents
*/
const INCLUSION = "thelia.include";
const BEFORE_CREATECUSTOMER = "action.before_createcustomer";
const CUSTOMER_LOGOUT = "action.customer_logout";
const CUSTOMER_LOGIN = "action.customer_login";
const AFTER_CREATECUSTOMER = "action.after_createcustomer";
const BEFORE_CREATECUSTOMER = "action.before_createcustomer";
const AFTER_CREATECUSTOMER = "action.after_createcustomer";
const BEFORE_CHANGECUSTOMER = "action.before_changecustomer";
const AFTER_CHANGECUSTOMER = "action.after_changecustomer";
const CREATECUSTOMER_CUSTOMREF = "customer.creation.customref";
}

View File

@@ -90,8 +90,6 @@ class ViewListener implements EventSubscriberInterface
// Redirect to the login template
$event->setResponse(Redirect::exec(URL::viewUrl($ex->getLoginTemplate())));
}
throw new \Exception("toto !");
}
public function beforeKernelView(GetResponseForControllerResultEvent $event)

View File

@@ -27,6 +27,7 @@ use Symfony\Component\HttpFoundation\Session\Session as BaseSession;
use Thelia\Core\Security\User\UserInterface;
use Thelia\Form\BaseForm;
use Thelia\Model\ConfigQuery;
use Thelia\Tools\URL;
class Session extends BaseSession {
@@ -109,7 +110,7 @@ class Session extends BaseSession {
*/
public function getReturnToUrl()
{
return $this->get('return_to_url', ConfigQuery::read('base_url'));
return $this->get('return_to_url', URL::getIndexPage());
}
}

View File

@@ -37,7 +37,7 @@ class CustomerUsernamePasswordFormAuthenticator extends UsernamePasswordFormAuth
$loginForm,
new CustomerUserProvider(),
array(
'username_field_name', 'email'
'username_field_name' => 'email'
)
);
}

View File

@@ -0,0 +1,62 @@
<?php
/*************************************************************************************/
/* */
/* Thelia */
/* */
/* Copyright (c) OpenStudio */
/* email : info@thelia.net */
/* web : http://www.thelia.net */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 3 of the License */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* */
/*************************************************************************************/
namespace Thelia\Core\Template;
use Thelia\Model\ConfigQuery;
use Thelia\Core\HttpFoundation\Request;
use Thelia\Tools\URL;
/**
* The parser context is an application-wide context, which stores var-value pairs.
* Theses pairs are injected in the parser and becomes available to the templates.
*
* @author Franck Allimant <franck@cqfdev.fr>
*/
class ParserContext implements \IteratorAggregate
{
private $store = array();
public function __construct(Request $request) {
// Setup basic variables
$this
->set('base_url' , ConfigQuery::read('base_url', '/'))
->set('index_page' , URL::getIndexPage())
->set('return_to_url' , URL::absoluteUrl($request->getSession()->getReturnToUrl()))
;
}
public function set($name, $value) {
$this->store[$name] = $value;
return $this;
}
public function get($name) {
return $this->store[$name];
}
public function getIterator() {
return new \ArrayIterator( $this->store );
}
}

View File

@@ -73,7 +73,7 @@ class SmartyAssetsManager
$url = $this->assetic_manager->asseticize(
$asset_dir.'/'.$asset_file,
$this->web_root."/".$this->path_relative_to_web_root,
URL::absoluteUrl($this->path_relative_to_web_root),
URL::absoluteUrl($this->path_relative_to_web_root, array(), true /* path only */),
$assetType,
$filters,
$debug

View File

@@ -47,7 +47,7 @@ class UrlGenerator implements SmartyPluginInterface
public function generateUrlFunction($params, &$smarty)
{
// the path to process
$path =trim($params['path']);
$path = trim($params['path']);
return URL::absoluteUrl($path, $this->getArgsFromParam($params));
}
@@ -61,10 +61,17 @@ class UrlGenerator implements SmartyPluginInterface
*/
public function generateViewUrlFunction($params, &$smarty)
{
// the path to process
// the view name (without .html)
$view = trim($params['view']);
return URL::viewUrl($view, $this->getArgsFromParam($params));
// the related action (optionale)
$action = trim($params['action']);
$args = $this->getArgsFromParam($params);
if (! empty($action)) $args['action'] = $action;
return URL::viewUrl($view, $args);
}
/**
@@ -82,18 +89,6 @@ class UrlGenerator implements SmartyPluginInterface
return array();
}
/**
* Process view url generator function
*
* @param array $params
* @param unknown $smarty
* @return string no text is returned.
*/
public function generateReturnToUrl($params, &$smarty)
{
return URL::absoluteUrl($this->request->getSession()->getReturnToUrl());
}
/**
* Define the various smarty plugins hendled by this class
*
@@ -103,8 +98,7 @@ class UrlGenerator implements SmartyPluginInterface
{
return array(
new SmartyPluginDescriptor('function', 'url', $this, 'generateUrlFunction'),
new SmartyPluginDescriptor('function', 'viewurl', $this, 'generateViewUrlFunction'),
new SmartyPluginDescriptor('function', 'return_to_url', $this, 'generateReturnToUrl')
new SmartyPluginDescriptor('function', 'viewurl', $this, 'generateViewUrlFunction')
);
}
}

View File

@@ -12,6 +12,8 @@ use Thelia\Core\Template\ParserInterface;
use Thelia\Core\Template\Smarty\SmartyPluginInterface;
use Thelia\Core\Template\Exception\ResourceNotFoundException;
use Thelia\Core\Template\ParserContext;
use Thelia\Model\ConfigQuery;
/**
*
@@ -23,7 +25,9 @@ class SmartyParser extends Smarty implements ParserInterface
public $plugins = array();
protected $request, $dispatcher;
protected $request;
protected $dispatcher;
protected $parserContext;
protected $template = "";
@@ -36,12 +40,15 @@ class SmartyParser extends Smarty implements ParserInterface
* @param string $env
* @param bool $debug
*/
public function __construct(Request $request, EventDispatcherInterface $dispatcher, $template = false, $env = "prod", $debug = false)
public function __construct(
Request $request, EventDispatcherInterface $dispatcher, ParserContext $parserContext,
$template = false, $env = "prod", $debug = false)
{
parent::__construct();
$this->request = $request;
$this->dispatcher = $dispatcher;
$this->parserContext = $parserContext;
// Configure basic Smarty parameters
@@ -51,11 +58,11 @@ class SmartyParser extends Smarty implements ParserInterface
$cache_dir = THELIA_ROOT . 'cache/'. $env .'/smarty/cache';
if (! is_dir($cache_dir)) @mkdir($cache_dir, 0777, true);
$this->setTemplate($template ?: 'smarty-sample'); // FIXME: put this in configuration
$this->setCompileDir($compile_dir);
$this->setCacheDir($cache_dir);
$this->setTemplate($template ?: ConfigQuery::read('active-template', 'default'));
$this->debugging = $debug;
// Prevent smarty ErrorException: Notice: Undefined index bla bla bla...
@@ -110,8 +117,13 @@ class SmartyParser extends Smarty implements ParserInterface
* @param array $parameters an associative array of names / value pairs
* @return string the rendered template text
*/
public function render($realTemplateName, array $parameters)
public function render($realTemplateName, array $parameters = array())
{
// Assign the parserContext variables
foreach($this->parserContext as $var => $value) {
$this->assign($var, $value);
}
$this->assign($parameters);
return $this->fetch($realTemplateName);
@@ -126,11 +138,12 @@ class SmartyParser extends Smarty implements ParserInterface
{
try {
$templateFile = $this->getTemplateFilePath();
} catch(\RuntimeException $e) {
}
catch(\RuntimeException $e) {
return new Response($e->getMessage(), "404");
}
return $this->fetch($templateFile);
return $this->render($templateFile);
}
/**

View File

@@ -46,7 +46,6 @@ class AdminLogin extends BaseForm {
->add("remember_me", "checkbox", array(
'value' => 'yes'
))
->add("success_url", "text")
;
}

View File

@@ -31,6 +31,7 @@ use Symfony\Component\Form\Extension\Csrf\CsrfExtension;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider;
use Symfony\Component\Validator\Validation;
use Thelia\Model\ConfigQuery;
use Thelia\Tools\URL;
abstract class BaseForm {
/**
@@ -72,7 +73,7 @@ abstract class BaseForm {
// If not already set, define the success_url field
if (! $this->formBuilder->has('success_url')) {
$this->formBuilder->add("success_url", "text")
$this->formBuilder->add("success_url", "text");
}
$this->form = $this->formBuilder->getForm();

View File

@@ -46,7 +46,6 @@ class CustomerLogin extends BaseForm {
)
))
->add("remember_me", "checkbox")
->add("success_url", "text")
;
}

View File

@@ -149,11 +149,11 @@ abstract class Address implements ActiveRecordInterface
protected $cellphone;
/**
* The value for the default field.
* The value for the is_default field.
* Note: this column has a database default value of: 0
* @var int
*/
protected $default;
protected $is_default;
/**
* The value for the created_at field.
@@ -193,7 +193,7 @@ abstract class Address implements ActiveRecordInterface
*/
public function applyDefaultValues()
{
$this->default = 0;
$this->is_default = 0;
}
/**
@@ -618,14 +618,14 @@ abstract class Address implements ActiveRecordInterface
}
/**
* Get the [default] column value.
* Get the [is_default] column value.
*
* @return int
*/
public function getDefault()
public function getIsDefault()
{
return $this->default;
return $this->is_default;
}
/**
@@ -992,25 +992,25 @@ abstract class Address implements ActiveRecordInterface
} // setCellphone()
/**
* Set the value of [default] column.
* Set the value of [is_default] column.
*
* @param int $v new value
* @return \Thelia\Model\Address The current object (for fluent API support)
*/
public function setDefault($v)
public function setIsDefault($v)
{
if ($v !== null) {
$v = (int) $v;
}
if ($this->default !== $v) {
$this->default = $v;
$this->modifiedColumns[] = AddressTableMap::DEFAULT;
if ($this->is_default !== $v) {
$this->is_default = $v;
$this->modifiedColumns[] = AddressTableMap::IS_DEFAULT;
}
return $this;
} // setDefault()
} // setIsDefault()
/**
* Sets the value of [created_at] column to a normalized version of the date/time value specified.
@@ -1064,7 +1064,7 @@ abstract class Address implements ActiveRecordInterface
*/
public function hasOnlyDefaultValues()
{
if ($this->default !== 0) {
if ($this->is_default !== 0) {
return false;
}
@@ -1140,8 +1140,8 @@ abstract class Address implements ActiveRecordInterface
$col = $row[TableMap::TYPE_NUM == $indexType ? 14 + $startcol : AddressTableMap::translateFieldName('Cellphone', TableMap::TYPE_PHPNAME, $indexType)];
$this->cellphone = (null !== $col) ? (string) $col : null;
$col = $row[TableMap::TYPE_NUM == $indexType ? 15 + $startcol : AddressTableMap::translateFieldName('Default', TableMap::TYPE_PHPNAME, $indexType)];
$this->default = (null !== $col) ? (int) $col : null;
$col = $row[TableMap::TYPE_NUM == $indexType ? 15 + $startcol : AddressTableMap::translateFieldName('IsDefault', TableMap::TYPE_PHPNAME, $indexType)];
$this->is_default = (null !== $col) ? (int) $col : null;
$col = $row[TableMap::TYPE_NUM == $indexType ? 16 + $startcol : AddressTableMap::translateFieldName('CreatedAt', TableMap::TYPE_PHPNAME, $indexType)];
if ($col === '0000-00-00 00:00:00') {
@@ -1454,8 +1454,8 @@ abstract class Address implements ActiveRecordInterface
if ($this->isColumnModified(AddressTableMap::CELLPHONE)) {
$modifiedColumns[':p' . $index++] = 'CELLPHONE';
}
if ($this->isColumnModified(AddressTableMap::DEFAULT)) {
$modifiedColumns[':p' . $index++] = 'DEFAULT';
if ($this->isColumnModified(AddressTableMap::IS_DEFAULT)) {
$modifiedColumns[':p' . $index++] = 'IS_DEFAULT';
}
if ($this->isColumnModified(AddressTableMap::CREATED_AT)) {
$modifiedColumns[':p' . $index++] = 'CREATED_AT';
@@ -1519,8 +1519,8 @@ abstract class Address implements ActiveRecordInterface
case 'CELLPHONE':
$stmt->bindValue($identifier, $this->cellphone, PDO::PARAM_STR);
break;
case 'DEFAULT':
$stmt->bindValue($identifier, $this->default, PDO::PARAM_INT);
case 'IS_DEFAULT':
$stmt->bindValue($identifier, $this->is_default, PDO::PARAM_INT);
break;
case 'CREATED_AT':
$stmt->bindValue($identifier, $this->created_at ? $this->created_at->format("Y-m-d H:i:s") : null, PDO::PARAM_STR);
@@ -1636,7 +1636,7 @@ abstract class Address implements ActiveRecordInterface
return $this->getCellphone();
break;
case 15:
return $this->getDefault();
return $this->getIsDefault();
break;
case 16:
return $this->getCreatedAt();
@@ -1688,7 +1688,7 @@ abstract class Address implements ActiveRecordInterface
$keys[12] => $this->getCountryId(),
$keys[13] => $this->getPhone(),
$keys[14] => $this->getCellphone(),
$keys[15] => $this->getDefault(),
$keys[15] => $this->getIsDefault(),
$keys[16] => $this->getCreatedAt(),
$keys[17] => $this->getUpdatedAt(),
);
@@ -1785,7 +1785,7 @@ abstract class Address implements ActiveRecordInterface
$this->setCellphone($value);
break;
case 15:
$this->setDefault($value);
$this->setIsDefault($value);
break;
case 16:
$this->setCreatedAt($value);
@@ -1832,7 +1832,7 @@ abstract class Address implements ActiveRecordInterface
if (array_key_exists($keys[12], $arr)) $this->setCountryId($arr[$keys[12]]);
if (array_key_exists($keys[13], $arr)) $this->setPhone($arr[$keys[13]]);
if (array_key_exists($keys[14], $arr)) $this->setCellphone($arr[$keys[14]]);
if (array_key_exists($keys[15], $arr)) $this->setDefault($arr[$keys[15]]);
if (array_key_exists($keys[15], $arr)) $this->setIsDefault($arr[$keys[15]]);
if (array_key_exists($keys[16], $arr)) $this->setCreatedAt($arr[$keys[16]]);
if (array_key_exists($keys[17], $arr)) $this->setUpdatedAt($arr[$keys[17]]);
}
@@ -1861,7 +1861,7 @@ abstract class Address implements ActiveRecordInterface
if ($this->isColumnModified(AddressTableMap::COUNTRY_ID)) $criteria->add(AddressTableMap::COUNTRY_ID, $this->country_id);
if ($this->isColumnModified(AddressTableMap::PHONE)) $criteria->add(AddressTableMap::PHONE, $this->phone);
if ($this->isColumnModified(AddressTableMap::CELLPHONE)) $criteria->add(AddressTableMap::CELLPHONE, $this->cellphone);
if ($this->isColumnModified(AddressTableMap::DEFAULT)) $criteria->add(AddressTableMap::DEFAULT, $this->default);
if ($this->isColumnModified(AddressTableMap::IS_DEFAULT)) $criteria->add(AddressTableMap::IS_DEFAULT, $this->is_default);
if ($this->isColumnModified(AddressTableMap::CREATED_AT)) $criteria->add(AddressTableMap::CREATED_AT, $this->created_at);
if ($this->isColumnModified(AddressTableMap::UPDATED_AT)) $criteria->add(AddressTableMap::UPDATED_AT, $this->updated_at);
@@ -1941,7 +1941,7 @@ abstract class Address implements ActiveRecordInterface
$copyObj->setCountryId($this->getCountryId());
$copyObj->setPhone($this->getPhone());
$copyObj->setCellphone($this->getCellphone());
$copyObj->setDefault($this->getDefault());
$copyObj->setIsDefault($this->getIsDefault());
$copyObj->setCreatedAt($this->getCreatedAt());
$copyObj->setUpdatedAt($this->getUpdatedAt());
if ($makeNew) {
@@ -2094,7 +2094,7 @@ abstract class Address implements ActiveRecordInterface
$this->country_id = null;
$this->phone = null;
$this->cellphone = null;
$this->default = null;
$this->is_default = null;
$this->created_at = null;
$this->updated_at = null;
$this->alreadyInSave = false;

View File

@@ -36,7 +36,7 @@ use Thelia\Model\Map\AddressTableMap;
* @method ChildAddressQuery orderByCountryId($order = Criteria::ASC) Order by the country_id column
* @method ChildAddressQuery orderByPhone($order = Criteria::ASC) Order by the phone column
* @method ChildAddressQuery orderByCellphone($order = Criteria::ASC) Order by the cellphone column
* @method ChildAddressQuery orderByDefault($order = Criteria::ASC) Order by the default column
* @method ChildAddressQuery orderByIsDefault($order = Criteria::ASC) Order by the is_default column
* @method ChildAddressQuery orderByCreatedAt($order = Criteria::ASC) Order by the created_at column
* @method ChildAddressQuery orderByUpdatedAt($order = Criteria::ASC) Order by the updated_at column
*
@@ -55,7 +55,7 @@ use Thelia\Model\Map\AddressTableMap;
* @method ChildAddressQuery groupByCountryId() Group by the country_id column
* @method ChildAddressQuery groupByPhone() Group by the phone column
* @method ChildAddressQuery groupByCellphone() Group by the cellphone column
* @method ChildAddressQuery groupByDefault() Group by the default column
* @method ChildAddressQuery groupByIsDefault() Group by the is_default column
* @method ChildAddressQuery groupByCreatedAt() Group by the created_at column
* @method ChildAddressQuery groupByUpdatedAt() Group by the updated_at column
*
@@ -89,7 +89,7 @@ use Thelia\Model\Map\AddressTableMap;
* @method ChildAddress findOneByCountryId(int $country_id) Return the first ChildAddress filtered by the country_id column
* @method ChildAddress findOneByPhone(string $phone) Return the first ChildAddress filtered by the phone column
* @method ChildAddress findOneByCellphone(string $cellphone) Return the first ChildAddress filtered by the cellphone column
* @method ChildAddress findOneByDefault(int $default) Return the first ChildAddress filtered by the default column
* @method ChildAddress findOneByIsDefault(int $is_default) Return the first ChildAddress filtered by the is_default column
* @method ChildAddress findOneByCreatedAt(string $created_at) Return the first ChildAddress filtered by the created_at column
* @method ChildAddress findOneByUpdatedAt(string $updated_at) Return the first ChildAddress filtered by the updated_at column
*
@@ -108,7 +108,7 @@ use Thelia\Model\Map\AddressTableMap;
* @method array findByCountryId(int $country_id) Return ChildAddress objects filtered by the country_id column
* @method array findByPhone(string $phone) Return ChildAddress objects filtered by the phone column
* @method array findByCellphone(string $cellphone) Return ChildAddress objects filtered by the cellphone column
* @method array findByDefault(int $default) Return ChildAddress objects filtered by the default column
* @method array findByIsDefault(int $is_default) Return ChildAddress objects filtered by the is_default column
* @method array findByCreatedAt(string $created_at) Return ChildAddress objects filtered by the created_at column
* @method array findByUpdatedAt(string $updated_at) Return ChildAddress objects filtered by the updated_at column
*
@@ -199,7 +199,7 @@ abstract class AddressQuery extends ModelCriteria
*/
protected function findPkSimple($key, $con)
{
$sql = 'SELECT ID, TITLE, CUSTOMER_ID, CUSTOMER_TITLE_ID, COMPANY, FIRSTNAME, LASTNAME, ADDRESS1, ADDRESS2, ADDRESS3, ZIPCODE, CITY, COUNTRY_ID, PHONE, CELLPHONE, DEFAULT, CREATED_AT, UPDATED_AT FROM address WHERE ID = :p0';
$sql = 'SELECT ID, TITLE, CUSTOMER_ID, CUSTOMER_TITLE_ID, COMPANY, FIRSTNAME, LASTNAME, ADDRESS1, ADDRESS2, ADDRESS3, ZIPCODE, CITY, COUNTRY_ID, PHONE, CELLPHONE, IS_DEFAULT, CREATED_AT, UPDATED_AT FROM address WHERE ID = :p0';
try {
$stmt = $con->prepare($sql);
$stmt->bindValue(':p0', $key, PDO::PARAM_INT);
@@ -776,16 +776,16 @@ abstract class AddressQuery extends ModelCriteria
}
/**
* Filter the query on the default column
* Filter the query on the is_default column
*
* Example usage:
* <code>
* $query->filterByDefault(1234); // WHERE default = 1234
* $query->filterByDefault(array(12, 34)); // WHERE default IN (12, 34)
* $query->filterByDefault(array('min' => 12)); // WHERE default > 12
* $query->filterByIsDefault(1234); // WHERE is_default = 1234
* $query->filterByIsDefault(array(12, 34)); // WHERE is_default IN (12, 34)
* $query->filterByIsDefault(array('min' => 12)); // WHERE is_default > 12
* </code>
*
* @param mixed $default The value to use as filter.
* @param mixed $isDefault The value to use as filter.
* Use scalar values for equality.
* Use array values for in_array() equivalent.
* Use associative array('min' => $minValue, 'max' => $maxValue) for intervals.
@@ -793,16 +793,16 @@ abstract class AddressQuery extends ModelCriteria
*
* @return ChildAddressQuery The current query, for fluid interface
*/
public function filterByDefault($default = null, $comparison = null)
public function filterByIsDefault($isDefault = null, $comparison = null)
{
if (is_array($default)) {
if (is_array($isDefault)) {
$useMinMax = false;
if (isset($default['min'])) {
$this->addUsingAlias(AddressTableMap::DEFAULT, $default['min'], Criteria::GREATER_EQUAL);
if (isset($isDefault['min'])) {
$this->addUsingAlias(AddressTableMap::IS_DEFAULT, $isDefault['min'], Criteria::GREATER_EQUAL);
$useMinMax = true;
}
if (isset($default['max'])) {
$this->addUsingAlias(AddressTableMap::DEFAULT, $default['max'], Criteria::LESS_EQUAL);
if (isset($isDefault['max'])) {
$this->addUsingAlias(AddressTableMap::IS_DEFAULT, $isDefault['max'], Criteria::LESS_EQUAL);
$useMinMax = true;
}
if ($useMinMax) {
@@ -813,7 +813,7 @@ abstract class AddressQuery extends ModelCriteria
}
}
return $this->addUsingAlias(AddressTableMap::DEFAULT, $default, $comparison);
return $this->addUsingAlias(AddressTableMap::IS_DEFAULT, $isDefault, $comparison);
}
/**

View File

@@ -15,6 +15,7 @@ use Thelia\Core\Security\User\UserInterface;
use Propel\Runtime\Connection\ConnectionInterface;
use Propel\Runtime\Propel;
use Thelia\Model\Map\CustomerTableMap;
use Thelia\Core\Security\Role\Role;
/**
* Skeleton subclass for representing a row from the 'customer' table.
@@ -87,7 +88,7 @@ class Customer extends BaseCustomer implements UserInterface
->setCellphone($cellphone)
->setZipcode($zipcode)
->setCountryId($countryId)
->setDefault(1)
->setIsDefault(1)
->setCustomer($this)
->save($con);
@@ -114,7 +115,7 @@ class Customer extends BaseCustomer implements UserInterface
protected function generateRef()
{
return date("YmdHI");
return date("YmdHisu");
}
public function setPassword($password)

View File

@@ -145,9 +145,9 @@ class AddressTableMap extends TableMap
const CELLPHONE = 'address.CELLPHONE';
/**
* the column name for the DEFAULT field
* the column name for the IS_DEFAULT field
*/
const DEFAULT = 'address.DEFAULT';
const IS_DEFAULT = 'address.IS_DEFAULT';
/**
* the column name for the CREATED_AT field
@@ -171,11 +171,11 @@ class AddressTableMap extends TableMap
* e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id'
*/
protected static $fieldNames = array (
self::TYPE_PHPNAME => array('Id', 'Title', 'CustomerId', 'CustomerTitleId', 'Company', 'Firstname', 'Lastname', 'Address1', 'Address2', 'Address3', 'Zipcode', 'City', 'CountryId', 'Phone', 'Cellphone', 'Default', 'CreatedAt', 'UpdatedAt', ),
self::TYPE_STUDLYPHPNAME => array('id', 'title', 'customerId', 'customerTitleId', 'company', 'firstname', 'lastname', 'address1', 'address2', 'address3', 'zipcode', 'city', 'countryId', 'phone', 'cellphone', 'default', 'createdAt', 'updatedAt', ),
self::TYPE_COLNAME => array(AddressTableMap::ID, AddressTableMap::TITLE, AddressTableMap::CUSTOMER_ID, AddressTableMap::CUSTOMER_TITLE_ID, AddressTableMap::COMPANY, AddressTableMap::FIRSTNAME, AddressTableMap::LASTNAME, AddressTableMap::ADDRESS1, AddressTableMap::ADDRESS2, AddressTableMap::ADDRESS3, AddressTableMap::ZIPCODE, AddressTableMap::CITY, AddressTableMap::COUNTRY_ID, AddressTableMap::PHONE, AddressTableMap::CELLPHONE, AddressTableMap::DEFAULT, AddressTableMap::CREATED_AT, AddressTableMap::UPDATED_AT, ),
self::TYPE_RAW_COLNAME => array('ID', 'TITLE', 'CUSTOMER_ID', 'CUSTOMER_TITLE_ID', 'COMPANY', 'FIRSTNAME', 'LASTNAME', 'ADDRESS1', 'ADDRESS2', 'ADDRESS3', 'ZIPCODE', 'CITY', 'COUNTRY_ID', 'PHONE', 'CELLPHONE', 'DEFAULT', 'CREATED_AT', 'UPDATED_AT', ),
self::TYPE_FIELDNAME => array('id', 'title', 'customer_id', 'customer_title_id', 'company', 'firstname', 'lastname', 'address1', 'address2', 'address3', 'zipcode', 'city', 'country_id', 'phone', 'cellphone', 'default', 'created_at', 'updated_at', ),
self::TYPE_PHPNAME => array('Id', 'Title', 'CustomerId', 'CustomerTitleId', 'Company', 'Firstname', 'Lastname', 'Address1', 'Address2', 'Address3', 'Zipcode', 'City', 'CountryId', 'Phone', 'Cellphone', 'IsDefault', 'CreatedAt', 'UpdatedAt', ),
self::TYPE_STUDLYPHPNAME => array('id', 'title', 'customerId', 'customerTitleId', 'company', 'firstname', 'lastname', 'address1', 'address2', 'address3', 'zipcode', 'city', 'countryId', 'phone', 'cellphone', 'isDefault', 'createdAt', 'updatedAt', ),
self::TYPE_COLNAME => array(AddressTableMap::ID, AddressTableMap::TITLE, AddressTableMap::CUSTOMER_ID, AddressTableMap::CUSTOMER_TITLE_ID, AddressTableMap::COMPANY, AddressTableMap::FIRSTNAME, AddressTableMap::LASTNAME, AddressTableMap::ADDRESS1, AddressTableMap::ADDRESS2, AddressTableMap::ADDRESS3, AddressTableMap::ZIPCODE, AddressTableMap::CITY, AddressTableMap::COUNTRY_ID, AddressTableMap::PHONE, AddressTableMap::CELLPHONE, AddressTableMap::IS_DEFAULT, AddressTableMap::CREATED_AT, AddressTableMap::UPDATED_AT, ),
self::TYPE_RAW_COLNAME => array('ID', 'TITLE', 'CUSTOMER_ID', 'CUSTOMER_TITLE_ID', 'COMPANY', 'FIRSTNAME', 'LASTNAME', 'ADDRESS1', 'ADDRESS2', 'ADDRESS3', 'ZIPCODE', 'CITY', 'COUNTRY_ID', 'PHONE', 'CELLPHONE', 'IS_DEFAULT', 'CREATED_AT', 'UPDATED_AT', ),
self::TYPE_FIELDNAME => array('id', 'title', 'customer_id', 'customer_title_id', 'company', 'firstname', 'lastname', 'address1', 'address2', 'address3', 'zipcode', 'city', 'country_id', 'phone', 'cellphone', 'is_default', 'created_at', 'updated_at', ),
self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, )
);
@@ -186,11 +186,11 @@ class AddressTableMap extends TableMap
* e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0
*/
protected static $fieldKeys = array (
self::TYPE_PHPNAME => array('Id' => 0, 'Title' => 1, 'CustomerId' => 2, 'CustomerTitleId' => 3, 'Company' => 4, 'Firstname' => 5, 'Lastname' => 6, 'Address1' => 7, 'Address2' => 8, 'Address3' => 9, 'Zipcode' => 10, 'City' => 11, 'CountryId' => 12, 'Phone' => 13, 'Cellphone' => 14, 'Default' => 15, 'CreatedAt' => 16, 'UpdatedAt' => 17, ),
self::TYPE_STUDLYPHPNAME => array('id' => 0, 'title' => 1, 'customerId' => 2, 'customerTitleId' => 3, 'company' => 4, 'firstname' => 5, 'lastname' => 6, 'address1' => 7, 'address2' => 8, 'address3' => 9, 'zipcode' => 10, 'city' => 11, 'countryId' => 12, 'phone' => 13, 'cellphone' => 14, 'default' => 15, 'createdAt' => 16, 'updatedAt' => 17, ),
self::TYPE_COLNAME => array(AddressTableMap::ID => 0, AddressTableMap::TITLE => 1, AddressTableMap::CUSTOMER_ID => 2, AddressTableMap::CUSTOMER_TITLE_ID => 3, AddressTableMap::COMPANY => 4, AddressTableMap::FIRSTNAME => 5, AddressTableMap::LASTNAME => 6, AddressTableMap::ADDRESS1 => 7, AddressTableMap::ADDRESS2 => 8, AddressTableMap::ADDRESS3 => 9, AddressTableMap::ZIPCODE => 10, AddressTableMap::CITY => 11, AddressTableMap::COUNTRY_ID => 12, AddressTableMap::PHONE => 13, AddressTableMap::CELLPHONE => 14, AddressTableMap::DEFAULT => 15, AddressTableMap::CREATED_AT => 16, AddressTableMap::UPDATED_AT => 17, ),
self::TYPE_RAW_COLNAME => array('ID' => 0, 'TITLE' => 1, 'CUSTOMER_ID' => 2, 'CUSTOMER_TITLE_ID' => 3, 'COMPANY' => 4, 'FIRSTNAME' => 5, 'LASTNAME' => 6, 'ADDRESS1' => 7, 'ADDRESS2' => 8, 'ADDRESS3' => 9, 'ZIPCODE' => 10, 'CITY' => 11, 'COUNTRY_ID' => 12, 'PHONE' => 13, 'CELLPHONE' => 14, 'DEFAULT' => 15, 'CREATED_AT' => 16, 'UPDATED_AT' => 17, ),
self::TYPE_FIELDNAME => array('id' => 0, 'title' => 1, 'customer_id' => 2, 'customer_title_id' => 3, 'company' => 4, 'firstname' => 5, 'lastname' => 6, 'address1' => 7, 'address2' => 8, 'address3' => 9, 'zipcode' => 10, 'city' => 11, 'country_id' => 12, 'phone' => 13, 'cellphone' => 14, 'default' => 15, 'created_at' => 16, 'updated_at' => 17, ),
self::TYPE_PHPNAME => array('Id' => 0, 'Title' => 1, 'CustomerId' => 2, 'CustomerTitleId' => 3, 'Company' => 4, 'Firstname' => 5, 'Lastname' => 6, 'Address1' => 7, 'Address2' => 8, 'Address3' => 9, 'Zipcode' => 10, 'City' => 11, 'CountryId' => 12, 'Phone' => 13, 'Cellphone' => 14, 'IsDefault' => 15, 'CreatedAt' => 16, 'UpdatedAt' => 17, ),
self::TYPE_STUDLYPHPNAME => array('id' => 0, 'title' => 1, 'customerId' => 2, 'customerTitleId' => 3, 'company' => 4, 'firstname' => 5, 'lastname' => 6, 'address1' => 7, 'address2' => 8, 'address3' => 9, 'zipcode' => 10, 'city' => 11, 'countryId' => 12, 'phone' => 13, 'cellphone' => 14, 'isDefault' => 15, 'createdAt' => 16, 'updatedAt' => 17, ),
self::TYPE_COLNAME => array(AddressTableMap::ID => 0, AddressTableMap::TITLE => 1, AddressTableMap::CUSTOMER_ID => 2, AddressTableMap::CUSTOMER_TITLE_ID => 3, AddressTableMap::COMPANY => 4, AddressTableMap::FIRSTNAME => 5, AddressTableMap::LASTNAME => 6, AddressTableMap::ADDRESS1 => 7, AddressTableMap::ADDRESS2 => 8, AddressTableMap::ADDRESS3 => 9, AddressTableMap::ZIPCODE => 10, AddressTableMap::CITY => 11, AddressTableMap::COUNTRY_ID => 12, AddressTableMap::PHONE => 13, AddressTableMap::CELLPHONE => 14, AddressTableMap::IS_DEFAULT => 15, AddressTableMap::CREATED_AT => 16, AddressTableMap::UPDATED_AT => 17, ),
self::TYPE_RAW_COLNAME => array('ID' => 0, 'TITLE' => 1, 'CUSTOMER_ID' => 2, 'CUSTOMER_TITLE_ID' => 3, 'COMPANY' => 4, 'FIRSTNAME' => 5, 'LASTNAME' => 6, 'ADDRESS1' => 7, 'ADDRESS2' => 8, 'ADDRESS3' => 9, 'ZIPCODE' => 10, 'CITY' => 11, 'COUNTRY_ID' => 12, 'PHONE' => 13, 'CELLPHONE' => 14, 'IS_DEFAULT' => 15, 'CREATED_AT' => 16, 'UPDATED_AT' => 17, ),
self::TYPE_FIELDNAME => array('id' => 0, 'title' => 1, 'customer_id' => 2, 'customer_title_id' => 3, 'company' => 4, 'firstname' => 5, 'lastname' => 6, 'address1' => 7, 'address2' => 8, 'address3' => 9, 'zipcode' => 10, 'city' => 11, 'country_id' => 12, 'phone' => 13, 'cellphone' => 14, 'is_default' => 15, 'created_at' => 16, 'updated_at' => 17, ),
self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, )
);
@@ -225,7 +225,7 @@ class AddressTableMap extends TableMap
$this->addColumn('COUNTRY_ID', 'CountryId', 'INTEGER', true, null, null);
$this->addColumn('PHONE', 'Phone', 'VARCHAR', false, 20, null);
$this->addColumn('CELLPHONE', 'Cellphone', 'VARCHAR', false, 20, null);
$this->addColumn('DEFAULT', 'Default', 'TINYINT', false, null, 0);
$this->addColumn('IS_DEFAULT', 'IsDefault', 'TINYINT', false, null, 0);
$this->addColumn('CREATED_AT', 'CreatedAt', 'TIMESTAMP', false, null, null);
$this->addColumn('UPDATED_AT', 'UpdatedAt', 'TIMESTAMP', false, null, null);
} // initialize()
@@ -405,7 +405,7 @@ class AddressTableMap extends TableMap
$criteria->addSelectColumn(AddressTableMap::COUNTRY_ID);
$criteria->addSelectColumn(AddressTableMap::PHONE);
$criteria->addSelectColumn(AddressTableMap::CELLPHONE);
$criteria->addSelectColumn(AddressTableMap::DEFAULT);
$criteria->addSelectColumn(AddressTableMap::IS_DEFAULT);
$criteria->addSelectColumn(AddressTableMap::CREATED_AT);
$criteria->addSelectColumn(AddressTableMap::UPDATED_AT);
} else {
@@ -424,7 +424,7 @@ class AddressTableMap extends TableMap
$criteria->addSelectColumn($alias . '.COUNTRY_ID');
$criteria->addSelectColumn($alias . '.PHONE');
$criteria->addSelectColumn($alias . '.CELLPHONE');
$criteria->addSelectColumn($alias . '.DEFAULT');
$criteria->addSelectColumn($alias . '.IS_DEFAULT');
$criteria->addSelectColumn($alias . '.CREATED_AT');
$criteria->addSelectColumn($alias . '.UPDATED_AT');
}

View File

@@ -27,19 +27,30 @@ use Thelia\Model\ConfigQuery;
class URL
{
public static function getIndexPage() {
return ConfigQuery::read('base_url', '/') . "index_dev.php"; // FIXME !
}
/**
* Returns the Absolute URL for a given path relative to web root
* Returns the Absolute URL for a given path relative to web root. By default,
* the index.php (or index_dev.php) script name is added to the URL, use
* $path_only = true to get a path without the index script.
*
* @param string $path the relative path
* @param mixed $parameters An array of parameters
* @param string $path the relative path
* @param array $parameters An array of parameters
* @param boolean $path_only if true, getIndexPage() will not be added
*
* @return string The generated URL
*/
public static function absoluteUrl($path, array $parameters = array())
public static function absoluteUrl($path, array $parameters = array(), $path_only = false)
{
// Already absolute ?
if (substr($path, 0, 4) != 'http')
$base = ConfigQuery::read('base_url', '/') . ltrim($path, '/');
if (substr($path, 0, 4) != 'http') {
$root = $path_only ? ConfigQuery::read('base_url', '/') : self::getIndexPage();
$base = $root . $path;
}
else
$base = $path;
@@ -49,7 +60,9 @@ class URL
$queryString = sprintf("%s=%s&", urlencode($name), urlencode($value));
}
if ('' !== $queryString = rtrim($queryString, "&")) $queryString = '?' . $queryString;
$sepChar = strstr($base, '?') === false ? '?' : '&';
if ('' !== $queryString = rtrim($queryString, "&")) $queryString = $sepChar . $queryString;
return $base . $queryString;
}
@@ -63,7 +76,8 @@ class URL
* @return string The generated URL
*/
public static function viewUrl($viewName, array $parameters = array()) {
$path = sprintf("%s?view=%s", ConfigQuery::read('base_url', '/'), $viewName);
$path = sprintf("%s?view=%s", self::getIndexPage(), $viewName);
return self::absoluteUrl($path, $parameters);
}