From 488ee3e8f4502aef03e135f4f8fce39290bcbd57 Mon Sep 17 00:00:00 2001 From: Etienne Roudeix Date: Wed, 6 Nov 2013 10:26:29 +0100 Subject: [PATCH 1/9] lil loop refactor --- .../Element/ArraySearchLoopInterface.php | 36 ++++++ .../Core/Template/Element/BaseI18nLoop.php | 6 +- .../Thelia/Core/Template/Element/BaseLoop.php | 119 ++++++++++++++++-- .../Element/Exception/LoopException.php | 46 +++++++ .../Core/Template/Element/LoopResult.php | 83 ++++++++++-- .../Core/Template/Element/LoopResultRow.php | 53 +------- .../Element/PropelSearchLoopInterface.php | 36 ++++++ .../Thelia/Core/Template/Loop/Accessory.php | 39 +++--- .../lib/Thelia/Core/Template/Loop/Address.php | 24 ++-- core/lib/Thelia/Core/Template/Loop/Admin.php | 24 ++-- core/lib/Thelia/Core/Template/Loop/Area.php | 32 ++--- .../Core/Template/Loop/AssociatedContent.php | 35 +++--- .../Thelia/Core/Template/Loop/Attribute.php | 42 +++---- .../Template/Loop/AttributeAvailability.php | 28 ++--- .../Template/Loop/AttributeCombination.php | 29 +++-- core/lib/Thelia/Core/Template/Loop/Auth.php | 17 ++- .../Core/Template/Loop/BaseSpecificModule.php | 25 ++-- core/lib/Thelia/Core/Template/Loop/Cart.php | 80 +++--------- .../Thelia/Core/Template/Loop/Category.php | 35 +++--- .../Core/Template/Loop/CategoryPath.php | 43 ++++--- .../Core/Template/Loop/CategoryTree.php | 59 +++++---- core/lib/Thelia/Core/Template/Loop/Config.php | 29 +++-- .../lib/Thelia/Core/Template/Loop/Content.php | 35 +++--- .../lib/Thelia/Core/Template/Loop/Country.php | 30 +++-- core/lib/Thelia/Core/Template/Loop/Coupon.php | 27 ++-- .../Thelia/Core/Template/Loop/Currency.php | 28 ++--- .../Thelia/Core/Template/Loop/Customer.php | 25 ++-- .../Thelia/Core/Template/Loop/Delivery.php | 24 ++-- .../Thelia/Core/Template/Loop/Document.php | 45 +++---- .../lib/Thelia/Core/Template/Loop/Feature.php | 42 +++---- .../Template/Loop/FeatureAvailability.php | 28 ++--- .../Core/Template/Loop/FeatureValue.php | 28 ++--- core/lib/Thelia/Core/Template/Loop/Feed.php | 34 ++--- core/lib/Thelia/Core/Template/Loop/Folder.php | 38 +++--- .../Thelia/Core/Template/Loop/FolderPath.php | 52 ++++---- .../Thelia/Core/Template/Loop/FolderTree.php | 53 ++++---- core/lib/Thelia/Core/Template/Loop/Image.php | 55 ++++---- core/lib/Thelia/Core/Template/Loop/Lang.php | 24 ++-- .../lib/Thelia/Core/Template/Loop/Message.php | 29 +++-- core/lib/Thelia/Core/Template/Loop/Module.php | 30 +++-- core/lib/Thelia/Core/Template/Loop/Order.php | 29 +++-- .../Core/Template/Loop/OrderAddress.php | 23 ++-- .../Core/Template/Loop/OrderProduct.php | 64 +++++----- .../Loop/OrderProductAttributeCombination.php | 42 +++---- .../Thelia/Core/Template/Loop/OrderStatus.php | 28 ++--- .../lib/Thelia/Core/Template/Loop/Payment.php | 26 ++-- .../lib/Thelia/Core/Template/Loop/Product.php | 64 +++++----- .../Template/Loop/ProductSaleElements.php | 24 ++-- .../Core/Template/Loop/ProductTemplate.php | 28 ++--- .../lib/Thelia/Core/Template/Loop/Profile.php | 27 ++-- .../Thelia/Core/Template/Loop/Resource.php | 30 +++-- core/lib/Thelia/Core/Template/Loop/Tax.php | 29 ++--- .../lib/Thelia/Core/Template/Loop/TaxRule.php | 39 +++--- .../Core/Template/Loop/TaxRuleCountry.php | 39 +++--- .../Thelia/Core/Template/Loop/Template.php | 28 ++--- core/lib/Thelia/Core/Template/Loop/Title.php | 28 ++--- 56 files changed, 1081 insertions(+), 1014 deletions(-) create mode 100644 core/lib/Thelia/Core/Template/Element/ArraySearchLoopInterface.php create mode 100644 core/lib/Thelia/Core/Template/Element/Exception/LoopException.php create mode 100644 core/lib/Thelia/Core/Template/Element/PropelSearchLoopInterface.php diff --git a/core/lib/Thelia/Core/Template/Element/ArraySearchLoopInterface.php b/core/lib/Thelia/Core/Template/Element/ArraySearchLoopInterface.php new file mode 100644 index 000000000..f8875194e --- /dev/null +++ b/core/lib/Thelia/Core/Template/Element/ArraySearchLoopInterface.php @@ -0,0 +1,36 @@ +. */ +/* */ +/*************************************************************************************/ +namespace Thelia\Core\Template\Element; + +/** + * + * @author Etienne Roudeix + * + */ +interface ArraySearchLoopInterface +{ + /** + * @return array + */ + public function buildArray(); +} diff --git a/core/lib/Thelia/Core/Template/Element/BaseI18nLoop.php b/core/lib/Thelia/Core/Template/Element/BaseI18nLoop.php index 557c64901..aff1d9188 100644 --- a/core/lib/Thelia/Core/Template/Element/BaseI18nLoop.php +++ b/core/lib/Thelia/Core/Template/Element/BaseI18nLoop.php @@ -36,6 +36,8 @@ use Thelia\Model\Tools\ModelCriteriaTools; */ abstract class BaseI18nLoop extends BaseLoop { + protected $locale; + /** * Define common loop arguments * @@ -65,9 +67,7 @@ abstract class BaseI18nLoop extends BaseLoop { /* manage translations */ - $fr = $this->getForce_return(); - - return ModelCriteriaTools::getI18n( + $this->locale = ModelCriteriaTools::getI18n( $this->getBackend_context(), $this->getLang(), $search, diff --git a/core/lib/Thelia/Core/Template/Element/BaseLoop.php b/core/lib/Thelia/Core/Template/Element/BaseLoop.php index 6b6f44146..7344843ed 100755 --- a/core/lib/Thelia/Core/Template/Element/BaseLoop.php +++ b/core/lib/Thelia/Core/Template/Element/BaseLoop.php @@ -27,6 +27,7 @@ use Propel\Runtime\ActiveQuery\Criteria; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Thelia\Core\Template\Element\Exception\LoopException; use Thelia\Core\Template\Loop\Argument\Argument; use Propel\Runtime\ActiveQuery\ModelCriteria; use Thelia\Core\Security\SecurityContext; @@ -62,9 +63,9 @@ abstract class BaseLoop protected $args; - public $countable = true; - public $timestampable = false; - public $versionable = false; + protected $countable = true; + protected $timestampable = false; + protected $versionable = false; /** * Create a new Loop @@ -73,6 +74,8 @@ abstract class BaseLoop */ public function __construct(ContainerInterface $container) { + $this->checkInterface(); + $this->container = $container; $this->request = $container->get('request'); @@ -240,6 +243,9 @@ abstract class BaseLoop */ protected function search(ModelCriteria $search, &$pagination = null) { + if (false === $this->countable) { + return $search->find(); + } if ($this instanceof SearchLoopInterface) { $searchTerm = $this->getSearch_term(); $searchIn = $this->getSearch_in(); @@ -271,6 +277,29 @@ abstract class BaseLoop } } + + protected function searchArray(array $search, &$pagination = null) + { + if (false === $this->countable) { + return $search; + } + if ($this->getArgValue('page') !== null) { + + $nbPage = ceil(count($search)/$this->getArgValue('limit')); + if($this->getArgValue('page') > $nbPage || $this->getArgValue('page') <= 0) { + return array(); + } + + $firstItem = ($this->getArgValue('page')-1) * $this->getArgValue('limit') + 1; + + return array_slice($search, $firstItem, $firstItem + $this->getArgValue('limit'), false); + + } else { + return array_slice($search, $this->getArgValue('offset'), $this->getArgValue('limit'), false); + + } + } + /** * @param ModelCriteria $search * @@ -304,18 +333,84 @@ abstract class BaseLoop } /** - * - * this function have to be implement in your own loop class. - * - * All loops parameters can be accessible via getter. - * - * for example, ref parameter is accessible through getRef method - * * @param $pagination - * * @return LoopResult */ - abstract public function exec(&$pagination); + public function exec(&$pagination) + { + if($this instanceof PropelSearchLoopInterface) { + $searchModelCriteria = $this->buildModelCriteria(); + if(null === $searchModelCriteria) { + $results = array(); + } else { + $results = $this->search( + $searchModelCriteria, + $pagination + ); + } + } elseif ($this instanceof ArraySearchLoopInterface) { + $searchArray = $this->buildArray(); + if(null === $searchArray) { + $results = array(); + } else { + $results = $this->searchArray( + $searchArray, + $pagination + ); + } + } + + $loopResult = new LoopResult($results); + + if(true === $this->countable) { + $loopResult->setCountable(); + } + if(true === $this->timestampable) { + $loopResult->setTimestamped(); + } + if(true === $this->versionable) { + $loopResult->setVersioned(); + } + + return $this->parseResults($loopResult); + } + + protected function checkInterface() + { + /* Must implement either : + * - PropelSearchLoopInterface + * - ArraySearchLoopInterface + */ + $searchInterface = false; + if($this instanceof PropelSearchLoopInterface) { + if(true === $searchInterface) { + throw new LoopException('Loop cannot implements multiple Search Interfaces : `PropelSearchLoopInterface`, `ArraySearchLoopInterface`', LoopException::MULTIPLE_SEARCH_INTERFACE); + } + $searchInterface = true; + } + if($this instanceof ArraySearchLoopInterface) { + if(true === $searchInterface) { + throw new LoopException('Loop cannot implements multiple Search Interfaces : `PropelSearchLoopInterface`, `ArraySearchLoopInterface`', LoopException::MULTIPLE_SEARCH_INTERFACE); + } + $searchInterface = true; + } + + if(false === $searchInterface) { + throw new LoopException('Loop must implements one of the following interfaces : `PropelSearchLoopInterface`, `ArraySearchLoopInterface`', LoopException::SEARCH_INTERFACE_NOT_FOUND); + } + + /* Only PropelSearch allows timestamp and version */ + if(!$this instanceof PropelSearchLoopInterface) { + if(true === $this->timestampable) { + throw new LoopException("Loop must implements 'PropelSearchLoopInterface' to be timestampable", LoopException::NOT_TIMESTAMPED); + } + if(true === $this->versionable) { + throw new LoopException("Loop must implements 'PropelSearchLoopInterface' to be versionable", LoopException::NOT_VERSIONED); + } + } + } + + abstract public function parseResults(LoopResult $loopResult); /** * diff --git a/core/lib/Thelia/Core/Template/Element/Exception/LoopException.php b/core/lib/Thelia/Core/Template/Element/Exception/LoopException.php new file mode 100644 index 000000000..cc6340df3 --- /dev/null +++ b/core/lib/Thelia/Core/Template/Element/Exception/LoopException.php @@ -0,0 +1,46 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Template\Element\Exception; + +class LoopException extends \RuntimeException +{ + const UNKNOWN_EXCEPTION = 0; + + const NOT_TIMESTAMPED = 100; + const NOT_VERSIONED = 101; + + const MULTIPLE_SEARCH_INTERFACE = 400; + const SEARCH_INTERFACE_NOT_FOUND = 404; + + public function __construct($message, $code = null, $arguments = array(), $previous = null) + { + if (is_array($arguments)) { + $this->arguments = $arguments; + } + if ($code === null) { + $code = self::UNKNOWN_EXCEPTION; + } + parent::__construct($message, $code, $previous); + } +} diff --git a/core/lib/Thelia/Core/Template/Element/LoopResult.php b/core/lib/Thelia/Core/Template/Element/LoopResult.php index 3ca1e91d3..af24a4bda 100755 --- a/core/lib/Thelia/Core/Template/Element/LoopResult.php +++ b/core/lib/Thelia/Core/Template/Element/LoopResult.php @@ -32,14 +32,40 @@ class LoopResult implements \Iterator private $position; protected $collection = array(); - public $modelCollection = null; + public $resultsCollection = null; - public function __construct($modelCollection = null) + protected $versioned = false; + protected $timestamped = false; + protected $countable = false; + + public function __construct($resultsCollection) { $this->position = 0; - if ($modelCollection instanceof ObjectCollection || $modelCollection instanceof PropelModelPager || is_array($modelCollection)) { - $this->modelCollection = $modelCollection; - } + $this->resultsCollection = $resultsCollection; + } + + /** + * @param boolean $countable + */ + public function setCountable($countable = true) + { + $this->countable = true === $countable; + } + + /** + * @param boolean $timestamped + */ + public function setTimestamped($timestamped = true) + { + $this->timestamped = true === $timestamped; + } + + /** + * @param boolean $versioned + */ + public function setVersioned($versioned = true) + { + $this->versioned = true === $versioned; } public function isEmpty() @@ -49,6 +75,21 @@ class LoopResult implements \Iterator public function addRow(LoopResultRow $row) { + if (true === $this->versioned) { + foreach ($this->getVersionOutputs() as $output) { + $row->set($output[0], $row->model->$output[1]()); + } + } + if (true === $this->timestamped) { + foreach ($this->getTimestampOutputs() as $output) { + $row->set($output[0], $row->model->$output[1]()); + } + } + if (true === $this->countable) { + $row->set('LOOP_COUNT', 1 + $this->getCount()); + $row->set('LOOP_TOTAL', $this->getResultDataCollectionCount()); + } + $this->collection[] = $row; } @@ -57,17 +98,22 @@ class LoopResult implements \Iterator return count($this->collection); } - public function getModelCollectionCount() + public function getResultDataCollectionCount() { - if ($this->modelCollection instanceof ObjectCollection || $this->modelCollection instanceof PropelModelPager) { - return $this->modelCollection->count(); - } elseif (is_array($this->modelCollection)) { - return count($this->modelCollection); + if ($this->resultsCollection instanceof ObjectCollection || $this->resultsCollection instanceof PropelModelPager) { + return $this->resultsCollection->count(); + } elseif (is_array($this->resultsCollection)) { + return count($this->resultsCollection); } else { return 0; } } + public function getResultDataCollection() + { + return $this->resultsCollection; + } + /** * (PHP 5 >= 5.0.0)
* Return the current element @@ -123,4 +169,21 @@ class LoopResult implements \Iterator { $this->position = 0; } + + protected function getTimestampOutputs() + { + return array( + array('CREATE_DATE', 'getCreatedAt'), + array('UPDATE_DATE', 'getUpdatedAt'), + ); + } + + protected function getVersionOutputs() + { + return array( + array('VERSION', 'getVersion'), + array('VERSION_DATE', 'getVersionCreatedAt'), + array('VERSION_AUTHOR', 'getVersionCreatedBy'), + ); + } } diff --git a/core/lib/Thelia/Core/Template/Element/LoopResultRow.php b/core/lib/Thelia/Core/Template/Element/LoopResultRow.php index 9c4f93586..d908c92c3 100755 --- a/core/lib/Thelia/Core/Template/Element/LoopResultRow.php +++ b/core/lib/Thelia/Core/Template/Element/LoopResultRow.php @@ -30,28 +30,12 @@ class LoopResultRow protected $substitution = array(); public $model = null; - public $loopResult; - public $versionable = false; - public $timestampable = false; - public $countable = false; - - public function __construct($loopResult = null, $model = null, $versionable = false, $timestampable = false, $countable = true) + public function __construct($model = null) { if ($model instanceof ActiveRecordInterface) { $this->model = $model; - - $this->versionable = $versionable; - $this->timestampable = $timestampable; } - - if ($loopResult instanceof LoopResult) { - $this->loopResult = $loopResult; - - $this->countable = $countable; - } - - $this->assignDefaultOutputs(); } public function set($key, $value) @@ -75,39 +59,4 @@ class LoopResultRow { return array_keys($this->substitution); } - - protected function getTimestampOutputs() - { - return array( - array('CREATE_DATE', 'getCreatedAt'), - array('UPDATE_DATE', 'getUpdatedAt'), - ); - } - - protected function getVersionOutputs() - { - return array( - array('VERSION', 'getVersion'), - array('VERSION_DATE', 'getVersionCreatedAt'), - array('VERSION_AUTHOR', 'getVersionCreatedBy'), - ); - } - - protected function assignDefaultOutputs() - { - if (true === $this->versionable) { - foreach ($this->getVersionOutputs() as $output) { - $this->set($output[0], $this->model->$output[1]()); - } - } - if (true === $this->timestampable) { - foreach ($this->getTimestampOutputs() as $output) { - $this->set($output[0], $this->model->$output[1]()); - } - } - if (true === $this->countable) { - $this->set('LOOP_COUNT', 1 + $this->loopResult->getCount()); - $this->set('LOOP_TOTAL', $this->loopResult->getModelCollectionCount()); - } - } } diff --git a/core/lib/Thelia/Core/Template/Element/PropelSearchLoopInterface.php b/core/lib/Thelia/Core/Template/Element/PropelSearchLoopInterface.php new file mode 100644 index 000000000..c6473346a --- /dev/null +++ b/core/lib/Thelia/Core/Template/Element/PropelSearchLoopInterface.php @@ -0,0 +1,36 @@ +. */ +/* */ +/*************************************************************************************/ +namespace Thelia\Core\Template\Element; + +/** + * + * @author Etienne Roudeix + * + */ +interface PropelSearchLoopInterface +{ + /** + * @return \Propel\Runtime\ActiveQuery\ModelCriteria + */ + public function buildModelCriteria(); +} diff --git a/core/lib/Thelia/Core/Template/Loop/Accessory.php b/core/lib/Thelia/Core/Template/Loop/Accessory.php index 6b15a6715..8a7a80e27 100755 --- a/core/lib/Thelia/Core/Template/Loop/Accessory.php +++ b/core/lib/Thelia/Core/Template/Loop/Accessory.php @@ -45,6 +45,9 @@ use Thelia\Type; */ class Accessory extends Product { + protected $accessoryId; + protected $accessoryPosition; + /** * @return ArgumentCollection */ @@ -64,12 +67,7 @@ class Accessory extends Product return $argumentCollection; } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = AccessoryQuery::create(); @@ -93,40 +91,45 @@ class Accessory extends Product $accessories = $this->search($search); - $accessoryIdList = array(0); - $accessoryPosition = $accessoryId = array(); + $this->accessoryIdList = array(0); + $this->accessoryPosition = $this->accessoryId = array(); foreach ($accessories as $accessory) { $accessoryProductId = $accessory->getAccessory(); - array_push($accessoryIdList, $accessoryProductId); + array_push($this->accessoryIdList, $accessoryProductId); - $accessoryPosition[$accessoryProductId] = $accessory->getPosition(); - $accessoryId[$accessoryProductId] = $accessory->getId(); + $this->accessoryPosition[$accessoryProductId] = $accessory->getPosition(); + $this->accessoryId[$accessoryProductId] = $accessory->getId(); } $receivedIdList = $this->getId(); /* if an Id list is receive, loop will only match accessories from this list */ if ($receivedIdList === null) { - $this->args->get('id')->setValue( implode(',', $accessoryIdList) ); + $this->args->get('id')->setValue( implode(',', $this->accessoryIdList) ); } else { - $this->args->get('id')->setValue( implode(',', array_intersect($receivedIdList, $accessoryIdList)) ); + $this->args->get('id')->setValue( implode(',', array_intersect($receivedIdList, $this->accessoryIdList)) ); } - $loopResult = parent::exec($pagination); + return parent::buildModelCriteria(); + } - foreach ($loopResult as $loopResultRow) { + public function parseResults(LoopResult $results) + { + $results = parent::parseResults($results); + + foreach ($results as $loopResultRow) { $accessoryProductId = $loopResultRow->get('ID'); $loopResultRow - ->set("ID" , $accessoryId[$accessoryProductId]) - ->set("POSITION", $accessoryPosition[$accessoryProductId]) + ->set("ID" , $this->accessoryId[$accessoryProductId]) + ->set("POSITION", $this->accessoryPosition[$accessoryProductId]) ; } - return $loopResult; + return $results; } } diff --git a/core/lib/Thelia/Core/Template/Loop/Address.php b/core/lib/Thelia/Core/Template/Loop/Address.php index 5fe20b0e4..8bb4f4f9c 100755 --- a/core/lib/Thelia/Core/Template/Loop/Address.php +++ b/core/lib/Thelia/Core/Template/Loop/Address.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -44,9 +45,9 @@ use Thelia\Type; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Address extends BaseLoop +class Address extends BaseLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -80,12 +81,7 @@ class Address extends BaseLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = AddressQuery::create(); @@ -100,7 +96,7 @@ class Address extends BaseLoop if ($customer === 'current') { $currentCustomer = $this->securityContext->getCustomerUser(); if ($currentCustomer === null) { - return new LoopResult(); + return null; } else { $search->filterByCustomerId($currentCustomer->getId(), Criteria::EQUAL); } @@ -122,12 +118,14 @@ class Address extends BaseLoop $search->filterById($exclude, Criteria::NOT_IN); } - $addresses = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($addresses); + } - foreach ($addresses as $address) { - $loopResultRow = new LoopResultRow($loopResult, $address, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $address) { + $loopResultRow = new LoopResultRow($address); $loopResultRow ->set("ID", $address->getId()) ->set("LABEL", $address->getLabel()) diff --git a/core/lib/Thelia/Core/Template/Loop/Admin.php b/core/lib/Thelia/Core/Template/Loop/Admin.php index 581f6faed..ef5ce7e1f 100755 --- a/core/lib/Thelia/Core/Template/Loop/Admin.php +++ b/core/lib/Thelia/Core/Template/Loop/Admin.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -43,9 +44,9 @@ use Thelia\Type; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Admin extends BaseLoop +class Admin extends BaseLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -58,12 +59,7 @@ class Admin extends BaseLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = AdminQuery::create(); @@ -81,13 +77,14 @@ class Admin extends BaseLoop $search->orderByFirstname(Criteria::ASC); - /* perform search */ - $admins = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($admins); + } - foreach ($admins as $admin) { - $loopResultRow = new LoopResultRow($loopResult, $admin, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $admin) { + $loopResultRow = new LoopResultRow($admin); $loopResultRow->set("ID", $admin->getId()) ->set("PROFILE",$admin->getProfileId()) ->set("FIRSTNAME",$admin->getFirstname()) @@ -99,5 +96,6 @@ class Admin extends BaseLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Area.php b/core/lib/Thelia/Core/Template/Loop/Area.php index 524777d08..6ac3b1518 100644 --- a/core/lib/Thelia/Core/Template/Loop/Area.php +++ b/core/lib/Thelia/Core/Template/Loop/Area.php @@ -26,6 +26,7 @@ use Propel\Runtime\ActiveQuery\Criteria; use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Model\AreaQuery; @@ -35,9 +36,9 @@ use Thelia\Model\AreaQuery; * @package Thelia\Core\Template\Loop * @author Manuel Raynaud */ -class Area extends BaseLoop +class Area extends BaseLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @@ -80,19 +81,7 @@ class Area extends BaseLoop ); } - /** - * - * this function have to be implement in your own loop class. - * - * All loops parameters can be accessible via getter. - * - * for example, ref parameter is accessible through getRef method - * - * @param $pagination - * - * @return mixed - */ - public function exec(&$pagination) + public function buildModelCriteria() { $id = $this->getId(); @@ -117,14 +106,14 @@ class Area extends BaseLoop ->where('`without_zone`.delivery_module_id '.Criteria::ISNULL); } - //echo $search->toString(); exit; + return $search; - $areas = $this->search($search, $pagination); + } - $loopResult = new LoopResult($areas); - - foreach ($areas as $area) { - $loopResultRow = new LoopResultRow($loopResult, $area, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $area) { + $loopResultRow = new LoopResultRow($area); $loopResultRow ->set('ID', $area->getId()) @@ -136,6 +125,7 @@ class Area extends BaseLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/AssociatedContent.php b/core/lib/Thelia/Core/Template/Loop/AssociatedContent.php index 6fc41fc9b..9411b1dbd 100755 --- a/core/lib/Thelia/Core/Template/Loop/AssociatedContent.php +++ b/core/lib/Thelia/Core/Template/Loop/AssociatedContent.php @@ -46,6 +46,9 @@ use Thelia\Type; */ class AssociatedContent extends Content { + protected $contentId; + protected $contentPosition; + /** * @return ArgumentCollection */ @@ -68,16 +71,8 @@ class AssociatedContent extends Content return $argumentCollection; } - /** - * @param $pagination - * - * @return LoopResult - * @throws \InvalidArgumentException - */ - public function exec(&$pagination) + public function buildModelCriteria() { - // - $product = $this->getProduct(); $category = $this->getCategory(); @@ -136,16 +131,15 @@ class AssociatedContent extends Content $associatedContentIdList = array(0); - $contentIdList = array(0); - $contentPosition = $contentId = array(); + $this->contentPosition = $this->contentId = array(); foreach ($associatedContents as $associatedContent) { $associatedContentId = $associatedContent->getContentId(); array_push($associatedContentIdList, $associatedContentId); - $contentPosition[$associatedContentId] = $associatedContent->getPosition(); - $contentId[$associatedContentId] = $associatedContent->getId(); + $this->contentPosition[$associatedContentId] = $associatedContent->getPosition(); + $this->contentId[$associatedContentId] = $associatedContent->getId(); } $receivedIdList = $this->getId(); @@ -157,18 +151,23 @@ class AssociatedContent extends Content $this->args->get('id')->setValue( implode(',', array_intersect($receivedIdList, $associatedContentIdList)) ); } - $loopResult = parent::exec($pagination); + return parent::buildModelCriteria(); + } - foreach ($loopResult as $loopResultRow) { + public function parseResults(LoopResult $results) + { + $results = parent::parseResults($results); + + foreach ($results as $loopResultRow) { $relatedContentId = $loopResultRow->get('ID'); $loopResultRow - ->set("ID" , $contentId[$relatedContentId]) - ->set("POSITION", $contentPosition[$relatedContentId]) + ->set("ID" , $this->contentId[$relatedContentId]) + ->set("POSITION", $this->contentPosition[$relatedContentId]) ; } - return $loopResult; + return $results; } } diff --git a/core/lib/Thelia/Core/Template/Loop/Attribute.php b/core/lib/Thelia/Core/Template/Loop/Attribute.php index daad80979..97b540f96 100755 --- a/core/lib/Thelia/Core/Template/Loop/Attribute.php +++ b/core/lib/Thelia/Core/Template/Loop/Attribute.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -47,9 +48,11 @@ use Thelia\Model\Map\AttributeTemplateTableMap; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Attribute extends BaseI18nLoop +class Attribute extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $useAttributePosistion; + + protected $timestampable = true; /** * @return ArgumentCollection @@ -72,12 +75,7 @@ class Attribute extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = AttributeQuery::create(); @@ -86,7 +84,7 @@ class Attribute extends BaseI18nLoop $lang = $this->getLang(); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -104,7 +102,7 @@ class Attribute extends BaseI18nLoop $template = $this->getTemplate(); $exclude_template = $this->getExcludeTemplate(); - $use_attribute_pos = true; + $this->useAttributePosistion = true; if (null !== $product) { // Find all template assigned to the products. @@ -132,7 +130,7 @@ class Attribute extends BaseI18nLoop ->filterByTemplate(TemplateQuery::create()->findById($template), Criteria::IN) ; - $use_attribute_pos = false; + $this->useAttributePosistion = false; } elseif (null !== $exclude_template) { // Join with attribute_template table to get position @@ -144,7 +142,7 @@ class Attribute extends BaseI18nLoop ->filterById($exclude_attributes, Criteria::NOT_IN) ; - $use_attribute_pos = false; + $this->useAttributePosistion = false; } $orders = $this->getOrder(); @@ -164,13 +162,13 @@ class Attribute extends BaseI18nLoop $search->addDescendingOrderByColumn('i18n_TITLE'); break; case "manual": - if ($use_attribute_pos) + if ($this->useAttributePosistion) $search->orderByPosition(Criteria::ASC); else $search->addAscendingOrderByColumn(AttributeTemplateTableMap::POSITION); break; case "manual_reverse": - if ($use_attribute_pos) + if ($this->useAttributePosistion) $search->orderByPosition(Criteria::DESC); else $search->addDescendingOrderByColumn(AttributeTemplateTableMap::POSITION); @@ -178,26 +176,28 @@ class Attribute extends BaseI18nLoop } } - /* perform search */ - $attributes = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($attributes); + } - foreach ($attributes as $attribute) { - $loopResultRow = new LoopResultRow($loopResult, $attribute, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $attribute) { + $loopResultRow = new LoopResultRow($attribute); $loopResultRow->set("ID", $attribute->getId()) ->set("IS_TRANSLATED",$attribute->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$locale) + ->set("LOCALE",$this->locale) ->set("TITLE",$attribute->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $attribute->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION", $attribute->getVirtualColumn('i18n_DESCRIPTION')) ->set("POSTSCRIPTUM", $attribute->getVirtualColumn('i18n_POSTSCRIPTUM')) - ->set("POSITION", $use_attribute_pos ? $attribute->getPosition() : $attribute->getVirtualColumn('position')) + ->set("POSITION", $this->useAttributePosistion ? $attribute->getPosition() : $attribute->getVirtualColumn('position')) ; $loopResult->addRow($loopResultRow); } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/AttributeAvailability.php b/core/lib/Thelia/Core/Template/Loop/AttributeAvailability.php index 10c1dda00..81f01f6da 100755 --- a/core/lib/Thelia/Core/Template/Loop/AttributeAvailability.php +++ b/core/lib/Thelia/Core/Template/Loop/AttributeAvailability.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -43,9 +44,9 @@ use Thelia\Type; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class AttributeAvailability extends BaseI18nLoop +class AttributeAvailability extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -66,17 +67,12 @@ class AttributeAvailability extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = AttributeAvQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -121,18 +117,19 @@ class AttributeAvailability extends BaseI18nLoop } } - /* perform search */ - $attributesAv = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($attributesAv); + } - foreach ($attributesAv as $attributeAv) { - $loopResultRow = new LoopResultRow($loopResult, $attributeAv, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $attributeAv) { + $loopResultRow = new LoopResultRow($attributeAv); $loopResultRow ->set("ID" , $attributeAv->getId()) ->set("ATTRIBUTE_ID" , $attributeAv->getAttributeId()) ->set("IS_TRANSLATED", $attributeAv->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE" , $locale) + ->set("LOCALE" , $this->locale) ->set("TITLE" , $attributeAv->getVirtualColumn('i18n_TITLE')) ->set("CHAPO" , $attributeAv->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION" , $attributeAv->getVirtualColumn('i18n_DESCRIPTION')) @@ -144,5 +141,6 @@ class AttributeAvailability extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/AttributeCombination.php b/core/lib/Thelia/Core/Template/Loop/AttributeCombination.php index f2af0887d..7fad6bd34 100755 --- a/core/lib/Thelia/Core/Template/Loop/AttributeCombination.php +++ b/core/lib/Thelia/Core/Template/Loop/AttributeCombination.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -45,9 +46,9 @@ use Thelia\Type; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class AttributeCombination extends BaseI18nLoop +class AttributeCombination extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -66,17 +67,12 @@ class AttributeCombination extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = AttributeCombinationQuery::create(); /* manage attribute translations */ - $locale = $this->configureI18nProcessing( + $this->configureI18nProcessing( $search, array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM'), AttributeTableMap::TABLE_NAME, @@ -84,7 +80,7 @@ class AttributeCombination extends BaseI18nLoop ); /* manage attributeAv translations */ - $locale = $this->configureI18nProcessing( + $this->configureI18nProcessing( $search, array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM'), AttributeAvTableMap::TABLE_NAME, @@ -108,15 +104,17 @@ class AttributeCombination extends BaseI18nLoop } } - $attributeCombinations = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($attributeCombinations); + } - foreach ($attributeCombinations as $attributeCombination) { - $loopResultRow = new LoopResultRow($loopResult, $attributeCombination, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $attributeCombination) { + $loopResultRow = new LoopResultRow($attributeCombination); $loopResultRow - ->set("LOCALE",$locale) + ->set("LOCALE",$this->locale) ->set("ATTRIBUTE_TITLE", $attributeCombination->getVirtualColumn(AttributeTableMap::TABLE_NAME . '_i18n_TITLE')) ->set("ATTRIBUTE_CHAPO", $attributeCombination->getVirtualColumn(AttributeTableMap::TABLE_NAME . '_i18n_CHAPO')) ->set("ATTRIBUTE_DESCRIPTION", $attributeCombination->getVirtualColumn(AttributeTableMap::TABLE_NAME . '_i18n_DESCRIPTION')) @@ -130,5 +128,6 @@ class AttributeCombination extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Auth.php b/core/lib/Thelia/Core/Template/Loop/Auth.php index cdb668978..ef466d3e9 100755 --- a/core/lib/Thelia/Core/Template/Loop/Auth.php +++ b/core/lib/Thelia/Core/Template/Loop/Auth.php @@ -24,6 +24,7 @@ namespace Thelia\Core\Template\Loop; use Thelia\Core\Security\AccessManager; +use Thelia\Core\Template\Element\ArraySearchLoopInterface; use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; @@ -40,7 +41,7 @@ use Thelia\Type\TypeCollection; * * @author Franck Allimant */ -class Auth extends BaseLoop +class Auth extends BaseLoop implements ArraySearchLoopInterface { public function getArgDefinitions() { @@ -69,19 +70,17 @@ class Auth extends BaseLoop ); } - /** - * @param $pagination - * - * @return LoopResult - */ - public function exec(&$pagination) + public function buildArray() + { + return array(); + } + + public function parseResults(LoopResult $loopResult) { $roles = $this->getRole(); $resource = $this->getResource(); $access = $this->getAccess(); - $loopResult = new LoopResult(); - try { if (true === $this->securityContext->isGranted($roles, $resource === null ? array() : $resource, $access === null ? array() : $access)) { diff --git a/core/lib/Thelia/Core/Template/Loop/BaseSpecificModule.php b/core/lib/Thelia/Core/Template/Loop/BaseSpecificModule.php index 6f5f23707..c1bc483f9 100644 --- a/core/lib/Thelia/Core/Template/Loop/BaseSpecificModule.php +++ b/core/lib/Thelia/Core/Template/Loop/BaseSpecificModule.php @@ -24,6 +24,8 @@ namespace Thelia\Core\Template\Loop; use Propel\Runtime\ActiveQuery\Criteria; use Thelia\Core\Template\Element\BaseI18nLoop; +use Thelia\Core\Template\Element\LoopResult; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Model\ModuleQuery; @@ -32,9 +34,9 @@ use Thelia\Model\ModuleQuery; * @package Thelia\Core\Template\Loop * @author Manuel Raynaud */ -class BaseSpecificModule extends BaseI18nLoop +abstract class BaseSpecificModule extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @@ -76,19 +78,7 @@ class BaseSpecificModule extends BaseI18nLoop ); } - /** - * - * this function have to be implement in your own loop class. - * - * All loops parameters can be accesible via getter. - * - * for example, ref parameter is accessible through getRef method - * - * @param $pagination - * - * @return \Thelia\Model\ModuleQuery - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = ModuleQuery::create(); @@ -102,7 +92,12 @@ class BaseSpecificModule extends BaseI18nLoop $search->filterById($exclude, Criteria::NOT_IN); } + $this->configureI18nProcessing($search); + + $search->filterByType($this->getModuleType(), Criteria::EQUAL); + return $search; } + abstract protected function getModuleType(); } diff --git a/core/lib/Thelia/Core/Template/Loop/Cart.php b/core/lib/Thelia/Core/Template/Loop/Cart.php index e54675a29..f6b4c6a01 100755 --- a/core/lib/Thelia/Core/Template/Loop/Cart.php +++ b/core/lib/Thelia/Core/Template/Loop/Cart.php @@ -9,15 +9,15 @@ namespace Thelia\Core\Template\Loop; +use Thelia\Core\Template\Element\ArraySearchLoopInterface; use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; -use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Model\CountryQuery; use Thelia\Type; -class Cart extends BaseLoop +class Cart extends BaseLoop implements ArraySearchLoopInterface { use \Thelia\Cart\CartTrait; /** @@ -41,80 +41,29 @@ class Cart extends BaseLoop */ protected function getArgDefinitions() { - return new ArgumentCollection( - Argument::createIntTypeArgument('limit'), - Argument::createAnyTypeArgument('position') - ); + return new ArgumentCollection(); } - /** - * - * this function have to be implement in your own loop class. - * - * All your parameters are defined in defineArgs() and can be accessible like a class property. - * - * example : - * - * public function defineArgs() - * { - * return array ( - * "ref", - * "id" => "optional", - * "stock" => array( - * "optional", - * "default" => 10 - * ) - * ); - * } - * - * you can retrieve ref value using $this->ref - * - * @param $pagination - * - * @return mixed - */ - public function exec(&$pagination) + public function buildArray() { - $cart = $this->getCart($this->request); - $cartItems = $cart->getCartItems(); - $result = new LoopResult($cartItems); - - if ($cart === null) { - return $result; + if(null === $cart) { + return array(); } - $limit = $this->getLimit(); - - $countCartItems = count($cartItems); - - if ($limit <= 0 || $limit >= $countCartItems) { - $limit = $countCartItems; - } - - $position = $this->getPosition(); - - if (isset($position)) { - if ($position == "first") { - $limit = 1; - $cartItems = array($cartItems[0]); - } elseif ($position == "last") { - $limit = 1; - $cartItems = array(end($cartItems)); - } - - // @TODO : if the position is a number - } + return iterator_to_array($cart->getCartItems()); + } + public function parseResults(LoopResult $loopResult) + { $taxCountry = CountryQuery::create()->findPk(64); // @TODO : make it magic; - for ($i=0; $i<$limit; $i ++) { - $cartItem = $cartItems[$i]; + foreach($loopResult->getResultDataCollection() as $cartItem) { $product = $cartItem->getProduct(); $productSaleElement = $cartItem->getProductSaleElements(); - $loopResultRow = new LoopResultRow($result, $cartItem, $this->versionable, $this->timestampable, $this->countable); + $loopResultRow = new LoopResultRow(); $loopResultRow->set("ITEM_ID", $cartItem->getId()); $loopResultRow->set("TITLE", $product->getTitle()); @@ -130,10 +79,11 @@ class Cart extends BaseLoop ->set("PROMO_TAXED_PRICE", $cartItem->getTaxedPromoPrice($taxCountry)) ->set("IS_PROMO", $cartItem->getPromo() === 1 ? 1 : 0); $loopResultRow->set("PRODUCT_SALE_ELEMENTS_ID", $productSaleElement->getId()); - $result->addRow($loopResultRow); + + $loopResult->addRow($loopResultRow); } - return $result; + return $loopResult; } /** diff --git a/core/lib/Thelia/Core/Template/Loop/Category.php b/core/lib/Thelia/Core/Template/Loop/Category.php index 7de04c739..b03f6dbb0 100755 --- a/core/lib/Thelia/Core/Template/Loop/Category.php +++ b/core/lib/Thelia/Core/Template/Loop/Category.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -61,10 +62,10 @@ use Thelia\Model\ProductQuery; * @author Manuel Raynaud * @author Etienne Roudeix */ -class Category extends BaseI18nLoop +class Category extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; - public $versionable = true; + protected $timestampable = true; + protected $versionable = true; /** * @return ArgumentCollection @@ -90,17 +91,12 @@ class Category extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = CategoryQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -184,16 +180,16 @@ class Category extends BaseI18nLoop } } - /* perform search */ - $categories = $this->search($search, $pagination); - /* @todo */ $notEmpty = $this->getNot_empty(); - $loopResult = new LoopResult($categories); + return $search; - foreach ($categories as $category) { + } + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $category) { // Find previous and next category $previous = CategoryQuery::create() ->filterByParent($category->getParent()) @@ -214,18 +210,18 @@ class Category extends BaseI18nLoop * if ($this->getNotEmpty() && $category->countAllProducts() == 0) continue; */ - $loopResultRow = new LoopResultRow($loopResult, $category, $this->versionable, $this->timestampable, $this->countable); + $loopResultRow = new LoopResultRow($category); $loopResultRow ->set("ID", $category->getId()) ->set("IS_TRANSLATED",$category->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$locale) + ->set("LOCALE",$this->locale) ->set("TITLE", $category->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $category->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION", $category->getVirtualColumn('i18n_DESCRIPTION')) ->set("POSTSCRIPTUM", $category->getVirtualColumn('i18n_POSTSCRIPTUM')) ->set("PARENT", $category->getParent()) - ->set("URL", $category->getUrl($locale)) + ->set("URL", $category->getUrl($this->locale)) ->set("PRODUCT_COUNT", $category->countAllProducts()) ->set("CHILD_COUNT", $category->countChild()) ->set("VISIBLE", $category->getVisible() ? "1" : "0") @@ -236,11 +232,12 @@ class Category extends BaseI18nLoop ->set("PREVIOUS", $previous != null ? $previous->getId() : -1) ->set("NEXT" , $next != null ? $next->getId() : -1) - ; + ; $loopResult->addRow($loopResultRow); } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/CategoryPath.php b/core/lib/Thelia/Core/Template/Loop/CategoryPath.php index 0582ad3ee..1b7f68f22 100755 --- a/core/lib/Thelia/Core/Template/Loop/CategoryPath.php +++ b/core/lib/Thelia/Core/Template/Loop/CategoryPath.php @@ -23,6 +23,7 @@ namespace Thelia\Core\Template\Loop; +use Thelia\Core\Template\Element\ArraySearchLoopInterface; use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; @@ -54,7 +55,7 @@ use Thelia\Type\BooleanOrBothType; * @package Thelia\Core\Template\Loop * @author Franck Allimant */ -class CategoryPath extends BaseI18nLoop +class CategoryPath extends BaseI18nLoop implements ArraySearchLoopInterface { /** * @return ArgumentCollection @@ -69,19 +70,14 @@ class CategoryPath extends BaseI18nLoop ); } - /** - * @param $pagination (ignored) - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildArray() { $id = $this->getCategory(); $visible = $this->getVisible(); $search = CategoryQuery::create(); - $locale = $this->configureI18nProcessing($search, array('TITLE')); + $this->configureI18nProcessing($search, array('TITLE')); $search->filterById($id); if ($visible != BooleanOrBothType::ANY) $search->filterByVisible($visible); @@ -95,16 +91,12 @@ class CategoryPath extends BaseI18nLoop if ($category != null) { - $loopResultRow = new LoopResultRow(); - - $loopResultRow - ->set("TITLE",$category->getVirtualColumn('i18n_TITLE')) - ->set("URL", $category->getUrl($locale)) - ->set("ID", $category->getId()) - ->set("LOCALE",$locale) - ; - - $results[] = $loopResultRow; + $results[] = array( + "ID" => $category->getId(), + "TITLE" => $category->getVirtualColumn('i18n_TITLE'), + "URL" => $category->getUrl($this->locale), + "LOCALE" => $this->locale, + ); $parent = $category->getParent(); @@ -128,11 +120,18 @@ class CategoryPath extends BaseI18nLoop } while ($category != null && $parent > 0); // Reverse list and build the final result - $results = array_reverse($results); + return array_reverse($results); + } - $loopResult = new LoopResult(); - - foreach($results as $result) $loopResult->addRow($result); + public function parseResults(LoopResult $loopResult) + { + foreach($loopResult->getResultDataCollection() as $result) { + $loopResultRow = new LoopResultRow($result); + foreach($result as $output => $outputValue) { + $loopResultRow->set($output, $outputValue); + } + $loopResult->addRow($loopResultRow); + } return $loopResult; } diff --git a/core/lib/Thelia/Core/Template/Loop/CategoryTree.php b/core/lib/Thelia/Core/Template/Loop/CategoryTree.php index b7c262649..3c3c3ffe0 100755 --- a/core/lib/Thelia/Core/Template/Loop/CategoryTree.php +++ b/core/lib/Thelia/Core/Template/Loop/CategoryTree.php @@ -23,6 +23,7 @@ namespace Thelia\Core\Template\Loop; use Propel\Runtime\ActiveQuery\Criteria; +use Thelia\Core\Template\Element\ArraySearchLoopInterface; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; @@ -45,7 +46,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; * @package Thelia\Core\Template\Loop * @author Franck Allimant */ -class CategoryTree extends BaseI18nLoop +class CategoryTree extends BaseI18nLoop implements ArraySearchLoopInterface { /** * @return ArgumentCollection @@ -59,13 +60,13 @@ class CategoryTree extends BaseI18nLoop } // changement de rubrique - protected function buildCategoryTree($parent, $visible, $level, $previousLevel, $max_level, $exclude, LoopResult &$loopResult) + protected function buildCategoryTree($parent, $visible, $level, $previousLevel, $max_level, $exclude, &$resultsList) { if ($level > $max_level) return; $search = CategoryQuery::create(); - $locale = $this->configureI18nProcessing($search, array( + $this->configureI18nProcessing($search, array( 'TITLE' )); @@ -81,41 +82,45 @@ class CategoryTree extends BaseI18nLoop foreach ($results as $result) { - $loopResultRow = new LoopResultRow(); + $resultsList[] = array( + "ID" => $result->getId(), + "TITLE" => $result->getVirtualColumn('i18n_TITLE'), + "PARENT" => $result->getParent(), + "URL" => $result->getUrl($this->locale), + "VISIBLE" => $result->getVisible() ? "1" : "0", + "LEVEL" => $level, + 'CHILD_COUNT' => $result->countChild(), + 'PREV_LEVEL' => $previousLevel, + ); - $loopResultRow - ->set("ID", $result->getId()) - ->set("TITLE", $result->getVirtualColumn('i18n_TITLE')) - ->set("PARENT", $result->getParent()) - ->set("URL", $result->getUrl($locale)) - ->set("VISIBLE", $result->getVisible() ? "1" : "0") - ->set("LEVEL", $level) - ->set('CHILD_COUNT', $result->countChild()) - ->set('PREV_LEVEL', $previousLevel) - ; - - $loopResult->addRow($loopResultRow); - - $this->buildCategoryTree($result->getId(), $visible, 1 + $level, $level, $max_level, $exclude, $loopResult); + $this->buildCategoryTree($result->getId(), $visible, 1 + $level, $level, $max_level, $exclude, $resultsList); } } - /** - * @param $pagination (ignored) - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function parseResults(LoopResult $loopResult) + { + foreach($loopResult->getResultDataCollection() as $result) { + $loopResultRow = new LoopResultRow($result); + foreach($result as $output => $outputValue) { + $loopResultRow->set($output, $outputValue); + } + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + } + + public function buildArray() { $id = $this->getCategory(); $depth = $this->getDepth(); $visible = $this->getVisible(); $exclude = $this->getExclude(); - $loopResult = new LoopResult(); + $resultsList = array(); - $this->buildCategoryTree($id, $visible, 0, 0, $depth, $exclude, $loopResult); + $this->buildCategoryTree($id, $visible, 0, 0, $depth, $exclude, $resultsList); - return $loopResult; + return $resultsList; } } diff --git a/core/lib/Thelia/Core/Template/Loop/Config.php b/core/lib/Thelia/Core/Template/Loop/Config.php index 78f53489b..f656c6d51 100644 --- a/core/lib/Thelia/Core/Template/Loop/Config.php +++ b/core/lib/Thelia/Core/Template/Loop/Config.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; @@ -48,9 +49,9 @@ use Thelia\Type\EnumListType; * @package Thelia\Core\Template\Loop * @author Franck Allimant */ -class Config extends BaseI18nLoop +class Config extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -80,20 +81,16 @@ class Config extends BaseI18nLoop ); } - /** - * @param $pagination (ignored) - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $id = $this->getId(); $name = $this->getVariable(); $secured = $this->getSecured(); + $exclude = $this->getExclude(); $search = ConfigQuery::create(); - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); if (! is_null($id)) $search->filterById($id); @@ -145,20 +142,21 @@ class Config extends BaseI18nLoop } } - $results = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($results); + } - foreach ($results as $result) { - - $loopResultRow = new LoopResultRow($loopResult, $result, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $result) { + $loopResultRow = new LoopResultRow($result); $loopResultRow ->set("ID" , $result->getId()) ->set("NAME" , $result->getName()) ->set("VALUE" , $result->getValue()) ->set("IS_TRANSLATED", $result->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE" , $locale) + ->set("LOCALE" , $this->locale) ->set("TITLE" , $result->getVirtualColumn('i18n_TITLE')) ->set("CHAPO" , $result->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION" , $result->getVirtualColumn('i18n_DESCRIPTION')) @@ -171,5 +169,6 @@ class Config extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Content.php b/core/lib/Thelia/Core/Template/Loop/Content.php index 3770d700d..e40e95815 100755 --- a/core/lib/Thelia/Core/Template/Loop/Content.php +++ b/core/lib/Thelia/Core/Template/Loop/Content.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -47,10 +48,10 @@ use Thelia\Type\BooleanOrBothType; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Content extends BaseI18nLoop +class Content extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; - public $versionable = true; + protected $timestampable = true; + protected $versionable = true; /** * @return ArgumentCollection @@ -77,19 +78,13 @@ class Content extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return LoopResult - * @throws \InvalidArgumentException - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = ContentQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -205,26 +200,25 @@ class Content extends BaseI18nLoop ); } - /* perform search */ - $search->groupBy(ContentTableMap::ID); + return $search; - $contents = $this->search($search, $pagination); + } - $loopResult = new LoopResult($contents); - - foreach ($contents as $content) { - $loopResultRow = new LoopResultRow($loopResult, $content, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $content) { + $loopResultRow = new LoopResultRow($content); $loopResultRow->set("ID", $content->getId()) ->set("IS_TRANSLATED",$content->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$locale) + ->set("LOCALE",$this->locale) ->set("TITLE",$content->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $content->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION", $content->getVirtualColumn('i18n_DESCRIPTION')) ->set("POSTSCRIPTUM", $content->getVirtualColumn('i18n_POSTSCRIPTUM')) ->set("POSITION", $content->getPosition()) ->set("DEFAULT_FOLDER", $content->getDefaultFolderId()) - ->set("URL", $content->getUrl($locale)) + ->set("URL", $content->getUrl($this->locale)) ->set("VISIBLE", $content->getVisible()) ; @@ -232,6 +226,7 @@ class Content extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Country.php b/core/lib/Thelia/Core/Template/Loop/Country.php index 87e45cb47..8676e03af 100755 --- a/core/lib/Thelia/Core/Template/Loop/Country.php +++ b/core/lib/Thelia/Core/Template/Loop/Country.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -42,9 +43,9 @@ use Thelia\Model\CountryQuery; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Country extends BaseI18nLoop +class Country extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -59,17 +60,12 @@ class Country extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = CountryQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -99,16 +95,17 @@ class Country extends BaseI18nLoop $search->addAscendingOrderByColumn('i18n_TITLE'); - /* perform search */ - $countries = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($countries); + } - foreach ($countries as $country) { - $loopResultRow = new LoopResultRow($loopResult, $country, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $country) { + $loopResultRow = new LoopResultRow($country); $loopResultRow->set("ID", $country->getId()) ->set("IS_TRANSLATED",$country->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$locale) + ->set("LOCALE",$this->locale) ->set("TITLE",$country->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $country->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION", $country->getVirtualColumn('i18n_DESCRIPTION')) @@ -118,11 +115,12 @@ class Country extends BaseI18nLoop ->set("ISOALPHA3", $country->getIsoalpha3()) ->set("IS_DEFAULT", $country->getByDefault() ? "1" : "0") ->set("IS_SHOP_COUNTRY", $country->getShopCountry() ? "1" : "0") - ; + ; $loopResult->addRow($loopResultRow); } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Coupon.php b/core/lib/Thelia/Core/Template/Loop/Coupon.php index 61e3b2762..f11fd0e9a 100755 --- a/core/lib/Thelia/Core/Template/Loop/Coupon.php +++ b/core/lib/Thelia/Core/Template/Loop/Coupon.php @@ -31,6 +31,7 @@ use Thelia\Core\HttpFoundation\Request; use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Coupon\Type\CouponInterface; @@ -49,7 +50,7 @@ use Thelia\Type; * @author Guillaume MOREL * */ -class Coupon extends BaseI18nLoop +class Coupon extends BaseI18nLoop implements PropelSearchLoopInterface { /** * Define all args used in your loop @@ -64,19 +65,12 @@ class Coupon extends BaseI18nLoop ); } - /** - * Execute Loop - * - * @param PropelModelPager $pagination Pagination manager - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = CouponQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search, array('TITLE', 'DESCRIPTION', 'SHORT_DESCRIPTION')); + $this->configureI18nProcessing($search, array('TITLE', 'DESCRIPTION', 'SHORT_DESCRIPTION')); $id = $this->getId(); $isEnabled = $this->getIsEnabled(); @@ -89,10 +83,11 @@ class Coupon extends BaseI18nLoop $search->filterByIsEnabled($isEnabled ? true : false); } - // Perform search - $coupons = $this->search($search, $pagination); + return $search; + } - $loopResult = new LoopResult(); + public function parseResults(LoopResult $loopResult) + { /** @var ConditionFactory $conditionFactory */ $conditionFactory = $this->container->get('thelia.condition.factory'); @@ -102,8 +97,8 @@ class Coupon extends BaseI18nLoop $lang = $request->getSession()->getLang(); /** @var MCoupon $coupon */ - foreach ($coupons as $coupon) { - $loopResultRow = new LoopResultRow(); + foreach ($loopResult->getResultDataCollection() as $coupon) { + $loopResultRow = new LoopResultRow($coupon); $conditions = $conditionFactory->unserializeConditionCollection( $coupon->getSerializedConditions() ); @@ -136,7 +131,7 @@ class Coupon extends BaseI18nLoop } $loopResultRow->set("ID", $coupon->getId()) ->set("IS_TRANSLATED", $coupon->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE", $locale) + ->set("LOCALE", $this->locale) ->set("CODE", $coupon->getCode()) ->set("TITLE", $coupon->getVirtualColumn('i18n_TITLE')) ->set("SHORT_DESCRIPTION", $coupon->getVirtualColumn('i18n_SHORT_DESCRIPTION')) diff --git a/core/lib/Thelia/Core/Template/Loop/Currency.php b/core/lib/Thelia/Core/Template/Loop/Currency.php index a1f936300..82aebeb32 100755 --- a/core/lib/Thelia/Core/Template/Loop/Currency.php +++ b/core/lib/Thelia/Core/Template/Loop/Currency.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -44,9 +45,9 @@ use Thelia\Type\EnumListType; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Currency extends BaseI18nLoop +class Currency extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -76,17 +77,12 @@ class Currency extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = CurrencyQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search, array('NAME')); + $this->configureI18nProcessing($search, array('NAME')); $id = $this->getId(); @@ -162,17 +158,18 @@ class Currency extends BaseI18nLoop } /* perform search */ - $currencies = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($currencies); + } - foreach ($currencies as $currency) { - - $loopResultRow = new LoopResultRow($loopResult, $currency, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $currency) { + $loopResultRow = new LoopResultRow($currency); $loopResultRow ->set("ID" , $currency->getId()) ->set("IS_TRANSLATED" , $currency->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE" , $locale) + ->set("LOCALE" , $this->locale) ->set("NAME" , $currency->getVirtualColumn('i18n_NAME')) ->set("ISOCODE" , $currency->getCode()) ->set("SYMBOL" , $currency->getSymbol()) @@ -185,5 +182,6 @@ class Currency extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Customer.php b/core/lib/Thelia/Core/Template/Loop/Customer.php index 6c0a022a8..949103556 100755 --- a/core/lib/Thelia/Core/Template/Loop/Customer.php +++ b/core/lib/Thelia/Core/Template/Loop/Customer.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Element\SearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -45,9 +46,9 @@ use Thelia\Type; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Customer extends BaseLoop implements SearchLoopInterface +class Customer extends BaseLoop implements SearchLoopInterface, PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -109,12 +110,7 @@ class Customer extends BaseLoop implements SearchLoopInterface } } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = CustomerQuery::create(); @@ -123,7 +119,7 @@ class Customer extends BaseLoop implements SearchLoopInterface if ($current === true) { $currentCustomer = $this->securityContext->getCustomerUser(); if ($currentCustomer === null) { - return new LoopResult(); + return null; } else { $search->filterById($currentCustomer->getId(), Criteria::EQUAL); } @@ -155,12 +151,14 @@ class Customer extends BaseLoop implements SearchLoopInterface $search->filterBySponsor($sponsor, Criteria::EQUAL); } - $customers = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($customers); + } - foreach ($customers as $customer) { - $loopResultRow = new LoopResultRow($loopResult, $customer, $this->versionable, $this->timestampable, $this->countable); + 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()); @@ -175,5 +173,6 @@ class Customer extends BaseLoop implements SearchLoopInterface } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Delivery.php b/core/lib/Thelia/Core/Template/Loop/Delivery.php index 3a0c5cb31..e5c56797d 100644 --- a/core/lib/Thelia/Core/Template/Loop/Delivery.php +++ b/core/lib/Thelia/Core/Template/Loop/Delivery.php @@ -22,7 +22,6 @@ /*************************************************************************************/ namespace Thelia\Core\Template\Loop; -use Propel\Runtime\ActiveQuery\Criteria; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; use Thelia\Core\Template\Loop\Argument\Argument; @@ -33,6 +32,7 @@ use Thelia\Module\BaseModule; * Class Delivery * @package Thelia\Core\Template\Loop * @author Manuel Raynaud + * @author Etienne Roudeix */ class Delivery extends BaseSpecificModule { @@ -48,14 +48,8 @@ class Delivery extends BaseSpecificModule return $collection; } - public function exec(&$pagination) + public function parseResults(LoopResult $loopResult) { - $search = parent::exec($pagination); - /* manage translations */ - $locale = $this->configureI18nProcessing($search); - - $search->filterByType(BaseModule::DELIVERY_MODULE_TYPE, Criteria::EQUAL); - $countryId = $this->getCountry(); if (null !== $countryId) { $country = CountryQuery::create()->findPk($countryId); @@ -66,13 +60,8 @@ class Delivery extends BaseSpecificModule $country = CountryQuery::create()->findOneByByDefault(1); } - /* perform search */ - $deliveryModules = $this->search($search, $pagination); - - $loopResult = new LoopResult($deliveryModules); - - foreach ($deliveryModules as $deliveryModule) { - $loopResultRow = new LoopResultRow($loopResult, $deliveryModule, $this->versionable, $this->timestampable, $this->countable); + foreach ($loopResult->getResultDataCollection() as $deliveryModule) { + $loopResultRow = new LoopResultRow($deliveryModule); $moduleReflection = new \ReflectionClass($deliveryModule->getFullNamespace()); if ($moduleReflection->isSubclassOf("Thelia\Module\DeliveryModuleInterface") === false) { @@ -97,4 +86,9 @@ class Delivery extends BaseSpecificModule return $loopResult; } + + protected function getModuleType() + { + return BaseModule::DELIVERY_MODULE_TYPE; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Document.php b/core/lib/Thelia/Core/Template/Loop/Document.php index 9f99a6fa4..ff57c62c7 100644 --- a/core/lib/Thelia/Core/Template/Loop/Document.php +++ b/core/lib/Thelia/Core/Template/Loop/Document.php @@ -23,6 +23,7 @@ namespace Thelia\Core\Template\Loop; use Thelia\Core\Template\Element\BaseI18nLoop; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Core\Event\Document\DocumentEvent; use Thelia\Core\Event\TheliaEvents; @@ -41,9 +42,12 @@ use Thelia\Log\Tlog; * * @author Franck Allimant */ -class Document extends BaseI18nLoop +class Document extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $objectType; + protected $objectId; + + protected $timestampable = true; /** * @var array Possible document sources @@ -195,18 +199,15 @@ class Document extends BaseI18nLoop return $search; } - /** - * @param unknown $pagination - */ - public function exec(&$pagination) + public function buildModelCriteria() { // Select the proper query to use, and get the object type - $object_type = $object_id = null; + $this->objectType = $this->objectId = null; - $search = $this->getSearchQuery($object_type, $object_id); + $search = $this->getSearchQuery($this->objectType, $this->objectId); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -221,14 +222,13 @@ class Document extends BaseI18nLoop // Create document processing event $event = new DocumentEvent($this->request); - // echo "sql=".$search->toString(); + return $search; - $results = $this->search($search, $pagination); - - $loopResult = new LoopResult($results); - - foreach ($results as $result) { + } + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $result) { // Create document processing event $event = new DocumentEvent($this->request); @@ -236,22 +236,22 @@ class Document extends BaseI18nLoop $source_filepath = sprintf("%s%s/%s/%s", THELIA_ROOT, ConfigQuery::read('documents_library_path', 'local/media/documents'), - $object_type, + $this->objectType, $result->getFile() - ); + ); $event->setSourceFilepath($source_filepath); - $event->setCacheSubdirectory($object_type); + $event->setCacheSubdirectory($this->objectType); try { // Dispatch document processing event $this->dispatcher->dispatch(TheliaEvents::DOCUMENT_PROCESS, $event); - $loopResultRow = new LoopResultRow($loopResult, $result, $this->versionable, $this->timestampable, $this->countable); + $loopResultRow = new LoopResultRow($result); $loopResultRow ->set("ID" , $result->getId()) - ->set("LOCALE" , $locale) + ->set("LOCALE" , $this->locale) ->set("DOCUMENT_URL" , $event->getFileUrl()) ->set("DOCUMENT_PATH" , $event->getDocumentPath()) ->set("ORIGINAL_DOCUMENT_PATH", $source_filepath) @@ -260,8 +260,8 @@ class Document extends BaseI18nLoop ->set("DESCRIPTION" , $result->getVirtualColumn('i18n_DESCRIPTION')) ->set("POSTSCRIPTUM" , $result->getVirtualColumn('i18n_POSTSCRIPTUM')) ->set("POSITION" , $result->getPosition()) - ->set("OBJECT_TYPE" , $object_type) - ->set("OBJECT_ID" , $object_id) + ->set("OBJECT_TYPE" , $this->objectType) + ->set("OBJECT_ID" , $this->objectId) ; $loopResult->addRow($loopResultRow); @@ -272,5 +272,6 @@ class Document extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Feature.php b/core/lib/Thelia/Core/Template/Loop/Feature.php index 89b338b0f..6f7f12c71 100755 --- a/core/lib/Thelia/Core/Template/Loop/Feature.php +++ b/core/lib/Thelia/Core/Template/Loop/Feature.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -50,9 +51,11 @@ use Thelia\Model\Map\FeatureTemplateTableMap; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Feature extends BaseI18nLoop +class Feature extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $useFeaturePosition; + + protected $timestampable = true; /** * @return ArgumentCollection @@ -77,17 +80,12 @@ class Feature extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = FeatureQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -109,7 +107,7 @@ class Feature extends BaseI18nLoop $template = $this->getTemplate(); $exclude_template = $this->getExcludeTemplate(); - $use_feature_pos = true; + $this->useFeaturePosition = true; if (null !== $product) { // Find all template assigned to the products. @@ -137,7 +135,7 @@ class Feature extends BaseI18nLoop ->filterByTemplate(TemplateQuery::create()->findById($template), Criteria::IN) ; - $use_feature_pos = false; + $this->useFeaturePosition = false; } if (null !== $exclude_template) { @@ -149,7 +147,7 @@ class Feature extends BaseI18nLoop ->filterById($exclude_features, Criteria::NOT_IN) ; - $use_feature_pos = false; + $this->useFeaturePosition = false; } $title = $this->getTitle(); @@ -186,13 +184,13 @@ class Feature extends BaseI18nLoop $search->addDescendingOrderByColumn('i18n_TITLE'); break; case "manual": - if ($use_feature_pos) + if ($this->useFeaturePosition) $search->orderByPosition(Criteria::ASC); else $search->addAscendingOrderByColumn(FeatureTemplateTableMap::POSITION); break; case "manual_reverse": - if ($use_feature_pos) + if ($this->useFeaturePosition) $search->orderByPosition(Criteria::DESC); else $search->addDescendingOrderByColumn(FeatureTemplateTableMap::POSITION); @@ -201,26 +199,28 @@ class Feature extends BaseI18nLoop } - /* perform search */ - $features = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($features); + } - foreach ($features as $feature) { - $loopResultRow = new LoopResultRow($loopResult, $feature, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $feature) { + $loopResultRow = new LoopResultRow($feature); $loopResultRow->set("ID", $feature->getId()) ->set("IS_TRANSLATED",$feature->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$locale) + ->set("LOCALE",$this->locale) ->set("TITLE",$feature->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $feature->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION", $feature->getVirtualColumn('i18n_DESCRIPTION')) ->set("POSTSCRIPTUM", $feature->getVirtualColumn('i18n_POSTSCRIPTUM')) - ->set("POSITION", $use_feature_pos ? $feature->getPosition() : $feature->getVirtualColumn('position')) + ->set("POSITION", $this->useFeaturePosition ? $feature->getPosition() : $feature->getVirtualColumn('position')) ; $loopResult->addRow($loopResultRow); } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/FeatureAvailability.php b/core/lib/Thelia/Core/Template/Loop/FeatureAvailability.php index 093cea24a..96c65713d 100755 --- a/core/lib/Thelia/Core/Template/Loop/FeatureAvailability.php +++ b/core/lib/Thelia/Core/Template/Loop/FeatureAvailability.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -43,9 +44,9 @@ use Thelia\Type; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class FeatureAvailability extends BaseI18nLoop +class FeatureAvailability extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -66,17 +67,12 @@ class FeatureAvailability extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = FeatureAvQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -115,16 +111,17 @@ class FeatureAvailability extends BaseI18nLoop } } - /* perform search */ - $featuresAv = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($featuresAv); + } - foreach ($featuresAv as $featureAv) { - $loopResultRow = new LoopResultRow($loopResult, $featureAv, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $featureAv) { + $loopResultRow = new LoopResultRow($featureAv); $loopResultRow->set("ID", $featureAv->getId()) ->set("IS_TRANSLATED",$featureAv->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$locale) + ->set("LOCALE",$this->locale) ->set("TITLE",$featureAv->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $featureAv->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION", $featureAv->getVirtualColumn('i18n_DESCRIPTION')) @@ -135,5 +132,6 @@ class FeatureAvailability extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/FeatureValue.php b/core/lib/Thelia/Core/Template/Loop/FeatureValue.php index 8ae8b0f4f..1547202f7 100755 --- a/core/lib/Thelia/Core/Template/Loop/FeatureValue.php +++ b/core/lib/Thelia/Core/Template/Loop/FeatureValue.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -45,9 +46,9 @@ use Thelia\Type; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class FeatureValue extends BaseI18nLoop +class FeatureValue extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -70,17 +71,12 @@ class FeatureValue extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = FeatureProductQuery::create(); // manage featureAv translations - $locale = $this->configureI18nProcessing( + $this->configureI18nProcessing( $search, array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM'), FeatureAvTableMap::TABLE_NAME, @@ -127,13 +123,14 @@ class FeatureValue extends BaseI18nLoop } } - $featureValues = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($featureValues); + } - foreach ($featureValues as $featureValue) { - - $loopResultRow = new LoopResultRow($loopResult, $featureValue, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $featureValue) { + $loopResultRow = new LoopResultRow($featureValue); $loopResultRow ->set("ID" , $featureValue->getId()) @@ -144,7 +141,7 @@ class FeatureValue extends BaseI18nLoop ->set("IS_FREE_TEXT" , is_null($featureValue->getFeatureAvId()) ? 1 : 0) ->set("IS_FEATURE_AV" , is_null($featureValue->getFeatureAvId()) ? 0 : 1) - ->set("LOCALE" , $locale) + ->set("LOCALE" , $this->locale) ->set("TITLE" , $featureValue->getVirtualColumn(FeatureAvTableMap::TABLE_NAME . '_i18n_TITLE')) ->set("CHAPO" , $featureValue->getVirtualColumn(FeatureAvTableMap::TABLE_NAME . '_i18n_CHAPO')) ->set("DESCRIPTION" , $featureValue->getVirtualColumn(FeatureAvTableMap::TABLE_NAME . '_i18n_DESCRIPTION')) @@ -157,5 +154,6 @@ class FeatureValue extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Feed.php b/core/lib/Thelia/Core/Template/Loop/Feed.php index 11f872432..0fc5ab686 100755 --- a/core/lib/Thelia/Core/Template/Loop/Feed.php +++ b/core/lib/Thelia/Core/Template/Loop/Feed.php @@ -23,13 +23,13 @@ namespace Thelia\Core\Template\Loop; +use Thelia\Core\Template\Element\ArraySearchLoopInterface; use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; -use Thelia\Tools\DateTimeFormat; /** * @@ -37,7 +37,7 @@ use Thelia\Tools\DateTimeFormat; * * @author Franck Allimant */ -class Feed extends BaseLoop +class Feed extends BaseLoop implements ArraySearchLoopInterface { public function getArgDefinitions() { @@ -47,12 +47,7 @@ class Feed extends BaseLoop ); } - /** - * - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildArray() { $cachedir = THELIA_ROOT . 'cache/feeds'; @@ -72,26 +67,15 @@ class Feed extends BaseLoop $items = $feed->get_items(); - $limit = min(count($items), $this->getLimit()); + return $items; - $indexes = array(); - for ($idx = 0; $idx < $limit; $idx++) { - $indexes[] = $idx; - } + } - $loopResult = new LoopResult($indexes); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $item) { - foreach ($indexes as $idx) { - - $item = $items[$idx]; - - $link = $item->get_permalink(); - - $title = $item->get_title(); - $author = $item->get_author(); - $description = $item->get_description(); - - $loopResultRow = new LoopResultRow($loopResult, null, $this->versionable, $this->timestampable, $this->countable); + $loopResultRow = new LoopResultRow(); $loopResultRow ->set("URL" , $item->get_permalink()) diff --git a/core/lib/Thelia/Core/Template/Loop/Folder.php b/core/lib/Thelia/Core/Template/Loop/Folder.php index c59a3e95c..071c88dd3 100755 --- a/core/lib/Thelia/Core/Template/Loop/Folder.php +++ b/core/lib/Thelia/Core/Template/Loop/Folder.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -43,10 +44,10 @@ use Thelia\Type\BooleanOrBothType; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Folder extends BaseI18nLoop +class Folder extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; - public $versionable = true; + protected $timestampable = true; + protected $versionable = true; /** * @return ArgumentCollection @@ -71,17 +72,12 @@ class Folder extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = FolderQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -148,33 +144,28 @@ class Folder extends BaseI18nLoop } } - /* perform search */ - $folders = $this->search($search, $pagination); - /* @todo */ $notEmpty = $this->getNot_empty(); - $loopResult = new LoopResult($folders); + return $search; - foreach ($folders as $folder) { + } - /* - * no cause pagination lost : - * if ($notEmpty && $folder->countAllProducts() == 0) continue; - */ - - $loopResultRow = new LoopResultRow($loopResult, $folder, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $folder) { + $loopResultRow = new LoopResultRow($folder); $loopResultRow ->set("ID", $folder->getId()) ->set("IS_TRANSLATED",$folder->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$locale) + ->set("LOCALE",$this->locale) ->set("TITLE",$folder->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $folder->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION", $folder->getVirtualColumn('i18n_DESCRIPTION')) ->set("POSTSCRIPTUM", $folder->getVirtualColumn('i18n_POSTSCRIPTUM')) ->set("PARENT", $folder->getParent()) - ->set("URL", $folder->getUrl($locale)) + ->set("URL", $folder->getUrl($this->locale)) ->set("CHILD_COUNT", $folder->countChild()) ->set("CONTENT_COUNT", $folder->countAllContents()) ->set("VISIBLE", $folder->getVisible() ? "1" : "0") @@ -185,5 +176,6 @@ class Folder extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/FolderPath.php b/core/lib/Thelia/Core/Template/Loop/FolderPath.php index 2b9a52b0d..ce5ea9526 100644 --- a/core/lib/Thelia/Core/Template/Loop/FolderPath.php +++ b/core/lib/Thelia/Core/Template/Loop/FolderPath.php @@ -22,6 +22,7 @@ /*************************************************************************************/ namespace Thelia\Core\Template\Loop; +use Thelia\Core\Template\Element\ArraySearchLoopInterface; use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; @@ -35,9 +36,8 @@ use Thelia\Type\BooleanOrBothType; * @package Thelia\Core\Template\Loop * @author Manuel Raynaud */ -class FolderPath extends BaseI18nLoop +class FolderPath extends BaseI18nLoop implements ArraySearchLoopInterface { - /** * * define all args used in your loop @@ -80,26 +80,14 @@ class FolderPath extends BaseI18nLoop ); } - /** - * - * this function have to be implement in your own loop class. - * - * All loops parameters can be accessible via getter. - * - * for example, ref parameter is accessible through getRef method - * - * @param $pagination - * - * @return mixed - */ - public function exec(&$pagination) + public function buildArray() { $id = $this->getFolder(); $visible = $this->getVisible(); $search = FolderQuery::create(); - $locale = $this->configureI18nProcessing($search, array('TITLE')); + $this->configureI18nProcessing($search, array('TITLE')); $search->filterById($id); if ($visible != BooleanOrBothType::ANY) $search->filterByVisible($visible); @@ -113,16 +101,12 @@ class FolderPath extends BaseI18nLoop if ($folder != null) { - $loopResultRow = new LoopResultRow(); - - $loopResultRow - ->set("TITLE",$folder->getVirtualColumn('i18n_TITLE')) - ->set("URL", $folder->getUrl($locale)) - ->set("ID", $folder->getId()) - ->set("LOCALE",$locale) - ; - - $results[] = $loopResultRow; + $results[] = array( + "ID" => $result->getId(), + "TITLE" => $result->getVirtualColumn('i18n_TITLE'), + "URL" => $result->getUrl($this->locale), + "LOCALE" => $this->locale, + ); $parent = $folder->getParent(); @@ -146,13 +130,19 @@ class FolderPath extends BaseI18nLoop } while ($folder != null && $parent > 0); // Reverse list and build the final result - $results = array_reverse($results); + return array_reverse($results); + } - $loopResult = new LoopResult(); - - foreach($results as $result) $loopResult->addRow($result); + public function parseResults(LoopResult $loopResult) + { + foreach($loopResult->getResultDataCollection() as $result) { + $loopResultRow = new LoopResultRow($result); + foreach($result as $output => $outputValue) { + $loopResultRow->set($output, $outputValue); + } + $loopResult->addRow($loopResultRow); + } return $loopResult; } - } diff --git a/core/lib/Thelia/Core/Template/Loop/FolderTree.php b/core/lib/Thelia/Core/Template/Loop/FolderTree.php index 9549f2467..9598f7a5c 100644 --- a/core/lib/Thelia/Core/Template/Loop/FolderTree.php +++ b/core/lib/Thelia/Core/Template/Loop/FolderTree.php @@ -23,6 +23,7 @@ namespace Thelia\Core\Template\Loop; use Propel\Runtime\ActiveQuery\Criteria; +use Thelia\Core\Template\Element\ArraySearchLoopInterface; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; @@ -45,7 +46,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; * @package Thelia\Core\Template\Loop * @author Franck Allimant */ -class FolderTree extends BaseI18nLoop +class FolderTree extends BaseI18nLoop implements ArraySearchLoopInterface { /** * @return ArgumentCollection @@ -61,13 +62,13 @@ class FolderTree extends BaseI18nLoop } // changement de rubrique - protected function buildFolderTree($parent, $visible, $level, $max_level, $exclude, LoopResult &$loopResult) + protected function buildFolderTree($parent, $visible, $level, $max_level, $exclude, &$resultsList) { if ($level > $max_level) return; $search = FolderQuery::create(); - $locale = $this->configureI18nProcessing($search, array( + $this->configureI18nProcessing($search, array( 'TITLE' )); @@ -83,36 +84,44 @@ class FolderTree extends BaseI18nLoop foreach ($results as $result) { - $loopResultRow = new LoopResultRow(); + $resultsList[] = array( + "ID" => $result->getId(), + "TITLE" => $result->getVirtualColumn('i18n_TITLE'), + "PARENT" => $result->getParent(), + "URL" => $result->getUrl($this->locale), + "VISIBLE" => $result->getVisible() ? "1" : "0", + "LEVEL" => $level, + 'CHILD_COUNT' => $result->countChild(), + ); - $loopResultRow - ->set("ID", $result->getId())->set("TITLE", $result->getVirtualColumn('i18n_TITLE')) - ->set("PARENT", $result->getParent())->set("URL", $result->getUrl($locale)) - ->set("VISIBLE", $result->getVisible() ? "1" : "0")->set("LEVEL", $level) - ; - - $loopResult->addRow($loopResultRow); - - $this->buildFolderTree($result->getId(), $visible, 1 + $level, $max_level, $exclude, $loopResult); + $this->buildFolderTree($result->getId(), $visible, 1 + $level, $max_level, $exclude, $resultsList); } } - /** - * @param $pagination (ignored) - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function parseResults(LoopResult $loopResult) + { + foreach($loopResult->getResultDataCollection() as $result) { + $loopResultRow = new LoopResultRow($result); + foreach($result as $output => $outputValue) { + $loopResultRow->set($output, $outputValue); + } + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + } + + public function buildArray() { $id = $this->getFolder(); $depth = $this->getDepth(); $visible = $this->getVisible(); $exclude = $this->getExclude(); - $loopResult = new LoopResult(); + $resultsList = array(); - $this->buildFolderTree($id, $visible, 0, $depth, $exclude, $loopResult); + $this->buildFolderTree($id, $visible, 0, $depth, $exclude, $resultsList); - return $loopResult; + return $resultsList; } } diff --git a/core/lib/Thelia/Core/Template/Loop/Image.php b/core/lib/Thelia/Core/Template/Loop/Image.php index b20b161a3..b207deb29 100755 --- a/core/lib/Thelia/Core/Template/Loop/Image.php +++ b/core/lib/Thelia/Core/Template/Loop/Image.php @@ -23,6 +23,7 @@ namespace Thelia\Core\Template\Loop; use Thelia\Core\Template\Element\BaseI18nLoop; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Core\Event\Image\ImageEvent; use Thelia\Core\Event\TheliaEvents; @@ -41,9 +42,12 @@ use Thelia\Log\Tlog; * * @author Franck Allimant */ -class Image extends BaseI18nLoop +class Image extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $objectType; + protected $objectId; + + protected $timestampable = true; /** * @var array Possible image sources @@ -210,19 +214,16 @@ class Image extends BaseI18nLoop return $search; } - /** - * @param unknown $pagination - */ - public function exec(&$pagination) + public function buildModelCriteria() { // Select the proper query to use, and get the object type - $object_type = $object_id = null; + $this->objectType = $this->objectId = null; - $search = $this->getSearchQuery($object_type, $object_id); + $search = $this->getSearchQuery($this->objectType, $this->objectId); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -234,6 +235,14 @@ class Image extends BaseI18nLoop if (!is_null($exclude)) $search->filterById($exclude, Criteria::NOT_IN); + // echo "sql=".$search->toString(); + + return $search; + + } + + public function parseResults(LoopResult $loopResult) + { // Create image processing event $event = new ImageEvent($this->request); @@ -264,16 +273,11 @@ class Image extends BaseI18nLoop } - // echo "sql=".$search->toString(); - - $results = $this->search($search, $pagination); - - $loopResult = new LoopResult($results); - - foreach ($results as $result) { - + foreach ($loopResult->getResultDataCollection() as $result) { // Create image processing event - $event = new ImageEvent($this->request); + + // ERO : following is duplicated, guess it's useless at this point + //$event = new ImageEvent($this->request); // Setup required transformations if (! is_null($width)) $event->setWidth($width); @@ -288,22 +292,22 @@ class Image extends BaseI18nLoop $source_filepath = sprintf("%s%s/%s/%s", THELIA_ROOT, ConfigQuery::read('images_library_path', 'local/media/images'), - $object_type, + $this->objectType, $result->getFile() - ); + ); $event->setSourceFilepath($source_filepath); - $event->setCacheSubdirectory($object_type); + $event->setCacheSubdirectory($this->objectType); try { // Dispatch image processing event $this->dispatcher->dispatch(TheliaEvents::IMAGE_PROCESS, $event); - $loopResultRow = new LoopResultRow($loopResult, $result, $this->versionable, $this->timestampable, $this->countable); + $loopResultRow = new LoopResultRow($result); $loopResultRow ->set("ID" , $result->getId()) - ->set("LOCALE" ,$locale) + ->set("LOCALE" ,$this->locale) ->set("IMAGE_URL" , $event->getFileUrl()) ->set("ORIGINAL_IMAGE_URL" , $event->getOriginalFileUrl()) ->set("IMAGE_PATH" , $event->getCacheFilepath()) @@ -313,8 +317,8 @@ class Image extends BaseI18nLoop ->set("DESCRIPTION" , $result->getVirtualColumn('i18n_DESCRIPTION')) ->set("POSTSCRIPTUM" , $result->getVirtualColumn('i18n_POSTSCRIPTUM')) ->set("POSITION" , $result->getPosition()) - ->set("OBJECT_TYPE" , $object_type) - ->set("OBJECT_ID" , $object_id) + ->set("OBJECT_TYPE" , $this->objectType) + ->set("OBJECT_ID" , $this->objectId) ; $loopResult->addRow($loopResultRow); @@ -325,5 +329,6 @@ class Image extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Lang.php b/core/lib/Thelia/Core/Template/Loop/Lang.php index 52a866d30..f473b8589 100755 --- a/core/lib/Thelia/Core/Template/Loop/Lang.php +++ b/core/lib/Thelia/Core/Template/Loop/Lang.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Model\LangQuery; @@ -43,9 +44,9 @@ use Thelia\Core\Template\Loop\Argument\ArgumentCollection; * @package Thelia\Core\Template\Loop * @author Franck Allimant */ -class Lang extends BaseLoop +class Lang extends BaseLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -59,12 +60,7 @@ class Lang extends BaseLoop ); } - /** - * @param $pagination (ignored) - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $id = $this->getId(); $exclude = $this->getExclude(); @@ -84,13 +80,14 @@ class Lang extends BaseLoop $search->orderByPosition(Criteria::ASC); - $results = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($results); + } - foreach ($results as $result) { - - $loopResultRow = new LoopResultRow($loopResult, $result, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $result) { + $loopResultRow = new LoopResultRow($result); $loopResultRow ->set("ID", $result->getId()) @@ -108,5 +105,6 @@ class Lang extends BaseLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Message.php b/core/lib/Thelia/Core/Template/Loop/Message.php index bea662572..4594dd4d2 100644 --- a/core/lib/Thelia/Core/Template/Loop/Message.php +++ b/core/lib/Thelia/Core/Template/Loop/Message.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; @@ -46,9 +47,9 @@ use Thelia\Type\BooleanOrBothType; * @package Thelia\Core\Template\Loop * @author Franck Allimant */ -class Message extends BaseI18nLoop +class Message extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -64,20 +65,16 @@ class Message extends BaseI18nLoop ); } - /** - * @param $pagination (ignored) - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $id = $this->getId(); $name = $this->getVariable(); $secured = $this->getSecured(); + $exclude = $this->getExclude(); $search = MessageQuery::create(); - $locale = $this->configureI18nProcessing($search, array( + $this->configureI18nProcessing($search, array( 'TITLE', 'SUBJECT', 'TEXT_MESSAGE', @@ -100,19 +97,20 @@ class Message extends BaseI18nLoop $search->orderByName(Criteria::ASC); - $results = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($results); + } - foreach ($results as $result) { - - $loopResultRow = new LoopResultRow($loopResult, $result, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $result) { + $loopResultRow = new LoopResultRow($result); $loopResultRow ->set("ID" , $result->getId()) ->set("NAME" , $result->getName()) ->set("IS_TRANSLATED", $result->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE" , $locale) + ->set("LOCALE" , $this->locale) ->set("TITLE" , $result->getVirtualColumn('i18n_TITLE')) ->set("SUBJECT" , $result->getVirtualColumn('i18n_SUBJECT')) ->set("TEXT_MESSAGE" , $result->getVirtualColumn('i18n_TEXT_MESSAGE')) @@ -124,5 +122,6 @@ class Message extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Module.php b/core/lib/Thelia/Core/Template/Loop/Module.php index 1c07d7d5f..786990b66 100755 --- a/core/lib/Thelia/Core/Template/Loop/Module.php +++ b/core/lib/Thelia/Core/Template/Loop/Module.php @@ -29,6 +29,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -46,9 +47,9 @@ use Thelia\Type; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Module extends BaseI18nLoop +class Module extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -79,17 +80,12 @@ class Module extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = ModuleQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -131,16 +127,17 @@ class Module extends BaseI18nLoop $search->orderByPosition(); - /* perform search */ - $modules = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($modules); + } - foreach ($modules as $module) { - $loopResultRow = new LoopResultRow($loopResult, $module, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $module) { + $loopResultRow = new LoopResultRow($module); $loopResultRow->set("ID", $module->getId()) ->set("IS_TRANSLATED",$module->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$locale) + ->set("LOCALE",$this->locale) ->set("TITLE",$module->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $module->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION", $module->getVirtualColumn('i18n_DESCRIPTION')) @@ -151,7 +148,7 @@ class Module extends BaseI18nLoop ->set("CLASS", $module->getFullNamespace()) ->set("POSITION", $module->getPosition()); - if (null !== $profile) { + if (null !== $this->getProfile()) { $accessValue = $module->getVirtualColumn('access'); $manager = new AccessManager($accessValue); @@ -165,5 +162,6 @@ class Module extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Order.php b/core/lib/Thelia/Core/Template/Loop/Order.php index e10b8a5cb..5f12fa1eb 100755 --- a/core/lib/Thelia/Core/Template/Loop/Order.php +++ b/core/lib/Thelia/Core/Template/Loop/Order.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Element\SearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -43,11 +44,11 @@ use Thelia\Type; * @author Franck Allimant * @author Etienne Roudeix */ -class Order extends BaseLoop implements SearchLoopInterface +class Order extends BaseLoop implements SearchLoopInterface, PropelSearchLoopInterface { - public $countable = true; - public $timestampable = true; - public $versionable = false; + protected $countable = true; + protected $timestampable = true; + protected $versionable = false; public function getArgDefinitions() { @@ -131,12 +132,7 @@ class Order extends BaseLoop implements SearchLoopInterface } } - /** - * @param $pagination - * - * @return LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = OrderQuery::create(); @@ -151,7 +147,7 @@ class Order extends BaseLoop implements SearchLoopInterface if ($customer === 'current') { $currentCustomer = $this->securityContext->getCustomerUser(); if ($currentCustomer === null) { - return new LoopResult(); + return null; } else { $search->filterByCustomerId($currentCustomer->getId(), Criteria::EQUAL); } @@ -178,14 +174,16 @@ class Order extends BaseLoop implements SearchLoopInterface } } - $orders = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($orders); + } - foreach ($orders as $order) { + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $order) { $tax = 0; $amount = $order->getTotalAmount($tax); - $loopResultRow = new LoopResultRow($loopResult, $order, $this->versionable, $this->timestampable, $this->countable); + $loopResultRow = new LoopResultRow($order); $loopResultRow ->set("ID", $order->getId()) ->set("REF", $order->getRef()) @@ -213,5 +211,6 @@ class Order extends BaseLoop implements SearchLoopInterface } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/OrderAddress.php b/core/lib/Thelia/Core/Template/Loop/OrderAddress.php index 38dcb0239..4898a7217 100755 --- a/core/lib/Thelia/Core/Template/Loop/OrderAddress.php +++ b/core/lib/Thelia/Core/Template/Loop/OrderAddress.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -42,9 +43,9 @@ use Thelia\Model\OrderAddressQuery; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class OrderAddress extends BaseLoop +class OrderAddress extends BaseLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -56,12 +57,7 @@ class OrderAddress extends BaseLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = OrderAddressQuery::create(); @@ -69,12 +65,14 @@ class OrderAddress extends BaseLoop $search->filterById($id, Criteria::IN); - $orderAddresses = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($orderAddresses); + } - foreach ($orderAddresses as $orderAddress) { - $loopResultRow = new LoopResultRow($loopResult, $orderAddress, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $orderAddress) { + $loopResultRow = new LoopResultRow($orderAddress); $loopResultRow ->set("ID", $orderAddress->getId()) ->set("TITLE", $orderAddress->getCustomerTitleId()) @@ -94,5 +92,6 @@ class OrderAddress extends BaseLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/OrderProduct.php b/core/lib/Thelia/Core/Template/Loop/OrderProduct.php index f12bbed70..f36162099 100755 --- a/core/lib/Thelia/Core/Template/Loop/OrderProduct.php +++ b/core/lib/Thelia/Core/Template/Loop/OrderProduct.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -41,9 +42,9 @@ use Thelia\Model\Base\OrderProductQuery; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class OrderProduct extends BaseLoop +class OrderProduct extends BaseLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -55,13 +56,7 @@ class OrderProduct extends BaseLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - * @throws \InvalidArgumentException - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = OrderProductQuery::create(); @@ -76,44 +71,47 @@ class OrderProduct extends BaseLoop $search->orderById(Criteria::ASC); - $products = $this->search($search, $pagination); + return $search; + + } - $loopResult = new LoopResult($products); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $orderProduct) { + $loopResultRow = new LoopResultRow($orderProduct); - foreach ($products as $product) { - $loopResultRow = new LoopResultRow($loopResult, $product, $this->versionable, $this->timestampable, $this->countable); + $price = $orderProduct->getPrice(); + $taxedPrice = $price + round($orderProduct->getVirtualColumn('TOTAL_TAX'), 2); + $promoPrice = $orderProduct->getPromoPrice(); + $taxedPromoPrice = $promoPrice + round($orderProduct->getVirtualColumn('TOTAL_PROMO_TAX'), 2); - $price = $product->getPrice(); - $taxedPrice = $price + round($product->getVirtualColumn('TOTAL_TAX'), 2); - $promoPrice = $product->getPromoPrice(); - $taxedPromoPrice = $promoPrice + round($product->getVirtualColumn('TOTAL_PROMO_TAX'), 2); - - $loopResultRow->set("ID", $product->getId()) - ->set("REF", $product->getProductRef()) - ->set("PRODUCT_SALE_ELEMENTS_REF", $product->getProductSaleElementsRef()) - ->set("WAS_NEW", $product->getWasNew() === 1 ? 1 : 0) - ->set("WAS_IN_PROMO", $product->getWasInPromo() === 1 ? 1 : 0) - ->set("WEIGHT", $product->getWeight()) - ->set("TITLE", $product->getTitle()) - ->set("CHAPO", $product->getChapo()) - ->set("DESCRIPTION", $product->getDescription()) - ->set("POSTSCRIPTUM", $product->getPostscriptum()) - ->set("QUANTITY", $product->getQuantity()) + $loopResultRow->set("ID", $orderProduct->getId()) + ->set("REF", $orderProduct->getProductRef()) + ->set("PRODUCT_SALE_ELEMENTS_REF", $orderProduct->getProductSaleElementsRef()) + ->set("WAS_NEW", $orderProduct->getWasNew() === 1 ? 1 : 0) + ->set("WAS_IN_PROMO", $orderProduct->getWasInPromo() === 1 ? 1 : 0) + ->set("WEIGHT", $orderProduct->getWeight()) + ->set("TITLE", $orderProduct->getTitle()) + ->set("CHAPO", $orderProduct->getChapo()) + ->set("DESCRIPTION", $orderProduct->getDescription()) + ->set("POSTSCRIPTUM", $orderProduct->getPostscriptum()) + ->set("QUANTITY", $orderProduct->getQuantity()) ->set("PRICE", $price) ->set("PRICE_TAX", $taxedPrice - $price) ->set("TAXED_PRICE", $taxedPrice) ->set("PROMO_PRICE", $promoPrice) ->set("PROMO_PRICE_TAX", $taxedPromoPrice - $promoPrice) ->set("TAXED_PROMO_PRICE", $taxedPromoPrice) - ->set("TAX_RULE_TITLE", $product->getTaxRuleTitle()) - ->set("TAX_RULE_DESCRIPTION", $product->getTaxRuledescription()) - ->set("PARENT", $product->getParent()) - ->set("EAN_CODE", $product->getEanCode()) + ->set("TAX_RULE_TITLE", $orderProduct->getTaxRuleTitle()) + ->set("TAX_RULE_DESCRIPTION", $orderProduct->getTaxRuledescription()) + ->set("PARENT", $orderProduct->getParent()) + ->set("EAN_CODE", $orderProduct->getEanCode()) ; $loopResult->addRow($loopResultRow); } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/OrderProductAttributeCombination.php b/core/lib/Thelia/Core/Template/Loop/OrderProductAttributeCombination.php index 623d0bae5..f248159c5 100755 --- a/core/lib/Thelia/Core/Template/Loop/OrderProductAttributeCombination.php +++ b/core/lib/Thelia/Core/Template/Loop/OrderProductAttributeCombination.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -43,9 +44,9 @@ use Thelia\Type; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class OrderProductAttributeCombination extends BaseI18nLoop +class OrderProductAttributeCombination extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -64,12 +65,7 @@ class OrderProductAttributeCombination extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = OrderProductAttributeCombinationQuery::create(); @@ -90,28 +86,30 @@ class OrderProductAttributeCombination extends BaseI18nLoop } } - $attributeCombinations = $this->search($search, $pagination); + return $search; + + } - $loopResult = new LoopResult($attributeCombinations); - - foreach ($attributeCombinations as $attributeCombination) { - $loopResultRow = new LoopResultRow($loopResult, $attributeCombination, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $orderAttributeCombination) { + $loopResultRow = new LoopResultRow($orderAttributeCombination); $loopResultRow - ->set("LOCALE",$locale) - ->set("ATTRIBUTE_TITLE", $attributeCombination->getAttributeTitle()) - ->set("ATTRIBUTE_CHAPO", $attributeCombination->getAttributeChapo()) - ->set("ATTRIBUTE_DESCRIPTION", $attributeCombination->getAttributeDescription()) - ->set("ATTRIBUTE_POSTSCRIPTUM", $attributeCombination->getAttributePostscriptum()) - ->set("ATTRIBUTE_AVAILABILITY_TITLE", $attributeCombination->getAttributeAvTitle()) - ->set("ATTRIBUTE_AVAILABILITY_CHAPO", $attributeCombination->getAttributeAvChapo()) - ->set("ATTRIBUTE_AVAILABILITY_DESCRIPTION", $attributeCombination->getAttributeAvDescription()) - ->set("ATTRIBUTE_AVAILABILITY_POSTSCRIPTUM", $attributeCombination->getAttributeAvPostscriptum()) + ->set("ATTRIBUTE_TITLE", $orderAttributeCombination->getAttributeTitle()) + ->set("ATTRIBUTE_CHAPO", $orderAttributeCombination->getAttributeChapo()) + ->set("ATTRIBUTE_DESCRIPTION", $orderAttributeCombination->getAttributeDescription()) + ->set("ATTRIBUTE_POSTSCRIPTUM", $orderAttributeCombination->getAttributePostscriptum()) + ->set("ATTRIBUTE_AVAILABILITY_TITLE", $orderAttributeCombination->getAttributeAvTitle()) + ->set("ATTRIBUTE_AVAILABILITY_CHAPO", $orderAttributeCombination->getAttributeAvChapo()) + ->set("ATTRIBUTE_AVAILABILITY_DESCRIPTION", $orderAttributeCombination->getAttributeAvDescription()) + ->set("ATTRIBUTE_AVAILABILITY_POSTSCRIPTUM", $orderAttributeCombination->getAttributeAvPostscriptum()) ; $loopResult->addRow($loopResultRow); } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/OrderStatus.php b/core/lib/Thelia/Core/Template/Loop/OrderStatus.php index 0f0d144c4..f45a1d99b 100755 --- a/core/lib/Thelia/Core/Template/Loop/OrderStatus.php +++ b/core/lib/Thelia/Core/Template/Loop/OrderStatus.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -42,9 +43,9 @@ use Thelia\Model\OrderStatusQuery; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class OrderStatus extends BaseI18nLoop +class OrderStatus extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -56,17 +57,12 @@ class OrderStatus extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = OrderStatusQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -74,16 +70,17 @@ class OrderStatus extends BaseI18nLoop $search->filterById($id, Criteria::IN); } - /* perform search */ - $orderStatusList = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($orderStatusList); + } - foreach ($orderStatusList as $orderStatus) { - $loopResultRow = new LoopResultRow($loopResult, $orderStatus, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $orderStatus) { + $loopResultRow = new LoopResultRow($orderStatus); $loopResultRow->set("ID", $orderStatus->getId()) ->set("IS_TRANSLATED",$orderStatus->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$locale) + ->set("LOCALE",$this->locale) ->set("CODE", $orderStatus->getCode()) ->set("TITLE", $orderStatus->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $orderStatus->getVirtualColumn('i18n_CHAPO')) @@ -95,5 +92,6 @@ class OrderStatus extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Payment.php b/core/lib/Thelia/Core/Template/Loop/Payment.php index ca0aaa18f..0fde890a9 100644 --- a/core/lib/Thelia/Core/Template/Loop/Payment.php +++ b/core/lib/Thelia/Core/Template/Loop/Payment.php @@ -22,9 +22,9 @@ /*************************************************************************************/ namespace Thelia\Core\Template\Loop; -use Propel\Runtime\ActiveQuery\Criteria; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Module\BaseModule; /** @@ -32,7 +32,7 @@ use Thelia\Module\BaseModule; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Payment extends BaseSpecificModule +class Payment extends BaseSpecificModule implements PropelSearchLoopInterface { public function getArgDefinitions() @@ -42,21 +42,10 @@ class Payment extends BaseSpecificModule return $collection; } - public function exec(&$pagination) + public function parseResults(LoopResult $loopResult) { - $search = parent::exec($pagination); - /* manage translations */ - $locale = $this->configureI18nProcessing($search); - - $search->filterByType(BaseModule::PAYMENT_MODULE_TYPE, Criteria::EQUAL); - - /* perform search */ - $paymentModules = $this->search($search, $pagination); - - $loopResult = new LoopResult($paymentModules); - - foreach ($paymentModules as $paymentModule) { - $loopResultRow = new LoopResultRow($loopResult, $paymentModule, $this->versionable, $this->timestampable, $this->countable); + foreach ($loopResult->getResultDataCollection() as $paymentModule) { + $loopResultRow = new LoopResultRow($paymentModule); $moduleReflection = new \ReflectionClass($paymentModule->getFullNamespace()); if ($moduleReflection->isSubclassOf("Thelia\Module\PaymentModuleInterface") === false) { @@ -80,4 +69,9 @@ class Payment extends BaseSpecificModule return $loopResult; } + + protected function getModuleType() + { + return BaseModule::PAYMENT_MODULE_TYPE; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Product.php b/core/lib/Thelia/Core/Template/Loop/Product.php index 5ddc6da10..09aff4479 100755 --- a/core/lib/Thelia/Core/Template/Loop/Product.php +++ b/core/lib/Thelia/Core/Template/Loop/Product.php @@ -29,6 +29,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Element\SearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -52,10 +53,10 @@ use Thelia\Type; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Product extends BaseI18nLoop implements SearchLoopInterface +class Product extends BaseI18nLoop implements PropelSearchLoopInterface, SearchLoopInterface { - public $timestampable = true; - public $versionable = true; + protected $timestampable = true; + protected $versionable = true; /** * @return ArgumentCollection @@ -161,17 +162,11 @@ class Product extends BaseI18nLoop implements SearchLoopInterface } } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - * @throws \InvalidArgumentException - */ - public function exec(&$pagination) + public function buildModelCriteria() { $complex = $this->getComplex(); if (true === $complex) { - return $this->execComplex($pagination); + return $this->buildComplex(); } $currencyId = $this->getCurrency(); @@ -227,7 +222,7 @@ class Product extends BaseI18nLoop implements SearchLoopInterface } /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -459,16 +454,21 @@ class Product extends BaseI18nLoop implements SearchLoopInterface } } - /* perform search */ - $products = $this->search($search, $pagination); + return $search; + } - $loopResult = new LoopResult($products); + public function parseResults(LoopResult $loopResult) + { + $complex = $this->getComplex(); + if (true === $complex) { + return $this->parseComplex($loopResult); + } $taxCountry = CountryQuery::create()->findPk(64); // @TODO : make it magic - foreach ($products as $product) { + foreach ($loopResult->getResultDataCollection() as $product) { - $loopResultRow = new LoopResultRow($loopResult, $product, $this->versionable, $this->timestampable, $this->countable); + $loopResultRow = new LoopResultRow($product); $price = $product->getVirtualColumn('price'); try { @@ -512,12 +512,12 @@ class Product extends BaseI18nLoop implements SearchLoopInterface ->set("ID" , $product->getId()) ->set("REF" , $product->getRef()) ->set("IS_TRANSLATED" , $product->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE" , $locale) + ->set("LOCALE" , $this->locale) ->set("TITLE" , $product->getVirtualColumn('i18n_TITLE')) ->set("CHAPO" , $product->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION" , $product->getVirtualColumn('i18n_DESCRIPTION')) ->set("POSTSCRIPTUM" , $product->getVirtualColumn('i18n_POSTSCRIPTUM')) - ->set("URL" , $product->getUrl($locale)) + ->set("URL" , $product->getUrl($this->locale)) ->set("BEST_PRICE" , $product->getVirtualColumn('is_promo') ? $promoPrice : $price) ->set("BEST_PRICE_TAX" , $taxedPrice - $product->getVirtualColumn('is_promo') ? $taxedPromoPrice - $promoPrice : $taxedPrice - $price) ->set("BEST_TAXED_PRICE" , $product->getVirtualColumn('is_promo') ? $taxedPromoPrice : $taxedPrice) @@ -551,13 +551,7 @@ class Product extends BaseI18nLoop implements SearchLoopInterface return $loopResult; } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - * @throws \InvalidArgumentException - */ - public function execComplex(&$pagination) + public function buildComplex() { $currencyId = $this->getCurrency(); if (null !== $currencyId) { @@ -575,7 +569,7 @@ class Product extends BaseI18nLoop implements SearchLoopInterface $search = ProductQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $attributeNonStrictMatch = $this->getAttribute_non_strict_match(); $isPSELeftJoinList = array(); @@ -978,16 +972,18 @@ class Product extends BaseI18nLoop implements SearchLoopInterface } } - /* perform search */ - $products = $this->search($search, $pagination); + return $search; + } - $loopResult = new LoopResult($products); + public function parseComplex(LoopResult $results) + { + $loopResult = new LoopResult($results); $taxCountry = CountryQuery::create()->findPk(64); // @TODO : make it magic - foreach ($products as $product) { + foreach ($loopResult->getResultDataCollection() as $product) { - $loopResultRow = new LoopResultRow($loopResult, $product, $this->versionable, $this->timestampable, $this->countable); + $loopResultRow = new LoopResultRow($product); $price = $product->getRealLowestPrice(); @@ -1023,12 +1019,12 @@ class Product extends BaseI18nLoop implements SearchLoopInterface ->set("ID" , $product->getId()) ->set("REF" , $product->getRef()) ->set("IS_TRANSLATED" , $product->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE" , $locale) + ->set("LOCALE" , $this->locale) ->set("TITLE" , $product->getVirtualColumn('i18n_TITLE')) ->set("CHAPO" , $product->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION" , $product->getVirtualColumn('i18n_DESCRIPTION')) ->set("POSTSCRIPTUM" , $product->getVirtualColumn('i18n_POSTSCRIPTUM')) - ->set("URL" , $product->getUrl($locale)) + ->set("URL" , $product->getUrl($this->locale)) ->set("BEST_PRICE" , $price) ->set("BEST_PRICE_TAX" , $taxedPrice - $price) ->set("BEST_TAXED_PRICE" , $taxedPrice) diff --git a/core/lib/Thelia/Core/Template/Loop/ProductSaleElements.php b/core/lib/Thelia/Core/Template/Loop/ProductSaleElements.php index b48b0359e..da2929c70 100755 --- a/core/lib/Thelia/Core/Template/Loop/ProductSaleElements.php +++ b/core/lib/Thelia/Core/Template/Loop/ProductSaleElements.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -49,9 +50,9 @@ use Thelia\Type; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class ProductSaleElements extends BaseLoop +class ProductSaleElements extends BaseLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -77,13 +78,7 @@ class ProductSaleElements extends BaseLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - * @throws \InvalidArgumentException - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = ProductSaleElementsQuery::create(); @@ -144,14 +139,16 @@ class ProductSaleElements extends BaseLoop $search->groupById(); - $PSEValues = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($PSEValues); + } + public function parseResults(LoopResult $loopResult) + { $taxCountry = CountryQuery::create()->findPk(64); // @TODO : make it magic - foreach ($PSEValues as $PSEValue) { - $loopResultRow = new LoopResultRow($loopResult, $PSEValue, $this->versionable, $this->timestampable, $this->countable); + foreach ($loopResult->getResultDataCollection() as $PSEValue) { + $loopResultRow = new LoopResultRow($PSEValue); $price = $PSEValue->getPrice(); try { @@ -189,5 +186,6 @@ class ProductSaleElements extends BaseLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/ProductTemplate.php b/core/lib/Thelia/Core/Template/Loop/ProductTemplate.php index 175ff0f91..412532180 100644 --- a/core/lib/Thelia/Core/Template/Loop/ProductTemplate.php +++ b/core/lib/Thelia/Core/Template/Loop/ProductTemplate.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -42,9 +43,9 @@ use Thelia\Model\Base\TemplateQuery; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class ProductTemplate extends BaseI18nLoop +class ProductTemplate extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -57,12 +58,7 @@ class ProductTemplate extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = TemplateQuery::create(); @@ -71,7 +67,7 @@ class ProductTemplate extends BaseI18nLoop $lang = $this->getLang(); /* manage translations */ - $locale = $this->configureI18nProcessing($search, $columns = array('NAME')); + $this->configureI18nProcessing($search, $columns = array('NAME')); $id = $this->getId(); @@ -85,18 +81,19 @@ class ProductTemplate extends BaseI18nLoop $search->filterById($exclude, Criteria::NOT_IN); } - /* perform search */ - $templates = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($templates); + } - foreach ($templates as $template) { - $loopResultRow = new LoopResultRow($loopResult, $template, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $template) { + $loopResultRow = new LoopResultRow($template); $loopResultRow ->set("ID", $template->getId()) ->set("IS_TRANSLATED" , $template->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE" , $locale) + ->set("LOCALE" , $this->locale) ->set("NAME" , $template->getVirtualColumn('i18n_NAME')) ; @@ -104,5 +101,6 @@ class ProductTemplate extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Profile.php b/core/lib/Thelia/Core/Template/Loop/Profile.php index bb2e4a7b5..bddcf856c 100755 --- a/core/lib/Thelia/Core/Template/Loop/Profile.php +++ b/core/lib/Thelia/Core/Template/Loop/Profile.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -43,9 +44,9 @@ use Thelia\Type; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Profile extends BaseI18nLoop +class Profile extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -57,17 +58,12 @@ class Profile extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = ProfileQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $id = $this->getId(); @@ -77,16 +73,17 @@ class Profile extends BaseI18nLoop $search->orderById(Criteria::ASC); - /* perform search */ - $profiles = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($profiles); + } - foreach ($profiles as $profile) { - $loopResultRow = new LoopResultRow($loopResult, $profile, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $profile) { + $loopResultRow = new LoopResultRow($profile); $loopResultRow->set("ID", $profile->getId()) ->set("IS_TRANSLATED",$profile->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$locale) + ->set("LOCALE",$this->locale) ->set("CODE",$profile->getCode()) ->set("TITLE",$profile->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $profile->getVirtualColumn('i18n_CHAPO')) diff --git a/core/lib/Thelia/Core/Template/Loop/Resource.php b/core/lib/Thelia/Core/Template/Loop/Resource.php index 41400dc65..d1975d73f 100755 --- a/core/lib/Thelia/Core/Template/Loop/Resource.php +++ b/core/lib/Thelia/Core/Template/Loop/Resource.php @@ -29,6 +29,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -44,9 +45,9 @@ use Thelia\Type; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Resource extends BaseI18nLoop +class Resource extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -64,17 +65,12 @@ class Resource extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = ResourceQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search); $profile = $this->getProfile(); @@ -92,16 +88,17 @@ class Resource extends BaseI18nLoop $search->orderById(Criteria::ASC); - /* perform search */ - $resources = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($resources); + } - foreach ($resources as $resource) { - $loopResultRow = new LoopResultRow($loopResult, $resource, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $resource) { + $loopResultRow = new LoopResultRow($resource); $loopResultRow->set("ID", $resource->getId()) ->set("IS_TRANSLATED",$resource->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$locale) + ->set("LOCALE",$this->locale) ->set("CODE",$resource->getCode()) ->set("TITLE",$resource->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $resource->getVirtualColumn('i18n_CHAPO')) @@ -109,7 +106,7 @@ class Resource extends BaseI18nLoop ->set("POSTSCRIPTUM", $resource->getVirtualColumn('i18n_POSTSCRIPTUM')) ; - if (null !== $profile) { + if (null !== $this->getProfile()) { $accessValue = $resource->getVirtualColumn('access'); $manager = new AccessManager($accessValue); @@ -123,5 +120,6 @@ class Resource extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Tax.php b/core/lib/Thelia/Core/Template/Loop/Tax.php index e97b9c7d5..bc57f5593 100644 --- a/core/lib/Thelia/Core/Template/Loop/Tax.php +++ b/core/lib/Thelia/Core/Template/Loop/Tax.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -45,9 +46,9 @@ use Thelia\Model\TaxQuery; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Tax extends BaseI18nLoop +class Tax extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -70,17 +71,12 @@ class Tax extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = TaxQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search, array('TITLE', 'DESCRIPTION')); + $this->configureI18nProcessing($search, array('TITLE', 'DESCRIPTION')); $id = $this->getId(); @@ -142,21 +138,21 @@ class Tax extends BaseI18nLoop } } - /* perform search */ - $taxes = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($taxes); + } - foreach ($taxes as $tax) { - - $loopResultRow = new LoopResultRow($loopResult, $tax, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $tax) { + $loopResultRow = new LoopResultRow($tax); $loopResultRow ->set("ID" , $tax->getId()) ->set("TYPE" , $tax->getType()) ->set("REQUIREMENTS" , $tax->getRequirements()) ->set("IS_TRANSLATED" , $tax->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE" , $locale) + ->set("LOCALE" , $this->locale) ->set("TITLE" , $tax->getVirtualColumn('i18n_TITLE')) ->set("DESCRIPTION" , $tax->getVirtualColumn('i18n_DESCRIPTION')) ; @@ -165,5 +161,6 @@ class Tax extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/TaxRule.php b/core/lib/Thelia/Core/Template/Loop/TaxRule.php index e1c30d177..be90cc5ac 100644 --- a/core/lib/Thelia/Core/Template/Loop/TaxRule.php +++ b/core/lib/Thelia/Core/Template/Loop/TaxRule.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -44,9 +45,9 @@ use Thelia\Model\TaxRuleQuery; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class TaxRule extends BaseI18nLoop +class TaxRule extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -66,17 +67,12 @@ class TaxRule extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = TaxRuleQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search, array('TITLE', 'DESCRIPTION')); + $this->configureI18nProcessing($search, array('TITLE', 'DESCRIPTION')); $id = $this->getId(); @@ -109,27 +105,28 @@ class TaxRule extends BaseI18nLoop } } - /* perform search */ - $tax_rules = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($tax_rules); + } - foreach ($tax_rules as $tax_rule) { - - $loopResultRow = new LoopResultRow($loopResult, $tax_rule, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $taxRule) { + $loopResultRow = new LoopResultRow($taxRule); $loopResultRow - ->set("ID" , $tax_rule->getId()) - ->set("IS_TRANSLATED" , $tax_rule->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE" , $locale) - ->set("TITLE" , $tax_rule->getVirtualColumn('i18n_TITLE')) - ->set("DESCRIPTION" , $tax_rule->getVirtualColumn('i18n_DESCRIPTION')) - ->set("IS_DEFAULT" , $tax_rule->getIsDefault() ? '1' : '0') + ->set("ID" , $taxRule->getId()) + ->set("IS_TRANSLATED" , $taxRule->getVirtualColumn('IS_TRANSLATED')) + ->set("LOCALE" , $this->locale) + ->set("TITLE" , $taxRule->getVirtualColumn('i18n_TITLE')) + ->set("DESCRIPTION" , $taxRule->getVirtualColumn('i18n_DESCRIPTION')) + ->set("IS_DEFAULT" , $taxRule->getIsDefault() ? '1' : '0') ; $loopResult->addRow($loopResultRow); } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/TaxRuleCountry.php b/core/lib/Thelia/Core/Template/Loop/TaxRuleCountry.php index 83539fef6..0c32a51df 100644 --- a/core/lib/Thelia/Core/Template/Loop/TaxRuleCountry.php +++ b/core/lib/Thelia/Core/Template/Loop/TaxRuleCountry.php @@ -29,6 +29,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -49,9 +50,11 @@ use Thelia\Model\TaxRuleCountryQuery; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class TaxRuleCountry extends BaseI18nLoop +class TaxRuleCountry extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $taxCountForOriginCountry; + + protected $timestampable = true; /** * @return ArgumentCollection @@ -71,12 +74,7 @@ class TaxRuleCountry extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = TaxRuleCountryQuery::create(); @@ -86,9 +84,9 @@ class TaxRuleCountry extends BaseI18nLoop $taxRule = $this->getTax_rule(); if ($ask === 'countries') { - $taxCountForOriginCountry = TaxRuleCountryQuery::create()->filterByCountryId($country)->count(); + $this->taxCountForOriginCountry = TaxRuleCountryQuery::create()->filterByCountryId($country)->count(); - if ($taxCountForOriginCountry > 0) { + if ($this->taxCountForOriginCountry > 0) { $search->groupByCountryId(); $originalCountryJoin = new Join(); @@ -101,7 +99,7 @@ class TaxRuleCountry extends BaseI18nLoop $search->addJoinObject($originalCountryJoin, 's_to_o'); $search->where('`origin`.`COUNTRY_ID`' . Criteria::EQUAL . '?', $country, \PDO::PARAM_INT); - $search->having('COUNT(*)=?', $taxCountForOriginCountry, \PDO::PARAM_INT); + $search->having('COUNT(*)=?', $this->taxCountForOriginCountry, \PDO::PARAM_INT); $search->filterByTaxRuleId($taxRule); @@ -142,17 +140,17 @@ class TaxRuleCountry extends BaseI18nLoop $search->orderByPosition(Criteria::ASC); } - /* perform search */ - $taxRuleCountries = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($taxRuleCountries); + } - foreach ($taxRuleCountries as $taxRuleCountry) { + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $taxRuleCountry) { + $loopResultRow = new LoopResultRow($taxRuleCountry); - $loopResultRow = new LoopResultRow($loopResult, $taxRuleCountry, $this->versionable, $this->timestampable, $this->countable); - - if ($ask === 'countries') { - if ($taxCountForOriginCountry > 0) { + if ($this->getAsk() === 'countries') { + if ($this->taxCountForOriginCountry > 0) { $loopResultRow ->set("COUNTRY" , $taxRuleCountry->getCountryId()) ->set("COUNTRY_TITLE" , $taxRuleCountry->getVirtualColumn(CountryTableMap::TABLE_NAME . '_i18n_TITLE')) @@ -167,7 +165,7 @@ class TaxRuleCountry extends BaseI18nLoop ->set("COUNTRY_DESCRIPTION" , $taxRuleCountry->getVirtualColumn('i18n_DESCRIPTION')) ->set("COUNTRY_POSTSCRIPTUM" , $taxRuleCountry->getVirtualColumn('i18n_POSTSCRIPTUM')); } - } elseif ($ask === 'taxes') { + } elseif ($this->getAsk() === 'taxes') { $loopResultRow ->set("TAX_RULE" , $taxRuleCountry->getTaxRuleId()) ->set("COUNTRY" , $taxRuleCountry->getCountryId()) @@ -182,5 +180,6 @@ class TaxRuleCountry extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Template.php b/core/lib/Thelia/Core/Template/Loop/Template.php index 83ef4fabe..235907116 100644 --- a/core/lib/Thelia/Core/Template/Loop/Template.php +++ b/core/lib/Thelia/Core/Template/Loop/Template.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -42,9 +43,9 @@ use Thelia\Model\Base\TemplateQuery; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Template extends BaseI18nLoop +class Template extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -57,12 +58,7 @@ class Template extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = TemplateQuery::create(); @@ -71,7 +67,7 @@ class Template extends BaseI18nLoop $lang = $this->getLang(); /* manage translations */ - $locale = $this->configureI18nProcessing($search, $columns = array('NAME')); + $this->configureI18nProcessing($search, $columns = array('NAME')); $id = $this->getId(); @@ -85,18 +81,19 @@ class Template extends BaseI18nLoop $search->filterById($exclude, Criteria::NOT_IN); } - /* perform search */ - $templates = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($templates); + } - foreach ($templates as $template) { - $loopResultRow = new LoopResultRow($loopResult, $template, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $template) { + $loopResultRow = new LoopResultRow($template); $loopResultRow ->set("ID", $template->getId()) ->set("IS_TRANSLATED" , $template->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE" , $locale) + ->set("LOCALE" , $this->locale) ->set("NAME" , $template->getVirtualColumn('i18n_NAME')) ; @@ -104,5 +101,6 @@ class Template extends BaseI18nLoop } return $loopResult; + } } diff --git a/core/lib/Thelia/Core/Template/Loop/Title.php b/core/lib/Thelia/Core/Template/Loop/Title.php index 3cd59d665..51d482892 100755 --- a/core/lib/Thelia/Core/Template/Loop/Title.php +++ b/core/lib/Thelia/Core/Template/Loop/Title.php @@ -28,6 +28,7 @@ use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; @@ -42,9 +43,9 @@ use Thelia\Model\CustomerTitleQuery; * @package Thelia\Core\Template\Loop * @author Etienne Roudeix */ -class Title extends BaseI18nLoop +class Title extends BaseI18nLoop implements PropelSearchLoopInterface { - public $timestampable = true; + protected $timestampable = true; /** * @return ArgumentCollection @@ -56,17 +57,12 @@ class Title extends BaseI18nLoop ); } - /** - * @param $pagination - * - * @return \Thelia\Core\Template\Element\LoopResult - */ - public function exec(&$pagination) + public function buildModelCriteria() { $search = CustomerTitleQuery::create(); /* manage translations */ - $locale = $this->configureI18nProcessing($search, array('SHORT', 'LONG')); + $this->configureI18nProcessing($search, array('SHORT', 'LONG')); $id = $this->getId(); @@ -76,16 +72,17 @@ class Title extends BaseI18nLoop $search->orderByPosition(); - /* perform search */ - $titles = $this->search($search, $pagination); + return $search; - $loopResult = new LoopResult($titles); + } - foreach ($titles as $title) { - $loopResultRow = new LoopResultRow($loopResult, $title, $this->versionable, $this->timestampable, $this->countable); + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $title) { + $loopResultRow = new LoopResultRow($title); $loopResultRow->set("ID", $title->getId()) ->set("IS_TRANSLATED",$title->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$locale) + ->set("LOCALE",$this->locale) ->set("DEFAULT", $title->getByDefault()) ->set("SHORT", $title->getVirtualColumn('i18n_SHORT')) ->set("LONG", $title->getVirtualColumn('i18n_LONG')) @@ -95,5 +92,6 @@ class Title extends BaseI18nLoop } return $loopResult; + } } From b9babff0707981b0aef232bd7307a1b646bc7720 Mon Sep 17 00:00:00 2001 From: Etienne Roudeix Date: Wed, 6 Nov 2013 10:28:29 +0100 Subject: [PATCH 2/9] comment --- .../Thelia/Core/Template/Element/ArraySearchLoopInterface.php | 2 ++ .../Thelia/Core/Template/Element/PropelSearchLoopInterface.php | 2 ++ 2 files changed, 4 insertions(+) diff --git a/core/lib/Thelia/Core/Template/Element/ArraySearchLoopInterface.php b/core/lib/Thelia/Core/Template/Element/ArraySearchLoopInterface.php index f8875194e..f33b8505e 100644 --- a/core/lib/Thelia/Core/Template/Element/ArraySearchLoopInterface.php +++ b/core/lib/Thelia/Core/Template/Element/ArraySearchLoopInterface.php @@ -30,6 +30,8 @@ namespace Thelia\Core\Template\Element; interface ArraySearchLoopInterface { /** + * this method returns an array + * * @return array */ public function buildArray(); diff --git a/core/lib/Thelia/Core/Template/Element/PropelSearchLoopInterface.php b/core/lib/Thelia/Core/Template/Element/PropelSearchLoopInterface.php index c6473346a..7bcb5614c 100644 --- a/core/lib/Thelia/Core/Template/Element/PropelSearchLoopInterface.php +++ b/core/lib/Thelia/Core/Template/Element/PropelSearchLoopInterface.php @@ -30,6 +30,8 @@ namespace Thelia\Core\Template\Element; interface PropelSearchLoopInterface { /** + * this method returns a Propel ModelCriteria + * * @return \Propel\Runtime\ActiveQuery\ModelCriteria */ public function buildModelCriteria(); From 48502e04e486f8e39774f53cfbb8a718ede73f4f Mon Sep 17 00:00:00 2001 From: Etienne Roudeix Date: Wed, 6 Nov 2013 10:42:34 +0100 Subject: [PATCH 3/9] phpdoc --- core/lib/Thelia/Core/Template/Element/BaseLoop.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/lib/Thelia/Core/Template/Element/BaseLoop.php b/core/lib/Thelia/Core/Template/Element/BaseLoop.php index 7344843ed..6d4e6ed92 100755 --- a/core/lib/Thelia/Core/Template/Element/BaseLoop.php +++ b/core/lib/Thelia/Core/Template/Element/BaseLoop.php @@ -410,6 +410,11 @@ abstract class BaseLoop } } + /** + * @param LoopResult $loopResult + * + * @return LoopResult + */ abstract public function parseResults(LoopResult $loopResult); /** From 361e4a9d748f656fff5e200e768ae01c6801341c Mon Sep 17 00:00:00 2001 From: Franck Allimant Date: Wed, 6 Nov 2013 10:49:03 +0100 Subject: [PATCH 4/9] Implementing translations (still in progress) --- core/lib/Thelia/Action/HttpException.php | 3 +- core/lib/Thelia/Action/Product.php | 38 ++- core/lib/Thelia/Config/Resources/loop.xml | 1 + .../Thelia/Config/Resources/routing/admin.xml | 10 + .../Controller/Admin/BaseAdminController.php | 3 +- .../Controller/Admin/OrderController.php | 3 +- .../Controller/Admin/ProductController.php | 1 + .../Admin/TranslationsController.php | 194 ++++++++++++++ .../Compiler/RegisterRouterPass.php | 14 +- .../Core/Security/Resource/AdminResources.php | 2 + .../Thelia/Core/Template/Loop/Template.php | 72 +++--- .../Smarty/Plugins/AdminUtilities.php | 3 +- .../Core/Template/Smarty/Plugins/Module.php | 2 +- .../Core/Template/Smarty/SmartyParser.php | 3 +- .../Core/Template/TemplateDefinition.php | 102 ++++++++ .../Thelia/Core/Template/TemplateHelper.php | 96 +++++++ core/lib/Thelia/Core/Thelia.php | 23 +- core/lib/Thelia/Model/ConfigQuery.php | 6 - core/lib/Thelia/Model/Map/ConfigTableMap.php | 2 +- core/lib/Thelia/Model/Module.php | 21 ++ install/insert.sql | 18 +- install/thelia.sql | 2 +- templates/admin/default/admin-logs.html | 171 +++++++------ templates/admin/default/configuration.html | 7 + templates/admin/default/customer-edit.html | 4 +- templates/admin/default/translations.html | 238 ++++++++++++++++++ templates/admin/default/variable-edit.html | 4 +- templates/pdf/default/I18n/en_US.php | 4 + templates/pdf/default/I18n/es_ES.php | 4 + templates/pdf/default/I18n/fr_FR.php | 4 + templates/pdf/default/I18n/it_IT.php | 4 + templates/pdf/{ => default}/delivery.html | 0 templates/pdf/{ => default}/invoice.html | 0 33 files changed, 890 insertions(+), 169 deletions(-) create mode 100644 core/lib/Thelia/Controller/Admin/TranslationsController.php create mode 100644 core/lib/Thelia/Core/Template/TemplateDefinition.php create mode 100644 core/lib/Thelia/Core/Template/TemplateHelper.php create mode 100644 templates/admin/default/translations.html create mode 100644 templates/pdf/default/I18n/en_US.php create mode 100644 templates/pdf/default/I18n/es_ES.php create mode 100644 templates/pdf/default/I18n/fr_FR.php create mode 100644 templates/pdf/default/I18n/it_IT.php rename templates/pdf/{ => default}/delivery.html (100%) rename templates/pdf/{ => default}/invoice.html (100%) diff --git a/core/lib/Thelia/Action/HttpException.php b/core/lib/Thelia/Action/HttpException.php index 10e0dad37..eff2f7586 100755 --- a/core/lib/Thelia/Action/HttpException.php +++ b/core/lib/Thelia/Action/HttpException.php @@ -30,6 +30,7 @@ use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\KernelEvents; use Thelia\Model\ConfigQuery; +use Thelia\Core\Template\TemplateHelper; /** * @@ -55,7 +56,7 @@ class HttpException extends BaseAction implements EventSubscriberInterface $parser = $this->container->get("thelia.parser"); // Define the template thant shoud be used - $parser->setTemplate(ConfigQuery::getActiveTemplate()); + $parser->setTemplate(TemplateHelper::getInstance()->getActiveFrontTemplate()->getPath()); //$event->getRequest()->attributes->set('_view', ConfigQuery::getPageNotFoundView()); diff --git a/core/lib/Thelia/Action/Product.php b/core/lib/Thelia/Action/Product.php index e56df6523..3917827d1 100644 --- a/core/lib/Thelia/Action/Product.php +++ b/core/lib/Thelia/Action/Product.php @@ -54,6 +54,8 @@ use Thelia\Core\Event\Product\ProductDeleteCategoryEvent; use Thelia\Core\Event\Product\ProductAddCategoryEvent; use Thelia\Core\Event\Product\ProductAddAccessoryEvent; use Thelia\Core\Event\Product\ProductDeleteAccessoryEvent; +use Thelia\Model\Map\ProductTableMap; +use Propel\Runtime\Propel; class Product extends BaseAction implements EventSubscriberInterface { @@ -257,21 +259,37 @@ class Product extends BaseAction implements EventSubscriberInterface public function setProductTemplate(ProductSetTemplateEvent $event) { - $product = $event->getProduct(); - // Delete all product feature relations - FeatureProductQuery::create()->filterByProduct($product)->delete(); + $con = Propel::getWriteConnection(ProductTableMap::DATABASE_NAME); - // Delete all product attributes sale elements - ProductSaleElementsQuery::create()->filterByProduct($product)->delete(); + $con->beginTransaction(); - // Update the product template - $template_id = $event->getTemplateId(); + try { - // Set it to null if it's zero. - if ($template_id <= 0) $template_id = NULL; + $product = $event->getProduct(); - $product->setTemplateId($template_id)->save(); + // Delete all product feature relations + FeatureProductQuery::create()->filterByProduct($product)->delete($con); + + // Delete all product attributes sale elements + ProductSaleElementsQuery::create()->filterByProduct($product)->delete($con); + + // Update the product template + $template_id = $event->getTemplateId(); + + // Set it to null if it's zero. + if ($template_id <= 0) $template_id = NULL; + + $product->setTemplateId($template_id)->save($con); + + // Store all the stuff ! + $con->commit(); + } catch (\Exception $ex) { + + $con->rollback(); + + throw $ex; + } } /** diff --git a/core/lib/Thelia/Config/Resources/loop.xml b/core/lib/Thelia/Config/Resources/loop.xml index bf5c9f7f9..c253b5fb4 100644 --- a/core/lib/Thelia/Config/Resources/loop.xml +++ b/core/lib/Thelia/Config/Resources/loop.xml @@ -49,6 +49,7 @@ + diff --git a/core/lib/Thelia/Config/Resources/routing/admin.xml b/core/lib/Thelia/Config/Resources/routing/admin.xml index 9fa7d1cbf..a966b2608 100755 --- a/core/lib/Thelia/Config/Resources/routing/admin.xml +++ b/core/lib/Thelia/Config/Resources/routing/admin.xml @@ -1040,6 +1040,16 @@ Thelia\Controller\Admin\LangController::deactivateDomainAction + + + + Thelia\Controller\Admin\TranslationsController::defaultAction + + + + Thelia\Controller\Admin\TranslationsController::updateAction + + diff --git a/core/lib/Thelia/Controller/Admin/BaseAdminController.php b/core/lib/Thelia/Controller/Admin/BaseAdminController.php index d34f2ce82..9eeedbbb7 100755 --- a/core/lib/Thelia/Controller/Admin/BaseAdminController.php +++ b/core/lib/Thelia/Controller/Admin/BaseAdminController.php @@ -43,6 +43,7 @@ use Symfony\Component\Routing\Router; use Thelia\Model\Admin; use Thelia\Core\Security\Token\CookieTokenProvider; use Thelia\Model\CurrencyQuery; +use Thelia\Core\Template\TemplateHelper; class BaseAdminController extends BaseController { @@ -199,7 +200,7 @@ class BaseAdminController extends BaseController $parser = $this->container->get("thelia.parser"); // Define the template thant shoud be used - $parser->setTemplate($template ?: ConfigQuery::read('base-admin-template', 'admin/default')); + $parser->setTemplate($template ?: TemplateHelper::getInstance()->getActiveAdminTemplate()->getPath()); return $parser; } diff --git a/core/lib/Thelia/Controller/Admin/OrderController.php b/core/lib/Thelia/Controller/Admin/OrderController.php index ff075b0e4..54dcc3059 100644 --- a/core/lib/Thelia/Controller/Admin/OrderController.php +++ b/core/lib/Thelia/Controller/Admin/OrderController.php @@ -36,6 +36,7 @@ use Thelia\Model\Base\OrderAddressQuery; use Thelia\Model\OrderQuery; use Thelia\Model\OrderStatusQuery; use Thelia\Tools\URL; +use Thelia\Core\Template\TemplateHelper; /** * Class OrderController @@ -218,7 +219,7 @@ class OrderController extends BaseAdminController array( 'order_id' => $order_id ), - ConfigQuery::read('pdf_template', 'pdf') + TemplateHelper::getInstance()->getActivePdfTemplate()->getPath() ); $order = OrderQuery::create()->findPk($order_id); diff --git a/core/lib/Thelia/Controller/Admin/ProductController.php b/core/lib/Thelia/Controller/Admin/ProductController.php index 1279dbff7..a711ada52 100644 --- a/core/lib/Thelia/Controller/Admin/ProductController.php +++ b/core/lib/Thelia/Controller/Admin/ProductController.php @@ -66,6 +66,7 @@ use Thelia\Model\Product; use Thelia\Model\CurrencyQuery; use Thelia\Form\ProductCombinationGenerationForm; use Thelia\Core\Event\Product\ProductCombinationGenerationEvent; +use Thelia\Core\Event\Product\ProductSetTemplateEvent; /** * Manages products diff --git a/core/lib/Thelia/Controller/Admin/TranslationsController.php b/core/lib/Thelia/Controller/Admin/TranslationsController.php new file mode 100644 index 000000000..1e6ba421c --- /dev/null +++ b/core/lib/Thelia/Controller/Admin/TranslationsController.php @@ -0,0 +1,194 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Controller\Admin; + + +use Thelia\Core\Security\Resource\AdminResources; +use Thelia\Core\Security\AccessManager; +use Thelia\Form\SystemLogConfigurationForm; +use Thelia\Log\Tlog; +use Thelia\Model\ConfigQuery; +use Thelia\Model\ModuleQuery; +use Thelia\Core\Template\TemplateHelper; +use Thelia\Core\Template\TemplateDefinition; +/** + * Class LangController + * @package Thelia\Controller\Admin + * @author Manuel Raynaud + */ +class TranslationsController extends BaseAdminController +{ + protected function renderTemplate() + { + + // Find modules + $modules = ModuleQuery::create()->joinI18n($this->getCurrentEditionLocale())->orderByPosition()->find(); + + TemplateHelper::getInstance()->getList(TemplateDefinition::BACK_OFFICE); + TemplateHelper::getInstance()->getList(TemplateDefinition::PDF); + TemplateHelper::getInstance()->getList(TemplateDefinition::FRONT_OFFICE); + + // Get related strings, if all input data are here + $item_to_translate = $this->getRequest()->get('item_to_translate'); + + $item_id = $this->getRequest()->get('item_id', ''); + + $all_strings = $translated_strings = array(); + + $template = $directory = $i18n_directory = false; + + if (! empty($item_id)) { + + switch($item_to_translate) { + + case 'mo' : + if (null !== $module = ModuleQuery::create()->findPk($item_id)) { + $directory = THELIA_MODULE_DIR . $module->getBaseDir(); + $i18n_directory = THELIA_TEMPLATE_DIR . $template->getI18nPath(); + } + break; + + case 'fo' : + $template = new TemplateDefinition($item_id, TemplateDefinition::FRONT_OFFICE); + break; + + case 'bo' : + $template = new TemplateDefinition($item_id, TemplateDefinition::BACK_OFFICE); + break; + + case 'pf' : + $template = new TemplateDefinition($item_id, TemplateDefinition::PDF); + break; + } + + if ($template) { + $directory = THELIA_TEMPLATE_DIR . $template->getPath(); + $i18n_directory = THELIA_TEMPLATE_DIR . $template->getI18nPath(); + } + + if ($directory) { + + // Load strings + $this->walkDir($directory, $all_strings); + + // Load translated strings + if ($i18n_directory) { + $locale = $this->getCurrentEditionLocale(); + } + } + } + + return $this->render('translations', array( + 'item_to_translate' => $item_to_translate, + 'item_id' => $item_id, + 'all_strings' => $all_strings, + 'translated_strings' => $translated_strings, + 'view_missing_traductions_only' => $this->getRequest()->get('view_missing_traductions_only', 0) + )); + } + + public function defaultAction() + { + if (null !== $response = $this->checkAuth(AdminResources::TRANSLATIONS, AccessManager::VIEW)) return $response; + + return $this->renderTemplate(); + } + + public function updateAction() + { + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::UPDATE)) return $response; + + return $this->renderTemplate(); + } + + protected function normalize_path($path) + { + $path = + str_replace( + str_replace('\\', '/', THELIA_ROOT), + '', + str_replace('\\', '/', realpath($path)) + ); + + if ($path[0] == '/') $path = substr($path, 1); + + return $path; + } + + protected function walkDir($directory, &$strings) { + try { + //echo "walking in $directory
"; + + foreach (new \DirectoryIterator($directory) as $fileInfo) { + + if ($fileInfo->isDot()) continue; + + if ($fileInfo->isDir()) $this->walkDir($fileInfo->getPathName(), $strings); + + if ($fileInfo->isFile()) { + + $ext = $fileInfo->getExtension(); + + if ($ext == 'html' || $ext == 'tpl' || $ext == 'xml') { + + if ($content = file_get_contents($fileInfo->getPathName())) { + + $short_path = $this->normalize_path($fileInfo->getPathName()); + + // echo " examining $short_path\n"; + + $matches = array(); + + if (preg_match_all('/{intl[\s]l=((? array($short_path), + 'chaine' => $match, + 'dollar' => strstr($match, '$') !== false); + } + } + } + } + } + } + } catch (\UnexpectedValueException $ex) { + echo $ex; + } + } + +} diff --git a/core/lib/Thelia/Core/DependencyInjection/Compiler/RegisterRouterPass.php b/core/lib/Thelia/Core/DependencyInjection/Compiler/RegisterRouterPass.php index 8fb086403..f92b7bf3d 100755 --- a/core/lib/Thelia/Core/DependencyInjection/Compiler/RegisterRouterPass.php +++ b/core/lib/Thelia/Core/DependencyInjection/Compiler/RegisterRouterPass.php @@ -67,26 +67,26 @@ class RegisterRouterPass implements CompilerPassInterface $modules = \Thelia\Model\ModuleQuery::getActivated(); foreach ($modules as $module) { - $moduleCode = ucfirst($module->getCode()); - if (file_exists(THELIA_MODULE_DIR . "/" . $moduleCode . "/Config/routing.xml")) { + $moduleBaseDir = $module->getBaseDir(); + if (file_exists(THELIA_MODULE_DIR . "/" . $moduleBaseDir . "/Config/routing.xml")) { $definition = new Definition( $container->getParameter("router.class"), array( new Reference("router.module.xmlLoader"), - ucfirst($module->getCode()) . "/Config/routing.xml", + $moduleBaseDir . "/Config/routing.xml", array( "cache_dir" => $container->getParameter("kernel.cache_dir"), "debug" => $container->getParameter("kernel.debug"), - "matcher_cache_class" => $container::camelize("ProjectUrlMatcher".$moduleCode), - "generator_cache_class" => $container::camelize("ProjectUrlGenerator".$moduleCode), + "matcher_cache_class" => $container::camelize("ProjectUrlMatcher".$moduleBaseDir), + "generator_cache_class" => $container::camelize("ProjectUrlGenerator".$moduleBaseDir), ), new Reference("request.context") ) ); - $container->setDefinition("router.".$moduleCode, $definition); + $container->setDefinition("router.".$moduleBaseDir, $definition); - $chainRouter->addMethodCall("add", array(new Reference("router.".$moduleCode), 150)); + $chainRouter->addMethodCall("add", array(new Reference("router.".$moduleBaseDir), 150)); } } } diff --git a/core/lib/Thelia/Core/Security/Resource/AdminResources.php b/core/lib/Thelia/Core/Security/Resource/AdminResources.php index 295de1fe8..834c2c628 100644 --- a/core/lib/Thelia/Core/Security/Resource/AdminResources.php +++ b/core/lib/Thelia/Core/Security/Resource/AdminResources.php @@ -99,4 +99,6 @@ final class AdminResources const TEMPLATE = "admin.configuration.template"; const SYSTEM_LOG = "admin.configuration.system-log"; + + const TRANSLATIONS = "admin.configuration.translations"; } diff --git a/core/lib/Thelia/Core/Template/Loop/Template.php b/core/lib/Thelia/Core/Template/Loop/Template.php index 83ef4fabe..b53c4d816 100644 --- a/core/lib/Thelia/Core/Template/Loop/Template.php +++ b/core/lib/Thelia/Core/Template/Loop/Template.php @@ -24,6 +24,7 @@ namespace Thelia\Core\Template\Loop; use Propel\Runtime\ActiveQuery\Criteria; +use Thelia\Core\Security\AccessManager; use Thelia\Core\Template\Element\BaseI18nLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; @@ -31,29 +32,39 @@ use Thelia\Core\Template\Element\LoopResultRow; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; -use Thelia\Model\Base\TemplateQuery; +use Thelia\Model\ModuleQuery; + +use Thelia\Module\BaseModule; +use Thelia\Type; +use Thelia\Core\Template\TemplateHelper; +use Thelia\Core\Template\TemplateDefinition; /** * - * Template loop + * Template loop, to get available back-office or front-office templates. * - * - * Class Template * @package Thelia\Core\Template\Loop - * @author Etienne Roudeix + * + * @author Franck Allimant */ class Template extends BaseI18nLoop { - public $timestampable = true; - /** * @return ArgumentCollection */ protected function getArgDefinitions() { return new ArgumentCollection( - Argument::createIntListTypeArgument('id'), - Argument::createIntListTypeArgument('exclude') + new Argument( + 'template_type', + new Type\TypeCollection( + new Type\EnumListType(array( + 'front-office', + 'back-office', + 'pdf' + )) + ) + ) ); } @@ -64,40 +75,27 @@ class Template extends BaseI18nLoop */ public function exec(&$pagination) { - $search = TemplateQuery::create(); + $type = $this->getArg(template_type); - $backendContext = $this->getBackend_context(); + if ($type == 'front-office') + $templateType = TemplateDefinition::FRONT_OFFICE; + else if ($type == 'back-office') + $templateType = TemplateDefinition::BACK_OFFICE; + else if ($type == 'pdf') + $templateType = TemplateDefinition::PDF; - $lang = $this->getLang(); + $templates = TemplateHelper::getInstance()->getList($templateType); - /* manage translations */ - $locale = $this->configureI18nProcessing($search, $columns = array('NAME')); - - $id = $this->getId(); - - if (null !== $id) { - $search->filterById($id, Criteria::IN); - } - - $exclude = $this->getExclude(); - - if (null !== $exclude) { - $search->filterById($exclude, Criteria::NOT_IN); - } - - /* perform search */ - $templates = $this->search($search, $pagination); - - $loopResult = new LoopResult($templates); + $loopResult = new LoopResult(); foreach ($templates as $template) { - $loopResultRow = new LoopResultRow($loopResult, $template, $this->versionable, $this->timestampable, $this->countable); + + $loopResultRow = new LoopResultRow($loopResult); $loopResultRow - ->set("ID", $template->getId()) - ->set("IS_TRANSLATED" , $template->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE" , $locale) - ->set("NAME" , $template->getVirtualColumn('i18n_NAME')) + ->set("NAME" , $template->getName()) + ->set("RELATIVE_PATH" , $template->getPath()) + ->set("ABSOLUTE_PATH" , THELIA_TEMPLATE_DIR . $template->getPath()) ; $loopResult->addRow($loopResultRow); @@ -105,4 +103,4 @@ class Template extends BaseI18nLoop return $loopResult; } -} +} \ No newline at end of file diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/AdminUtilities.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/AdminUtilities.php index 3b432cea9..0be66997a 100644 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/AdminUtilities.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/AdminUtilities.php @@ -29,6 +29,7 @@ use Thelia\Tools\URL; use Thelia\Core\Security\SecurityContext; use Thelia\Model\Config; use Thelia\Model\ConfigQuery; +use Thelia\Core\Template\TemplateHelper; /** * This class implements variour admin template utilities @@ -50,7 +51,7 @@ class AdminUtilities extends AbstractSmartyPlugin $snippet_path = sprintf('%s/%s/%s.html', THELIA_TEMPLATE_DIR, - ConfigQuery::read('base-admin-template', 'admin/default'), + TemplateHelper::getInstance()->getActiveAdminTemplate()->getPath(), $templateName ); diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/Module.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/Module.php index 2dfbb08fc..39c525c16 100755 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/Module.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/Module.php @@ -48,7 +48,7 @@ class Module extends AbstractSmartyPlugin foreach ($modules as $module) { - $file = sprintf("%s/%s/AdminIncludes/%s.html", THELIA_MODULE_DIR, ucfirst($module->getCode()), $location); + $file = sprintf("%s/%s/AdminIncludes/%s.html", THELIA_MODULE_DIR, $module->getBaseDir(), $location); if (file_exists($file)) { $content .= file_get_contents($file); diff --git a/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php b/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php index 272f6787c..6b8e77d9e 100755 --- a/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php +++ b/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php @@ -14,6 +14,7 @@ use Thelia\Core\Template\Smarty\AbstractSmartyPlugin; use Thelia\Core\Template\Exception\ResourceNotFoundException; use Thelia\Core\Template\ParserContext; use Thelia\Model\ConfigQuery; +use Thelia\Core\Template\TemplateHelper; /** * @@ -62,7 +63,7 @@ class SmartyParser extends Smarty implements ParserInterface $this->setCompileDir($compile_dir); $this->setCacheDir($cache_dir); - $this->setTemplate($template ?: ConfigQuery::read('active-template', 'default')); + $this->setTemplate($template ?: TemplateHelper::getInstance()->getActiveFrontTemplate()->getPath()); $this->debugging = $debug; diff --git a/core/lib/Thelia/Core/Template/TemplateDefinition.php b/core/lib/Thelia/Core/Template/TemplateDefinition.php new file mode 100644 index 000000000..a88f46c75 --- /dev/null +++ b/core/lib/Thelia/Core/Template/TemplateDefinition.php @@ -0,0 +1,102 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Template; +use Thelia\Model\ConfigQuery; + +class TemplateDefinition +{ + const FRONT_OFFICE = 1; + const BACK_OFFICE = 2; + const PDF = 3; + + const BACK_OFFICE_SUBDIR = 'admin/'; + const PDF_SUBDIR = 'pdf/'; + + /** + * @var the template directory name (e.g. 'default') + */ + protected $name; + + /** + * @var the template directory full path + */ + protected $path; + + /** + * @var the template type (front, back, pdf) + */ + protected $type; + + + public function __construct($name, $type) + { + $this->name = $name; + $this->type = $type; + + if ($type == self::BACK_OFFICE) + $this->path = self::BACK_OFFICE_SUBDIR . $name; + else if ($type == self::PDF) + $this->path = self::PDF_SUBDIR . $name; + else + $this->path = $name; + } + + public function getName() + { + return $this->name; + } + + public function setName($name) + { + $this->name = $name; + return $this; + } + + public function getI18nPath() { + return $this->getPath() . DS . 'I18n'; + } + + public function getPath() + { + return $this->path; + } + + public function setPath($path) + { + $this->path = $path; + return $this; + } + + public function getType() + { + return $this->type; + } + + public function setType($type) + { + $this->type = $type; + return $this; + } + +} diff --git a/core/lib/Thelia/Core/Template/TemplateHelper.php b/core/lib/Thelia/Core/Template/TemplateHelper.php new file mode 100644 index 000000000..7ddbdf79a --- /dev/null +++ b/core/lib/Thelia/Core/Template/TemplateHelper.php @@ -0,0 +1,96 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Template; + +use Thelia\Model\ConfigQuery; + +class TemplateHelper +{ + /** + * This is a singleton + + */ + private static $instance = null; + + private function __construct() {} + + public static function getInstance() { + if (self::$instance == null) self::$instance = new TemplateHelper(); + + return self::$instance; + } + + public function getActivePdfTemplate() { + return new TemplateDefinition( + ConfigQuery::read('active-pdf-template', 'default'), + TemplateDefinition::PDF + ); + } + + public function getActiveAdminTemplate() { + return new TemplateDefinition( + ConfigQuery::read('active-admin-template', 'default'), + TemplateDefinition::BACK_OFFICE + ); + } + + public function getActiveFrontTemplate() { + return new TemplateDefinition( + ConfigQuery::read('active-admin-template', 'default'), + TemplateDefinition::FRONT_OFFICE + ); + } + + public function getList($templateType) { + + $list = $exclude = array(); + + if ($templateType == TemplateDefinition::BACK_OFFICE) { + $baseDir = THELIA_TEMPLATE_DIR.TemplateDefinition::BACK_OFFICE_SUBDIR; + } + else if ($templateType == TemplateDefinition::PDF) { + $baseDir = THELIA_TEMPLATE_DIR.TemplateDefinition::PDF_SUBDIR; + } + else { + $baseDir = THELIA_TEMPLATE_DIR; + + $exclude = array(TemplateDefinition::BACK_OFFICE_SUBDIR, TemplateDefinition::PDF_SUBDIR); + } + + // Every subdir of the basedir is supposed to be a template. + $di = new \DirectoryIterator($baseDir); + + foreach ($di as $file) { + // Ignore 'dot' elements + if ($file->isDot() || ! $file->isDir()) continue; + + // Ignore reserved directory names + if (in_array($file->getFilename()."/", $exclude)) continue; + + $list[] = new TemplateDefinition($file->getFilename(), $templateType); + } + + return $list; + } +} diff --git a/core/lib/Thelia/Core/Thelia.php b/core/lib/Thelia/Core/Thelia.php index fafe50171..50688b53b 100755 --- a/core/lib/Thelia/Core/Thelia.php +++ b/core/lib/Thelia/Core/Thelia.php @@ -52,6 +52,7 @@ use Symfony\Component\Config\FileLocator; use Propel\Runtime\Propel; use Propel\Runtime\Connection\ConnectionManagerSingle; +use Thelia\Core\Template\TemplateHelper; class Thelia extends Kernel { @@ -138,10 +139,10 @@ class Thelia extends Kernel $defintion ); - $loader = new XmlFileLoader($container, new FileLocator(THELIA_MODULE_DIR . "/" . ucfirst($module->getCode()) . "/Config")); + $loader = new XmlFileLoader($container, new FileLocator(THELIA_MODULE_DIR . $module->getConfigPath())); $loader->load("config.xml"); - if (is_dir($dir = THELIA_MODULE_DIR . "/" . ucfirst($module->getCode()) . "/I18n")) { + if (is_dir($dir = THELIA_MODULE_DIR . $module->getI18nPath())) { $dirs[] = $dir; } } catch (\InvalidArgumentException $e) { @@ -149,18 +150,22 @@ class Thelia extends Kernel } } - //Load translation from templates + // Load translation from templates //core translation - $dirs[] = THELIA_ROOT . "/core/lib/Thelia/Config/I18n"; + $dirs[] = THELIA_ROOT . "core/lib/Thelia/Config/I18n"; - //admin template - if(is_dir($dir = THELIA_TEMPLATE_DIR . '/admin/default/I18n')) { + // admin template + if (is_dir($dir = THELIA_TEMPLATE_DIR . TemplateHelper::getInstance()->getActiveAdminTemplate()->getI18nPath())) { $dirs[] = $dir; } - //front template - $template = ConfigQuery::getActiveTemplate(); - if(is_dir($dir = THELIA_TEMPLATE_DIR . $template . "/I18n")) { + // front template + if (is_dir($dir = THELIA_TEMPLATE_DIR . TemplateHelper::getInstance()->getActiveFrontTemplate()->getI18nPath())) { + $dirs[] = $dir; + } + + // PDF template + if (is_dir($dir = THELIA_TEMPLATE_DIR . TemplateHelper::getInstance()->getActivePdfTemplate()->getI18nPath())) { $dirs[] = $dir; } diff --git a/core/lib/Thelia/Model/ConfigQuery.php b/core/lib/Thelia/Model/ConfigQuery.php index 71ff253ea..e2f6a3975 100755 --- a/core/lib/Thelia/Model/ConfigQuery.php +++ b/core/lib/Thelia/Model/ConfigQuery.php @@ -82,12 +82,6 @@ class ConfigQuery extends BaseConfigQuery { return self::read('passed_url_view', 'passed-url'); } - - public static function getActiveTemplate() - { - return self::read('active-template', 'default'); - } - public static function useTaxFreeAmounts() { return self::read('use_tax_free_amounts', 'default') == 1; diff --git a/core/lib/Thelia/Model/Map/ConfigTableMap.php b/core/lib/Thelia/Model/Map/ConfigTableMap.php index ebd5d6edf..8208b56fe 100644 --- a/core/lib/Thelia/Model/Map/ConfigTableMap.php +++ b/core/lib/Thelia/Model/Map/ConfigTableMap.php @@ -166,7 +166,7 @@ class ConfigTableMap extends TableMap // columns $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); $this->addColumn('NAME', 'Name', 'VARCHAR', true, 255, null); - $this->addColumn('VALUE', 'Value', 'VARCHAR', true, 255, null); + $this->addColumn('VALUE', 'Value', 'LONGVARCHAR', true, null, null); $this->addColumn('SECURED', 'Secured', 'TINYINT', true, null, 1); $this->addColumn('HIDDEN', 'Hidden', 'TINYINT', true, null, 1); $this->addColumn('CREATED_AT', 'CreatedAt', 'TIMESTAMP', false, null, null); diff --git a/core/lib/Thelia/Model/Module.php b/core/lib/Thelia/Model/Module.php index c9ccd5f8d..d57df77fa 100755 --- a/core/lib/Thelia/Model/Module.php +++ b/core/lib/Thelia/Model/Module.php @@ -11,4 +11,25 @@ class Module extends BaseModule { { ModuleQuery::resetActivated(); } + + /** + * @return the module's base directory path, relative to THELIA_MODULE_DIR + */ + public function getBaseDir() { + return ucfirst($this->getCode()); + } + + /** + * @return the module's config directory path, relative to THELIA_MODULE_DIR + */ + public function getConfigPath() { + return $this->getBaseDir() . DS . "Config"; + } + + /** + * @return the module's i18N directory path, relative to THELIA_MODULE_DIR + */ + public function getI18nPath() { + return $this->getBaseDir() . DS . "I18n"; + } } diff --git a/install/insert.sql b/install/insert.sql index 7ceb6ce34..ea26fbd6f 100755 --- a/install/insert.sql +++ b/install/insert.sql @@ -8,7 +8,8 @@ INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updat ('session_config.default', '1', 1, 1, NOW(), NOW()), ('verifyStock', '1', 0, 0, NOW(), NOW()), ('active-template', 'default', 0, 0, NOW(), NOW()), -('base-admin-template', 'admin/default', 0, 0, NOW(), NOW()), +('active-admin-template', 'default', 0, 0, NOW(), NOW()), +('active-pdf-template', 'default', 0, 0, NOW(), NOW()), ('default_lang_without_translation', '1', 1, 1, NOW(), NOW()), ('rewriting_enable', '0', 0, 0, NOW(), NOW()), ('imagine_graphic_driver', 'gd', 0, 0, NOW(), NOW()), @@ -33,6 +34,8 @@ INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updat ('contact_email','', 0, 0, NOW(), NOW()), ('url_site','', 0, 0, NOW(), NOW()), ('one_domain_foreach_lang','0', 1, 1, NOW(), NOW()), +('pdf_invoice_file', 'invoice', 0, 0, NOW(), NOW()), +('pdf_delivery_file', 'delivery', 0, 0, NOW(), NOW()), ('thelia_version','2.0.0-beta1', 1, 1, NOW(), NOW()), ('thelia_major_version','2', 1, 1, NOW(), NOW()), ('thelia_minus_version','0', 1, 1, NOW(), NOW()), @@ -1207,7 +1210,7 @@ generated with command : php Thelia thelia:generate-resources --output sql */ INSERT INTO resource (`id`, `code`, `created_at`, `updated_at`) VALUES (1, 'admin.address', NOW(), NOW()), -(2, 'admin.configuration.admin', NOW(), NOW()), +(2, 'admin.configuration.administrator', NOW(), NOW()), (3, 'admin.configuration.area', NOW(), NOW()), (4, 'admin.configuration.attribute', NOW(), NOW()), (5, 'admin.category', NOW(), NOW()), @@ -1228,7 +1231,8 @@ INSERT INTO resource (`id`, `code`, `created_at`, `updated_at`) VALUES (20, 'admin.configuration.profile', NOW(), NOW()), (21, 'admin.configuration.shipping-zone', NOW(), NOW()), (22, 'admin.configuration.tax', NOW(), NOW()), -(23, 'admin.configuration.template', NOW(), NOW()); +(23, 'admin.configuration.template', NOW(), NOW()), +(24, 'admin.configuration.system-log', NOW(), NOW()); /** generated with command : php Thelia thelia:generate-resources --output sql-i18n @@ -1236,8 +1240,8 @@ generated with command : php Thelia thelia:generate-resources --output sql-i18n INSERT INTO resource_i18n (`id`, `locale`, `title`) VALUES (1, 'en_US', 'Address'), (1, 'fr_FR', 'Address'), -(2, 'en_US', 'Configuration / Admin'), -(2, 'fr_FR', 'Configuration / Admin'), +(2, 'en_US', 'Configuration / Administrator'), +(2, 'fr_FR', 'Configuration / Administrator'), (3, 'en_US', 'Configuration / Area'), (3, 'fr_FR', 'Configuration / Area'), (4, 'en_US', 'Configuration / Attribute'), @@ -1279,7 +1283,9 @@ INSERT INTO resource_i18n (`id`, `locale`, `title`) VALUES (22, 'en_US', 'Configuration / Tax'), (22, 'fr_FR', 'Configuration / Tax'), (23, 'en_US', 'Configuration / Template'), -(23, 'fr_FR', 'Configuration / Template'); +(23, 'fr_FR', 'Configuration / Template'), +(24, 'en_US', 'Configuration / System Log'), +(24, 'fr_FR', 'Configuration / Logs système'); INSERT INTO `message` (`id`, `name`, `secured`, `created_at`, `updated_at`, `version`, `version_created_at`, `version_created_by`) VALUES diff --git a/install/thelia.sql b/install/thelia.sql index b213c114f..ed27071fb 100755 --- a/install/thelia.sql +++ b/install/thelia.sql @@ -416,7 +416,7 @@ CREATE TABLE `config` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, - `value` VARCHAR(255) NOT NULL, + `value` TEXT NOT NULL, `secured` TINYINT DEFAULT 1 NOT NULL, `hidden` TINYINT DEFAULT 1 NOT NULL, `created_at` DATETIME, diff --git a/templates/admin/default/admin-logs.html b/templates/admin/default/admin-logs.html index 8f86729b7..74273a6c9 100755 --- a/templates/admin/default/admin-logs.html +++ b/templates/admin/default/admin-logs.html @@ -26,98 +26,106 @@
- +
-
-
- {intl l='Period'} : -
+
+
+
+ {intl l='Period'} : +
-
-
-
- {intl l='From'} - - - - -
-
-
-
- {intl l='To'} - - - - -
-
-
+
+
+
+ {intl l='From'} + + + + +
+
+
+
+ {intl l='To'} + + + + +
+
+
+
-
-
- {intl l='Administrators'} : -
+
+
+
+ {intl l='Administrators'} : +
-
- {loop type="admin" name="admin-list" backend_context="1"} - {if ($LOOP_COUNT-1)%4 == 0 AND $LOOP_COUNT != 0 AND $LOOP_COUNT != $LOOP_TOTAL} -
-
- {/if} -
- - -
- {/loop} -
+
+ {loop type="admin" name="admin-list" backend_context="1"} + {if ($LOOP_COUNT-1)%4 == 0 AND $LOOP_COUNT != 0 AND $LOOP_COUNT != $LOOP_TOTAL} +
+
+ {/if} +
+ + +
+ {/loop} +
+
+
+ +
+
+
+ {intl l='Resources'} : +
+ +
+ {loop type="resource" name="resources-list" backend_context="1"} + {if ($LOOP_COUNT-1)%4 == 0 AND $LOOP_COUNT != 0 AND $LOOP_COUNT != $LOOP_TOTAL} +
+
+ {/if} +
+ + +
+ {/loop} +
+ +
-
-
- {intl l='Resources'} : -
+
+
+
+ {intl l='Modules'} : +
-
- {loop type="resource" name="resources-list" backend_context="1"} - {if ($LOOP_COUNT-1)%4 == 0 AND $LOOP_COUNT != 0 AND $LOOP_COUNT != $LOOP_TOTAL} -
-
- {/if} -
- - -
- {/loop} -
- -
- -
-
- {intl l='Modules'} : -
- -
- {loop type="module" name="modules-list" backend_context="1"} - {if ($LOOP_COUNT-1)%4 == 0 AND $LOOP_COUNT != 0 AND $LOOP_COUNT != $LOOP_TOTAL} -
-
- {/if} -
- - -
- {/loop} -
+
+ {loop type="module" name="modules-list" backend_context="1"} + {if ($LOOP_COUNT-1)%4 == 0 AND $LOOP_COUNT != 0 AND $LOOP_COUNT != $LOOP_TOTAL} +
+
+ {/if} +
+ + +
+ {/loop} +
+
@@ -129,7 +137,6 @@
-
diff --git a/templates/admin/default/configuration.html b/templates/admin/default/configuration.html index 9f0cc4160..6b4428b1a 100644 --- a/templates/admin/default/configuration.html +++ b/templates/admin/default/configuration.html @@ -151,6 +151,13 @@ {/loop} + {loop type="auth" name="pcc5.1" role="ADMIN" resource="admin.configuration.translations" access="VIEW"} + + {intl l='Translations'} + + + {/loop} + {loop type="auth" name="pcc6" role="ADMIN" resource="admin.configuration.mailing-system" access="VIEW"} {intl l='Mailing system'} diff --git a/templates/admin/default/customer-edit.html b/templates/admin/default/customer-edit.html index 370fe11f3..954deceb3 100644 --- a/templates/admin/default/customer-edit.html +++ b/templates/admin/default/customer-edit.html @@ -23,7 +23,7 @@
- {intl l="Edit customer $FIRSTNAME $LASTNAME"} + {intl l="Edit customer %firstname %lastname" firstname=$FIRSTNAME lastname=$LASTNAME}
@@ -143,7 +143,7 @@

- +
diff --git a/templates/admin/default/translations.html b/templates/admin/default/translations.html new file mode 100644 index 000000000..946e68cdb --- /dev/null +++ b/templates/admin/default/translations.html @@ -0,0 +1,238 @@ +{extends file="admin-layout.tpl"} + +{block name="page-title"}{intl l='Translations'}{/block} + +{block name="check-resource"}admin.configuration.variable{/block} +{block name="check-access"}update{/block} + +{block name="main-content"} +
+ +
+ + + +
+
+
+ +
+ {intl l="Translation"} +
+ +
+
+
+
+ + {include + file = "includes/inner-form-toolbar.html" + close_url = {url path='/admin/configuration'} + } + +
+
+
+ + + +
+
+ + {if $item_to_translate == 'mo'} +
+
+ + + +
+
+ {else if $item_to_translate == 'fo'} +
+
+ + + +
+
+ {else if $item_to_translate == 'bo'} +
+
+ + + +
+
+ {else if $item_to_translate == 'pf'} +
+
+ + + +
+
+ {/if} + + +
+
+ + +
+
+
+
+ + {* -- STRINGS TO TRANSLATE --------------------------------------------- *} + + {$currfile = false} + {$untranslated = 0} + + {foreach $all_strings as $hash => $info} + + {if $view_missing_traductions_only != 1 || ! isset($translated_strings[$info.chaine]) || $translated_strings[$info.chaine]== ''} + + {* Create a liste of files names *} + + {if count($info.files) > 1} + {$label = {intl l='In pages:'}} + {capture name="banner" assign=file_names} +
    + {foreach $info.files as $file} +
  • {$file}
  • + {/foreach} +
+ {/capture} + {else} + {$label = {intl l='In page'}} + {$file_names = $info.files.0} + {/if} + + {* Display current file liste, if required *} + + {if $file_names != $currfile} + + {if $currfile !== false} + {* Close current panel *} +
+
+ {/if} + + {$currfile = $file_names} + +
+
+ {loop name="lang_list" type="lang" id=$edit_language_id} + {intl l=$TITLE} + {/loop} + + {$label} {$file_names nofilter} + +
+ + + + {/if} + + + + + + + {/if} + + {/foreach} + +
+ {$info.chaine} + + {if $info.dollar} + {intl l='Warning'} + {intl l='This string contains a Smarty variable, and cannot not be translated properly'} + {/if} + +
+ + +
+
+
{* panel *} + + +
+
+
+ + + + + +{/block} + +{block name="javascript-initialization"} + +{/block} diff --git a/templates/admin/default/variable-edit.html b/templates/admin/default/variable-edit.html index dfc572ec2..267ffb89e 100644 --- a/templates/admin/default/variable-edit.html +++ b/templates/admin/default/variable-edit.html @@ -16,7 +16,7 @@
  • {intl l="Home"}
  • {intl l="Configuration"}
  • {intl l="System variables"}
  • -
  • {intl l='Editing variable "%name"' name="{$NAME}"}
  • +
  • {intl l='Editing variable "%name"' name=$NAME}
  • @@ -24,7 +24,7 @@
    - {intl l="Edit variable $NAME"} + {intl l="Edit variable %name" name=$NAME}
    diff --git a/templates/pdf/default/I18n/en_US.php b/templates/pdf/default/I18n/en_US.php new file mode 100644 index 000000000..8f9845d30 --- /dev/null +++ b/templates/pdf/default/I18n/en_US.php @@ -0,0 +1,4 @@ + Date: Wed, 6 Nov 2013 11:07:31 +0100 Subject: [PATCH 5/9] fix tests --- core/lib/Thelia/Model/Map/ConfigTableMap.php | 2 +- core/lib/Thelia/Tests/Core/Template/Loop/CategoryTest.php | 7 +++++++ core/lib/Thelia/Tests/Core/Template/Loop/ContentTest.php | 7 +++++++ core/lib/Thelia/Tests/Core/Template/Loop/FolderTest.php | 7 +++++++ core/lib/Thelia/Tests/Core/Template/Loop/ProductTest.php | 7 +++++++ core/lib/Thelia/Tests/Core/Template/Loop/TaxRuleTest.php | 5 +++++ install/thelia.sql | 2 +- 7 files changed, 35 insertions(+), 2 deletions(-) diff --git a/core/lib/Thelia/Model/Map/ConfigTableMap.php b/core/lib/Thelia/Model/Map/ConfigTableMap.php index ebd5d6edf..8208b56fe 100644 --- a/core/lib/Thelia/Model/Map/ConfigTableMap.php +++ b/core/lib/Thelia/Model/Map/ConfigTableMap.php @@ -166,7 +166,7 @@ class ConfigTableMap extends TableMap // columns $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); $this->addColumn('NAME', 'Name', 'VARCHAR', true, 255, null); - $this->addColumn('VALUE', 'Value', 'VARCHAR', true, 255, null); + $this->addColumn('VALUE', 'Value', 'LONGVARCHAR', true, null, null); $this->addColumn('SECURED', 'Secured', 'TINYINT', true, null, 1); $this->addColumn('HIDDEN', 'Hidden', 'TINYINT', true, null, 1); $this->addColumn('CREATED_AT', 'CreatedAt', 'TIMESTAMP', false, null, null); diff --git a/core/lib/Thelia/Tests/Core/Template/Loop/CategoryTest.php b/core/lib/Thelia/Tests/Core/Template/Loop/CategoryTest.php index ce5f56747..c3fbe56d9 100755 --- a/core/lib/Thelia/Tests/Core/Template/Loop/CategoryTest.php +++ b/core/lib/Thelia/Tests/Core/Template/Loop/CategoryTest.php @@ -53,6 +53,13 @@ class CategoryTest extends BaseLoopTestor public function testSearchById() { $category = CategoryQuery::create()->findOne(); + if(null === $category) { + $category = new \Thelia\Model\Category(); + $category->setParent(0); + $category->setVisible(1); + $category->setTitle('foo'); + $category->save(); + } $this->baseTestSearchById($category->getId()); } diff --git a/core/lib/Thelia/Tests/Core/Template/Loop/ContentTest.php b/core/lib/Thelia/Tests/Core/Template/Loop/ContentTest.php index 3a286200a..dbb705b03 100755 --- a/core/lib/Thelia/Tests/Core/Template/Loop/ContentTest.php +++ b/core/lib/Thelia/Tests/Core/Template/Loop/ContentTest.php @@ -53,6 +53,13 @@ class ContentTest extends BaseLoopTestor public function testSearchById() { $content = ContentQuery::create()->findOne(); + if(null === $content) { + $content = new \Thelia\Model\Content(); + $content->setDefaultFolder(0); + $content->setVisible(1); + $content->setTitle('foo'); + $content->save(); + } $this->baseTestSearchById($content->getId()); } diff --git a/core/lib/Thelia/Tests/Core/Template/Loop/FolderTest.php b/core/lib/Thelia/Tests/Core/Template/Loop/FolderTest.php index 15ea3968c..a5210839e 100755 --- a/core/lib/Thelia/Tests/Core/Template/Loop/FolderTest.php +++ b/core/lib/Thelia/Tests/Core/Template/Loop/FolderTest.php @@ -53,6 +53,13 @@ class FolderTest extends BaseLoopTestor public function testSearchById() { $folder = FolderQuery::create()->findOne(); + if(null === $folder) { + $folder = new \Thelia\Model\Folder(); + $folder->setParent(0); + $folder->setVisible(1); + $folder->setTitle('foo'); + $folder->save(); + } $this->baseTestSearchById($folder->getId()); } diff --git a/core/lib/Thelia/Tests/Core/Template/Loop/ProductTest.php b/core/lib/Thelia/Tests/Core/Template/Loop/ProductTest.php index 07e179cbd..e806a6971 100755 --- a/core/lib/Thelia/Tests/Core/Template/Loop/ProductTest.php +++ b/core/lib/Thelia/Tests/Core/Template/Loop/ProductTest.php @@ -54,6 +54,13 @@ class ProductTest extends BaseLoopTestor public function testSearchById() { $product = ProductQuery::create()->orderById(Criteria::ASC)->findOne(); + if(null === $product) { + $product = new \Thelia\Model\Product(); + $product->setDefaultCategory(0); + $product->setVisible(1); + $product->setTitle('foo'); + $product->save(); + } $this->baseTestSearchById($product->getId()); } diff --git a/core/lib/Thelia/Tests/Core/Template/Loop/TaxRuleTest.php b/core/lib/Thelia/Tests/Core/Template/Loop/TaxRuleTest.php index fa24d72ee..7e2da4b26 100644 --- a/core/lib/Thelia/Tests/Core/Template/Loop/TaxRuleTest.php +++ b/core/lib/Thelia/Tests/Core/Template/Loop/TaxRuleTest.php @@ -53,6 +53,11 @@ class TaxRuleTest extends BaseLoopTestor public function testSearchById() { $tr = TaxRuleQuery::create()->findOne(); + if(null === $tr) { + $tr = new \Thelia\Model\TaxRule(); + $tr->setTitle('foo'); + $tr->save(); + } $this->baseTestSearchById($tr->getId(), array('force_return' => true)); } diff --git a/install/thelia.sql b/install/thelia.sql index b213c114f..ed27071fb 100755 --- a/install/thelia.sql +++ b/install/thelia.sql @@ -416,7 +416,7 @@ CREATE TABLE `config` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, - `value` VARCHAR(255) NOT NULL, + `value` TEXT NOT NULL, `secured` TINYINT DEFAULT 1 NOT NULL, `hidden` TINYINT DEFAULT 1 NOT NULL, `created_at` DATETIME, From 2d291cf5a06a5e89a87a93c51a189d56373c9206 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Wed, 6 Nov 2013 11:12:39 +0100 Subject: [PATCH 6/9] refactor how to assign template to parser --- .../lib/Thelia/Command/BaseModuleGenerate.php | 3 +- core/lib/Thelia/Config/Resources/config.xml | 1 - .../Controller/Admin/BaseAdminController.php | 2 +- .../Core/Template/Smarty/SmartyParser.php | 5 +- core/lib/Thelia/Core/Thelia.php | 54 ++++++++++++------- 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/core/lib/Thelia/Command/BaseModuleGenerate.php b/core/lib/Thelia/Command/BaseModuleGenerate.php index 7d487d4cc..b3286c874 100755 --- a/core/lib/Thelia/Command/BaseModuleGenerate.php +++ b/core/lib/Thelia/Command/BaseModuleGenerate.php @@ -42,7 +42,8 @@ abstract class BaseModuleGenerate extends ContainerAwareCommand 'Config', 'Model', 'Loop', - 'AdminIncludes' + 'AdminIncludes', + 'templates', ); protected function verifyExistingModule() diff --git a/core/lib/Thelia/Config/Resources/config.xml b/core/lib/Thelia/Config/Resources/config.xml index 198f9f999..5a3548a9c 100755 --- a/core/lib/Thelia/Config/Resources/config.xml +++ b/core/lib/Thelia/Config/Resources/config.xml @@ -50,7 +50,6 @@ - false %kernel.environment% %kernel.debug% diff --git a/core/lib/Thelia/Controller/Admin/BaseAdminController.php b/core/lib/Thelia/Controller/Admin/BaseAdminController.php index d34f2ce82..f820f4bf5 100755 --- a/core/lib/Thelia/Controller/Admin/BaseAdminController.php +++ b/core/lib/Thelia/Controller/Admin/BaseAdminController.php @@ -199,7 +199,7 @@ class BaseAdminController extends BaseController $parser = $this->container->get("thelia.parser"); // Define the template thant shoud be used - $parser->setTemplate($template ?: ConfigQuery::read('base-admin-template', 'admin/default')); + $parser->addTemplateDir($template ?: ConfigQuery::read('base-admin-template', 'admin/default'), 'default'); return $parser; } diff --git a/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php b/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php index 272f6787c..5a3665d21 100755 --- a/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php +++ b/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php @@ -37,13 +37,12 @@ class SmartyParser extends Smarty implements ParserInterface * @param Request $request * @param EventDispatcherInterface $dispatcher * @param ParserContext $parserContext - * @param bool $template * @param string $env * @param bool $debug */ public function __construct( Request $request, EventDispatcherInterface $dispatcher, ParserContext $parserContext, - $template = false, $env = "prod", $debug = false) + $env = "prod", $debug = false) { parent::__construct(); @@ -62,7 +61,7 @@ class SmartyParser extends Smarty implements ParserInterface $this->setCompileDir($compile_dir); $this->setCacheDir($cache_dir); - $this->setTemplate($template ?: ConfigQuery::read('active-template', 'default')); + //$this->setTemplate($template ?: ConfigQuery::read('active-template', 'default')); $this->debugging = $debug; diff --git a/core/lib/Thelia/Core/Thelia.php b/core/lib/Thelia/Core/Thelia.php index fafe50171..c5a4c16c3 100755 --- a/core/lib/Thelia/Core/Thelia.php +++ b/core/lib/Thelia/Core/Thelia.php @@ -123,8 +123,10 @@ class Thelia extends Kernel if (defined("THELIA_INSTALL_MODE") === false) { $modules = \Thelia\Model\ModuleQuery::getActivated(); - $translator = $container->getDefinition('thelia.translator'); - $dirs = array(); + + $translationDirs = array(); + $templateDirs = array(); + $parser = $container->getDefinition('thelia.parser'); foreach ($modules as $module) { try { @@ -138,46 +140,60 @@ class Thelia extends Kernel $defintion ); - $loader = new XmlFileLoader($container, new FileLocator(THELIA_MODULE_DIR . "/" . ucfirst($module->getCode()) . "/Config")); + $code = ucfirst($module->getCode()); + + $loader = new XmlFileLoader($container, new FileLocator(THELIA_MODULE_DIR . "/" . $code . "/Config")); $loader->load("config.xml"); - if (is_dir($dir = THELIA_MODULE_DIR . "/" . ucfirst($module->getCode()) . "/I18n")) { - $dirs[] = $dir; + if (is_dir($dir = THELIA_MODULE_DIR . "/" . $code . "/I18n")) { + $translationDirs[] = $dir; + } + + if (is_dir($dir = THELIA_MODULE_DIR . "/" . $code . "/templates")) { + //$templateDirs[$code] = $dir; + $parser->addMethodCall('addTemplateDir', array($dir, $code)); } } catch (\InvalidArgumentException $e) { - // FIXME: process module configuration exception + // TODO: process module configuration exception } } //Load translation from templates //core translation - $dirs[] = THELIA_ROOT . "/core/lib/Thelia/Config/I18n"; + $translationDirs[] = THELIA_ROOT . "/core/lib/Thelia/Config/I18n"; //admin template if(is_dir($dir = THELIA_TEMPLATE_DIR . '/admin/default/I18n')) { - $dirs[] = $dir; + $translationDirs[] = $dir; } //front template $template = ConfigQuery::getActiveTemplate(); if(is_dir($dir = THELIA_TEMPLATE_DIR . $template . "/I18n")) { - $dirs[] = $dir; + $translationDirs[] = $dir; } - if ($dirs) { - $finder = Finder::create() - ->files() - ->depth(0) - ->in($dirs); - - foreach ($finder as $file) { - list($locale, $format) = explode('.', $file->getBaseName(), 2); - $translator->addMethodCall('addResource', array($format, (string) $file, $locale)); - } + if ($translationDirs) { + $this->loadTranslation($container, $translationDirs); } } } + private function loadTranslation(ContainerBuilder $container, array $dirs) + { + $translator = $container->getDefinition('thelia.translator'); + + $finder = Finder::create() + ->files() + ->depth(0) + ->in($dirs); + + foreach ($finder as $file) { + list($locale, $format) = explode('.', $file->getBaseName(), 2); + $translator->addMethodCall('addResource', array($format, (string) $file, $locale)); + } + } + /** * * initialize session in Request object From 6e5ae0f6344603182716608346016a8710f862ac Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Wed, 6 Nov 2013 13:48:32 +0100 Subject: [PATCH 7/9] refactor render template process --- .../Controller/Admin/BaseAdminController.php | 2 +- core/lib/Thelia/Controller/BaseController.php | 5 ++ .../Controller/Front/BaseFrontController.php | 13 +++++ .../Core/EventListener/ViewListener.php | 9 +++- .../Thelia/Core/Template/ParserInterface.php | 2 +- .../Core/Template/Smarty/SmartyParser.php | 47 +++---------------- 6 files changed, 34 insertions(+), 44 deletions(-) diff --git a/core/lib/Thelia/Controller/Admin/BaseAdminController.php b/core/lib/Thelia/Controller/Admin/BaseAdminController.php index f820f4bf5..e2e1bed45 100755 --- a/core/lib/Thelia/Controller/Admin/BaseAdminController.php +++ b/core/lib/Thelia/Controller/Admin/BaseAdminController.php @@ -199,7 +199,7 @@ class BaseAdminController extends BaseController $parser = $this->container->get("thelia.parser"); // Define the template thant shoud be used - $parser->addTemplateDir($template ?: ConfigQuery::read('base-admin-template', 'admin/default'), 'default'); + $parser->setTemplate($template ?: ConfigQuery::read('base-admin-template', 'admin/default'), 'default'); return $parser; } diff --git a/core/lib/Thelia/Controller/BaseController.php b/core/lib/Thelia/Controller/BaseController.php index d5868b8d2..450f98e74 100755 --- a/core/lib/Thelia/Controller/BaseController.php +++ b/core/lib/Thelia/Controller/BaseController.php @@ -311,6 +311,11 @@ class BaseController extends ContainerAware } /** + * + * return an instance of SmartyParser + * + * Caution : maybe there is still not default template defined. + * * @return ParserInterface instance parser */ protected function getParser() diff --git a/core/lib/Thelia/Controller/Front/BaseFrontController.php b/core/lib/Thelia/Controller/Front/BaseFrontController.php index 5892194a4..bec9e5b41 100755 --- a/core/lib/Thelia/Controller/Front/BaseFrontController.php +++ b/core/lib/Thelia/Controller/Front/BaseFrontController.php @@ -25,6 +25,7 @@ namespace Thelia\Controller\Front; use Symfony\Component\Routing\Router; use Thelia\Controller\BaseController; use Thelia\Model\AddressQuery; +use Thelia\Model\ConfigQuery; use Thelia\Model\ModuleQuery; use Thelia\Tools\URL; @@ -83,4 +84,16 @@ class BaseFrontController extends BaseController $this->redirectToRoute("order.invoice"); } } + + /** + * @return ParserInterface instance parser + */ + protected function getParser() + { + $parser = $this->container->get("thelia.parser"); + + $parser->setTemplate(ConfigQuery::getActiveTemplate()); + + return $parser; + } } diff --git a/core/lib/Thelia/Core/EventListener/ViewListener.php b/core/lib/Thelia/Core/EventListener/ViewListener.php index 667a3d42c..722dcbd67 100755 --- a/core/lib/Thelia/Core/EventListener/ViewListener.php +++ b/core/lib/Thelia/Core/EventListener/ViewListener.php @@ -23,15 +23,18 @@ namespace Thelia\Core\EventListener; use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; use Thelia\Core\HttpFoundation\Response; use Symfony\Component\Routing\Router; +use Thelia\Core\HttpKernel\Exception\NotFountHttpException; use Thelia\Core\Template\Exception\ResourceNotFoundException; use Thelia\Core\Template\ParserInterface; use Thelia\Exception\OrderException; +use Thelia\Model\ConfigQuery; use Thelia\Tools\Redirect; use Thelia\Tools\URL; use Thelia\Core\Security\Exception\AuthenticationException; @@ -74,9 +77,11 @@ class ViewListener implements EventSubscriberInterface { $parser = $this->container->get('thelia.parser'); + $parser->setTemplate(ConfigQuery::getActiveTemplate()); + $request = $this->container->get('request'); try { - $content = $parser->getContent(); + $content = $parser->render($request->attributes->get('_view').".html"); if ($content instanceof Response) { $response = $content;$event->setResponse($content); @@ -94,7 +99,7 @@ class ViewListener implements EventSubscriberInterface $event->setResponse($response); } catch (ResourceNotFoundException $e) { - $event->setResponse(new Response($e->getMessage(), 404)); + throw new NotFoundHttpException(); } catch (AuthenticationException $ex) { // Redirect to the login template diff --git a/core/lib/Thelia/Core/Template/ParserInterface.php b/core/lib/Thelia/Core/Template/ParserInterface.php index bbf926812..a0886a203 100755 --- a/core/lib/Thelia/Core/Template/ParserInterface.php +++ b/core/lib/Thelia/Core/Template/ParserInterface.php @@ -33,7 +33,7 @@ interface ParserInterface /** * */ - public function getContent(); + public function render($realTemplateName, array $parameters = array()); public function setContent($content); diff --git a/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php b/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php index 5a3665d21..4cdf8557e 100755 --- a/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php +++ b/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php @@ -77,6 +77,8 @@ class SmartyParser extends Smarty implements ParserInterface $this->setForceCompile(false); } + //$this->enableSecurity(); + // The default HTTP status $this->status = 200; @@ -103,7 +105,7 @@ class SmartyParser extends Smarty implements ParserInterface { $this->template = $template_path_from_template_base; - $this->setTemplateDir(THELIA_TEMPLATE_DIR.$this->template); + $this->addTemplateDir(THELIA_TEMPLATE_DIR.$this->template, 0); $config_dir = THELIA_TEMPLATE_DIR.$this->template.'/configs'; @@ -124,6 +126,9 @@ class SmartyParser extends Smarty implements ParserInterface */ public function render($realTemplateName, array $parameters = array()) { + if(false === $this->templateExists($realTemplateName)) { + throw new ResourceNotFoundException(); + } // Assign the parserContext variables foreach ($this->parserContext as $var => $value) { $this->assign($var, $value); @@ -131,23 +136,7 @@ class SmartyParser extends Smarty implements ParserInterface $this->assign($parameters); - return $this->fetch($realTemplateName); - } - - /** - * - * This method must return a Symfony\Component\HttpFoudation\Response instance or the content of the response - * - */ - public function getContent() - { - try { - $templateFile = $this->getTemplateFilePath(); - } catch (\RuntimeException $e) { - return new Response($this->render(\Thelia\Model\ConfigQuery::getPageNotFoundView()), "404"); - } - - return $this->render($templateFile); + return $this->fetch(sprintf("file:%s", $realTemplateName)); } /** @@ -208,26 +197,4 @@ class SmartyParser extends Smarty implements ParserInterface } } - protected function getTemplateFilePath() - { - $file = $this->request->attributes->get('_view'); - $fileName = THELIA_TEMPLATE_DIR . rtrim($this->template, "/") . "/" . $file; - - $pathFileName = realpath(dirname(THELIA_TEMPLATE_DIR . rtrim($this->template, "/") . "/" . $file)); - $templateDir = realpath(THELIA_TEMPLATE_DIR . rtrim($this->template, "/") . "/"); - - if (strpos($pathFileName, $templateDir) !== 0) { - throw new ResourceNotFoundException(sprintf("this view does not exists")); - } - - if (!file_exists($fileName)) { - $fileName .= ".html"; - - if (!file_exists($fileName)) { - throw new ResourceNotFoundException(sprintf("file not found in %s template", $this->template)); - } - } - - return $fileName; - } } From 8d40605091ee7f80f854318e929ae0c9a108fd66 Mon Sep 17 00:00:00 2001 From: Franck Allimant Date: Wed, 6 Nov 2013 14:40:33 +0100 Subject: [PATCH 8/9] Continued on translations --- .../Admin/TranslationsController.php | 38 ++++++++++++++----- .../Thelia/Core/Translation/Translator.php | 6 ++- templates/admin/default/admin-logs.html | 2 +- .../default/includes/inner-form-toolbar.html | 2 +- templates/admin/default/translations.html | 34 +++++++++++++---- 5 files changed, 62 insertions(+), 20 deletions(-) diff --git a/core/lib/Thelia/Controller/Admin/TranslationsController.php b/core/lib/Thelia/Controller/Admin/TranslationsController.php index 1e6ba421c..d13f29423 100644 --- a/core/lib/Thelia/Controller/Admin/TranslationsController.php +++ b/core/lib/Thelia/Controller/Admin/TranslationsController.php @@ -54,10 +54,12 @@ class TranslationsController extends BaseAdminController $item_id = $this->getRequest()->get('item_id', ''); - $all_strings = $translated_strings = array(); + $all_strings = array(); $template = $directory = $i18n_directory = false; + $mode = 'template'; + if (! empty($item_id)) { switch($item_to_translate) { @@ -66,7 +68,14 @@ class TranslationsController extends BaseAdminController if (null !== $module = ModuleQuery::create()->findPk($item_id)) { $directory = THELIA_MODULE_DIR . $module->getBaseDir(); $i18n_directory = THELIA_TEMPLATE_DIR . $template->getI18nPath(); + $mode = 'php'; } + break; + + case 'co' : + $directory = THELIA_ROOT . 'core/lib/Thelia'; + $i18n_directory = THELIA_ROOT . 'core/lib/Thelia/Config/I18n'; + $mode = 'php'; break; case 'fo' : @@ -90,7 +99,7 @@ class TranslationsController extends BaseAdminController if ($directory) { // Load strings - $this->walkDir($directory, $all_strings); + $this->walkDir($directory, $mode, $all_strings); // Load translated strings if ($i18n_directory) { @@ -103,7 +112,6 @@ class TranslationsController extends BaseAdminController 'item_to_translate' => $item_to_translate, 'item_id' => $item_id, 'all_strings' => $all_strings, - 'translated_strings' => $translated_strings, 'view_missing_traductions_only' => $this->getRequest()->get('view_missing_traductions_only', 0) )); } @@ -136,7 +144,18 @@ class TranslationsController extends BaseAdminController return $path; } - protected function walkDir($directory, &$strings) { + protected function walkDir($directory, $mode, &$strings) { + + if ($mode == 'php') { + $prefix = '\-\>[\s]*trans[\s]*\('; + + $allowed_exts = array('php'); + } else { + $prefix = '\{intl[\s]l='; + + $allowed_exts = array('html', 'tpl', 'xml'); + } + try { //echo "walking in $directory
    "; @@ -144,13 +163,13 @@ class TranslationsController extends BaseAdminController if ($fileInfo->isDot()) continue; - if ($fileInfo->isDir()) $this->walkDir($fileInfo->getPathName(), $strings); + if ($fileInfo->isDir()) $this->walkDir($fileInfo->getPathName(), $mode, $strings); if ($fileInfo->isFile()) { $ext = $fileInfo->getExtension(); - if ($ext == 'html' || $ext == 'tpl' || $ext == 'xml') { + if (in_array($ext, $allowed_exts)) { if ($content = file_get_contents($fileInfo->getPathName())) { @@ -160,7 +179,7 @@ class TranslationsController extends BaseAdminController $matches = array(); - if (preg_match_all('/{intl[\s]l=((? array($short_path), 'chaine' => $match, - 'dollar' => strstr($match, '$') !== false); + 'translation' => $this->getTranslator()->trans($match, array(), 'messages', $this->getCurrentEditionLocale(), false), + 'dollar' => strstr($match, '$') !== false + ); } } } @@ -190,5 +211,4 @@ class TranslationsController extends BaseAdminController echo $ex; } } - } diff --git a/core/lib/Thelia/Core/Translation/Translator.php b/core/lib/Thelia/Core/Translation/Translator.php index 397a7e095..775ef7ad8 100755 --- a/core/lib/Thelia/Core/Translation/Translator.php +++ b/core/lib/Thelia/Core/Translation/Translator.php @@ -52,7 +52,7 @@ class Translator extends BaseTranslator * * @api */ - public function trans($id, array $parameters = array(), $domain = 'messages', $locale = null) + public function trans($id, array $parameters = array(), $domain = 'messages', $locale = null, $return_default_if_not_available = true) { if (null === $locale) { $locale = $this->getLocale(); @@ -64,7 +64,9 @@ class Translator extends BaseTranslator if ($this->catalogues[$locale]->has((string) $id, $domain)) return parent::trans($id, $parameters, $domain, $locale); - else + else if ($return_default_if_not_available) return strtr($id, $parameters); + else + return ''; } } diff --git a/templates/admin/default/admin-logs.html b/templates/admin/default/admin-logs.html index 74273a6c9..80eadbbe5 100755 --- a/templates/admin/default/admin-logs.html +++ b/templates/admin/default/admin-logs.html @@ -26,7 +26,7 @@
    - +
    diff --git a/templates/admin/default/includes/inner-form-toolbar.html b/templates/admin/default/includes/inner-form-toolbar.html index 1b2be1ff7..0fbed51a4 100755 --- a/templates/admin/default/includes/inner-form-toolbar.html +++ b/templates/admin/default/includes/inner-form-toolbar.html @@ -16,7 +16,7 @@ Parameters: