Merge branch 'master' of https://github.com/thelia/thelia into coupon

# By Manuel Raynaud (18) and others
# Via franck (9) and others
* 'master' of https://github.com/thelia/thelia: (39 commits)
  Working :
  Working :
  Working :
  Working :
  Fixed minor visual glitches
  Working : Resize countries flag + Add bootstrap-switch
  fix test suite
  clear asset cache in cache:cler command
  Added a 'development mode' to assetic smarty plugin
  rewriting router
  use good Request object
  Added Tools\URL test case, and a test case superclass for initializing Tools\URL
  remove unused UrlWritin controller
  create router for rewriting matching
  customer substitutions
  fix typo in front id
  Working : For attributes on labels
  Working : For attributes on labels
  add label_attr attribute to form smarty plugin
  start refactorin rewriting routing
  ...

Conflicts:
	core/lib/Thelia/Config/Resources/routing/front.xml
	templates/admin/default/assets/less/thelia/bootstrap-editable.less
	templates/admin/default/categories.html
This commit is contained in:
gmorel
2013-09-06 19:36:52 +02:00
118 changed files with 4702 additions and 1831 deletions

View File

@@ -32,7 +32,7 @@ use Thelia\Model\Customer;
* @package Thelia\Core\Event
* @author Manuel Raynaud <mraynaud@openstudio.fr>
*/
class AddressCreateOrUpdateEvent extends Event
class AddressCreateOrUpdateEvent extends ActionEvent
{
/**
* @var string address label

View File

@@ -0,0 +1,54 @@
<?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\Event;
use Symfony\Component\EventDispatcher\Event;
use Thelia\Model\Address;
/**
* Class AddressEvent
* @package Thelia\Core\Event
* @author Manuel Raynaud <mraynaud@openstudio.fr>
*/
class AddressEvent extends ActionEvent
{
/**
* @var \Thelia\Model\Address
*/
protected $address;
function __construct(Address $address)
{
$this->address = $address;
}
/**
* @return \Thelia\Model\Address
*/
public function getAddress()
{
return $this->address;
}
}

View File

@@ -0,0 +1,77 @@
<?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\Event;
class BaseUpdatePositionEvent extends ActionEvent
{
const POSITION_UP = 1;
const POSITION_DOWN = 2;
const POSITION_ABSOLUTE = 3;
protected $object_id;
protected $mode;
protected $position;
protected $object;
public function __construct($object_id, $mode, $position = null)
{
$this->object_id = $object_id;
$this->mode = $mode;
$this->position = $position;
}
public function getMode()
{
return $this->mode;
}
public function setMode($mode)
{
$this->mode = $mode;
return $this;
}
public function getPosition()
{
return $this->position;
}
public function setPosition($position)
{
$this->position = $position;
return $this;
}
public function getObjectId()
{
return $this->object_id;
}
public function setObjectId($object_id)
{
$this->object_id = $object_id;
return $this;
}
}

View File

@@ -26,7 +26,7 @@ namespace Thelia\Core\Event;
use Symfony\Component\EventDispatcher\Event;
use Thelia\Model\Cart;
class CartEvent extends Event
class CartEvent extends ActionEvent
{
protected $cart;
protected $quantity;

View File

@@ -22,64 +22,7 @@
/*************************************************************************************/
namespace Thelia\Core\Event;
use Thelia\Model\Category;
class CategoryChangePositionEvent extends ActionEvent
class CurrencyUpdatePositionEvent extends BaseUpdatePositionEvent
{
const POSITION_UP = 1;
const POSITION_DOWN = 2;
const POSITION_ABSOLUTE = 3;
protected $category_id;
protected $mode;
protected $position;
protected $category;
public function __construct($category_id, $mode, $position = null)
{
$this->category_id = $category_id;
$this->mode = $mode;
$this->position = $position;
}
public function getMode()
{
return $this->mode;
}
public function setMode($mode)
{
$this->mode = $mode;
}
public function getPosition()
{
return $this->position;
}
public function setPosition($position)
{
$this->position = $position;
}
public function getCategory()
{
return $this->category;
}
public function setCategory($category)
{
$this->category = $category;
}
public function getCategoryId()
{
return $this->category_id;
}
public function setCategoryId($category_id)
{
$this->category_id = $category_id;
}
}
}

View File

@@ -25,7 +25,7 @@ namespace Thelia\Core\Event;
use Thelia\Model\Category;
class CategoryCreateEvent extends ActionEvent
class CategoryUpdateEvent extends ActionEvent
{
protected $category_id;
protected $locale;

View File

@@ -25,7 +25,7 @@ namespace Thelia\Core\Event;
use Thelia\Model\Config;
class ConfigChangeEvent extends ConfigCreateEvent
class ConfigUpdateEvent extends ConfigCreateEvent
{
protected $config_id;

View File

@@ -24,7 +24,7 @@
namespace Thelia\Core\Event;
use Thelia\Model\Currency;
class CurrencyChangeEvent extends CurrencyCreateEvent
class CurrencyUpdateEvent extends CurrencyCreateEvent
{
protected $currency_id;
protected $is_default;

View File

@@ -0,0 +1,28 @@
<?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\Event;
class CurrencyUpdatePositionEvent extends BaseUpdatePositionEvent
{
}

View File

@@ -13,7 +13,7 @@ namespace Thelia\Core\Event;
use Symfony\Component\EventDispatcher\Event;
use Thelia\Model\Customer;
class CustomerCreateOrUpdateEvent extends Event {
class CustomerCreateOrUpdateEvent extends ActionEvent {
//base parameters for creating new customer
protected $title;

View File

@@ -25,7 +25,7 @@ namespace Thelia\Core\Event;
use Thelia\Model\Message;
class MessageChangeEvent extends MessageCreateEvent
class MessageUpdateEvent extends MessageCreateEvent
{
protected $message_id;

View File

@@ -88,12 +88,13 @@ final class TheliaEvents
/**
* Sent once the customer change form has been successfully validated, and before customer update in the database.
*/
const BEFORE_CHANGECUSTOMER = "action.before_updateCustomer";
const BEFORE_UPDATECUSTOMER = "action.before_updateCustomer";
/**
* Sent just after a successful update of a customer in the database.
*/
const AFTER_CHANGECUSTOMER = "action.after_updateCustomer";
const AFTER_UPDATECUSTOMER = "action.after_updateCustomer";
// -- ADDRESS MANAGEMENT ---------------------------------------------------------
/**
* sent for address creation
*/
@@ -104,6 +105,17 @@ final class TheliaEvents
*/
const ADDRESS_UPDATE = "action.updateAddress";
const BEFORE_CREATEADDRESS = "action.before_createAddress";
const AFTER_CREATEADDRESS = "action.after_createAddress";
const BEFORE_UPDATEADDRESS = "action.before_updateAddress";
const AFTER_UPDATEADDRESS = "action.after_updateAddress";
const BEFORE_DELETEADDRESS = "action.before_deleteAddress";
const AFTER_DELETEADDRESS = "action.after_deleteAddress";
// -- END ADDRESS MANAGEMENT ---------------------------------------------------------
/**
* Sent once the category creation form has been successfully validated, and before category insertion in the database.
*/
@@ -124,7 +136,7 @@ final class TheliaEvents
/**
* Change category position
*/
const CATEGORY_CHANGE_POSITION = "action.changeCategoryPosition";
const CATEGORY_CHANGE_POSITION = "action.updateCategoryPosition";
/**
* Sent just after a successful insert of a new category in the database.
@@ -344,12 +356,12 @@ final class TheliaEvents
// -- Currencies management ---------------------------------------------
const CURRENCY_CREATE = "action.createCurrency";
const CURRENCY_UPDATE = "action.updateCurrency";
const CURRENCY_DELETE = "action.deleteCurrency";
const CURRENCY_SET_DEFAULT = "action.setDefaultCurrency";
const CURRENCY_UPDATE_RATES = "action.updateCurrencyRates";
const CURRENCY_CREATE = "action.createCurrency";
const CURRENCY_UPDATE = "action.updateCurrency";
const CURRENCY_DELETE = "action.deleteCurrency";
const CURRENCY_SET_DEFAULT = "action.setDefaultCurrency";
const CURRENCY_UPDATE_RATES = "action.updateCurrencyRates";
const CURRENCY_UPDATE_POSITION = "action.updateCurrencyPosition";
const BEFORE_CREATECURRENCY = "action.before_createCurrency";
const AFTER_CREATECURRENCY = "action.after_createCurrency";

View File

@@ -86,7 +86,7 @@ class ViewListener implements EventSubscriberInterface
} catch (AuthenticationException $ex) {
// Redirect to the login template
Redirect::exec(URL::viewUrl($ex->getLoginTemplate()));
Redirect::exec($this->container->get('thelia.url.manager')->viewUrl($ex->getLoginTemplate()));
}
}

View File

@@ -41,55 +41,29 @@ use Thelia\Model\Lang;
*/
class Session extends BaseSession
{
// -- Language ------------------------------------------------------------
public function getLocale()
{
return $this->get("locale", "en_US");
}
public function setLocale($locale)
{
$this->set("locale", $locale);
return $this;
}
/**
* @return \Thelia\Model\Lang|null
*/
public function getLang()
{
return $this->get("lang");
return $this->get("thelia.current.lang", Lang::getDefaultLanguage());
}
public function setLang(Lang $lang)
{
$this->set("lang", $lang);
$this->set("thelia.current.lang", $lang);
return $this;
}
public function getLangId()
public function getAdminEditionLang()
{
return $this->get("lang_id", Lang::getDefaultLanguage()->getId());
return $this->get('thelia.admin.edition.lang', Lang::getDefaultLanguage());
}
public function setLangId($langId)
public function setAdminEditionLang($langId)
{
$this->set("lang_id", $langId);
return $this;
}
public function getAdminEditionLangId()
{
return $this->get('admin.edition_language', Lang::getDefaultLanguage()->getId());
}
public function setAdminEditionLangId($langId)
{
$this->set('admin.edition_language', $langId);
$this->set('thelia.admin.edition.lang', $langId);
return $this;
}
@@ -98,43 +72,43 @@ class Session extends BaseSession
public function setCustomerUser(UserInterface $user)
{
$this->set('customer_user', $user);
$this->set('thelia.customer_user', $user);
return $this;
}
public function getCustomerUser()
{
return $this->get('customer_user');
return $this->get('thelia.customer_user');
}
public function clearCustomerUser()
{
return $this->remove('customer_user');
return $this->remove('thelia.customer_user');
}
// -- Admin user -----------------------------------------------------------
public function setAdminUser(UserInterface $user)
{
$this->set('admin_user', $user);
$this->set('thelia.admin_user', $user);
return $this;
}
public function getAdminUser()
{
return $this->get('admin_user');
return $this->get('thelia.admin_user');
}
public function clearAdminUser()
{
return $this->remove('admin_user');
return $this->remove('thelia.admin_user');
}
// -- Return page ----------------------------------------------------------
public function setReturnToUrl($url)
{
$this->set('return_to_url', $url);
$this->set('thelia.return_to_url', $url);
return $this;
}
@@ -144,7 +118,7 @@ class Session extends BaseSession
*/
public function getReturnToUrl()
{
return $this->get('return_to_url', URL::getIndexPage());
return $this->get('thelia.return_to_url', URL::getInstance()->getIndexPage());
}
// -- Cart ------------------------------------------------------------------
@@ -156,7 +130,7 @@ class Session extends BaseSession
*/
public function getCart()
{
$cart_id = $this->get("cart_id");
$cart_id = $this->get("thelia.cart_id");
$cart = null;
if ($cart_id) {
$cart = CartQuery::create()->findPk($cart_id);
@@ -193,7 +167,7 @@ class Session extends BaseSession
*/
public function setCart($cart_id)
{
$this->set("cart_id", $cart_id);
$this->set("thelia.cart_id", $cart_id);
return $this;
}
}
}

View File

@@ -0,0 +1,219 @@
<?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\Routing;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Exception\InvalidParameterException;
use Symfony\Component\Routing\Exception\MethodNotAllowedException;
use Symfony\Component\Routing\Exception\MissingMandatoryParametersException;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\Exception\RouteNotFoundException;
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\RouterInterface;
use Thelia\Exception\RedirectException;
use Thelia\Exception\UrlRewritingException;
use Thelia\Model\ConfigQuery;
use Thelia\Tools\Redirect;
use Thelia\Tools\URL;
/**
* Class RewritingRouter
* @package Thelia\Core\Routing
* @author Manuel Raynaud <mraynaud@openstudio.fr>
* @author Etienne Roudeix <eroudeix@openstudio.fr>
*/
class RewritingRouter implements RouterInterface, RequestMatcherInterface
{
/**
* @var RequestContext The context
*/
protected $context;
/**
* @var options, don't use for now but mandatory
*/
protected $options;
/**
* Sets the request context.
*
* @param RequestContext $context The context
*
* @api
*/
public function setContext(RequestContext $context)
{
// TODO: Implement setContext() method.
$this->context = $context;
}
/**
* Gets the request context.
*
* @return RequestContext The context
*
* @api
*/
public function getContext()
{
// TODO: Implement getContext() method.
return $this->context;
}
public function setOption($key, $value)
{
//NOTHING TO DO FOR NOW
}
/**
* Gets the RouteCollection instance associated with this Router.
*
* @return RouteCollection A RouteCollection instance
*/
public function getRouteCollection()
{
return new RouteCollection();
}
/**
* Generates a URL or path for a specific route based on the given parameters.
*
* Parameters that reference placeholders in the route pattern will substitute them in the
* path or host. Extra params are added as query string to the URL.
*
* When the passed reference type cannot be generated for the route because it requires a different
* host or scheme than the current one, the method will return a more comprehensive reference
* that includes the required params. For example, when you call this method with $referenceType = ABSOLUTE_PATH
* but the route requires the https scheme whereas the current scheme is http, it will instead return an
* ABSOLUTE_URL with the https scheme and the current host. This makes sure the generated URL matches
* the route in any case.
*
* If there is no route with the given name, the generator must throw the RouteNotFoundException.
*
* @param string $name The name of the route
* @param mixed $parameters An array of parameters
* @param Boolean|string $referenceType The type of reference to be generated (one of the constants)
*
* @return string The generated URL
*
* @throws RouteNotFoundException If the named route doesn't exist
* @throws MissingMandatoryParametersException When some parameters are missing that are mandatory for the route
* @throws InvalidParameterException When a parameter value for a placeholder is not correct because
* it does not match the requirement
*
* @api
*/
public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH)
{
// TODO: Implement generate() method.
}
/**
* Tries to match a URL path with a set of routes.
*
* If the matcher can not find information, it must throw one of the exceptions documented
* below.
*
* @param string $pathinfo The path info to be parsed (raw format, i.e. not urldecoded)
*
* @return array An array of parameters
*
* @throws ResourceNotFoundException If the resource could not be found
* @throws MethodNotAllowedException If the resource was found but the request method is not allowed
*
* @api
*/
public function match($pathinfo)
{
throw new ResourceNotFoundException("impossible to find route with this method, please use matchRequest method");
}
/**
* Tries to match a request with a set of routes.
*
* If the matcher can not find information, it must throw one of the exceptions documented
* below.
*
* @param Request $request The request to match
*
* @throws \Exception|\Thelia\Exception\UrlRewritingException
* @throws \Symfony\Component\Routing\Exception\ResourceNotFoundException
* @throws \Thelia\Exception\RedirectException
* @return array An array of parameters
*
*/
public function matchRequest(Request $request)
{
if(ConfigQuery::isRewritingEnable()) {
try {
$rewrittenUrlData = URL::getInstance()->resolve($request->getPathInfo());
} catch(UrlRewritingException $e) {
switch($e->getCode()) {
case UrlRewritingException::URL_NOT_FOUND :
throw new ResourceNotFoundException();
break;
default:
throw $e;
}
}
/* is the URL redirected ? */
if(null !== $rewrittenUrlData->redirectedToUrl) {
$this->redirect($rewrittenUrlData->redirectedToUrl, 301);
}
/* define GET arguments in request */
if(null !== $rewrittenUrlData->view) {
$request->attributes->set('_view', $rewrittenUrlData->view);
if(null !== $rewrittenUrlData->viewId) {
$request->query->set($rewrittenUrlData->view . '_id', $rewrittenUrlData->viewId);
}
}
if(null !== $rewrittenUrlData->locale) {
$request->query->set('locale', $rewrittenUrlData->locale);
}
foreach($rewrittenUrlData->otherParameters as $parameter => $value) {
$request->query->set($parameter, $value);
}
return array (
'_controller' => 'Thelia\\Controller\\Front\\DefaultController::noAction',
'_route' => 'rewrite',
'_rewritten' => true,
);
}
throw new ResourceNotFoundException();
}
protected function redirect($url, $status = 302)
{
Redirect::exec($url, $status);
}
}

View File

@@ -43,15 +43,16 @@ class AsseticHelper
* Generates assets from $asset_path in $output_path, using $filters.
*
* @param string $asset_path the full path to the asset file (or file collection)
* @param unknown $output_path the full disk path to the output directory (shoud be visible to web server)
* @param unknown $output_url the URL to the generated asset directory
* @param unknown $asset_type the asset type: css, js, ... The generated files will have this extension. Pass an empty string to use the asset source extension.
* @param unknown $filters a list of filters, as defined below (see switch($filter_name) ...)
* @param unknown $debug true / false
* @param string $output_path the full disk path to the output directory (shoud be visible to web server)
* @param string $output_url the URL to the generated asset directory
* @param string $asset_type the asset type: css, js, ... The generated files will have this extension. Pass an empty string to use the asset source extension.
* @param array $filters a list of filters, as defined below (see switch($filter_name) ...)
* @param boolean $debug true / false
* @param boolean $dev_mode true / false. If true, assets are not cached and always compiled.
* @throws \InvalidArgumentException if an invalid filter name is found
* @return string The URL to the generated asset file.
*/
public function asseticize($asset_path, $output_path, $output_url, $asset_type, $filters, $debug)
public function asseticize($asset_path, $output_path, $output_url, $asset_type, $filters, $debug, $dev_mode = false)
{
$asset_name = basename($asset_path);
$asset_dir = dirname($asset_path);
@@ -106,17 +107,49 @@ class AsseticHelper
$factory->setDebug($debug);
$factory->addWorker(new CacheBustingWorker());
$factory->addWorker(new CacheBustingWorker('-'));
// Prepare the assets writer
$writer = new AssetWriter($output_path);
// We do not pass the filter list here, juste to get the asset file name
$asset = $factory->createAsset($asset_name);
$asset = $factory->createAsset($asset_name, $filter_list);
$asset_target_path = $asset->getTargetPath();
$cache = new AssetCache($asset, new FilesystemCache($output_path));
$target_file = sprintf("%s/%s", $output_path, $asset_target_path);
$writer->writeAsset($cache);
// As it seems that assetic cannot handle a real file cache, let's do the job ourselves.
// It works only if the CacheBustingWorker is used, as a new file name is generated for each version.
//
// the previous version of the file is deleted, by getting the first part of the ouput file name
// (the one before '-'), and delete aby file beginning with the same string. Example:
// old name: 3bc974a-dfacc1f.css
// new name: 3bc974a-ad3ef47.css
//
// before generating 3bc974a-ad3ef47.css, delete 3bc974a-* files.
//
if ($dev_mode == true || ! file_exists($target_file)) {
return rtrim($output_url, '/').'/'.$asset->getTargetPath();
// Delete previous version of the file
list($commonPart, $dummy) = explode('-', $asset_target_path);
foreach (glob("$output_path/$commonPart-*") as $filename) {
@unlink($filename);
}
// Apply filters now
foreach ($filter_list as $filter) {
if ('?' != $filter[0]) {
$asset->ensureFilter($fm->get($filter));
}
elseif (!$debug) {
$asset->ensureFilter($fm->get(substr($filter, 1)));
}
}
$writer = new AssetWriter($output_path);
$writer->writeAsset($asset);
}
return rtrim($output_url, '/').'/'.$asset_target_path;
}
}

View File

@@ -69,7 +69,7 @@ abstract class BaseI18nLoop extends BaseLoop
$this->getBackend_context(),
$this->getLang(),
$search,
$this->request->getSession()->getLocale(),
$this->request->getSession()->getLang()->getLocale(),
$columns,
$foreignTable,
$foreignKey,

View File

@@ -239,31 +239,6 @@ abstract class BaseLoop
}
}
/**
* Setup ModelCriteria for proper i18n processing
*
* @param ModelCriteria $search the Propel Criteria to configure
* @param array $columns the i18n columns
* @param string $foreignTable the specified table (default to criteria table)
* @param string $foreignKey the foreign key in this table (default to criteria table)
*
* @return mixed the locale
*/
protected function configureI18nProcessing(ModelCriteria $search, $columns = array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM'), $foreignTable = null, $foreignKey = 'ID', $forceReturn = false) {
/* manage translations */
return ModelCriteriaTools::getI18n(
$this->getBackend_context(),
$this->getLang(),
$search,
$this->request->getSession()->getLocale(),
$columns,
$foreignTable,
$foreignKey,
$forceReturn
);
}
/**
*
* this function have to be implement in your own loop class.

View File

@@ -64,7 +64,7 @@ class Address extends BaseLoop
),
'current'
),
Argument::createBooleanTypeArgument('default'),
Argument::createBooleanTypeArgument('default', false),
Argument::createIntListTypeArgument('exclude')
);
}
@@ -99,10 +99,9 @@ class Address extends BaseLoop
$default = $this->getDefault();
if ($default === true) {
$search->filterByIsDefault(1, Criteria::EQUAL);
} elseif ($default === false) {
$search->filterByIsDefault(1, Criteria::NOT_EQUAL);
}
$exclude = $this->getExclude();
@@ -119,7 +118,7 @@ class Address extends BaseLoop
$loopResultRow = new LoopResultRow($loopResult, $address, $this->versionable, $this->timestampable, $this->countable);
$loopResultRow
->set("ID", $address->getId())
->set("NAME", $address->getName())
->set("LABEL", $address->getLabel())
->set("CUSTOMER", $address->getCustomerId())
->set("TITLE", $address->getTitleId())
->set("COMPANY", $address->getCompany())

View File

@@ -71,10 +71,12 @@ class Cart extends BaseLoop
*/
public function exec(&$pagination)
{
$cartItems = $cart->getCartItems();
$result = new LoopResult($cartItems);
$cart = $this->getCart($this->request);
$cartItems = $cart->getCartItems();
$result = new LoopResult($cartItems);
if ($cart === null) {
return $result;

View File

@@ -166,7 +166,7 @@ class Config extends BaseI18nLoop
->set("POSTSCRIPTUM" , $result->getVirtualColumn('i18n_POSTSCRIPTUM'))
->set("HIDDEN" , $result->getHidden())
->set("SECURED" , $result->getSecured())
;
;
$loopResult->addRow($loopResultRow);
}

View File

@@ -34,18 +34,22 @@ class SmartyAssetsManager
private $web_root;
private $path_relative_to_web_root;
private $developmentMode;
/**
* Creates a new SmartyAssetsManager instance
*
* @param string $web_root the disk path to the web root
* @param string $path_relative_to_web_root the path (relative to web root) where the assets will be generated
* @param string $web_root the disk path to the web root
* @param string $path_relative_to_web_root the path (relative to web root) where the assets will be generated
* @param boolean $developmentMode true / false. If true, assets are not cached, and always generated.
*/
public function __construct($web_root, $path_relative_to_web_root)
public function __construct($web_root, $path_relative_to_web_root, $developmentMode)
{
$this->web_root = $web_root;
$this->path_relative_to_web_root = $path_relative_to_web_root;
$this->developmentMode = $developmentMode;
$this->assetic_manager = new AsseticHelper();
}
@@ -70,10 +74,11 @@ 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, null, URL::PATH_TO_FILE /* path only */),
URL::getInstance()->absoluteUrl($this->path_relative_to_web_root, null, URL::PATH_TO_FILE /* path only */),
$assetType,
$filters,
$debug
$debug,
$this->developmentMode
);
return $url;

View File

@@ -70,12 +70,12 @@ class AdminUtilities extends AbstractSmartyPlugin
if ($permissions == null || $this->securityContext->isGranted("ADMIN", array($permission))) {
return sprintf(
'<a href="%s"><i class="icon-arrow-up"></i></a><span class="%s" data-id="%s">%s</span><a href="%s"><i class="icon-arrow-down"></i></a>',
URL::absoluteUrl("$path/positionUp", array($url_parameter => $id)),
'<a href="%s"><i class="glyphicon glyphicon-arrow-up"></i></a><span class="%s" data-id="%s">%s</span><a href="%s"><i class="glyphicon glyphicon-arrow-down"></i></a>',
URL::getInstance()->absoluteUrl($path, array('mode' => 'up', $url_parameter => $id)),
$in_place_edit_class,
$id,
$position,
URL::absoluteUrl("$path/positionDown", array($url_parameter => $id))
URL::getInstance()->absoluteUrl($path, array('mode' => 'down', $url_parameter => $id))
);
}
else {
@@ -121,11 +121,11 @@ class AdminUtilities extends AbstractSmartyPlugin
}
if (! empty($icon))
$output = sprintf('<i class="icon icon-chevron-%s"></i> ', $icon);
$output = sprintf('<i class="glyphicon glyphicon-chevron-%s"></i> ', $icon);
else
$output = '';
return sprintf('%s<a href="%s">%s</a>', $output, URL::absoluteUrl($path, array('order' => $order_change)), $label);
return sprintf('%s<a href="%s">%s</a>', $output, URL::getInstance()->absoluteUrl($path, array('order' => $order_change)), $label);
}

View File

@@ -32,13 +32,13 @@ class Assetic extends AbstractSmartyPlugin
{
public $assetManager;
public function __construct()
public function __construct($developmentMode)
{
$web_root = THELIA_WEB_DIR;
$asset_dir_from_web_root = ConfigQuery::read('asset_dir_from_web_root', 'assets');
$this->assetManager = new SmartyAssetsManager($web_root, $asset_dir_from_web_root);
$this->assetManager = new SmartyAssetsManager($web_root, $asset_dir_from_web_root, $developmentMode == 'dev');
}
public function blockJavascripts($params, $content, \Smarty_Internal_Template $template, &$repeat)

View File

@@ -68,14 +68,14 @@ class DataAccessFunctions extends AbstractSmartyPlugin
}
/**
* Provides access to user attributes using the accessors.
* @param $objectLabel
* @param $user
* @param $params
*
* @param array $params
* @param unknown $smarty
* @return string the value of the requested attribute
* @throws InvalidArgumentException if the object does not have the requested attribute.
* @return string
* @throws \InvalidArgumentException
*/
protected function userDataAccess($objectLabel, $user, $params)
protected function userDataAccess($objectLabel, $user, $params)
{
$attribute = $this->getNormalizedParam($params, array('attribute', 'attrib', 'attr'));

View File

@@ -130,6 +130,7 @@ class Form extends AbstractSmartyPlugin
}
$template->assign("label", $formFieldView->vars["label"]);
$template->assign("label_attr", $formFieldView->vars["label_attr"]);
$errors = $formFieldView->vars["errors"];

View File

@@ -136,8 +136,23 @@ class TheliaLoop extends AbstractSmartyPlugin
}
if ($loopResults->valid()) {
$loopResultRow = $loopResults->current();
// On first iteration, save variables that may be overwritten by this loop
if (! isset($this->varstack[$name])) {
$saved_vars = array();
$varlist = $loopResultRow->getVars();
foreach ($varlist as $var) {
$saved_vars[$var] = $template->getTemplateVars($var);
}
$this->varstack[$name] = $saved_vars;
}
foreach ($loopResultRow->getVarVal() as $var => $val) {
$template->assign($var, $val);
}

View File

@@ -51,7 +51,7 @@ class UrlGenerator extends AbstractSmartyPlugin
$target = $this->getParam($params, 'target', null);
$url = URL::absoluteUrl($path, $this->getArgsFromParam($params, array('path', 'target')));
$url = URL::getInstance()->absoluteUrl($path, $this->getArgsFromParam($params, array('path', 'target')));
if ($target != null) $url .= '#'.$target;
@@ -102,7 +102,7 @@ class UrlGenerator extends AbstractSmartyPlugin
$args = $this->getArgsFromParam($params, array('view', 'action', 'target'));
if (! empty($action)) $args['action'] = $action;
return $forAdmin ? URL::adminViewUrl($view, $args) : URL::viewUrl($view, $args);
return $forAdmin ? URL::getInstance()->adminViewUrl($view, $args) : URL::getInstance()->viewUrl($view, $args);
}
/**
@@ -169,16 +169,16 @@ class UrlGenerator extends AbstractSmartyPlugin
protected function getCurrentUrl()
{
return URL::init()->retrieveCurrent($this->request)->toString();
return URL::getInstance()->retrieveCurrent($this->request)->toString();
}
protected function getReturnToUrl()
{
return URL::absoluteUrl($this->request->getSession()->getReturnToUrl());
return URL::getInstance()->absoluteUrl($this->request->getSession()->getReturnToUrl());
}
protected function getIndexUrl()
{
return Url::getIndexPage();
return URL::getInstance()->getIndexPage();
}
}

View File

@@ -66,6 +66,8 @@ class SmartyParser extends Smarty implements ParserInterface
$this->debugging = $debug;
$this->escape_html = true;
// Prevent smarty ErrorException: Notice: Undefined index bla bla bla...
$this->error_reporting = E_ALL ^ E_NOTICE;

View File

@@ -122,6 +122,11 @@ class TheliaHttpKernel extends HttpKernel
*/
protected function initParam(Request $request)
{
// Ensure an instaciation of URL service, which is accessed as a pseudo-singleton
// in the rest of the application.
// See Thelia\Tools\URL class.
$this->container->get('thelia.url.manager');
$lang = $this->detectLang($request);
if ($lang) {
@@ -139,6 +144,7 @@ class TheliaHttpKernel extends HttpKernel
protected function detectLang(Request $request)
{
$lang = null;
//first priority => lang parameter present in request (get or post)
if ($request->query->has("lang")) {
$lang = Model\LangQuery::create()->findOneByCode($request->query->get("lang"));