diff --git a/core/bootstrap.php b/core/bootstrap.php index 72c003da9..7023fb46b 100755 --- a/core/bootstrap.php +++ b/core/bootstrap.php @@ -5,13 +5,13 @@ * @file * Functions needed for Thelia bootstrap */ -define('THELIA_ROOT' , rtrim(realpath(__DIR__ .'/../'),'/') . "/"); -define('THELIA_LOCAL_DIR' , THELIA_ROOT . 'local/'); -define('THELIA_CONF_DIR' , THELIA_LOCAL_DIR . 'config/'); -define('THELIA_MODULE_DIR' , THELIA_LOCAL_DIR . 'modules/'); -define('THELIA_WEB_DIR' , THELIA_ROOT . 'web/'); -define('THELIA_TEMPLATE_DIR' , THELIA_ROOT . 'templates/'); define('DS' , DIRECTORY_SEPARATOR); +define('THELIA_ROOT' , rtrim(realpath(dirname(__DIR__)), DS) . DS); +define('THELIA_LOCAL_DIR' , THELIA_ROOT . 'local' . DS); +define('THELIA_CONF_DIR' , THELIA_LOCAL_DIR . 'config' . DS); +define('THELIA_MODULE_DIR' , THELIA_LOCAL_DIR . 'modules' . DS); +define('THELIA_WEB_DIR' , THELIA_ROOT . 'web' . DS); +define('THELIA_TEMPLATE_DIR' , THELIA_ROOT . 'templates' . DS); $loader = require __DIR__ . "/vendor/autoload.php"; diff --git a/core/lib/Thelia/Action/Customer.php b/core/lib/Thelia/Action/Customer.php index 9fee8b69e..34f0b418c 100755 --- a/core/lib/Thelia/Action/Customer.php +++ b/core/lib/Thelia/Action/Customer.php @@ -83,9 +83,10 @@ class Customer extends BaseAction implements EventSubscriberInterface public function delete(CustomerEvent $event) { - $customer = $event->getCustomer(); + if (null !== $customer = $event->getCustomer()) { - $customer->delete(); + $customer->delete(); + } } private function createOrUpdateCustomer(CustomerModel $customer, CustomerCreateOrUpdateEvent $event) diff --git a/core/lib/Thelia/Config/Resources/routing/admin.xml b/core/lib/Thelia/Config/Resources/routing/admin.xml index 52af62c45..684a953ae 100755 --- a/core/lib/Thelia/Config/Resources/routing/admin.xml +++ b/core/lib/Thelia/Config/Resources/routing/admin.xml @@ -109,19 +109,17 @@ - Thelia\Controller\Admin\CustomerController::indexAction + Thelia\Controller\Admin\CustomerController::defaultAction - - Thelia\Controller\Admin\CustomerController::viewAction - \d+ - - - + Thelia\Controller\Admin\CustomerController::updateAction - \d+ + + Thelia\Controller\Admin\CustomerController::processUpdateAction + + Thelia\Controller\Admin\CustomerController::deleteAction @@ -146,14 +144,12 @@ Thelia\Controller\Admin\AddressController::createAction - + Thelia\Controller\Admin\AddressController::updateAction - \d+ - + Thelia\Controller\Admin\AddressController::processUpdateAction - \d+ diff --git a/core/lib/Thelia/Config/Resources/smarty-plugin.xml b/core/lib/Thelia/Config/Resources/smarty-plugin.xml index 0d0b7ed15..9ea787534 100644 --- a/core/lib/Thelia/Config/Resources/smarty-plugin.xml +++ b/core/lib/Thelia/Config/Resources/smarty-plugin.xml @@ -4,23 +4,21 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://thelia.net/schema/dic/config http://thelia.net/schema/dic/config/thelia-1.0.xsd"> - - - - - - - + + + %kernel.environment% + - + - %kernel.environment% + + diff --git a/core/lib/Thelia/Controller/Admin/AbstractCrudController.php b/core/lib/Thelia/Controller/Admin/AbstractCrudController.php index 689ac9b1b..11ed4fc50 100644 --- a/core/lib/Thelia/Controller/Admin/AbstractCrudController.php +++ b/core/lib/Thelia/Controller/Admin/AbstractCrudController.php @@ -267,7 +267,7 @@ abstract class AbstractCrudController extends BaseAdminController */ public function defaultAction() { - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::VIEW)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::VIEW)) return $response; return $this->renderList(); } @@ -279,7 +279,7 @@ abstract class AbstractCrudController extends BaseAdminController public function createAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::CREATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::CREATE)) return $response; $error_msg = false; @@ -340,7 +340,7 @@ abstract class AbstractCrudController extends BaseAdminController public function updateAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; // Load the object $object = $this->getExistingObject(); @@ -366,7 +366,7 @@ abstract class AbstractCrudController extends BaseAdminController public function processUpdateAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $error_msg = false; @@ -431,7 +431,7 @@ abstract class AbstractCrudController extends BaseAdminController public function updatePositionAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; try { $mode = $this->getRequest()->get('mode', null); @@ -465,7 +465,7 @@ abstract class AbstractCrudController extends BaseAdminController protected function genericUpdatePositionAction($object, $eventName, $doFinalRedirect = true) { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; if ($object != null) { @@ -499,7 +499,7 @@ abstract class AbstractCrudController extends BaseAdminController public function setToggleVisibilityAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $changeEvent = $this->createToggleVisibilityEvent($this->getRequest()); @@ -521,7 +521,7 @@ abstract class AbstractCrudController extends BaseAdminController public function deleteAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::DELETE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::DELETE)) return $response; // Get the currency id, and dispatch the delet request $deleteEvent = $this->getDeleteEvent(); diff --git a/core/lib/Thelia/Controller/Admin/AddressController.php b/core/lib/Thelia/Controller/Admin/AddressController.php index 26f97c9b3..3e2812bd0 100644 --- a/core/lib/Thelia/Controller/Admin/AddressController.php +++ b/core/lib/Thelia/Controller/Admin/AddressController.php @@ -42,7 +42,7 @@ class AddressController extends AbstractCrudController public function __construct() { parent::__construct( - 'address', + 'registration_date', null, null, @@ -50,16 +50,13 @@ class AddressController extends AbstractCrudController TheliaEvents::ADDRESS_CREATE, TheliaEvents::ADDRESS_UPDATE, - TheliaEvents::ADDRESS_DELETE, - null, - null - + TheliaEvents::ADDRESS_DELETE ); } public function useAddressAction() { - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $address_id = $this->getRequest()->request->get('address_id'); @@ -79,7 +76,7 @@ class AddressController extends AbstractCrudController \Thelia\Log\Tlog::getInstance()->error(sprintf("error during address setting as default with message %s", $e->getMessage())); } - $this->redirectToRoute('admin.customer.update.view', array(), array('customer_id' => $address->getCustomerId())); + $this->redirectToEditionTemplate(); } /** @@ -99,13 +96,14 @@ class AddressController extends AbstractCrudController } /** - * Hydrate the update form for this object, before passing it to the update template + * Fills in the form data array * - * @param \Thelia\Model\Address $object + * @param unknown $object + * @return multitype:NULL */ - protected function hydrateObjectForm($object) + protected function createFormDataArray($object) { - $data = array( + return array( "label" => $object->getLabel(), "title" => $object->getTitleId(), "firstname" => $object->getFirstname(), @@ -120,8 +118,16 @@ class AddressController extends AbstractCrudController "phone" => $object->getPhone(), "company" => $object->getCompany() ); + } - return new AddressUpdateForm($this->getRequest(), "form", $data); + /** + * Hydrate the update form for this object, before passing it to the update template + * + * @param \Thelia\Model\Address $object + */ + protected function hydrateObjectForm($object) + { + return new AddressUpdateForm($this->getRequest(), "form", $this->createFormDataArray($object)); } /** @@ -240,7 +246,8 @@ class AddressController extends AbstractCrudController */ protected function renderListTemplate($currentOrder) { - // TODO: Implement renderListTemplate() method. + // We render here the customer edit template. + return $this->renderEditionTemplate(); } /** @@ -248,9 +255,10 @@ class AddressController extends AbstractCrudController */ protected function renderEditionTemplate() { - return $this->render('ajax/address-update-modal', array( - "address_id" => $this->getRequest()->get('address_id'), - "customer_id" => $this->getExistingObject()->getCustomerId() + return $this->render('customer-edit', array( + "address_id" => $this->getRequest()->get('address_id'), + "page" => $this->getRequest()->get('page'), + "customer_id" => $this->getCustomerId() )); } @@ -259,8 +267,11 @@ class AddressController extends AbstractCrudController */ protected function redirectToEditionTemplate() { - $address = $this->getExistingObject(); - $this->redirectToRoute('admin.customer.update.view', array(), array('customer_id' => $address->getCustomerId())); + // We display here the custromer edition template + $this->redirectToRoute('admin.customer.update.view', array( + "page" => $this->getRequest()->get('page'), + "customer_id" => $this->getCustomerId() + )); } /** @@ -279,8 +290,7 @@ class AddressController extends AbstractCrudController */ protected function performAdditionalDeleteAction($deleteEvent) { - $address = $deleteEvent->getAddress(); - $this->redirectToRoute('admin.customer.update.view', array(), array('customer_id' => $address->getCustomerId())); + $this->redirectToEditionTemplate(); } /** @@ -298,4 +308,11 @@ class AddressController extends AbstractCrudController { $this->redirectToEditionTemplate(); } + + protected function getCustomerId() { + if (null !== $address = $this->getExistingObject()) + return $address->getCustomerId(); + else + return $this->getRequest()->get('customer_id', 0); + } } diff --git a/core/lib/Thelia/Controller/Admin/AdminLogsController.php b/core/lib/Thelia/Controller/Admin/AdminLogsController.php index 1c7b6542f..5f3fadb0f 100644 --- a/core/lib/Thelia/Controller/Admin/AdminLogsController.php +++ b/core/lib/Thelia/Controller/Admin/AdminLogsController.php @@ -32,7 +32,7 @@ class AdminLogsController extends BaseAdminController public function defaultAction() { - if (null !== $response = $this->checkAuth(self::RESOURCE_CODE, AccessManager::VIEW)) return $response; + if (null !== $response = $this->checkAuth(self::RESOURCE_CODE, array(), AccessManager::VIEW)) return $response; // Render the edition template. return $this->render('admin-logs'); diff --git a/core/lib/Thelia/Controller/Admin/AreaController.php b/core/lib/Thelia/Controller/Admin/AreaController.php index 79c549201..2464ad0cb 100644 --- a/core/lib/Thelia/Controller/Admin/AreaController.php +++ b/core/lib/Thelia/Controller/Admin/AreaController.php @@ -231,7 +231,7 @@ class AreaController extends AbstractCrudController public function addCountry() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $areaCountryForm = new AreaCountryForm($this->getRequest()); $error_msg = null; @@ -273,7 +273,7 @@ class AreaController extends AbstractCrudController public function removeCountry() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $request = $this->getRequest(); $removeCountryEvent = new AreaRemoveCountryEvent($request->request->get('areai_id', 0), $request->request->get('country_id', 0)); @@ -284,7 +284,7 @@ class AreaController extends AbstractCrudController public function updatePostageAction() { - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $areaUpdateForm = new AreaPostageForm($this->getRequest()); $error_msg = null; diff --git a/core/lib/Thelia/Controller/Admin/AttributeController.php b/core/lib/Thelia/Controller/Admin/AttributeController.php index 9644d6651..ce1ca3072 100644 --- a/core/lib/Thelia/Controller/Admin/AttributeController.php +++ b/core/lib/Thelia/Controller/Admin/AttributeController.php @@ -235,7 +235,7 @@ class AttributeController extends AbstractCrudController protected function addRemoveFromAllTemplates($eventType) { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; try { if (null !== $object = $this->getExistingObject()) { diff --git a/core/lib/Thelia/Controller/Admin/BaseAdminController.php b/core/lib/Thelia/Controller/Admin/BaseAdminController.php index a36318232..5d10c65b6 100755 --- a/core/lib/Thelia/Controller/Admin/BaseAdminController.php +++ b/core/lib/Thelia/Controller/Admin/BaseAdminController.php @@ -118,17 +118,18 @@ class BaseAdminController extends BaseController * Check current admin user authorisations. An ADMIN role is assumed. * * @param mixed $resources a single resource or an array of resources. + * @param mixed $modules a single module or an array of modules. * @param mixed $accesses a single access or an array of accesses. * * @return mixed null if authorization is granted, or a Response object which contains the error page otherwise - * */ - protected function checkAuth($resources, $accesses) + protected function checkAuth($resources, $modules, $accesses) { $resources = is_array($resources) ? $resources : array($resources); + $modules = is_array($modules) ? $modules : array($modules); $accesses = is_array($accesses) ? $accesses : array($accesses); - if ($this->getSecurityContext()->isGranted(array("ADMIN"), $resources, $accesses)) { + if ($this->getSecurityContext()->isGranted(array("ADMIN"), $resources, $modules, $accesses)) { // Okay ! return null; } diff --git a/core/lib/Thelia/Controller/Admin/CategoryController.php b/core/lib/Thelia/Controller/Admin/CategoryController.php index 018aa3586..3a8428766 100755 --- a/core/lib/Thelia/Controller/Admin/CategoryController.php +++ b/core/lib/Thelia/Controller/Admin/CategoryController.php @@ -215,7 +215,7 @@ class CategoryController extends AbstractCrudController public function setToggleVisibilityAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $event = new CategoryToggleVisibilityEvent($this->getExistingObject()); @@ -295,7 +295,7 @@ class CategoryController extends AbstractCrudController public function addRelatedContentAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $content_id = intval($this->getRequest()->get('content_id')); @@ -325,7 +325,7 @@ class CategoryController extends AbstractCrudController public function addRelatedPictureAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) { + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) { return $response; } @@ -353,7 +353,7 @@ class CategoryController extends AbstractCrudController public function deleteRelatedContentAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $content_id = intval($this->getRequest()->get('content_id')); diff --git a/core/lib/Thelia/Controller/Admin/ConfigController.php b/core/lib/Thelia/Controller/Admin/ConfigController.php index 67aec848a..fe18720b6 100644 --- a/core/lib/Thelia/Controller/Admin/ConfigController.php +++ b/core/lib/Thelia/Controller/Admin/ConfigController.php @@ -186,7 +186,7 @@ class ConfigController extends AbstractCrudController public function changeValuesAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $variables = $this->getRequest()->get('variable', array()); diff --git a/core/lib/Thelia/Controller/Admin/ContentController.php b/core/lib/Thelia/Controller/Admin/ContentController.php index 0b850734c..82d9ec8bd 100644 --- a/core/lib/Thelia/Controller/Admin/ContentController.php +++ b/core/lib/Thelia/Controller/Admin/ContentController.php @@ -69,7 +69,7 @@ class ContentController extends AbstractCrudController public function addAdditionalFolderAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $folder_id = intval($this->getRequest()->request->get('additional_folder_id')); @@ -97,7 +97,7 @@ class ContentController extends AbstractCrudController public function removeAdditionalFolderAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $folder_id = intval($this->getRequest()->request->get('additional_folder_id')); diff --git a/core/lib/Thelia/Controller/Admin/CountryController.php b/core/lib/Thelia/Controller/Admin/CountryController.php index 0ef2f1006..d950cc487 100644 --- a/core/lib/Thelia/Controller/Admin/CountryController.php +++ b/core/lib/Thelia/Controller/Admin/CountryController.php @@ -235,7 +235,7 @@ class CountryController extends AbstractCrudController public function toggleDefaultAction() { - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $content = null; if (null !== $country_id = $this->getRequest()->get('country_id')) { $toogleDefaultEvent = new CountryToggleDefaultEvent($country_id); diff --git a/core/lib/Thelia/Controller/Admin/CouponController.php b/core/lib/Thelia/Controller/Admin/CouponController.php index 0169a16b9..167a13d55 100755 --- a/core/lib/Thelia/Controller/Admin/CouponController.php +++ b/core/lib/Thelia/Controller/Admin/CouponController.php @@ -62,7 +62,7 @@ class CouponController extends BaseAdminController */ public function browseAction() { - $this->checkAuth(AdminResources::COUPON, AccessManager::VIEW); + $this->checkAuth(AdminResources::COUPON, array(), AccessManager::VIEW); $args['urlReadCoupon'] = $this->getRoute( 'admin.coupon.read', @@ -94,7 +94,7 @@ class CouponController extends BaseAdminController */ public function readAction($couponId) { - $this->checkAuth(AdminResources::COUPON, AccessManager::VIEW); + $this->checkAuth(AdminResources::COUPON, array(), AccessManager::VIEW); // Database request repeated in the loop but cached $search = CouponQuery::create(); @@ -122,7 +122,7 @@ class CouponController extends BaseAdminController public function createAction() { // Check current user authorization - $response = $this->checkAuth(AdminResources::COUPON, AccessManager::CREATE); + $response = $this->checkAuth(AdminResources::COUPON, array(), AccessManager::CREATE); if ($response !== null) { return $response; } @@ -170,7 +170,7 @@ class CouponController extends BaseAdminController public function updateAction($couponId) { // Check current user authorization - $response = $this->checkAuth(AdminResources::COUPON, AccessManager::UPDATE); + $response = $this->checkAuth(AdminResources::COUPON, array(), AccessManager::UPDATE); if ($response !== null) { return $response; } @@ -274,7 +274,7 @@ class CouponController extends BaseAdminController */ public function getConditionInputAction($conditionId) { - $this->checkAuth(AdminResources::COUPON, AccessManager::VIEW); + $this->checkAuth(AdminResources::COUPON, array(), AccessManager::VIEW); $this->checkXmlHttpRequest(); @@ -304,7 +304,7 @@ class CouponController extends BaseAdminController */ public function updateConditionsAction($couponId) { - $this->checkAuth(AdminResources::COUPON, AccessManager::VIEW); + $this->checkAuth(AdminResources::COUPON, array(), AccessManager::VIEW); $this->checkXmlHttpRequest(); diff --git a/core/lib/Thelia/Controller/Admin/CurrencyController.php b/core/lib/Thelia/Controller/Admin/CurrencyController.php index 504877157..be780a13b 100644 --- a/core/lib/Thelia/Controller/Admin/CurrencyController.php +++ b/core/lib/Thelia/Controller/Admin/CurrencyController.php @@ -185,7 +185,7 @@ class CurrencyController extends AbstractCrudController public function updateRatesAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; try { $this->dispatch(TheliaEvents::CURRENCY_UPDATE_RATES); @@ -203,7 +203,7 @@ class CurrencyController extends AbstractCrudController public function setDefaultAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $changeEvent = new CurrencyUpdateEvent($this->getRequest()->get('currency_id', 0)); diff --git a/core/lib/Thelia/Controller/Admin/CustomerController.php b/core/lib/Thelia/Controller/Admin/CustomerController.php index 9719748fc..a3239542c 100644 --- a/core/lib/Thelia/Controller/Admin/CustomerController.php +++ b/core/lib/Thelia/Controller/Admin/CustomerController.php @@ -35,171 +35,99 @@ use Thelia\Form\Exception\FormValidationException; use Thelia\Model\CustomerQuery; use Thelia\Core\Translation\Translator; use Thelia\Tools\Password; +use Thelia\Model\AddressQuery; +use Thelia\Model\Address; /** * Class CustomerController * @package Thelia\Controller\Admin * @author Manuel Raynaud */ -class CustomerController extends BaseAdminController +class CustomerController extends AbstractCrudController { - public function indexAction() + public function __construct() { - if (null !== $response = $this->checkAuth(AdminResources::CUSTOMER, AccessManager::VIEW)) return $response; - return $this->render("customers", array("display_customer" => 20)); + + parent::__construct( + 'customer', + 'lastname', + 'customer_order', + + AdminResources::CUSTOMER, + + TheliaEvents::CUSTOMER_CREATEACCOUNT, + TheliaEvents::CUSTOMER_UPDATEACCOUNT, + TheliaEvents::CUSTOMER_DELETEACCOUNT + ); } - public function viewAction($customer_id) + protected function getCreationForm() { - if (null !== $response = $this->checkAuth(AdminResources::CUSTOMER, AccessManager::VIEW)) return $response; - return $this->render("customer-edit", array( - "customer_id" => $customer_id - )); + return new CustomerCreateForm($this->getRequest()); } - /** - * update customer action - * - * @param $customer_id - * @return mixed|\Thelia\Core\HttpFoundation\Response - */ - public function updateAction($customer_id) + protected function getUpdateForm() { - if (null !== $response = $this->checkAuth(AdminResources::CUSTOMER, AccessManager::UPDATE)) return $response; - - $message = false; - - $customerUpdateForm = new CustomerUpdateForm($this->getRequest()); - - try { - $customer = CustomerQuery::create()->findPk($customer_id); - - if (null === $customer) { - throw new \InvalidArgumentException(sprintf("%d customer id does not exist", $customer_id)); - } - - $form = $this->validateForm($customerUpdateForm); - - $event = $this->createEventInstance($form->getData()); - $event->setCustomer($customer); - - $this->dispatch(TheliaEvents::CUSTOMER_UPDATEACCOUNT, $event); - - $customerUpdated = $event->getCustomer(); - - $this->adminLogAppend(AdminResources::CUSTOMER, AccessManager::UPDATE, sprintf("Customer with Ref %s (ID %d) modified", $customerUpdated->getRef() , $customerUpdated->getId())); - - if ($this->getRequest()->get("save_mode") == "close") { - $this->redirectToRoute("admin.customers"); - } else { - $this->redirectSuccess($customerUpdateForm); - } - - } catch (FormValidationException $e) { - $message = sprintf("Please check your input: %s", $e->getMessage()); - } catch (PropelException $e) { - $message = $e->getMessage(); - } catch (\Exception $e) { - $message = sprintf("Sorry, an error occured: %s", $e->getMessage()." ".$e->getFile()); - } - - if ($message !== false) { - \Thelia\Log\Tlog::getInstance()->error(sprintf("Error during customer update process : %s.", $message)); - - $customerUpdateForm->setErrorMessage($message); - - $this->getParserContext() - ->addForm($customerUpdateForm) - ->setGeneralError($message) - ; - } - - return $this->render("customer-edit", array( - "customer_id" => $customer_id - )); + return new CustomerUpdateForm($this->getRequest()); } - public function createAction() + protected function getCreationEvent($formData) { - if (null !== $response = $this->checkAuth(AdminResources::CUSTOMER, AccessManager::CREATE)) return $response; - - $message = null; - - $customerCreateForm = new CustomerCreateForm($this->getRequest()); - - try { - - $form = $this->validateForm($customerCreateForm); - - $data = $form->getData(); - $data["password"] = Password::generateRandom(); - - $event = $this->createEventInstance($form->getData()); - - - - $this->dispatch(TheliaEvents::CUSTOMER_CREATEACCOUNT, $event); - - $successUrl = $customerCreateForm->getSuccessUrl(); - - $successUrl = str_replace('_ID_', $event->getCustomer()->getId(), $successUrl); - - $this->redirect($successUrl); - - - }catch (FormValidationException $e) { - $message = sprintf("Please check your input: %s", $e->getMessage()); - } catch (PropelException $e) { - $message = $e->getMessage(); - } catch (\Exception $e) { - $message = sprintf("Sorry, an error occured: %s", $e->getMessage()." ".$e->getFile()); - } - - if ($message !== false) { - \Thelia\Log\Tlog::getInstance()->error(sprintf("Error during customer creation process : %s.", $message)); - - $customerCreateForm->setErrorMessage($message); - - $this->getParserContext() - ->addForm($customerCreateForm) - ->setGeneralError($message) - ; - } - - return $this->render("customers", array("display_customer" => 20)); + return $this->createEventInstance($formData); } - public function deleteAction() + protected function getUpdateEvent($formData) { - if (null !== $response = $this->checkAuth(AdminResources::CUSTOMER, AccessManager::DELETE)) return $response; + $event = $this->createEventInstance($formData); - $message = null; + $event->setCustomer($this->getExistingObject()); - try { - $customer_id = $this->getRequest()->get("customer_id"); - $customer = CustomerQuery::create()->findPk($customer_id); + return $event; + } - if (null === $customer) { - throw new \InvalidArgumentException(Translator::getInstance("The customer you want to delete does not exist")); - } + protected function getDeleteEvent() + { + return new CustomerEvent($this->getExistingObject()); + } - $event = new CustomerEvent($customer); + protected function eventContainsObject($event) + { + return $event->hasCustomer(); + } - $this->dispatch(TheliaEvents::CUSTOMER_DELETEACCOUNT, $event); - } catch (\Exception $e) { - $message = $e->getMessage(); - } + protected function hydrateObjectForm($object) + { + // Get default adress of the customer + $address = $object->getDefaultAddress(); - $params = array( - "customer_page" => $this->getRequest()->get("customer_page", 1) + // Prepare the data that will hydrate the form + $data = array( + 'id' => $object->getId(), + 'firstname' => $object->getFirstname(), + 'lastname' => $object->getLastname(), + 'email' => $object->getEmail(), + 'title' => $object->getTitleId(), ); - if ($message) { - $params["delete_error_message"] = $message; + if ($address !== null) { + $data['company'] = $address->getCompany(); + $data['address1'] = $address->getAddress1(); + $data['address2'] = $address->getAddress2(); + $data['address3'] = $address->getAddress3(); + $data['phone'] = $address->getPhone(); + $data['cellphone'] = $address->getCellphone(); + $data['zipcode'] = $address->getZipcode(); + $data['city'] = $address->getCity(); + $data['country'] = $address->getCountryId(); } - $this->redirectToRoute("admin.customers", $params); + // A loop is used in the template + return new CustomerUpdateForm($this->getRequest(), 'form', $data); + } + protected function getObjectFromEvent($event) + { + return $event->hasCustomer() ? $event->getCustomer() : null; } /** @@ -209,26 +137,75 @@ class CustomerController extends BaseAdminController private function createEventInstance($data) { $customerCreateEvent = new CustomerCreateOrUpdateEvent( - $data["title"], - $data["firstname"], - $data["lastname"], - $data["address1"], - $data["address2"], - $data["address3"], - $data["phone"], - $data["cellphone"], - $data["zipcode"], - $data["city"], - $data["country"], - isset($data["email"])?$data["email"]:null, - isset($data["password"]) ? $data["password"]:null, - $this->getRequest()->getSession()->getLang()->getId(), - isset($data["reseller"])?$data["reseller"]:null, - isset($data["sponsor"])?$data["sponsor"]:null, - isset($data["discount"])?$data["discount"]:null, - isset($data["company"])?$data["company"]:null + $data["title"], + $data["firstname"], + $data["lastname"], + $data["address1"], + $data["address2"], + $data["address3"], + $data["phone"], + $data["cellphone"], + $data["zipcode"], + $data["city"], + $data["country"], + isset($data["email"])?$data["email"]:null, + isset($data["password"]) && ! empty($data["password"]) ? $data["password"]:null, + $this->getRequest()->getSession()->getLang()->getId(), + isset($data["reseller"])?$data["reseller"]:null, + isset($data["sponsor"])?$data["sponsor"]:null, + isset($data["discount"])?$data["discount"]:null, + isset($data["company"])?$data["company"]:null ); return $customerCreateEvent; } -} + + protected function getExistingObject() + { + return CustomerQuery::create()->findPk($this->getRequest()->get('customer_id', 0)); + } + + protected function getObjectLabel($object) + { + return $object->getRef() . "(".$object->getLastname()." ".$object->getFirstname().")"; + } + + protected function getObjectId($object) + { + return $object->getId(); + } + + protected function getEditionArguments() + { + return array( + 'customer_id' => $this->getRequest()->get('customer_id', 0), + 'page' => $this->getRequest()->get('page', 1) + ); + } + + protected function renderListTemplate($currentOrder) + { + return $this->render('customers', array( + 'customer_order' => $currentOrder, + 'display_customer' => 20, + 'page' => $this->getRequest()->get('page', 1) + )); + } + + protected function redirectToListTemplate() + { + $this->redirectToRoute('admin.customers', array( + 'page' => $this->getRequest()->get('page', 1)) + ); + } + + protected function renderEditionTemplate() + { + return $this->render('customer-edit', $this->getEditionArguments()); + } + + protected function redirectToEditionTemplate() + { + $this->redirectToRoute("admin.customer.update.view", $this->getEditionArguments()); + } +} \ No newline at end of file diff --git a/core/lib/Thelia/Controller/Admin/FeatureController.php b/core/lib/Thelia/Controller/Admin/FeatureController.php index 1be5dfeec..8ff3a972e 100644 --- a/core/lib/Thelia/Controller/Admin/FeatureController.php +++ b/core/lib/Thelia/Controller/Admin/FeatureController.php @@ -235,7 +235,7 @@ class FeatureController extends AbstractCrudController protected function addRemoveFromAllTemplates($eventType) { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; try { if (null !== $object = $this->getExistingObject()) { diff --git a/core/lib/Thelia/Controller/Admin/FileController.php b/core/lib/Thelia/Controller/Admin/FileController.php index 5c712898a..f4d2c3f73 100755 --- a/core/lib/Thelia/Controller/Admin/FileController.php +++ b/core/lib/Thelia/Controller/Admin/FileController.php @@ -71,7 +71,7 @@ class FileController extends BaseAdminController */ public function saveImageAjaxAction($parentId, $parentType) { - $this->checkAuth(AdminResources::retrieve($parentType), AccessManager::UPDATE); + $this->checkAuth(AdminResources::retrieve($parentType), array(), AccessManager::UPDATE); $this->checkXmlHttpRequest(); if ($this->isParentTypeValid($parentType)) { @@ -161,7 +161,7 @@ class FileController extends BaseAdminController */ public function saveDocumentAjaxAction($parentId, $parentType) { - $this->checkAuth(AdminResources::retrieve($parentType), AccessManager::UPDATE); + $this->checkAuth(AdminResources::retrieve($parentType), array(), AccessManager::UPDATE); $this->checkXmlHttpRequest(); if ($this->isParentTypeValid($parentType)) { @@ -239,7 +239,7 @@ class FileController extends BaseAdminController */ public function getImageListAjaxAction($parentId, $parentType) { - $this->checkAuth(AdminResources::retrieve($parentType), AccessManager::UPDATE); + $this->checkAuth(AdminResources::retrieve($parentType), array(), AccessManager::UPDATE); $this->checkXmlHttpRequest(); $args = array('imageType' => $parentType, 'parentId' => $parentId); @@ -256,7 +256,7 @@ class FileController extends BaseAdminController */ public function getDocumentListAjaxAction($parentId, $parentType) { - $this->checkAuth(AdminResources::retrieve($parentType), AccessManager::UPDATE); + $this->checkAuth(AdminResources::retrieve($parentType), array(), AccessManager::UPDATE); $this->checkXmlHttpRequest(); $args = array('documentType' => $parentType, 'parentId' => $parentId); @@ -273,7 +273,7 @@ class FileController extends BaseAdminController */ public function getImageFormAjaxAction($parentId, $parentType) { - $this->checkAuth(AdminResources::retrieve($parentType), AccessManager::UPDATE); + $this->checkAuth(AdminResources::retrieve($parentType), array(), AccessManager::UPDATE); $this->checkXmlHttpRequest(); $args = array('imageType' => $parentType, 'parentId' => $parentId); @@ -290,7 +290,7 @@ class FileController extends BaseAdminController */ public function getDocumentFormAjaxAction($parentId, $parentType) { - $this->checkAuth(AdminResources::retrieve($parentType), AccessManager::UPDATE); + $this->checkAuth(AdminResources::retrieve($parentType), array(), AccessManager::UPDATE); $this->checkXmlHttpRequest(); $args = array('documentType' => $parentType, 'parentId' => $parentId); @@ -307,7 +307,7 @@ class FileController extends BaseAdminController */ public function viewImageAction($imageId, $parentType) { - if (null !== $response = $this->checkAuth(AdminResources::retrieve($parentType), AccessManager::UPDATE)) { + if (null !== $response = $this->checkAuth(AdminResources::retrieve($parentType), array(), AccessManager::UPDATE)) { return $response; } try { @@ -336,7 +336,7 @@ class FileController extends BaseAdminController */ public function viewDocumentAction($documentId, $parentType) { - if (null !== $response = $this->checkAuth(AdminResources::retrieve($parentType), AccessManager::UPDATE)) { + if (null !== $response = $this->checkAuth(AdminResources::retrieve($parentType), array(), AccessManager::UPDATE)) { return $response; } try { @@ -365,7 +365,7 @@ class FileController extends BaseAdminController */ public function updateImageAction($imageId, $parentType) { - if (null !== $response = $this->checkAuth(AdminResources::retrieve($parentType), AccessManager::UPDATE)) { + if (null !== $response = $this->checkAuth(AdminResources::retrieve($parentType), array(), AccessManager::UPDATE)) { return $response; } @@ -442,7 +442,7 @@ class FileController extends BaseAdminController */ public function updateDocumentAction($documentId, $parentType) { - if (null !== $response = $this->checkAuth(AdminResources::retrieve($parentType), AccessManager::UPDATE)) { + if (null !== $response = $this->checkAuth(AdminResources::retrieve($parentType), array(), AccessManager::UPDATE)) { return $response; } @@ -519,7 +519,7 @@ class FileController extends BaseAdminController */ public function deleteImageAction($imageId, $parentType) { - $this->checkAuth(AdminResources::retrieve($parentType), AccessManager::UPDATE); + $this->checkAuth(AdminResources::retrieve($parentType), array(), AccessManager::UPDATE); $this->checkXmlHttpRequest(); $fileManager = new FileManager($this->container); @@ -591,7 +591,7 @@ class FileController extends BaseAdminController */ public function deleteDocumentAction($documentId, $parentType) { - $this->checkAuth(AdminResources::retrieve($parentType), AccessManager::UPDATE); + $this->checkAuth(AdminResources::retrieve($parentType), array(), AccessManager::UPDATE); $this->checkXmlHttpRequest(); $fileManager = new FileManager($this->container); diff --git a/core/lib/Thelia/Controller/Admin/HomeController.php b/core/lib/Thelia/Controller/Admin/HomeController.php index 8679b28e6..e8711f97d 100644 --- a/core/lib/Thelia/Controller/Admin/HomeController.php +++ b/core/lib/Thelia/Controller/Admin/HomeController.php @@ -33,7 +33,7 @@ class HomeController extends BaseAdminController public function defaultAction() { - if (null !== $response = $this->checkAuth(self::RESOURCE_CODE, AccessManager::VIEW)) return $response; + if (null !== $response = $this->checkAuth(self::RESOURCE_CODE, array(), AccessManager::VIEW)) return $response; // Render the edition template. return $this->render('home'); diff --git a/core/lib/Thelia/Controller/Admin/LangController.php b/core/lib/Thelia/Controller/Admin/LangController.php index ccf980c81..e7862badc 100644 --- a/core/lib/Thelia/Controller/Admin/LangController.php +++ b/core/lib/Thelia/Controller/Admin/LangController.php @@ -51,7 +51,7 @@ class LangController extends BaseAdminController public function defaultAction() { - if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::VIEW)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, array(), AccessManager::VIEW)) return $response; return $this->renderDefault(); } @@ -72,7 +72,7 @@ class LangController extends BaseAdminController public function updateAction($lang_id) { - if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, array(), AccessManager::UPDATE)) return $response; $this->checkXmlHttpRequest(); @@ -96,7 +96,7 @@ class LangController extends BaseAdminController public function processUpdateAction($lang_id) { - if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, array(), AccessManager::UPDATE)) return $response; $error_msg = false; @@ -138,7 +138,7 @@ class LangController extends BaseAdminController public function toggleDefaultAction($lang_id) { - if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, array(), AccessManager::UPDATE)) return $response; $this->checkXmlHttpRequest(); $error = false; @@ -169,7 +169,7 @@ class LangController extends BaseAdminController public function addAction() { - if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::CREATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, array(), AccessManager::CREATE)) return $response; $createForm = new LangCreateForm($this->getRequest()); @@ -211,7 +211,7 @@ class LangController extends BaseAdminController public function deleteAction() { - if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::DELETE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, array(), AccessManager::DELETE)) return $response; $error_msg = false; @@ -235,7 +235,7 @@ class LangController extends BaseAdminController public function defaultBehaviorAction() { - if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, array(), AccessManager::UPDATE)) return $response; $error_msg = false; @@ -267,7 +267,7 @@ class LangController extends BaseAdminController public function domainAction() { - if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, array(), AccessManager::UPDATE)) return $response; $error_msg = false; $langUrlForm = new LangUrlForm($this->getRequest()); @@ -314,7 +314,7 @@ class LangController extends BaseAdminController private function domainActivation($activate) { - if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, array(), AccessManager::UPDATE)) return $response; $error_msg = false; diff --git a/core/lib/Thelia/Controller/Admin/LanguageController.php b/core/lib/Thelia/Controller/Admin/LanguageController.php index 7559cb5cc..b91124277 100644 --- a/core/lib/Thelia/Controller/Admin/LanguageController.php +++ b/core/lib/Thelia/Controller/Admin/LanguageController.php @@ -35,7 +35,7 @@ class LanguageController extends BaseAdminController { public function defaultAction() { - if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::VIEW)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, array(), AccessManager::VIEW)) return $response; return $this->render("languages"); } diff --git a/core/lib/Thelia/Controller/Admin/MailingSystemController.php b/core/lib/Thelia/Controller/Admin/MailingSystemController.php index cfe6f06dd..1fe79c353 100644 --- a/core/lib/Thelia/Controller/Admin/MailingSystemController.php +++ b/core/lib/Thelia/Controller/Admin/MailingSystemController.php @@ -36,7 +36,7 @@ class MailingSystemController extends BaseAdminController public function defaultAction() { - if (null !== $response = $this->checkAuth(self::RESOURCE_CODE, AccessManager::VIEW)) return $response; + if (null !== $response = $this->checkAuth(self::RESOURCE_CODE, array(), AccessManager::VIEW)) return $response; // Hydrate the form abd pass it to the parser $data = array( @@ -64,7 +64,7 @@ class MailingSystemController extends BaseAdminController public function updateAction() { // Check current user authorization - if (null !== $response = $this->checkAuth(self::RESOURCE_CODE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(self::RESOURCE_CODE, array(), AccessManager::UPDATE)) return $response; $error_msg = false; diff --git a/core/lib/Thelia/Controller/Admin/ModuleController.php b/core/lib/Thelia/Controller/Admin/ModuleController.php index 24f297cbf..c9cd97359 100644 --- a/core/lib/Thelia/Controller/Admin/ModuleController.php +++ b/core/lib/Thelia/Controller/Admin/ModuleController.php @@ -180,7 +180,7 @@ class ModuleController extends AbstractCrudController public function indexAction() { - if (null !== $response = $this->checkAuth(AdminResources::MODULE, AccessManager::VIEW)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::MODULE, array(), AccessManager::VIEW)) return $response; $moduleManagement = new ModuleManagement(); $moduleManagement->updateModules(); @@ -190,7 +190,7 @@ class ModuleController extends AbstractCrudController public function toggleActivationAction($module_id) { - if (null !== $response = $this->checkAuth(AdminResources::MODULE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::MODULE, array(), AccessManager::UPDATE)) return $response; $message = null; try { $event = new ModuleToggleActivationEvent($module_id); @@ -222,7 +222,7 @@ class ModuleController extends AbstractCrudController public function deleteAction() { - if (null !== $response = $this->checkAuth(AdminResources::MODULE, AccessManager::DELETE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::MODULE, array(), AccessManager::DELETE)) return $response; $message = null; try { diff --git a/core/lib/Thelia/Controller/Admin/OrderController.php b/core/lib/Thelia/Controller/Admin/OrderController.php index 54ff428ea..285098580 100644 --- a/core/lib/Thelia/Controller/Admin/OrderController.php +++ b/core/lib/Thelia/Controller/Admin/OrderController.php @@ -47,7 +47,7 @@ class OrderController extends BaseAdminController { public function indexAction() { - if (null !== $response = $this->checkAuth(AdminResources::ORDER, AccessManager::VIEW)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::ORDER, array(), AccessManager::VIEW)) return $response; return $this->render("orders", array("display_order" => 20)); } @@ -60,7 +60,7 @@ class OrderController extends BaseAdminController public function updateStatus($order_id = null) { - if (null !== $response = $this->checkAuth(AdminResources::ORDER, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::ORDER, array(), AccessManager::UPDATE)) return $response; $message = null; @@ -111,7 +111,7 @@ class OrderController extends BaseAdminController public function updateDeliveryRef($order_id) { - if (null !== $response = $this->checkAuth(AdminResources::ORDER, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::ORDER, array(), AccessManager::UPDATE)) return $response; $message = null; @@ -146,7 +146,7 @@ class OrderController extends BaseAdminController public function updateAddress($order_id) { - if (null !== $response = $this->checkAuth(AdminResources::ORDER, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::ORDER, array(), AccessManager::UPDATE)) return $response; $message = null; diff --git a/core/lib/Thelia/Controller/Admin/ProductController.php b/core/lib/Thelia/Controller/Admin/ProductController.php index a711ada52..9aa2d279e 100644 --- a/core/lib/Thelia/Controller/Admin/ProductController.php +++ b/core/lib/Thelia/Controller/Admin/ProductController.php @@ -407,7 +407,7 @@ class ProductController extends AbstractCrudController public function setToggleVisibilityAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $event = new ProductToggleVisibilityEvent($this->getExistingObject()); @@ -483,7 +483,7 @@ class ProductController extends AbstractCrudController { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $content_id = intval($this->getRequest()->get('content_id')); @@ -509,7 +509,7 @@ class ProductController extends AbstractCrudController { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $content_id = intval($this->getRequest()->get('content_id')); @@ -561,7 +561,7 @@ class ProductController extends AbstractCrudController public function addAccessoryAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $accessory_id = intval($this->getRequest()->get('accessory_id')); @@ -586,7 +586,7 @@ class ProductController extends AbstractCrudController public function deleteAccessoryAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $accessory_id = intval($this->getRequest()->get('accessory_id')); @@ -642,7 +642,7 @@ class ProductController extends AbstractCrudController public function setProductTemplateAction($productId) { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $product = ProductQuery::create()->findPk($productId); @@ -739,7 +739,7 @@ class ProductController extends AbstractCrudController public function addAdditionalCategoryAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $category_id = intval($this->getRequest()->request->get('additional_category_id')); @@ -764,7 +764,7 @@ class ProductController extends AbstractCrudController public function deleteAdditionalCategoryAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $category_id = intval($this->getRequest()->get('additional_category_id')); @@ -861,7 +861,7 @@ class ProductController extends AbstractCrudController public function addProductSaleElementAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $event = new ProductSaleElementCreateEvent( $this->getExistingObject(), @@ -885,7 +885,7 @@ class ProductController extends AbstractCrudController public function deleteProductSaleElementAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $event = new ProductSaleElementDeleteEvent( $this->getRequest()->get('product_sale_element_id',0), @@ -944,7 +944,7 @@ class ProductController extends AbstractCrudController protected function processProductSaleElementUpdate($changeForm) { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $error_msg = false; @@ -1053,7 +1053,7 @@ class ProductController extends AbstractCrudController public function buildCombinationsAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $error_msg = false; diff --git a/core/lib/Thelia/Controller/Admin/ProfileController.php b/core/lib/Thelia/Controller/Admin/ProfileController.php index 909d055b8..9b83c30b7 100644 --- a/core/lib/Thelia/Controller/Admin/ProfileController.php +++ b/core/lib/Thelia/Controller/Admin/ProfileController.php @@ -221,7 +221,7 @@ class ProfileController extends AbstractCrudController public function updateAction() { - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $object = $this->getExistingObject(); @@ -306,7 +306,7 @@ class ProfileController extends AbstractCrudController public function processUpdateResourceAccess() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $error_msg = false; @@ -355,7 +355,7 @@ class ProfileController extends AbstractCrudController public function processUpdateModuleAccess() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $error_msg = false; diff --git a/core/lib/Thelia/Controller/Admin/ShippingZoneController.php b/core/lib/Thelia/Controller/Admin/ShippingZoneController.php index 8e8f38eec..82b630398 100644 --- a/core/lib/Thelia/Controller/Admin/ShippingZoneController.php +++ b/core/lib/Thelia/Controller/Admin/ShippingZoneController.php @@ -42,13 +42,13 @@ class ShippingZoneController extends BaseAdminController public function indexAction() { - if (null !== $response = $this->checkAuth(AdminResources::SHIPPING_ZONE, AccessManager::VIEW)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::SHIPPING_ZONE, array(), AccessManager::VIEW)) return $response; return $this->render("shipping-zones", array("display_shipping_zone" => 20)); } public function updateAction($shipping_zones_id) { - if (null !== $response = $this->checkAuth(AdminResources::SHIPPING_ZONE, AccessManager::VIEW)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::SHIPPING_ZONE, array(), AccessManager::VIEW)) return $response; return $this->render("shipping-zones-edit", array( "shipping_zones_id" => $shipping_zones_id )); @@ -59,7 +59,7 @@ class ShippingZoneController extends BaseAdminController */ public function addArea() { - if (null !== $response = $this->checkAuth(AdminResources::SHIPPING_ZONE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::SHIPPING_ZONE, array(), AccessManager::UPDATE)) return $response; $shippingAreaForm = new ShippingZoneAddArea($this->getRequest()); $error_msg = null; @@ -94,7 +94,7 @@ class ShippingZoneController extends BaseAdminController public function removeArea() { - if (null !== $response = $this->checkAuth(AdminResources::SHIPPING_ZONE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::SHIPPING_ZONE, array(), AccessManager::UPDATE)) return $response; $shippingAreaForm = new ShippingZoneRemoveArea($this->getRequest()); $error_msg = null; diff --git a/core/lib/Thelia/Controller/Admin/SystemLogController.php b/core/lib/Thelia/Controller/Admin/SystemLogController.php index 96621717c..118f06efb 100644 --- a/core/lib/Thelia/Controller/Admin/SystemLogController.php +++ b/core/lib/Thelia/Controller/Admin/SystemLogController.php @@ -86,7 +86,7 @@ class SystemLogController extends BaseAdminController public function defaultAction() { - if (null !== $response = $this->checkAuth(AdminResources::SYSTEM_LOG, AccessManager::VIEW)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::SYSTEM_LOG, array(), AccessManager::VIEW)) return $response; /* const VAR_LEVEL = "tlog_level"; @@ -121,7 +121,7 @@ class SystemLogController extends BaseAdminController public function saveAction() { - if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, array(), AccessManager::UPDATE)) return $response; $error_msg = false; diff --git a/core/lib/Thelia/Controller/Admin/TaxRuleController.php b/core/lib/Thelia/Controller/Admin/TaxRuleController.php index 2e6cb2b70..b85123505 100644 --- a/core/lib/Thelia/Controller/Admin/TaxRuleController.php +++ b/core/lib/Thelia/Controller/Admin/TaxRuleController.php @@ -219,7 +219,7 @@ class TaxRuleController extends AbstractCrudController public function updateAction() { - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $object = $this->getExistingObject(); @@ -237,7 +237,7 @@ class TaxRuleController extends AbstractCrudController public function setDefaultAction() { - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $setDefaultEvent = new TaxRuleEvent(); @@ -255,7 +255,7 @@ class TaxRuleController extends AbstractCrudController public function processUpdateTaxesAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; $error_msg = false; diff --git a/core/lib/Thelia/Controller/Admin/TemplateController.php b/core/lib/Thelia/Controller/Admin/TemplateController.php index fd7df6bb2..5e551679d 100644 --- a/core/lib/Thelia/Controller/Admin/TemplateController.php +++ b/core/lib/Thelia/Controller/Admin/TemplateController.php @@ -211,7 +211,7 @@ class TemplateController extends AbstractCrudController public function addAttributeAction() { // Check current user authorization - if (null !== $response = $this->checkAuth(AdminResources::TEMPLATE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::TEMPLATE, array(), AccessManager::UPDATE)) return $response; $attribute_id = intval($this->getRequest()->get('attribute_id')); @@ -235,7 +235,7 @@ class TemplateController extends AbstractCrudController public function deleteAttributeAction() { // Check current user authorization - if (null !== $response = $this->checkAuth(AdminResources::TEMPLATE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::TEMPLATE, array(), AccessManager::UPDATE)) return $response; $event = new TemplateDeleteAttributeEvent( $this->getExistingObject(), @@ -270,7 +270,7 @@ class TemplateController extends AbstractCrudController public function addFeatureAction() { // Check current user authorization - if (null !== $response = $this->checkAuth(AdminResources::TEMPLATE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::TEMPLATE, array(), AccessManager::UPDATE)) return $response; $feature_id = intval($this->getRequest()->get('feature_id')); @@ -294,7 +294,7 @@ class TemplateController extends AbstractCrudController public function deleteFeatureAction() { // Check current user authorization - if (null !== $response = $this->checkAuth(AdminResources::TEMPLATE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::TEMPLATE, array(), AccessManager::UPDATE)) return $response; $event = new TemplateDeleteFeatureEvent( $this->getExistingObject(), diff --git a/core/lib/Thelia/Controller/Admin/TranslationsController.php b/core/lib/Thelia/Controller/Admin/TranslationsController.php index 30ebbcdb2..654a3ffdf 100644 --- a/core/lib/Thelia/Controller/Admin/TranslationsController.php +++ b/core/lib/Thelia/Controller/Admin/TranslationsController.php @@ -161,14 +161,14 @@ class TranslationsController extends BaseAdminController public function defaultAction() { - if (null !== $response = $this->checkAuth(AdminResources::TRANSLATIONS, AccessManager::VIEW)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::TRANSLATIONS, array(), AccessManager::VIEW)) return $response; return $this->renderTemplate(); } public function updateAction() { - if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, array(), AccessManager::UPDATE)) return $response; return $this->renderTemplate(); } diff --git a/core/lib/Thelia/Controller/NullControllerInterface.php b/core/lib/Thelia/Controller/NullControllerInterface.php deleted file mode 100755 index 6e832aff6..000000000 --- a/core/lib/Thelia/Controller/NullControllerInterface.php +++ /dev/null @@ -1,19 +0,0 @@ - - */ - -interface NullControllerInterface -{ - /** - * Nothing to do - */ - public function noAction(Request $request); - -} diff --git a/core/lib/Thelia/Core/Event/Customer/CustomerCreateOrUpdateEvent.php b/core/lib/Thelia/Core/Event/Customer/CustomerCreateOrUpdateEvent.php index 2c59c2899..2c45942f3 100755 --- a/core/lib/Thelia/Core/Event/Customer/CustomerCreateOrUpdateEvent.php +++ b/core/lib/Thelia/Core/Event/Customer/CustomerCreateOrUpdateEvent.php @@ -31,7 +31,7 @@ use Thelia\Model\Customer; * @package Thelia\Core\Event * @author Manuel Raynaud */ -class CustomerCreateOrUpdateEvent extends ActionEvent +class CustomerCreateOrUpdateEvent extends CustomerEvent { //base parameters for creating new customer protected $title; @@ -53,11 +53,6 @@ class CustomerCreateOrUpdateEvent extends ActionEvent protected $discount; protected $company; - /** - * @var \Thelia\Model\Customer - */ - protected $customer; - /** * @param int $title the title customer id * @param string $firstname @@ -242,21 +237,4 @@ class CustomerCreateOrUpdateEvent extends ActionEvent { return $this->sponsor; } - - /** - * @param Customer $customer - */ - public function setCustomer(Customer $customer) - { - $this->customer = $customer; - } - - /** - * @return Customer - */ - public function getCustomer() - { - return $this->customer; - } - } diff --git a/core/lib/Thelia/Core/Event/Customer/CustomerEvent.php b/core/lib/Thelia/Core/Event/Customer/CustomerEvent.php index f11bb7f2d..e76f23955 100755 --- a/core/lib/Thelia/Core/Event/Customer/CustomerEvent.php +++ b/core/lib/Thelia/Core/Event/Customer/CustomerEvent.php @@ -28,13 +28,23 @@ use Thelia\Core\Event\ActionEvent; class CustomerEvent extends ActionEvent { - public $customer; + public $customer = null; - public function __construct(Customer $customer) + public function __construct(Customer $customer = null) { $this->customer = $customer; } + /** + * @param Customer $customer + */ + public function setCustomer(Customer $customer) + { + $this->customer = $customer; + + return $this; + } + /** * @return \Thelia\Model\Customer */ @@ -43,4 +53,12 @@ class CustomerEvent extends ActionEvent return $this->customer; } + /** + * @return bool + */ + public function hasCustomer() + { + return $this->customer != null; + } + } diff --git a/core/lib/Thelia/Core/Event/Customer/CustomerLoginEvent.php b/core/lib/Thelia/Core/Event/Customer/CustomerLoginEvent.php index 56c29bf6c..0a046177e 100755 --- a/core/lib/Thelia/Core/Event/Customer/CustomerLoginEvent.php +++ b/core/lib/Thelia/Core/Event/Customer/CustomerLoginEvent.php @@ -26,17 +26,7 @@ namespace Thelia\Core\Event\Customer; use Thelia\Core\Event\ActionEvent; use Thelia\Model\Customer; -class CustomerLoginEvent extends ActionEvent +class CustomerLoginEvent extends CustomerEvent { - protected $customer; - - public function __construct(Customer $customer) - { - $this->customer = $customer; - } - - public function getCustomer() - { - return $this->customer; - } + // Nothing specific :) } diff --git a/core/lib/Thelia/Core/Security/SecurityContext.php b/core/lib/Thelia/Core/Security/SecurityContext.php index 128feb516..e97a19877 100755 --- a/core/lib/Thelia/Core/Security/SecurityContext.php +++ b/core/lib/Thelia/Core/Security/SecurityContext.php @@ -123,7 +123,7 @@ class SecurityContext * * @return Boolean */ - final public function isGranted(array $roles, array $resources, array $accesses) + final public function isGranted(array $roles, array $resources, array $modules, array $accesses) { // Find a user which matches the required roles. $user = $this->getCustomerUser(); @@ -140,7 +140,7 @@ class SecurityContext return false; } - if (empty($resources) || empty($accesses)) { + if ((empty($resources) && empty($modules)) || empty($accesses)) { return true; } @@ -172,6 +172,28 @@ class SecurityContext } } + foreach ($modules as $module) { + if ($module === '') { + continue; + } + + if(!array_key_exists('module', $userPermissions)) { + return false; + } + + $module = strtolower($module); + + if (!array_key_exists($module, $userPermissions['module'])) { + return false; + } + + foreach ($accesses as $access) { + if (!$userPermissions['module'][$module]->can($access)) { + return false; + } + } + } + return true; } diff --git a/core/lib/Thelia/Core/Template/Assets/AssetManagerInterface.php b/core/lib/Thelia/Core/Template/Assets/AssetManagerInterface.php new file mode 100644 index 000000000..d9109b2c8 --- /dev/null +++ b/core/lib/Thelia/Core/Template/Assets/AssetManagerInterface.php @@ -0,0 +1,53 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Template\Assets; + +interface AssetManagerInterface { + /** + * Prepare an asset directory. + * + * @param string $source_assets_directory the full path to the source asstes directory + * @param string $web_assets_directory_base the base directory of the web based asset directory + * @throws \RuntimeException if something goes wrong. + */ + public function prepareAssets($source_assets_directory, $web_assets_directory_base); + + /** + * Generates assets from $asset_path in $output_path, using $filters. + * + * @param string $asset_path the full path to the asset file (or file collection, e.g. *.less) + * + * @param string $web_assets_directory_base the full disk path to the base assets output directory in the web space + * @param string $output_url the URL to the base assets output directory in the web space + * + * @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 the debug mode, true or false + * + * @throws \InvalidArgumentException if an invalid filter name is found + * @return string The URL to the generated asset file. + */ + public function processAsset($asset_path, $web_assets_directory_base, $output_url, $asset_type, $filters, $debug); +} \ No newline at end of file diff --git a/core/lib/Thelia/Core/Template/Assets/AsseticAssetManager.php b/core/lib/Thelia/Core/Template/Assets/AsseticAssetManager.php new file mode 100755 index 000000000..b5356bee6 --- /dev/null +++ b/core/lib/Thelia/Core/Template/Assets/AsseticAssetManager.php @@ -0,0 +1,350 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Template\Assets; + +use Assetic\AssetManager; +use Assetic\FilterManager; +use Assetic\Filter; +use Assetic\Factory\AssetFactory; +use Assetic\AssetWriter; +use Thelia\Model\ConfigQuery; +use Thelia\Log\Tlog; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Filesystem\Exception\IOException; + +/** + * This class is a simple helper for generating assets using Assetic. + * + * @author Franck Allimant + */ +class AsseticAssetManager implements AssetManagerInterface +{ + protected $developmentMode; + + protected $source_file_extensions = array('less', 'js', 'coffee', 'html', 'tpl', 'htm', 'xml'); + + public function __construct($developmentMode) + { + $this->developmentMode = $developmentMode; + } + + /** + * Create a stamp form the modification time of the content of the given directory and all of its subdirectories + * + * @param string $directory ther directory name + * @return string the stamp of this directory + */ + protected function getStamp($directory) + { + $stamp = ''; + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($directory, \RecursiveDirectoryIterator::SKIP_DOTS), + \RecursiveIteratorIterator::LEAVES_ONLY); + + foreach ($iterator as $file) { + $stamp .= $file->getMTime(); + } + + return md5($stamp); + } + + /** + * Check if a file is a source asset file + * + * @param \DirectoryIterator $fileInfo + */ + protected function isSourceFile(\SplFileInfo $fileInfo) { + return in_array($fileInfo->getExtension(), $this->source_file_extensions); + } + + /** + * Recursively copy assets from the source directory to the destination + * directory in the web space, ommiting source files. + * + * @param string $from_directory the source + * @param string $to_directory the destination + * @throws \RuntimeException if a problem occurs. + */ + protected function copyAssets(Filesystem $fs, $from_directory, $to_directory) + { + Tlog::getInstance()->addDebug("Copying assets from ", $from_directory, " to ", $to_directory); + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($from_directory, \RecursiveDirectoryIterator::SKIP_DOTS), + \RecursiveIteratorIterator::SELF_FIRST); + + foreach ($iterator as $item) { + if ($item->isDir()) { + $dest_dir = $to_directory . DS . $iterator->getSubPathName(); + + if (! is_dir($dest_dir)) { + if ($fs->exists($dest_dir)) { + $fs->remove($dest_dir); + } + + $fs->mkdir($dest_dir, 0777); + } + } + // We don't copy source files + else if (! $this->isSourceFile($item)) { + + $dest_file = $to_directory . DS . $iterator->getSubPathName(); + + if ($fs->exists($dest_file)) { + $fs->remove($dest_file); + } + + $fs->copy($item, $dest_file); + } + } + } + + /** + * Compite the assets path relative to the base template directory + * + * @param string $source_assets_directory the source directory + * @param string $web_assets_directory_base base directory of the web assets + * @return the full path of the destination directory + */ + protected function getRelativeDirectoryPath($source_assets_directory, $web_assets_directory_base) + { + $source_assets_directory = realpath($source_assets_directory); + + // Remove base path from asset source path to get a path relative to the template base + // and use it to create the destination path. + return str_replace( + realpath(THELIA_ROOT), + '', + $source_assets_directory + ); + } + + /** + * Compute the destination directory path, from the source directory and the + * base directory of the web assets + * + * @param string $source_assets_directory the source directory + * @param string $web_assets_directory_base base directory of the web assets + * @return the full path of the destination directory + */ + protected function getDestinationDirectory($source_assets_directory, $web_assets_directory_base) + { + // Compute the absolute path of the output directory + return $web_assets_directory_base . $this->getRelativeDirectoryPath($source_assets_directory, $web_assets_directory_base); + } + + /** + * Prepare an asset directory by checking that no changes occured in + * the source directory. If any change is detected, the whole asset directory + * is copied in the web space. + * + * @param string $source_assets_directory the full path to the source asstes directory + * @param string $web_assets_directory_base the base directory of the web based asset directory + * @throws \RuntimeException if something goes wrong. + */ + public function prepareAssets($source_assets_directory, $web_assets_directory_base) { + + // Compute the absolute path of the output directory + $to_directory = $this->getDestinationDirectory($source_assets_directory, $web_assets_directory_base); + + // Get a path to the stamp file + $stamp_file_path = $to_directory . DS . '.source-stamp'; + + // Get the last stamp of source assets directory + $prev_stamp = @file_get_contents($stamp_file_path); + + // Get the current stamp of the source directory + $curr_stamp = $this->getStamp($source_assets_directory); + + if ($prev_stamp !== $curr_stamp) { + + $fs = new Filesystem(); + + // FIXME: locking or not locking ? +/* + $lock_file = "$web_assets_directory_base/assets-".md5($source_assets_directory)."-generation-lock.txt"; + + if (! $fp = fopen($lock_file, "w")) { + throw new IOException(sprintf('Failed to open lock file %s', $lock_file)); + } + + if (flock($fp, LOCK_EX|LOCK_NB)) { // do an exclusive lock +*/ + $tmp_dir = "$to_directory.tmp"; + + $fs->remove($tmp_dir); + + // Copy the whole source dir in a temp directory + $this->copyAssets($fs, $source_assets_directory, $tmp_dir); + + // Remove existing directory + if ($fs->exists($to_directory)) $fs->remove($to_directory); + + // Put in place the new directory + $fs->rename($tmp_dir, $to_directory); +/* + // Release the lock + flock($fp, LOCK_UN); + + // Remove the lock file + @fclose($fp); + + $fs->remove($lock_file); +*/ + if (false === @file_put_contents($stamp_file_path, $curr_stamp)) { + throw new \RuntimeException( + "Failed to create asset stamp file $stamp_file_path. Please check that your web server has the proper access rights to do that."); + } +/* } + else { + @fclose($fp); + } +*/ + } + } + + /** + * Decode the filters names, and initialize the Assetic FilterManager + * + * @param FilterManager $filterManager the Assetic filter manager + * @param string $filters a comma separated list of filter names + * @throws \InvalidArgumentException if a wrong filter is passed + * @return an array of filter names + */ + protected function decodeAsseticFilters(FilterManager $filterManager, $filters) { + + if (!empty($filters)) { + + $filter_list = explode(',', $filters); + + foreach ($filter_list as $filter_name) { + + $filter_name = trim($filter_name); + + switch ($filter_name) { + case 'less': + $filterManager->set('less', new Filter\LessphpFilter()); + break; + + case 'sass': + $filterManager->set('sass', new Filter\Sass\SassFilter()); + break; + + case 'cssembed': + $filterManager->set('cssembed', new Filter\PhpCssEmbedFilter()); + break; + + case 'cssrewrite': + $filterManager->set('cssrewrite', new Filter\CssRewriteFilter()); + break; + + case 'cssimport': + $filterManager->set('cssimport', new Filter\CssImportFilter()); + break; + + case 'compass': + $filterManager->set('compass', new Filter\CompassFilter()); + break; + + default: + throw new \InvalidArgumentException("Unsupported Assetic filter: '$filter_name'"); + break; + } + } + } + else { + $filter_list = array(); + } + + return $filter_list; + } + + /** + * Generates assets from $asset_path in $output_path, using $filters. + * + * @param string $asset_path the full path to the asset file (or file collection, e.g. *.less) + * + * @param string $web_assets_directory_base the full disk path to the base assets output directory in the web space + * @param string $output_url the URL to the base assets output directory in the web space + * + * @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 + * @throws \InvalidArgumentException if an invalid filter name is found + * @return string The URL to the generated asset file. + */ + public function processAsset($asset_path, $web_assets_directory_base, $output_url, $asset_type, $filters, $debug) + { + $asset_name = basename($asset_path); + $input_directory = realpath(dirname($asset_path)); + + $am = new AssetManager(); + $fm = new FilterManager(); + + // Get the filter list + $filter_list = $this->decodeAsseticFilters($fm, $filters); + + // Factory setup + $factory = new AssetFactory($input_directory); + + $factory->setAssetManager($am); + $factory->setFilterManager($fm); + + $factory->setDefaultOutput('*' . (!empty($asset_type) ? '.' : '') . $asset_type); + + $factory->setDebug($debug); + + $asset = $factory->createAsset($asset_name, $filter_list); + + $input_directory = realpath(dirname($asset_path)); + + $output_directory = $this->getDestinationDirectory($input_directory, $web_assets_directory_base); + + // Get the URL part from the relative path + $output_relative_path = $this->getRelativeDirectoryPath($input_directory, $web_assets_directory_base); + + $output_relative_web_path = rtrim(str_replace('\\', '/', $output_relative_path), '/') . '/'; + + $asset_target_filename = $asset->getTargetPath(); + + // This is the final name of the generated asset + $asset_destination_path = $output_directory . DS . $asset_target_filename; + + Tlog::getInstance()->addDebug("Asset destination name: ", $asset_destination_path); + + // We generate an asset only if it does not exists, or if the asset processing is forced in development mode + if (! file_exists($asset_destination_path) || ($this->developmentMode && ConfigQuery::read('process_assets', true)) ) { + + $writer = new AssetWriter($output_directory); + + Tlog::getInstance()->addDebug("Writing asset to $output_directory"); + + $writer->writeAsset($asset); + } + + return rtrim($output_url, '/') . '/' . $output_relative_web_path . $asset_target_filename; + } +} \ No newline at end of file diff --git a/core/lib/Thelia/Core/Template/Assets/AsseticHelper.php b/core/lib/Thelia/Core/Template/Assets/AsseticHelper.php deleted file mode 100755 index 12ed85ad2..000000000 --- a/core/lib/Thelia/Core/Template/Assets/AsseticHelper.php +++ /dev/null @@ -1,160 +0,0 @@ -. */ -/* */ -/*************************************************************************************/ - -namespace Thelia\Core\Template\Assets; - -use Assetic\AssetManager; -use Assetic\FilterManager; -use Assetic\Filter; -use Assetic\Factory\AssetFactory; -use Assetic\Factory\Worker\CacheBustingWorker; -use Assetic\AssetWriter; -use Thelia\Model\ConfigQuery; - -/** - * This class is a simple helper for generating assets using Assetic. - * - * @author Franck Allimant - */ -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 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, $dev_mode = false) - { - $asset_name = basename($asset_path); - $asset_dir = dirname($asset_path); - - $am = new AssetManager(); - $fm = new FilterManager(); - - if (! empty($filters)) { - $filter_list = explode(',', $filters); - - foreach ($filter_list as $filter_name) { - - $filter_name = trim($filter_name); - - switch ($filter_name) { - case 'less' : - $fm->set('less', new Filter\LessphpFilter()); - break; - - case 'sass' : - $fm->set('sass', new Filter\Sass\SassFilter()); - break; - - case 'cssembed' : - $fm->set('cssembed', new Filter\PhpCssEmbedFilter()); - break; - - case 'cssrewrite': - $fm->set('cssrewrite', new Filter\CssRewriteFilter()); - break; - - case 'cssimport': - $fm->set('cssimport', new Filter\CssImportFilter()); - break; - - case 'compass': - $fm->set('compass', new Filter\CompassFilter()); - break; - - default : - throw new \InvalidArgumentException("Unsupported Assetic filter: '$filter_name'"); - break; - } - } - } else { - $filter_list = array(); - } - - // Factory setup - $factory = new AssetFactory($asset_dir); - - $factory->setAssetManager($am); - $factory->setFilterManager($fm); - - $factory->setDefaultOutput('*'.(! empty($asset_type) ? '.' : '').$asset_type); - - $factory->setDebug($debug); - - $factory->addWorker(new CacheBustingWorker('-')); - - // We do not pass the filter list here, juste to get the asset file name - $asset = $factory->createAsset($asset_name); - - $asset_target_path = $asset->getTargetPath(); - - $target_file = sprintf("%s/%s", $output_path, $asset_target_path); - - // 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)) { - - if (ConfigQuery::read('process_assets', true)) { - - // 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; - } -} diff --git a/core/lib/Thelia/Core/Template/Loop/Auth.php b/core/lib/Thelia/Core/Template/Loop/Auth.php index ef466d3e9..072193f34 100755 --- a/core/lib/Thelia/Core/Template/Loop/Auth.php +++ b/core/lib/Thelia/Core/Template/Loop/Auth.php @@ -60,6 +60,12 @@ class Auth extends BaseLoop implements ArraySearchLoopInterface new AlphaNumStringListType() ) ), + new Argument( + 'module', + new TypeCollection( + new AlphaNumStringListType() + ) + ), new Argument( 'access', new TypeCollection( @@ -79,10 +85,20 @@ class Auth extends BaseLoop implements ArraySearchLoopInterface { $roles = $this->getRole(); $resource = $this->getResource(); + $module = $this->getModule(); $access = $this->getAccess(); + if(null !== $module) { + $in = true; + } + try { - if (true === $this->securityContext->isGranted($roles, $resource === null ? array() : $resource, $access === null ? array() : $access)) { + if (true === $this->securityContext->isGranted( + $roles, + $resource === null ? array() : $resource, + $module === null ? array() : $module, + $access === null ? array() : $access) + ) { // Create an empty row: loop is no longer empty :) $loopResult->addRow(new LoopResultRow()); diff --git a/core/lib/Thelia/Core/Template/Loop/Customer.php b/core/lib/Thelia/Core/Template/Loop/Customer.php index 949103556..f955cd217 100755 --- a/core/lib/Thelia/Core/Template/Loop/Customer.php +++ b/core/lib/Thelia/Core/Template/Loop/Customer.php @@ -36,6 +36,9 @@ use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Model\CustomerQuery; use Thelia\Type\TypeCollection; use Thelia\Type; +use Thelia\Model\OrderQuery; +use Thelia\Model\Map\OrderAddressTableMap; +use Thelia\Model\Map\OrderTableMap; /** * @@ -65,7 +68,22 @@ class Customer extends BaseLoop implements SearchLoopInterface, PropelSearchLoop ) ), Argument::createBooleanTypeArgument('reseller'), - Argument::createIntTypeArgument('sponsor') + Argument::createIntTypeArgument('sponsor'), + new Argument( + 'order', + new TypeCollection( + new Type\EnumListType(array( + 'id', 'id_reverse', + 'reference', 'reference_reverse', + 'firstname', 'firstname_reverse', + 'lastname', 'lastname_reverse', + 'last_order', 'last_order_reverse', + 'order_amount', 'order_amount_reverse', + 'registration_date', 'registration_date_reverse' + )) + ), + 'lastname' + ) ); } @@ -151,6 +169,49 @@ class Customer extends BaseLoop implements SearchLoopInterface, PropelSearchLoop $search->filterBySponsor($sponsor, Criteria::EQUAL); } + $orders = $this->getOrder(); + + foreach ($orders as $order) { + switch ($order) { + case 'id': + $search->orderById(Criteria::ASC); + break; + case 'id_reverse': + $search->orderById(Criteria::DESC); + break; + + case 'reference': + $search->orderByRef(Criteria::ASC); + break; + case 'reference_reverse': + $search->orderByRef(Criteria::DESC); + break; + + case 'lastname': + $search->orderByLastname(Criteria::ASC); + break; + case 'lastname_reverse': + $search->orderByLastname(Criteria::DESC); + break; + + case 'firstname': + $search->orderByFirstname(Criteria::ASC); + break; + case 'firstname_reverse': + $search->orderByFirstname(Criteria::DESC); + break; + + case 'registration_date': + $search->orderByCreatedAt(Criteria::ASC); + break; + case 'registration_date_reverse': + $search->orderByCreatedAt(Criteria::DESC); + break; + + + } + } + return $search; } @@ -158,16 +219,24 @@ class Customer extends BaseLoop implements SearchLoopInterface, PropelSearchLoop public function parseResults(LoopResult $loopResult) { foreach ($loopResult->getResultDataCollection() as $customer) { + $loopResultRow = new LoopResultRow($customer); - $loopResultRow->set("ID", $customer->getId()); - $loopResultRow->set("REF", $customer->getRef()); - $loopResultRow->set("TITLE", $customer->getTitleId()); - $loopResultRow->set("FIRSTNAME", $customer->getFirstname()); - $loopResultRow->set("LASTNAME", $customer->getLastname()); - $loopResultRow->set("EMAIL", $customer->getEmail()); - $loopResultRow->set("RESELLER", $customer->getReseller()); - $loopResultRow->set("SPONSOR", $customer->getSponsor()); - $loopResultRow->set("DISCOUNT", $customer->getDiscount()); + + $loopResultRow + ->set("ID" , $customer->getId()) + ->set("REF" , $customer->getRef()) + ->set("TITLE" , $customer->getTitleId()) + ->set("FIRSTNAME" , $customer->getFirstname()) + ->set("LASTNAME" , $customer->getLastname()) + ->set("EMAIL" , $customer->getEmail()) + ->set("RESELLER" , $customer->getReseller()) + ->set("SPONSOR" , $customer->getSponsor()) + ->set("DISCOUNT" , $customer->getDiscount()) + + ->set("LAST_ORDER_DATE" , $lastOrder != null ? $lastOrder->getCreatedAt() : '') + ->set("LAST_ORDER_AMOUNT" , $lastOrder != null ? $lastOrder->getCreatedAt() : '') + ->set("LAST_ORDER_CURRENCY" , $lastOrder != null ? $lastOrder->getCreatedAt() : '') + ; $loopResult->addRow($loopResultRow); } diff --git a/core/lib/Thelia/Core/Template/Smarty/Assets/SmartyAssetsManager.php b/core/lib/Thelia/Core/Template/Smarty/Assets/SmartyAssetsManager.php index 7ad557256..dd8491bb2 100755 --- a/core/lib/Thelia/Core/Template/Smarty/Assets/SmartyAssetsManager.php +++ b/core/lib/Thelia/Core/Template/Smarty/Assets/SmartyAssetsManager.php @@ -25,32 +25,44 @@ namespace Thelia\Core\Template\Smarty\Assets; use Thelia\Core\Template\Assets\AsseticHelper; use Thelia\Tools\URL; +use Thelia\Core\Template\Assets\AssetManagerInterface; class SmartyAssetsManager { const ASSET_TYPE_AUTO = ''; - private $assetic_manager; + private $assetsManager; 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 boolean $developmentMode true / false. If true, assets are not cached, and always generated. + * @param AssetManagerInterface $assetsManager an asset manager instance + * @param string $web_root the disk path to the web root (with final /) + * @param string $path_relative_to_web_root the path (relative to web root) where the assets will be generated */ - public function __construct($web_root, $path_relative_to_web_root, $developmentMode) + public function __construct(AssetManagerInterface $assetsManager, $web_root, $path_relative_to_web_root) { $this->web_root = $web_root; $this->path_relative_to_web_root = $path_relative_to_web_root; - $this->developmentMode = $developmentMode; + $this->assetsManager = $assetsManager; + } - $this->assetic_manager = new AsseticHelper(); + public function prepareAssets($assets_directory, \Smarty_Internal_Template $template) { + + $tpl_dir = dirname($template->source->filepath); + + $asset_dir_absolute_path = realpath($tpl_dir . DS . $assets_directory); + + if ($asset_dir_absolute_path === false) throw new \Exception("Failed to get real path of '".$tpl_dir . DS . $assets_directory."'"); + + $this->assetsManager->prepareAssets( + $asset_dir_absolute_path, + $this->web_root . $this->path_relative_to_web_root + ); } public function computeAssetUrl($assetType, $params, \Smarty_Internal_Template $template) @@ -66,19 +78,18 @@ class SmartyAssetsManager $tpl_dir = dirname($tpl_path); // Create absolute dir path - $asset_dir = realpath($tpl_dir.'/'.dirname($file)); + $asset_dir = realpath($tpl_dir) . DS . dirname($file); $asset_file = basename($file); if ($asset_dir === false) throw new \Exception("Failed to get real path of '".$tpl_dir.'/'.dirname($file)."'"); - $url = $this->assetic_manager->asseticize( - $asset_dir.'/'.$asset_file, - $this->web_root."/".$this->path_relative_to_web_root, + $url = $this->assetsManager->processAsset( + $asset_dir . DS . $asset_file, + $this->web_root . $this->path_relative_to_web_root, URL::getInstance()->absoluteUrl($this->path_relative_to_web_root, null, URL::PATH_TO_FILE /* path only */), $assetType, $filters, - $debug, - $this->developmentMode + $debug ); return $url; diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/AdminUtilities.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/AdminUtilities.php index 0be66997a..78e1c8f5b 100644 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/AdminUtilities.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/AdminUtilities.php @@ -69,6 +69,7 @@ class AdminUtilities extends AbstractSmartyPlugin { // The required permissions $resource = $this->getParam($params, 'resource'); + $module = $this->getParam($params, 'module'); $access = $this->getParam($params, 'access'); // The base position change path @@ -92,7 +93,12 @@ class AdminUtilities extends AbstractSmartyPlugin */ - if ($permissions == null || $this->securityContext->isGranted("ADMIN", array($resource), array($access))) { + if ($permissions == null || $this->securityContext->isGranted( + "ADMIN", + $resource === null ? array() : array($resource), + $module === null ? array() : array($module), + array($access)) + ) { return $this->fetch_snippet($smarty, 'includes/admin-utilities-position-block', array( 'admin_utilities_go_up_url' => URL::getInstance()->absoluteUrl($path, array('mode' => 'up', $url_parameter => $id)), diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/Assetic.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/Assets.php similarity index 81% rename from core/lib/Thelia/Core/Template/Smarty/Plugins/Assetic.php rename to core/lib/Thelia/Core/Template/Smarty/Plugins/Assets.php index 76d9e1c66..e4c220ed5 100755 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/Assetic.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/Assets.php @@ -27,18 +27,29 @@ use Thelia\Core\Template\Smarty\SmartyPluginDescriptor; use Thelia\Core\Template\Smarty\AbstractSmartyPlugin; use Thelia\Core\Template\Smarty\Assets\SmartyAssetsManager; use Thelia\Model\ConfigQuery; +use Thelia\Core\Template\Assets\AssetManagerInterface; -class Assetic extends AbstractSmartyPlugin +class Assets extends AbstractSmartyPlugin { public $assetManager; - public function __construct($developmentMode) + public function __construct(AssetManagerInterface $assetsManager) { - $web_root = THELIA_WEB_DIR; + $asset_dir_from_web_root = ConfigQuery::read('asset_dir_from_web_root', 'assets'); - $asset_dir_from_web_root = ConfigQuery::read('asset_dir_from_web_root', 'assets/'); + $this->assetManager = new SmartyAssetsManager($assetsManager, THELIA_WEB_DIR, $asset_dir_from_web_root); + } - $this->assetManager = new SmartyAssetsManager($web_root, $asset_dir_from_web_root, $developmentMode == 'dev'); + public function declareAssets($params, \Smarty_Internal_Template $template) + { + if (false !== $asset_dir = $this->getParam($params, 'directory', false)) { + + $this->assetManager->prepareAssets($asset_dir, $template); + + return ''; + } + + throw new \InvalidArgumentException('declare_assets: parameter "directory" is required'); } public function blockJavascripts($params, $content, \Smarty_Internal_Template $template, &$repeat) @@ -79,10 +90,11 @@ class Assetic extends AbstractSmartyPlugin public function getPluginDescriptors() { return array( - new SmartyPluginDescriptor('block' , 'stylesheets', $this, 'blockStylesheets'), - new SmartyPluginDescriptor('block' , 'javascripts', $this, 'blockJavascripts'), - new SmartyPluginDescriptor('block' , 'images' , $this, 'blockImages'), - new SmartyPluginDescriptor('function', 'image' , $this, 'functionImage') + new SmartyPluginDescriptor('block' , 'stylesheets' , $this, 'blockStylesheets'), + new SmartyPluginDescriptor('block' , 'javascripts' , $this, 'blockJavascripts'), + new SmartyPluginDescriptor('block' , 'images' , $this, 'blockImages'), + new SmartyPluginDescriptor('function', 'image' , $this, 'functionImage'), + new SmartyPluginDescriptor('function', 'declare_assets' , $this, 'declareAssets') ); } } diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/Security.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/Security.php index 4f8b0ccc2..46a45c0c4 100755 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/Security.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/Security.php @@ -55,9 +55,10 @@ class Security extends AbstractSmartyPlugin { $roles = $this->_explode($this->getParam($params, 'role')); $resources = $this->_explode($this->getParam($params, 'resource')); + $modules = $this->_explode($this->getParam($params, 'module')); $accesses = $this->_explode($this->getParam($params, 'access')); - if (! $this->securityContext->isGranted($roles, $resources, $accesses)) { + if (! $this->securityContext->isGranted($roles, $resources, $modules, $accesses)) { $ex = new AuthenticationException( sprintf("User not granted for roles '%s', to access resources '%s' with %s in context '%s'.", diff --git a/core/lib/Thelia/Form/CustomerUpdateForm.php b/core/lib/Thelia/Form/CustomerUpdateForm.php index 06e094ec7..7442309be 100755 --- a/core/lib/Thelia/Form/CustomerUpdateForm.php +++ b/core/lib/Thelia/Form/CustomerUpdateForm.php @@ -82,6 +82,21 @@ class CustomerUpdateForm extends BaseForm "for" => "lastname" ) )) + ->add("email", "email", array( + "constraints" => array( + new Constraints\NotBlank() + ), + "label" => Translator::getInstance()->trans("Email address"), + "label_attr" => array( + "for" => "email" + ) + )) + ->add("password", "text", array( + "label" => Translator::getInstance()->trans("Password"), + "label_attr" => array( + "for" => "email" + ) + )) ->add("address1", "text", array( "constraints" => array( new Constraints\NotBlank() @@ -89,7 +104,7 @@ class CustomerUpdateForm extends BaseForm "label_attr" => array( "for" => "address" ), - "label" => Translator::getInstance()->trans("Street Address") + "label" => Translator::getInstance()->trans("Street Address ") )) ->add("address2", "text", array( "label" => Translator::getInstance()->trans("Address Line 2"), diff --git a/core/lib/Thelia/Model/Admin.php b/core/lib/Thelia/Model/Admin.php index 84fb65b35..7c88ee8d2 100755 --- a/core/lib/Thelia/Model/Admin.php +++ b/core/lib/Thelia/Model/Admin.php @@ -35,15 +35,24 @@ class Admin extends BaseAdmin implements UserInterface return AdminResources::SUPERADMINISTRATOR; } - $userPermissionsQuery = ProfileResourceQuery::create() + $userResourcePermissionsQuery = ProfileResourceQuery::create() ->joinResource("resource", Criteria::LEFT_JOIN) ->withColumn('resource.code', 'code') ->filterByProfileId($profileId) ->find(); + $userModulePermissionsQuery = ProfileModuleQuery::create() + ->joinModule("module", Criteria::LEFT_JOIN) + ->withColumn('module.code', 'code') + ->filterByProfileId($profileId) + ->find(); + $userPermissions = array(); - foreach($userPermissionsQuery as $userPermission) { - $userPermissions[$userPermission->getVirtualColumn('code')] = new AccessManager($userPermission->getAccess()); + foreach($userResourcePermissionsQuery as $userResourcePermission) { + $userPermissions[$userResourcePermission->getVirtualColumn('code')] = new AccessManager($userResourcePermission->getAccess()); + } + foreach($userModulePermissionsQuery as $userModulePermission) { + $userPermissions['module'][strtolower($userModulePermission->getVirtualColumn('code'))] = new AccessManager($userModulePermission->getAccess()); } return $userPermissions; diff --git a/install/insert.sql b/install/insert.sql index c49f3e210..42470c72b 100755 --- a/install/insert.sql +++ b/install/insert.sql @@ -47,8 +47,7 @@ INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updat INSERT INTO `module` (`id`, `code`, `type`, `activate`, `position`, `full_namespace`, `created_at`, `updated_at`) VALUES (1, 'TheliaDebugBar', 1, 1, 1, 'TheliaDebugBar\\TheliaDebugBar', NOW(), NOW()), (2, 'Colissimo', 2, 0, 1, 'Colissimo\\Colissimo', NOW(), NOW()), -(3, 'Cheque', 3, 0, 1, 'Cheque\\Cheque', NOW(), NOW()), -(4, 'FakeCB', 3, 0, 2, 'FakeCB\\FakeCB', NOW(), NOW()); +(3, 'Cheque', 3, 0, 1, 'Cheque\\Cheque', NOW(), NOW()); INSERT INTO `module_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES ('1', 'en_US', 'Debug bar', NULL, NULL, NULL), @@ -1225,7 +1224,7 @@ INSERT INTO resource (`id`, `code`, `created_at`, `updated_at`) VALUES (14, 'admin.configuration.language', NOW(), NOW()), (15, 'admin.configuration.mailing-system', NOW(), NOW()), (16, 'admin.configuration.message', NOW(), NOW()), -(17, 'admin.configuration.module', NOW(), NOW()), +(17, 'admin.module', NOW(), NOW()), (18, 'admin.order', NOW(), NOW()), (19, 'admin.product', NOW(), NOW()), (20, 'admin.configuration.profile', NOW(), NOW()), diff --git a/reset_install.sh b/reset_install.sh index 83288a509..4409dc783 100755 --- a/reset_install.sh +++ b/reset_install.sh @@ -42,6 +42,5 @@ php Thelia module:activate Colissimo echo -e "\n\033[01;34m[INFO] Activating Payment Module(s)\033[00m\n" php Thelia module:activate Cheque -php Thelia module:activate FakeCB -echo -e "\n\033[00;32m[SUCCESS] Reset done\033[00m\n" \ No newline at end of file +echo -e "\n\033[00;32m[SUCCESS] Reset done\033[00m\n" diff --git a/templates/admin/default/I18n/fr_FR.php b/templates/admin/default/I18n/fr_FR.php index edccca64e..4d482cb30 100755 --- a/templates/admin/default/I18n/fr_FR.php +++ b/templates/admin/default/I18n/fr_FR.php @@ -1,808 +1,341 @@ 'Lire la suite', - 'Back-office home' => 'Accueil administration', - 'Thelia Back Office' => 'Thelia Back Office', - 'Version %ver' => 'Version %ver', - 'View site' => 'Voir le site', - 'View shop' => 'Voir la boutique', - 'Profil' => 'Profile', - 'Close administation session' => 'Quitter l\'interface d\'administration', - 'Logout' => 'Se déconnecter', - 'Home' => 'Accueil', - 'Customers' => 'Clients', - 'Orders' => 'Commandes', - 'All orders' => 'Toutes les commandes', - 'Catalog' => 'Catalogue', - 'Folders' => 'Dossier', - 'Coupons' => 'Codes Promo', - 'Configuration' => 'Configuration', - 'Modules' => 'Modules', - 'Search' => 'Recherche', - 'Thelia, solution e-commerce libre' => 'Thelia, solution e-commerce libre', - 'Dashboard' => 'Tableau de bord', - 'Sales' => 'Ventes', - 'New customers' => 'Nouveaux clients', - 'First orders' => 'Premières commandes', - 'Aborted orders' => 'Paniers abandonnés', - 'Shop Informations' => 'Informations sur le magasin', // pas très beau - 'Categories' => 'Catégories', - 'Products' => 'Produits', - 'Online products' => 'Produits en ligne', - 'Offline products' => 'Produits hors ligne', - 'Pending orders' => 'Commandes en attente', - 'In process orderst' => 'Commandes en traitement', // In process orderst ATTENTION FAUTE enlever le t à ordres - 'Shipped orders' => 'Commandes envoyées', - 'Canceled orders' => 'Commandes annulées', - 'Sales statistics' => 'Statistiques de vente', - 'Today' => 'Aujourd\'hui', - 'This month' => 'Ce mois', - 'This year' => 'Cette année', - 'Overall sales' => 'Total des ventes', - 'Sales excluding shipping' => 'Ventes hors frais de port', // ou Chiffre d'affaires non? - 'Yesterday sales' => 'Ventes de la veille', - 'Waiting orders' => 'Commandes en attente', - 'In process orders' => 'Commandes en traitement', - 'Average cart' => 'Panier moyen', - 'Previous month sales' => 'Ventes du mois précédent', - 'Previous year sales' => 'Ventes de l\année précédente', - 'Thelia informations' => 'Informations Thelia', - 'Current version' => 'Version en cours', - 'Latest version available' => 'Dernière version disponible', - 'News' => 'Actualités', - 'Click here' => 'Cliquez ici', - '© Thelia 2013' => '© Thelia 2013', - 'Édité par OpenStudio' => 'Édité par OpenStudio', - 'Forum Thelia' => 'Forum Thelia', - 'Contributions Thelia' => 'Contributions Thelia', - 'Customer' => 'Client', // vraiment au singulier ? - 'Customers list' => 'Liste des clients', - 'Add a new Customer' => 'Ajouter un client', - 'customer ref' => 'ref client', - 'firstname & lastname' => 'Prénom & nom', - 'last order' => 'Dernière commande', - 'order amount' => 'Montant de la commande', - 'Actions' => 'Actions', - 'Edit this customer' => 'Modifier ce client', - 'Send a mail to this customer' => 'Contacter ce client par mail', - 'Delete this customer and all his orders' => 'Supprimer ce client et toutes ses commandes', - 'Company Name' => 'Entreprise', - 'Company' => 'Entreprise', - 'Title' => 'Civilité', - 'First Name' => 'Prénom', - 'Firstname' => 'Prénom', - 'Last Name' => 'Nom', - 'Lastname' => 'Nom', - 'Street Address' => 'Rue', - 'Address' => 'Adresse', - 'Address Line 2' => 'Adresse suite', - 'Additional address' => 'Adresse complémentaire', - 'Address Line 3' => 'Adresse suite', - 'Zip code' => 'Code postal', - 'City' => 'Ville', - 'Country' => 'Pays', - 'Email Address' => 'Adresse e-mail', - 'Email address' => 'Adresse e-mail', - 'Create a new customer' => 'Ajouter un client', - 'Create this customer' => 'Ajouter ce client', - 'Cancel' => 'Annuler', - 'OK' => 'OK', - 'Delete customer' => 'Supprimer ce client', - 'Do you really want to delete this customer ?' => 'Voulez-vous supprimer ce client ? ', - 'No' => 'No', - 'Yes' => 'Yes', - 'Thelia configuration' => 'Configuration thelia', - 'Product catalog configuration' => 'Configuration du catalogue produit', - 'Product templates' => 'Template produit', - 'Product attributes' => 'Attributs produit', - 'Product features' => 'Caractéristiques produit', - 'Mailing templates' => 'Template e-mail', - 'Currencies' => 'Monnaie', - 'Taxes rules' => 'Règles de taxes', - 'Shipping configuration' => 'Configuration du transport', - 'Countries' => 'Pays', - 'Shipping zones' => 'Zones de livraison', - 'System parameters' => 'Paramètres système ', - 'Modules activation' => 'Activation du modules', - 'System variables' => 'Gestion des variables', // ? - 'Administration profiles' => 'Gestion des administrateurs', // - 'Administrators' => 'Administrateurs', - 'Languages & URLs' => 'Langues et URLs', - 'Mailing system' => 'Envoi des e-mails', - 'Administration logs' => 'Gestion des logs', - 'System logs' => 'Journal des logs', - 'Thelia System Variables' => 'Variables Thelia',// pas sure du tout - 'Thelia system variables' => 'Variables Thelia', - 'Add a new variable' => 'Ajouter une variable', - 'Save chages' => 'Enregistrer les modifications', // attention faute sur Changes - 'Save changes' => 'Enregistrer les modifications', - 'Purpose' => 'Objet', // ? - 'Name' => 'Nom', - 'Value' => 'Valeur', - 'Action' => 'Action', - 'Change this variable' => 'Modifier cette variable', - 'Cancel changes and revert to original value' => 'Annuler les modifications et revenir à la version antérieure', - 'Delete this variable' => 'Supprimer cette variable', - 'Name *' => 'Nom *', - 'Variable name' => 'Nom de la variable', - 'Value *' => 'Valeur *', - 'Variable value' => 'Valeur de la variable', - 'Purpose *' => 'Objet *', - 'Variable purpose' => 'Objet de la variable', - 'English' => 'Anglais', - 'Enter here the category name in the default language (%title)' => 'Entrer ici le nom de la catégorie dans la langue par défaut (%title)', - 'Create a new variable' => 'Créer une nouvelle variable', - 'Create this variable' => 'Ajouter cette variable', - 'Delete a variable' => 'Supprimer une variable', - 'Do you really want to delete this variable ?' => 'Voulez-vous vraiment supprimer cette variable ?', - 'Coupon' => 'Code promo', - 'Browse' => 'Parcourir', - 'Coupons : ' => 'Codes promo', - 'List' => 'Liste', - 'Create a new coupon' => 'Créer un nouveau code promo', - 'Enabled coupons' => 'Codes promo disponibles', - 'Code' => 'Code', - 'Days before expiration' => 'Jours de validité', - 'Usage left' => 'Utilisation restante', // ??? - 'Edit' => 'Editer', - 'Unlimited' => 'Illimité', - 'Disabled coupons' => 'Codes désactivés', - 'Expiration date' => 'Date de fin', - 'Update coupon' => 'Mettre à jour le code', - 'Update' => 'Mettre à jour', - 'Code :' => 'Code', - 'code' => 'code', - 'Title :' => 'Titre', - 'title' => 'titre', - 'Is enabled' => 'Est valide', - 'Is available on special offers' => 'Est valide sur les offres promotionnelles', - 'Is cumulative' => 'Est cumulable', - 'Is removing postage' => 'Offre les frais de port', - 'Expiration date :' => 'Date de fin de validité', - 'yyyy-mm-dd' => 'jjjj--mm--aa', - 'Is unlimited' => 'Est illimité', - 'Max usage :' => 'Utilisations max', - 'max usage' => 'utilisations max', - 'Type :' => 'Type', - 'Please select a coupon type' => 'Merci d\'entrer le type de code', - 'Amount :' => 'Montant', - '14.50' => '14.50', - 'Short description :' => 'Description courte', - 'short description' => 'description court', - 'Long description :' => 'Description longue', - 'long description' => 'description longue', - 'Save your modifications' => 'Enregistrer les modifications', - 'Conditions' => 'Conditions', - 'Delete' => 'Supprimer', - 'And' => 'Et', - 'Save this condition' => 'Enregistrer cette condition', - 'Condition\'s category :' => 'Type de condition', - 'Please select a condition category' => 'Merci d\'entrer le type de condition', - 'Files manager' => '',//??? - 'Please retry' => 'Merci de réessayer', - 'Please select another condition' => 'Merci de sélectionner une autre condition', - 'Edit a customer' => 'Editer un client', - 'Editing customer "%name"' => 'Edition du client "%name"', - 'Edit customer thelia thelia' => '', // normal que ce soit en dur ça?? - 'Save' => ' Enregistrer', - 'Save and close' => 'Enregistrer et fermer', - 'Customer informations' => 'Informations client', - 'Default address' => 'Adresse par défaut', - 'Other addresses' => 'Autres adresses', - 'Add a new address' => 'Ajouter une nouvelle adresse', - 'Phone' => 'Téléphone', - 'cell phone' => 'Tel portable', - 'Edit this address' => 'Modifier cette adresse', - 'Use this address by default' => 'Utiliser comme adresse par défaut', - 'orders for this customer' => 'commandes pour ce client', - 'Order n°' => 'Commande n° ', - 'Date & Hour' => 'Date et heure', - 'Amount' => 'Montant', - 'Status' => 'Statut', - 'Sorry, customer ID=1 was not found.' => 'Désolée, le client ID=1 n\'a pas été trouvé.',// normal le ID=1 ? - 'Address label' => 'libellé de l\'adresse', - 'Label' => 'Libellé', - 'Create an address' => 'Créer une adresse', - 'Create this address' => 'Créer cette adresse', - 'Use address by default' => 'Utiliser comme adresse par défaut', - 'Do you really want to use this address by default ?' => 'Voulez-vous vraiment utiliser cette adresse comme adresse par défaut ?', - 'Delete address' => 'Supprimer l\'adresse', - 'Do you really want to delete this address ?' => 'Voulez-vous vraiment supprimer cette adresse ? ', - 'Edit an address' => 'Editer une adresse', - 'Edit this order' => 'Editer cette commande ', - 'Cancel this order' => 'Annuler cette commande', - 'Delete an order' => 'Supprimer une commande', - 'Do you really want to cancel this order ?' => 'Voulez-vous vraiment sup primer cette commande ? ', - 'Edit an order' => 'Editer une commande', - 'Ordered products' => 'Produits commandés', - 'Invoice and Delivery' => 'Livraison et facturation', - 'Cart' => 'Panier', - 'Product' => 'Produit', - 'Unit. price' => 'Prix unitaire', - 'Tax' => 'Taxes', - 'Unit taxed price' => 'Prix unitaire TTC', // ? - 'Quantity' => 'Quantité', - 'Taxed total' => 'Montant total des taxes', - 'Total without discount' => 'Montant total hors remises', - 'Discount' => 'Remise', - 'Coupon code' => 'Code promo', - 'Total including discount' => 'Total avec remise', - 'Postage' => 'Frais de livraison', - 'Total' => 'Total', - 'Payment information' => 'Informations de paiement', - 'Payment module' => 'Module de paiement', - 'Transaction reference' => 'Référence de la transaction', - 'Delivery module' => 'Module de livraison', - 'tracking reference' => 'Reference Tracking', - 'Description' => 'Description', - 'Invoice informations' => 'Informations de facturation', - 'Download invoice as PDF' => 'Télécharger la facture au format PDF', - 'PDF | Invoice' => 'Facure PDF', - 'Edit invoice address' => 'Editer l\'adresse de facturation', - 'Invoice reference' => 'Facture ref',// - 'Invoice date' => 'Facture date',// - 'Street address' => 'Adresse', - 'Delivery address' => 'Adresse de livraison', - 'Download purchase order as PDF' => 'Télécharger le bon de commande au format PDF', - 'PDF | Purchase order' => 'Bon de commande PDF', - 'Edit delivery address' => 'Editer l\'adresse de livraison', - 'Compagny' => 'Entreprise', // faute - 'Edit order address' => 'Editer l\'adresse de commande ', // ? - 'Confirm changes' => 'Valider les modifications', - 'Top level categories' => 'Catégories de niveau 1 ', - 'Add a new category' => 'Ajouter une catégorie', - 'ID' => 'ID', - 'Category title' => 'Titre de la catégorie', - 'Online' => 'En ligne', - 'Position' => 'Position', - 'Browse this category' => 'Parcourir cette catégorie', - 'Edit this category' => 'Editer cette catégorie', - 'Delete this category and all its contents' => 'Supprimer cette catégorie et tout ce qu\'elle contient ? ', - 'This category has no sub-categories. To create a new one, click the + button above.' => 'Cette catégorie n\'a pas de sous-catégorie. Pour en créer une nouvelle, cliquez sur le bouton + ci-dessus.', - 'This category has no sub-categories.' => 'Cette catégorie n\'a pas de sous-catégorie.', - 'Top level Products' => 'Produits mis en avant',// ? - 'Add a new product' => 'Ajouter un nouveau produit', - 'Reference' => 'Reference', - 'Product title' => 'Titre du produit', - 'This category doesn\'t contains any products. To add a new product, click the + button above.' => 'Cette catégorie n\'a aucun produit. Pour créer un nouveau product, cliques sur le bouton + ci-dessus. ', // attention faute : doesn't contain pas contains - 'Create a new category' => 'Créer une catégorie', - 'Create this category' => 'Créer cette catégorie', - 'Enter here the product reference' => 'Entrez ici la nouvelle référence produit', - 'Enter here the product name in the default language (%title)' => 'Entrez ici le nom du produit dans la langue par défaut (%title)', - 'Product price' => 'Prix du produit', - 'Enter here the product price in the default currency (%title)' => 'ntrez ici le prix du produit dans la langue par défaut (%title)', - 'Select a tax tule' => 'Sélectionnez une règle de taxes', - 'Select here the tax applicable to this product' => 'Sélectionnez ici la taxe applicable sur ce produit', - 'Product weight' => 'Poids du produit', - 'Kg' => 'Kg', - 'Enter here the product weight, in Kilogrammes' => 'Entrez ici le poids du produit, en Kilogrammes', - 'Create a new product' => 'Créer un nouveau produit', - 'Create this product' => 'Créer ce produit', - 'Delete category' => 'Supprimer cette catégorie', - 'Do you really want to delete this category and all its content ?' => 'Voulez-vous vraiment supprimer cette catégorie et tout ce qu\'elle contient ?', - 'Delete product' => 'Supprimer ce produit', - 'Do you really want to delete this product ?' => 'Voulez-vous vraiment supprimer ce produit ?', - 'Enter new category position' => 'Classement de la catégorie ', // ? - 'Enter new product position' => 'Classement du produit', - 'Edit category' => 'Editer la catégorie', - 'Editing %cat' => 'Edition de %cat', - 'Edit category %title' => 'Editer le titre de la catégorie : %title', - 'Preview category page' => '', - 'Edit next category' => '', - 'General description' => '', - 'Associations' => '', - 'Images' => '', - 'Documents' => '', - 'Edit information in %lng' => '', - 'Français' => '', - 'castellano' => '', - 'Italiano' => '', - 'Close' => '', - 'Category title *' => '', - 'Summary' => '', - 'A short description, used when a summary or an introduction is required' => '', - 'Short description' => '', - 'Detailed description' => '', - 'The detailed description.' => '', - 'Conclusion' => '', - 'A short post-description information' => '', - 'Short conclusion' => '', - 'Rewriten URL *' => '', - 'Rewritten URL' => '', - 'Rewriten URL' => '', - 'Parent category *' => '', - 'Top level' => '', - 'Visibility' => '', - 'Category created on %date_create. Last modification: %date_change' => '', - 'Related content' => '', - 'You can attach here some content to this category' => '', - 'Select a folder...' => '', - 'Select a folder to get its content' => '', - 'Select a folder content...' => '', - 'Select a content and click (+) to add it to this category' => '', - 'No available content in this folder' => '', - 'No folders found' => '', - 'Content title' => '', - 'This category contains no contents' => '', - 'Send files' => '', - 'Drop files to upload' => '', - 'Browse files' => '', - 'Update this image' => '', - 'There is no images attached to this %type.' => '', - 'Can\'t load images, please refresh this page.' => '', - 'There is no documents attached to this %type.' => '', - 'Can\'t load documents, please refresh this page.' => '', - 'Remove related content' => '', - 'Do you really want to remove this related content ?' => '', - '(edit)' => '', - 'Categories in %cat' => '', - 'Products in %cat' => '', - 'Edit this product' => '', - 'Delete this product' => '', - 'Edit product' => '', - 'Editing %title' => '', - 'Edit product %title' => '', - 'Preview product page' => '', - 'General' => '', - 'Details' => '', - 'Attributes & Features' => '', - 'Product reference' => '', - 'Product title *' => '', - 'Default product category *' => '', - 'You can attach this product to more categories in the details tab.' => '', - 'Product created on %date_create. Last modification: %date_change' => '', - 'Edit prices in %curr' => '', - 'Attribute Combinations' => '', - 'Quickly create combinations using the combination builder' => '', - 'Combination builder' => '', - 'Add a new combination' => '', - 'EAN Code' => '', - 'Price
w/o taxes (%currency)' => '', - 'Price
w/ taxes (%currency)' => '', - 'Weight
(Kg)' => '', - 'Default' => '', - 'Sale' => '', - 'New' => '', - 'Sale price
w/o taxes (%currency)' => '', - 'Sale price
w/ taxes (%currency)' => '', - 'Delete this combination' => '', - 'Attribute' => '', - 'Select an attribute...' => '', - 'Select an attribute and click (+) to view available values' => '', - 'Select an attribute value...' => '', - 'Select a value click (+) to add it to the combination' => '', - 'No available value for this attribute' => '', - 'To remove a value from the combination, select it and click "remove"' => '', - 'Remove selected values' => '', - 'Create a new combination' => '', - 'Create this combination' => '', - 'Delete a combination' => '', - 'Do you really want to delete this combination ?' => '', - 'Select attribute values to combine. You may enter a default value for some of the fields of the generated combinations.' => '', - 'Price excl. taxes' => '', - 'Combination reference' => '', - 'Combination EAN Code' => '', - 'Current quantity' => '', - '0 combinations' => '', - 'Create combinations' => '', - 'Please wait, loading' => '', - 'Failed to get converted prices. Please try again.' => '', - 'Failed to get prices. Please try again.' => '', - 'Existing combinations will be deleted. Do you want to continue ?' => '', - 'To use features or attributes on this product, please select a product template. You can define product templates in the configuration section of the administration.' => '', - 'Current product template' => '', - 'Do not use a product template' => '', - 'Apply' => '', - 'Product Attributes' => '', - 'You can change template attributes and their positions in the template configuration page.' => '', - 'Attribute Name' => '', - 'This product template does not contains any features' => '', - 'Product Features' => '', - 'You can change templates features and their positions in the template configuration page.' => '', - 'Feature Name' => '', - 'Feature value for this product' => '', - 'Use Ctrl+click to select more than one value. You can also clear selected values.' => '', - 'Enter here the feature value as free text' => '', - 'Feature value' => '', - 'Top level folders' => '', - 'Add a new folder' => '', - 'Folder title' => '', - 'Browse this folder' => '', - 'Edit this folder' => '', - 'Delete this folder and all its contents' => '', - 'This folder has no sub-folders. To create a new one, click the + button above.' => '', - 'This folder has no sub-folders.' => '', - 'Top level Contents' => '', - 'Add a new content' => '', - 'This folder doesn\'t contains any contents. To add a new content, click the + button above.' => '', - 'Enter here the folder name in the default language (%title)' => '', - 'Create a new folder' => '', - 'Create this folder' => '', - 'Enter here the content name in the default language (%title)' => '', - 'Create a new content' => '', - 'Create this content' => '', - 'Delete folder' => '', - 'Do you really want to delete this folder and all its content ?' => '', - 'Delete content' => '', - 'Do you really want to delete this content ?' => '', - 'Enter new folder position' => '', - 'Enter new content position' => '', - 'An error occured' => '', - 'Oops! An Error Occurred' => '', - 'Go to administration home' => '', - 'Folders in %fold' => '', - 'Contents in %fold' => '', - 'Edit this content' => '', - 'Delete this content' => '', - 'Edit content' => '', - 'Edit content %title' => '', - 'Preview folder page' => '', - 'Content title *' => '', - 'Default folder *' => '', - 'Folder created on %date_create. Last modification: %date_change' => '', - 'Additional Folders' => '', - 'A content could be attached to more than one folder. Select here the additional fodlers for this content.' => '', - 'You can change the default folder (%title) in the "General" tab.' => '', - ' (default)' => '', - 'Select a folder and click (+) to add it to the additional folder list' => '', - 'No Folders found' => '', - 'This product doesn\'t belong to any additional folder.' => '', - 'Remove associated folder' => '', - 'Do you really want to remove the content from this folder ?' => '', - 'Remove the product from this category' => '', - 'Coupon : ' => '', - 'days left' => '', - 'May be cumulative' => '', - 'Won\'t remove postage' => '', - 'Will be available on special offers' => '', - 'Application field' => '', - 'Do you really want to enable this element ?' => '', - 'Confirmation' => '', - 'Confirm' => '', - 'Create coupon' => '', - 'Create' => '', - 'Please save your Coupon in oder to affect it some conditions' => '', - 'Do you really want to delete this element ?' => '', - 'Thelia Product Templates' => '', - 'Thelia product templates' => '', - 'Add a new product template' => '', - 'Change this template' => '', - 'Change this product template' => '', - 'Delete this product template' => '', - 'No product template has been created yet. Click the + button to create one.' => '', - 'Template Name *' => '', - 'Template title' => '', - 'Enter here the template name in the default language (English)' => '', - 'Create a new product template' => '', - 'Create this product template' => '', - 'Delete template' => '', - 'Do you really want to delete this template ? It will be removed from all products.' => '', - 'Select an feature...' => '', - 'Select an feature and click (+) to add it to this template' => '', - 'Feature title' => '', - 'Delete this feature' => '', - 'This template contains no features' => '', - 'Remove feature' => '', - 'Do you really want to remove this feature from the template ?' => '', - 'Thelia Product Attributes' => '', - 'Thelia product attributes' => '', - 'Add a new product attribute' => '', - 'Change this attribute' => '', - 'Remove this attribute from all product templates' => '', - 'Add this attribute to all product templates' => '', - 'Change this product attribute' => '', - 'Delete this product attribute' => '', - 'No product attribute has been created yet. Click the + button to create one.' => '', - 'Title *' => '', - 'Attribute title' => '', - 'Enter here the attribute name in the default language (English)' => '', - 'Check this box if you want to add this attributes to all product templates' => '', - 'Create a new attribute' => '', - 'Create this attribute' => '', - 'Delete attribute' => '', - 'Do you really want to delete this attribute ? It will be removed from all product templates.' => '', - 'Add to all product templates' => '', - 'Do you really want to add this attribute to all product templates ?' => '', - 'Remove from all product templates' => '', - 'Do you really want to remove this attribute from all product templates ? You\'ll loose all product related data for this attribute.' => '', - 'Enter new attribute position' => '', - 'Edit an attribute' => '', - 'Attributes' => '', - 'Editing attribute "%name"' => '', - 'Edit attribute en_US : Officiis cumque.' => '', - 'Attribute information' => '', - 'Attribute values' => '', - 'Enter here all possible attribute values.' => '', - 'Delete this value' => '', - 'No value has been created yet. Click the + button to create one.' => '', - 'Sorry, attribute ID=1 was not found.' => '', - 'Enter here the value in the current edit language (English)' => '', - 'Create a new attribute value' => '', - 'Create this value' => '', - 'Delete attribute value' => '', - 'Do you really want to delete this attribute value ?' => '', - 'Enter new value position' => '', - 'Thelia Product Features' => '', - 'Thelia product features' => '', - 'Add a new product feature' => '', - 'Change this feature' => '', - 'Remove this feature from all product templates' => '', - 'Add this feature to all product templates' => '', - 'Change this product feature' => '', - 'Delete this product feature' => '', - 'No product feature has been created yet. Click the + button to create one.' => '', - 'Enter here the feature name in the default language (English)' => '', - 'Check this box if you want to add this features to all product templates' => '', - 'Create a new feature' => '', - 'Create this feature' => '', - 'Delete feature' => '', - 'Do you really want to delete this feature ? It will be removed from all product templates.' => '', - 'Do you really want to add this feature to all product templates ?' => '', - 'Do you really want to remove this feature from all product templates ? You\'ll loose all product related data for this feature.' => '', - 'Enter new feature position' => '', - 'Edit a feature' => '', - 'Features' => '', - 'Editing feature "%name"' => '', - 'Edit feature en_US : Consectetur omnis.' => '', - 'Feature information' => '', - 'Feature values' => '', - 'Enter here all possible feature values. To get a free text feature in product forms, don\'t add any value.' => '', - 'Sorry, feature ID=1 was not found.' => '', - 'Create a new feature value' => '', - 'Delete feature value' => '', - 'Do you really want to delete this feature value ?' => '', - 'Thelia Mailing Templates' => '', - 'Thelia mailing templates' => '', - 'Add a new mailing template' => '', - 'Change this mailing template' => '', - 'Delete this mailing template' => '', - 'No mailing template has been created yet. Click the + button to create one.' => '', - 'Mailing template name' => '', - 'Mailing template purpose' => '', - 'Enter here the mailing template purpose in the default language (English)' => '', - 'Create a new mailing template' => '', - 'Create this mailing template' => '', - 'Delete mailing template' => '', - 'Do you really want to delete this mailing template ?' => '', - 'Edit a mailing template' => '', - 'Editing mailing template "%name"' => '', - 'Edit mailing template order_confirmation' => '', - 'Prevent mailing template modification or deletion, except for super-admin' => '', - 'Message subject *' => '', - 'Subject' => '', - 'HTML Message' => '', - 'The mailing template in HTML format.' => '', - 'Text Message' => '', - 'The mailing template in text-only format.' => '', - 'Message created on %date_create. Last modification: %date_change' => '', - 'Sorry, message ID=1 was not found.' => '', - 'Update rates' => '', - 'Add a new currency' => '', - 'ISO 4217 Code' => '', - 'More information about ISO 4217' => '', - 'Symbol' => '', - 'Rate in €' => '', - 'Change this currency' => '', - 'Delete this currency' => '', - 'No currency has been created yet. Click the + button to create one.' => '', - 'Currency name' => '', - 'Enter here the currency name in the default language (English)' => '', - 'ISO 4217 code *' => '', - 'ISO 4217 code' => '', - 'Symbol *' => '', - 'Currency symbol' => '', - 'Rate from € *' => '', - 'Currency rate' => '', - 'Rate' => '', - 'The rate from Euro (Price in Euro * rate = Price in this currency)' => '', - 'Create a new currency' => '', - 'Create this currency' => '', - 'Delete currency' => '', - 'Do you really want to delete this currency ?' => '', - 'Enter new currency position' => '', - 'Edit a currency' => '', - 'Editing currency "%name"' => '', - 'Edit currency Euro' => '', - 'Currency ISO 4217 Code' => '', - 'The symbol, such as $, £, €...' => '', - 'Rate from Euro' => '', - 'Sorry, currency ID=1 was not found.' => '', - 'In order to manges your shop taxes you can manage' => '', - 'taxes' => '', - 'and' => '', - 'tax rules' => '', - 'Taxes define the amount of money which is add to a bought product.' => '', - 'Example :' => '', - 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => '', - 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => '', - 'Tax rules are combination of different taxes.' => '', - 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => '', - 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.' => '', - 'Taxes' => '', - 'Create a new tax' => '', - 'Change this tax' => '', - 'Delete this tax' => '', - 'Create a new tax rule' => '', - 'Change this tax rule' => '', - 'Set as default tax rule' => '', - 'Delete this tax rule' => '', - 'Type' => '', - 'amount' => '', - 'feature' => '', - 'percent' => '', - 'Delete tax' => '', - 'Do you really want to delete this tax ?' => '', - 'Delete tax rule' => '', - 'Do you really want to delete this tax rule ?' => '', - 'Edit a tax' => '', - 'Editing tax' => '', - 'Tax created on %date_create. Last modification: %date_change' => '', - 'Edit a tax rule' => '', - 'Editing tax rule' => '', - 'Tax rule created on %date_create. Last modification: %date_change' => '', - 'Manage taxes' => '', - 'Choose a country' => '', - 'Countries that have the same tax rule' => '', - 'NONE' => '', - 'Manage the tax rule taxes appliance order' => '', - 'Add tax to this group' => '', - 'Drop tax here to create a tax group' => '', - 'Drop tax here to delete from group' => '', - 'Tax rule taxes will be update for the following countries :' => '', - 'uncheck all' => '', - 'Update tax rule taxes' => '', - 'Edit tax rule taxes' => '', - 'Add a new country' => '', - 'Shop' => '', - 'N° ISO' => '', - 'ISO Code' => '', - 'Change this country' => '', - 'Delete this country' => '', - 'No country has been created yet. Click the + button to create one.' => '', - 'Country title *' => '', - 'Country title' => '', - 'Country area' => '', - 'ISO Code *' => '', - 'Alpha code 2 *' => '', - 'Alpha code 2' => '', - 'Alpha code 3 *' => '', - 'Alpha code 3' => '', - 'Create a new country' => '', - 'Create this country' => '', - 'Delete country' => '', - 'Do you really want to delete this country ?' => '', - 'Error' => '', - 'Impossible to change default country. Please contact your administrator or try later' => '', - 'Edit a country' => '', - 'Editing country "%name"' => '', - 'Edit country ' => '', - '' => '',//? - 'Country short description' => '', - 'Country description' => '', - 'Sorry, country ID=190 was not found.' => '', - 'Edit country Afghanistan' => '', - 'Sorry, country ID=1 was not found.' => '', - 'Thelia Shipping zones' => '', - 'Change this shipping zone' => '', - 'Edit a shipping zone' => '', - 'Editing shipping zone "%name"' => '', - 'Edit shipping zone %title' => '', - 'Add' => 'Ajouter', - 'Zones' => '', - 'Delete this zone' => '', - 'Remove zone' => '', - 'Do you really want to remove this zone ?' => '', - 'Thelia Shipping configuration' => '', - 'Add a new shipping configuration' => '', - 'Change this shipping configuration' => '', - 'Delete this shipping configuration' => '', - 'Shipping configuration name' => '', - 'Create a new shipping configuration' => '', - 'Create this shipping configuration' => '', - 'Delete shipping configuration' => '', - 'Do you really want to delete this shipping configuration ?' => '', - 'Edit a shipping configuration' => '', - 'Editing shipping configuration "%name"' => '', - 'Edit shipping configuration %title' => '', - 'Add this country' => '', - 'No area defined with this id' => '', - 'Remove country' => '', - 'Do you really want to remove this country ?' => '', - 'Classic modules' => '', - 'classic modules' => '', - 'Enable/Disable' => '', - 'Deactivate %title module' => '', - 'deactivation' => '', - 'Edit this module' => '', - 'Delete this module' => '', - 'Delivery modules' => '', - 'Payment modules' => '', - 'Delete a module' => '', - 'Do you really want to delete this module ?' => '', - 'Edit a system variable' => '', - 'Editing variable "%name"' => '', - 'Edit variable active-template' => '', - 'Prevent variable modification or deletion, except for super-admin' => '', - 'Variable created on %date_create. Last modification: %date_change' => '', - 'Sorry, variable ID=3 was not found.' => '', - 'Profiles' => '', - 'Create a new profile' => '', - 'Profile Code' => '', - 'Profile code' => '', - 'Postscriptum' => '', - 'Delete profile' => '', - 'Do you really want to delete this profile ?' => '', - 'You can\'t delete this profile' => '', - 'They are some administrator which are linked to this profile. Please edit/remove them before deleting this profile.' => '', - 'Create a new administrator' => '', - 'Login' => '', - 'FirstName' => 'Prénom', - 'LastName' => 'Nom', - 'Profile' => 'Profile', - 'Superadministrator' => '', - 'Change this administrator' => '', - 'Password' => '', - 'Password confirmation' => '', - 'Leave empty to keep current password' => '', - 'Update a new administrator' => '', - 'Delete administrator' => '', - 'Do you really want to delete this administrator ?' => '', - 'You can\'t delete this administrator' => '', - 'They are some administrator which are linked to this administrator. Please edit/remove them before deleting this administrator.' => '', - 'Thelia Languages' => '', - 'Languages' => '', - 'Languages management' => '', - 'Add a new language' => '', - 'Language name' => '', - 'ISO 639 Code' => '', - 'Locale' => '', - 'date form' => '', - 'time form' => '', - 'Change this language' => '', - 'Delete this language' => '', - 'Parameters' => '', - 'If a translation is missing or incomplete :' => '', - 'Using a domain or subdomain for each language' => '', - 'activate' => '', - 'Language title' => '', - 'language locale' => '', - 'en_US' => 'en_US', - 'date format' => '', - 'd-m-Y' => 'j-m-A', - 'time format' => '', - 'H:i:s' => '',//? - 'Create a new language' => '', - 'Create this language' => '', - 'Delete language' => '', - 'Do you really want to delete this language ?' => '', - 'Impossible to change default languages. Please contact your administrator or try later' => '', - 'Edit a language' => '', - 'Edit this language' => '', - 'deactivate' => 'désactiver', - 'Thelia Mailing System' => '', - 'Configuration mailing system' => '', - 'Enable remote SMTP use : ' => '', - 'Host :' => 'Host', - 'Host' => 'Host', - 'Port :' => 'Port', - 'Port' => 'Port', - 'Encryption :' => '', //? - 'Encryption' => '', - 'Username :' => 'Nom d\'utilisateur', - 'Username' => 'Nom d\'utilisateur', - 'Password :' => 'Mot de passe', - 'Auth Mode :' => '', - // 'Auth Mode' => 'Mode auteur', - // 'Timeout :' => 'Délai', -// 'Timeout' => 'Délai', - 'Source IP :' => 'IP source', - 'Source IP' => 'IP source', - 'Show logs' => 'Voir les loge', - 'Period' => 'Période', - 'From' => 'De', - 'To' => 'A', - 'Resources' => 'Ressources', - 'company' => 'entreprise', -) -; \ No newline at end of file +return array( + 'Page not found' => 'Page non trouvée', + 'The server returned a "404 Not Found"' => 'Le serveur à retourné l\'erreur "404 non trouvé"', + 'The page you\'ve requested was not found. Please check the page address, and try again.' => 'La page que vous avez demandé n\'est pas disponible.', + 'Thelia Back Office' => 'Thelia Back Office', + 'Version %ver' => 'Version %ver', + 'View site' => 'Voir le site', + 'View shop' => 'Voir la boutique', + 'Profil' => 'Profile', + 'Close administation session' => 'Quitter l\'interface d\'administration', + 'Logout' => 'Se déconnecter', + 'Home' => 'Accueil', + 'Customers' => 'Clients', + 'Orders' => 'Commandes', + 'All orders' => 'Toutes les commandes', + 'Catalog' => 'Catalogue', + 'Folders' => 'Dossier', + 'Coupons' => 'Codes Promo', + 'Configuration' => 'Configuration', + 'Modules' => 'Modules', + 'Search' => 'Recherche', + 'Thelia, the open source e-commerce solution' => 'Thelia, solution e-commerce libre', + '© Thelia 2013' => '© Thelia 2013', + 'Published by OpenStudio' => 'Edité par OpenStudio', + 'Thelia support forum' => 'Communauté Thelia', + 'Thelia contributions' => 'Contributions Thelia', + 'Thelia Mailing System' => 'Configuration des envois de mails', + 'Administration logs' => 'Gestion des logs', + 'Show logs' => 'Voir les loge', + 'Period' => 'Période', + 'From' => 'De', + 'To' => 'A', + 'Administrators' => 'Administrateurs', + 'Resources' => 'Ressources', + 'Back-office users' => 'Utilisateurs du back-office', + 'Taxes' => 'Taxes', + 'Create a new administrator' => 'Créer un nouvel administrateur', + 'Login' => 'Connexion', + 'First Name' => 'Prénom', + 'Last Name' => 'Nom', + 'Profile' => 'Profile', + 'Actions' => 'Actions', + 'Superadministrator' => 'Super-administrateur', + 'Change this administrator' => 'Modifier cet administrateur', + 'Delete this administrator' => 'Supprimer cet administrateur', + 'FirstName' => 'Prénom', + 'LastName' => 'Nom', + 'Password' => 'Mot de passe', + 'Create' => 'Créer', + 'Cancel' => 'Annuler', + 'Leave empty to keep current password' => 'Laisser ce champ vide pour ne pas modifier le mot de passe', + 'Update a new administrator' => 'Modifier cet administrateur', + 'Update' => 'Mettre à jour', + 'Delete administrator' => 'Supprimer un administrateur', + 'Do you really want to delete this administrator ?' => 'Confirmez-vous la suppression de cet adminisrateur ?', + 'You can\'t delete this administrator' => 'Vous ne pouvez pas supprimer cet administrateur', + 'They are some administrator which are linked to this administrator. Please edit/remove them before deleting this administrator.' => 'Cet administrateur est lié avec un ou plusieurs autres administrateurs. Supprimez ou modifiez ces administrateur d\'abord.', + 'Label' => 'Libellé', + 'Company' => 'Entreprise', + 'Edit a language' => 'Modifier une langue', + 'Edit this language' => 'Modifier cette langue', + 'Current product template' => 'Gabarit de produit actuel', + 'Do not use a product template' => 'Ne pas utiliser de gabarit', + 'Apply' => 'Appliquer', + 'Product Attributes' => 'Déclinaisons du produit', + 'ID' => 'ID', + 'Attribute Name' => 'Nom de la déclinaison', + 'This product template does not contains any features' => 'Ce gabarit de produit ne comporte aucune caractéristique', + 'Product Features' => 'Caractéristiques du produit', + 'Feature Name' => 'Nom de la caractéristique', + 'Feature value for this product' => 'Valeur de la caractéristique', + 'Use Ctrl+click to select more than one value. You can also clear selected values.' => 'Utilisez Ctrl+clic pour choisir plus d\'une valeur. Vous pouvez aussi tout désélectionner.', + 'Enter here the feature value as free text' => 'Indiquez ici la valeur de la caractéristique', + 'Feature value' => 'Valeur de la caractéristique', + 'Related content' => 'Contenu associé', + 'You can attach here some content to this product' => 'Attachez ici un ou plusieurs contenus à ce produit', + 'Select a folder...' => 'Choisissez un dossier de contenu...', + 'Select a folder to get its content' => 'Choisissez un dossier de contenu pour lister ses contenus', + 'Select a folder content...' => 'Choisissez un dossier de contenu...', + 'Select a content and click (+) to add it to this product' => 'Chosiissez un contenu, et cliquez [+] pour l\'attacher au produit', + 'No available content in this folder' => 'Ce dossier est vide de contenus', + 'No folders found' => 'Aucun dossier n\'a été trouvé.', + 'Content title' => 'Titre du contenu', + 'Position' => 'Position', + 'Delete this content' => 'Supprimer ce contenu', + 'Category title' => 'Titre de la catégorie', + 'Enter new category position' => 'Classement de la catégorie ', + 'Lire la suite' => 'Lire la suite', + 'Value' => 'Valeur', + 'Title' => 'Civilité', + 'Product attributes' => 'Attributs produit', + 'Categories' => 'Catégories', + 'Top level categories' => 'Catégories de niveau 1 ', + 'Add a new category' => 'Ajouter une catégorie', + 'Online' => 'En ligne', + 'Browse this category' => 'Parcourir cette catégorie', + 'Edit this category' => 'Editer cette catégorie', + 'Delete this category and all its contents' => 'Supprimer cette catégorie et tout ce qu\'elle contient ? ', + 'This category has no sub-categories. To create a new one, click the + button above.' => 'Cette catégorie n\'a pas de sous-catégorie. Pour en créer une nouvelle, cliquez sur le bouton + ci-dessus.', + 'This category has no sub-categories.' => 'Cette catégorie n\'a pas de sous-catégorie.', + 'Top level Products' => 'Produits mis en avant', + 'Add a new product' => 'Ajouter un nouveau produit', + 'Reference' => 'Reference', + 'Product title' => 'Titre du produit', + 'This category doesn\'t contains any products. To add a new product, click the + button above.' => 'Cette catégorie n\'a aucun produit. Pour créer un nouveau product, cliques sur le bouton + ci-dessus. ', + 'Name' => 'Nom', + 'Enter here the category name in the default language (%title)' => 'Entrer ici le nom de la catégorie dans la langue par défaut (%title)', + 'Create a new category' => 'Créer une catégorie', + 'Create this category' => 'Créer cette catégorie', + 'Enter here the product reference' => 'Entrez ici la nouvelle référence produit', + 'Enter here the product name in the default language (%title)' => 'Entrez ici le nom du produit dans la langue par défaut (%title)', + 'Product price' => 'Prix du produit', + 'Enter here the product price in the default currency (%title)' => 'ntrez ici le prix du produit dans la langue par défaut (%title)', + 'Select a tax tule' => 'Sélectionnez une règle de taxes', + 'Select here the tax applicable to this product' => 'Sélectionnez ici la taxe applicable sur ce produit', + 'Product weight' => 'Poids du produit', + 'Kg' => 'Kg', + 'Enter here the product weight, in Kilogrammes' => 'Entrez ici le poids du produit, en Kilogrammes', + 'Create a new product' => 'Créer un nouveau produit', + 'Create this product' => 'Créer ce produit', + 'Delete category' => 'Supprimer cette catégorie', + 'Do you really want to delete this category and all its content ?' => 'Voulez-vous vraiment supprimer cette catégorie et tout ce qu\'elle contient ?', + 'Delete product' => 'Supprimer ce produit', + 'Do you really want to delete this product ?' => 'Voulez-vous vraiment supprimer ce produit ?', + 'Enter new product position' => 'Classement du produit', + 'Edit category' => 'Editer la catégorie', + 'Edit category %title' => 'Editer le titre de la catégorie : %title', + 'Thelia configuration' => 'Configuration thelia', + 'Product catalog configuration' => 'Configuration du catalogue produit', + 'Product templates' => 'Template produit', + 'Product features' => 'Caractéristiques produit', + 'Mailing templates' => 'Template e-mail', + 'Currencies' => 'Monnaie', + 'Taxes rules' => 'Règles de taxes', + 'Shipping configuration' => 'Configuration du transport', + 'Countries' => 'Pays', + 'Shipping zones' => 'Zones de livraison', + 'System parameters' => 'Paramètres système ', + 'System variables' => 'Gestion des variables', + 'Administration profiles' => 'Gestion des administrateurs', + 'Languages & URLs' => 'Langues et URLs', + 'Mailing system' => 'Envoi des e-mails', + 'System logs' => 'Journal des logs', + 'And' => 'Et', + 'Edit' => 'Editer', + 'Delete' => 'Supprimer', + 'Code :' => 'Code', + 'code' => 'code', + 'Title :' => 'Titre', + 'title' => 'titre', + 'Is enabled' => 'Est valide', + 'Is available on special offers' => 'Est valide sur les offres promotionnelles', + 'Is cumulative' => 'Est cumulable', + 'Is removing postage' => 'Offre les frais de port', + 'Expiration date :' => 'Date de fin de validité', + 'yyyy-mm-dd' => 'jjjj--mm--aa', + 'Is unlimited' => 'Est illimité', + 'Max usage :' => 'Utilisations max', + 'max usage' => 'utilisations max', + 'Type :' => 'Type', + 'Please select a coupon type' => 'Merci d\'entrer le type de code', + 'Amount :' => 'Montant', + '14.50' => '14.50', + 'Short description :' => 'Description courte', + 'short description' => 'description court', + 'Long description :' => 'Description longue', + 'long description' => 'description longue', + 'Save your modifications' => 'Enregistrer les modifications', + 'Conditions' => 'Conditions', + 'Save this condition' => 'Enregistrer cette condition', + 'Condition\'s category :' => 'Type de condition', + 'Please select a condition category' => 'Merci d\'entrer le type de condition', + 'Coupon' => 'Code promo', + 'Coupons : ' => 'Codes promo', + 'Create a new coupon' => 'Créer un nouveau code promo', + 'Browse' => 'Parcourir', + 'List' => 'Liste', + 'Enabled coupons' => 'Codes promo disponibles', + 'Code' => 'Code', + 'Days before expiration' => 'Jours de validité', + 'Usage left' => 'Utilisation restante', + 'Unlimited' => 'Illimité', + 'Disabled coupons' => 'Codes désactivés', + 'Expiration date' => 'Date de fin', + 'Amount' => 'Montant', + 'Update coupon' => 'Mettre à jour le code', + 'Please retry' => 'Merci de réessayer', + 'Please select another condition' => 'Merci de sélectionner une autre condition', + 'Edit a customer' => 'Editer un client', + 'Editing customer "%name"' => 'Edition du client "%name"', + 'Customer informations' => 'Informations client', + 'Firstname' => 'Prénom', + 'Lastname' => 'Nom', + 'Default address' => 'Adresse par défaut', + 'Address' => 'Adresse', + 'Additional address' => 'Adresse complémentaire', + 'Zip code' => 'Code postal', + 'City' => 'Ville', + 'Other addresses' => 'Autres adresses', + 'Add a new address' => 'Ajouter une nouvelle adresse', + 'Phone' => 'Téléphone', + 'Edit this address' => 'Editer cette adresse', + 'Use this address by default' => 'Utiliser comme adresse par défaut', + 'Delete this customer and all his orders' => 'Supprimer ce client et toutes ses commandes', + 'orders for this customer' => 'commandes pour ce client', + 'Order n°' => 'Commande n° ', + 'Date & Hour' => 'Date et heure', + 'Status' => 'Etat', + 'Create this address' => 'Créer cette adresse', + 'Use address by default' => 'Utiliser comme adresse par défaut', + 'Do you really want to use this address by default ?' => 'Voulez-vous vraiment utiliser cette adresse comme adresse par défaut ?', + 'Delete address' => 'Supprimer cette adresse', + 'Do you really want to delete this address ?' => 'Voulez-vous vraiment supprimer cette adresse ?', + 'Customer' => 'Client', + 'Customers list' => 'Liste des clients', + 'Add a new Customer' => 'Ajouter un client', + 'Edit this customer' => 'Modifier ce client', + 'Send a mail to this customer' => 'Contacter ce client par mail', + 'Email address' => 'Adresse e-mail', + 'Create a new customer' => 'Ajouter un client', + 'Create this customer' => 'Ajouter ce client', + 'Delete customer' => 'Supprimer ce client', + 'Do you really want to delete this customer ?' => 'Voulez-vous supprimer ce client ? ', + 'Back' => 'Retour', + 'Save' => ' Enregistrer', + 'Description' => 'Description', + 'Back-office home' => 'Accueil administration', + 'Dashboard' => 'Tableau de bord', + 'Sales' => 'Ventes', + 'New customers' => 'Nouveaux clients', + 'First orders' => 'Premières commandes', + 'Aborted orders' => 'Paniers abandonnés', + 'Shop Informations' => 'Informations sur le magasin', + 'Products' => 'Produits', + 'Online products' => 'Produits en ligne', + 'Offline products' => 'Produits hors ligne', + 'Sales statistics' => 'Statistiques de vente', + 'Today' => 'Aujourd\'hui', + 'This month' => 'Ce mois', + 'This year' => 'Cette année', + 'Overall sales' => 'Total des ventes', + 'Sales excluding shipping' => 'Ventes hors frais de port', + 'Yesterday sales' => 'Ventes de la veille', + 'Average cart' => 'Panier moyen', + 'Previous month sales' => 'Ventes du mois précédent', + 'Previous year sales' => 'Ventes de l\année précédente', + 'Thelia informations' => 'Informations Thelia', + 'Current version' => 'Version en cours', + 'Latest version available' => 'Dernière version disponible', + 'News' => 'Actualités', + 'Click here' => 'Cliquez ici', + 'Editing %cat' => 'Edition de %cat', + 'No' => 'Non', + 'Yes' => 'Oui', + 'OK' => 'OK', + 'Save and close' => 'Enregistrer et fermer', + 'Quantity' => 'Quantité', + 'deactivate' => 'désactiver', + 'en_US' => 'en_US', + 'd-m-Y' => 'j-m-A', + 'Username' => 'Nom d\'utilisateur', + 'Host :' => 'Host', + 'Host' => 'Host', + 'Port :' => 'Port', + 'Port' => 'Port', + 'Username :' => 'Nom d\'utilisateur', + 'Password :' => 'Mot de passe', + 'Source IP :' => 'IP source', + 'Source IP' => 'IP source', + 'Variable name' => 'Nom de la variable', + 'Purpose' => 'Objet', + 'Edit an order' => 'Editer une commande', + 'Ordered products' => 'Produits commandés', + 'Invoice and Delivery' => 'Livraison et facturation', + 'Cart' => 'Panier', + 'Product' => 'Produit', + 'Unit. price' => 'Prix unitaire', + 'Tax' => 'Taxes', + 'Unit taxed price' => 'Prix unitaire TTC', + 'Taxed total' => 'Montant total des taxes', + 'Total without discount' => 'Montant total hors remises', + 'Discount' => 'Remise', + 'Coupon code' => 'Code promo', + 'Total including discount' => 'Total avec remise', + 'Postage' => 'Frais de livraison', + 'Total' => 'Total', + 'Payment information' => 'Informations de paiement', + 'Payment module' => 'Module de paiement', + 'Transaction reference' => 'Référence de la transaction', + 'Delivery module' => 'Module de livraison', + 'tracking reference' => 'Reference Tracking', + 'Invoice informations' => 'Informations de facturation', + 'Download invoice as PDF' => 'Télécharger la facture au format PDF', + 'PDF | Invoice' => 'Facure PDF', + 'Edit invoice address' => 'Editer l\'adresse de facturation', + 'Invoice reference' => 'Facture ref', + 'Invoice date' => 'Facture date', + 'Street address' => 'Adresse', + 'Country' => 'Pays', + 'Delivery address' => 'Adresse de livraison', + 'Download purchase order as PDF' => 'Télécharger le bon de commande au format PDF', + 'PDF | Purchase order' => 'Bon de commande PDF', + 'Edit delivery address' => 'Editer l\'adresse de livraison', + 'Edit order address' => 'Editer l\'adresse de commande ', + 'Confirm changes' => 'Valider les modifications', + 'Edit this order' => 'Editer cette commande ', + 'Cancel this order' => 'Annuler cette commande', + 'Delete an order' => 'Supprimer une commande', + 'Do you really want to cancel this order ?' => 'Voulez-vous vraiment sup primer cette commande ? ', + 'View' => 'Voir', + 'customer ref' => 'ref client', + 'company' => 'entreprise', + 'firstname & lastname' => 'Prénom & nom', + 'last order' => 'Dernière commande', + 'order amount' => 'Montant de la commande', + 'Add' => 'Ajouter', + 'Warning' => 'Attention', + 'Edit a system variable' => 'Modifier une variable système', + 'Editing variable "%name"' => 'Modification de la variable "%name" ', + 'Edit variable %name' => 'Modifier de la variable "%name" ', + 'Variable value' => 'Valeur de la variable', + 'Variable created on %date_create. Last modification: %date_change' => 'Variable créée le %date_create. Dernière modification: %date_change', + 'Sorry, variable ID=%id was not found.' => 'Désolé, la variable ID=%id n\'a pas été trouvée.', + 'Thelia System Variables' => 'Variables Thelia', + 'Thelia system variables' => 'Variables Thelia', + 'Add a new variable' => 'Ajouter une variable', + 'Save chages' => 'Enregistrer les modifications', + 'Save changes' => 'Enregistrer les modifications', + 'Action' => 'Action', + 'Change this variable' => 'Modifier cette variable', + 'Cancel changes and revert to original value' => 'Annuler les modifications et revenir à la version antérieure', + 'Delete this variable' => 'Supprimer cette variable', + 'This variable could not be changed.' => 'Cette variable ne peut pas être modifiée', + 'Variable purpose' => 'Objet de la variable', + 'Create a new variable' => 'Créer une nouvelle variable', + 'Create this variable' => 'Ajouter cette variable', + 'Delete a variable' => 'Supprimer une variable', + 'Do you really want to delete this variable ?' => 'Voulez-vous vraiment supprimer cette variable ?', +); diff --git a/templates/admin/default/admin-layout.tpl b/templates/admin/default/admin-layout.tpl index 03a011866..5649f5807 100644 --- a/templates/admin/default/admin-layout.tpl +++ b/templates/admin/default/admin-layout.tpl @@ -4,9 +4,12 @@ {check_auth role="ADMIN" resource="{block name="check-resource"}{/block}" access="{block name="check-access"}{/block}" login_tpl="/admin/login"} {/block} -{* -- Define some stuff for Smarty ----------------------------------------- *} +{* -- Define some stuff for Smarty ------------------------------------------ *} {config_load file='variables.conf'} +{* -- Declare assets directory, relative to template base directory --------- *} +{declare_assets directory='assets'} + @@ -22,7 +25,7 @@ {block name="before-bootstrap-css"}{/block} - {stylesheets file='assets/less/*' filters='less,cssembed'} + {stylesheets file='assets/less/main.less' filters='less'} {/stylesheets} diff --git a/templates/admin/default/ajax/address-update-modal.html b/templates/admin/default/ajax/address-update-modal.html deleted file mode 100644 index 687c51b57..000000000 --- a/templates/admin/default/ajax/address-update-modal.html +++ /dev/null @@ -1,111 +0,0 @@ -{* Update an Address *} - -{form name="thelia.admin.address.update"} - -{* Capture the dialog body, to pass it to the generic dialog *} -{capture "edit_address_dialog"} - - {form_hidden_fields form=$form} - - {form_field form=$form field='label'} -
- - -
- {/form_field} - - {form_field form=$form field='company'} -
- - -
- {/form_field} - - {form_field form=$form field='title'} -
- - - -
- {/form_field} - - {form_field form=$form field='firstname'} -
- - -
- {/form_field} - - {form_field form=$form field='lastname'} -
- - -
- {/form_field} - - {form_field form=$form field='address1'} -
- - -
- -
- {form_field form=$form field='address2'} - - {/form_field} -
- -
- {form_field form=$form field='address3'} - - {/form_field} -
- {/form_field} - - {form_field form=$form field='zipcode'} -
- - -
- {/form_field} - - {form_field form=$form field='city'} -
- - -
- {/form_field} - - {form_field form=$form field='country'} -
- - -
- {/form_field} - -{/capture} - - {include - file = "includes/generic-create-dialog.html" - - dialog_id = "edit_address_dialog" - dialog_title = {intl l="Edit an address"} - dialog_body = {$smarty.capture.edit_address_dialog nofilter} - -dialog_ok_label = {intl l="Edit this address"} -dialog_cancel_label = {intl l="Cancel"} - -form_action = {url path="/admin/address/save/{$address_id}"} -form_enctype = {form_enctype form=$form} -form_error_message = $form_error_message -} - -{/form} \ No newline at end of file diff --git a/templates/admin/default/assets/less/main.less b/templates/admin/default/assets/less/main.less index 3498441a2..6eda3fcee 100644 --- a/templates/admin/default/assets/less/main.less +++ b/templates/admin/default/assets/less/main.less @@ -2,4 +2,4 @@ @import "bootstrap/bootstrap.less"; /* Thelia Admin */ -@import "thelia/thelia.less"; \ No newline at end of file +@import "thelia/thelia.less"; diff --git a/templates/admin/default/customer-edit.html b/templates/admin/default/customer-edit.html index 79aff3119..24087a756 100644 --- a/templates/admin/default/customer-edit.html +++ b/templates/admin/default/customer-edit.html @@ -9,7 +9,6 @@
- {loop name="customer_edit" type="customer" current="false" id="$customer_id" backend_context="1" lang="$edit_language_id"}