From b6a216fd9b4d2b2e0ae23a1c8fc12b3093dc4e14 Mon Sep 17 00:00:00 2001 From: Etienne Roudeix Date: Fri, 6 Sep 2013 12:21:36 +0200 Subject: [PATCH 1/4] substitutions : product category folder content --- core/lib/Thelia/Config/Resources/config.xml | 1 + .../Smarty/Plugins/DataAccessFunctions.php | 168 +++++++++++++++--- .../Core/Template/Smarty/Plugins/Format.php | 22 +-- .../Thelia/Model/Tools/ModelCriteriaTools.php | 2 +- core/lib/Thelia/Tools/DateTimeFormat.php | 66 +++++++ templates/default/debug.html | 7 +- 6 files changed, 222 insertions(+), 44 deletions(-) create mode 100755 core/lib/Thelia/Tools/DateTimeFormat.php diff --git a/core/lib/Thelia/Config/Resources/config.xml b/core/lib/Thelia/Config/Resources/config.xml index 96e5941cd..030d0374a 100755 --- a/core/lib/Thelia/Config/Resources/config.xml +++ b/core/lib/Thelia/Config/Resources/config.xml @@ -184,6 +184,7 @@ + diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/DataAccessFunctions.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/DataAccessFunctions.php index a2fd10c15..1fdb6e4bf 100755 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/DataAccessFunctions.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/DataAccessFunctions.php @@ -23,10 +23,20 @@ namespace Thelia\Core\Template\Smarty\Plugins; +use Propel\Runtime\ActiveQuery\ModelCriteria; +use Symfony\Component\HttpFoundation\Request; use Thelia\Core\Template\Smarty\AbstractSmartyPlugin; use Thelia\Core\Security\SecurityContext; use Thelia\Core\Template\ParserContext; use Thelia\Core\Template\Smarty\SmartyPluginDescriptor; +use Thelia\Model\CategoryQuery; +use Thelia\Model\ContentQuery; +use Thelia\Model\FolderQuery; +use Thelia\Model\Product; +use Thelia\Model\ProductQuery; +use Thelia\Model\Tools\ModelCriteriaTools; +use Thelia\Tools\DateTimeFormat; + /** * Implementation of data access to main Thelia objects (users, cart, etc.) * @@ -37,10 +47,13 @@ class DataAccessFunctions extends AbstractSmartyPlugin { private $securityContext; protected $parserContext; + protected $request; - public function __construct(SecurityContext $securityContext, ParserContext $parserContext) + public function __construct(Request $request, SecurityContext $securityContext, ParserContext $parserContext) { $this->securityContext = $securityContext; + $this->parserContext = $parserContext; + $this->request = $request; } /** @@ -52,7 +65,7 @@ class DataAccessFunctions extends AbstractSmartyPlugin */ public function adminDataAccess($params, &$smarty) { - return $this->userDataAccess("Admin User", $this->securityContext->getAdminUser(), $params); + return $this->dataAccess("Admin User", $params, $this->securityContext->getAdminUser()); } /** @@ -64,37 +77,146 @@ class DataAccessFunctions extends AbstractSmartyPlugin */ public function customerDataAccess($params, &$smarty) { - return $this->userDataAccess("Customer User", $this->securityContext->getCustomerUser(), $params); + return $this->dataAccess("Customer User", $params, $this->securityContext->getCustomerUser()); } + public function productDataAccess($params, &$smarty) + { + $productId = $this->request->get('product_id'); + + if($productId !== null) { + + $search = ProductQuery::create() + ->filterById($productId); + + return $this->dataAccessWithI18n("Product", $params, $search); + } + } + + public function categoryDataAccess($params, &$smarty) + { + $categoryId = $this->request->get('category_id'); + + if($categoryId !== null) { + + $search = CategoryQuery::create() + ->filterById($categoryId); + + return $this->dataAccessWithI18n("Category", $params, $search); + } + } + + public function contentDataAccess($params, &$smarty) + { + $contentId = $this->request->get('content_id'); + + if($contentId !== null) { + + $search = ContentQuery::create() + ->filterById($contentId); + + return $this->dataAccessWithI18n("Content", $params, $search); + } + } + + public function folderDataAccess($params, &$smarty) + { + $folderId = $this->request->get('folder_id'); + + if($folderId !== null) { + + $search = FolderQuery::create() + ->filterById($folderId); + + return $this->dataAccessWithI18n("Folder", $params, $search); + } + } + /** - * @param $objectLabel - * @param $user - * @param $params + * @param $objectLabel + * @param $params + * @param ModelCriteria $search + * @param array $columns + * @param null $foreignTable + * @param string $foreignKey + * + * @return string + */ + protected function dataAccessWithI18n($objectLabel, $params, ModelCriteria $search, $columns = array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM'), $foreignTable = null, $foreignKey = 'ID') + { + $lang = $this->getNormalizedParam($params, array('lang')); + if($lang === null) { + $lang = $this->request->getSession()->getLang()->getId(); + } + + ModelCriteriaTools::getI18n( + false, + $lang, + $search, + $this->request->getSession()->getLang()->getLocale(), + $columns, + $foreignTable, + $foreignKey, + true + ); + + $data = $search->findOne(); + + $noGetterData = array(); + foreach($columns as $column) { + $noGetterData[$column] = $data->getVirtualColumn('i18n_' . $column); + } + + return $this->dataAccess($objectLabel, $params, $data, $noGetterData); + } + + /** + * @param $objectLabel + * @param $params + * @param $data + * @param array $noGetterData * * @return string * @throws \InvalidArgumentException */ - protected function userDataAccess($objectLabel, $user, $params) - { - $attribute = $this->getNormalizedParam($params, array('attribute', 'attrib', 'attr')); + protected function dataAccess($objectLabel, $params, $data, $noGetterData = array()) + { + $attribute = $this->getNormalizedParam($params, array('attribute', 'attrib', 'attr')); - if (! empty($attribute)) { + if (! empty($attribute)) { - if (null != $user) { - $getter = sprintf("get%s", ucfirst($attribute)); + if (null != $data) { - if (method_exists($user, $getter)) { - return $user->$getter(); - } + $keyAttribute = strtoupper($attribute); + if(array_key_exists($keyAttribute, $noGetterData)) { + return $noGetterData[$keyAttribute]; + } - throw new \InvalidArgumentException(sprintf("%s has no '%s' attribute", $objectLabel, $attribute)); + $getter = sprintf("get%s", ucfirst($attribute)); + if (method_exists($data, $getter)) { + $return = $data->$getter(); - } - } + if($return instanceof \DateTime) { + if (array_key_exists("format", $params)) { + $format = $params["format"]; + } else { + $format = DateTimeFormat::getInstance($this->request)->getFormat(array_key_exists("output", $params) ? $params["output"] : null); + } + + $return = $return->format($format); + } + + return $return; + } + + throw new \InvalidArgumentException(sprintf("%s has no '%s' attribute", $objectLabel, $attribute)); + + } + } + + return ''; + } - return ''; - } /** * Define the various smarty plugins hendled by this class * @@ -104,7 +226,11 @@ class DataAccessFunctions extends AbstractSmartyPlugin { return array( new SmartyPluginDescriptor('function', 'admin', $this, 'adminDataAccess'), - new SmartyPluginDescriptor('function', 'customer', $this, 'customerDataAccess') + new SmartyPluginDescriptor('function', 'customer', $this, 'customerDataAccess'), + new SmartyPluginDescriptor('function', 'product', $this, 'productDataAccess'), + new SmartyPluginDescriptor('function', 'category', $this, 'categoryDataAccess'), + new SmartyPluginDescriptor('function', 'content', $this, 'contentDataAccess'), + new SmartyPluginDescriptor('function', 'folder', $this, 'folderDataAccess'), ); } } diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/Format.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/Format.php index a095f214a..daaff3fc1 100644 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/Format.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/Format.php @@ -27,6 +27,7 @@ use Thelia\Core\HttpFoundation\Request; use Thelia\Core\Template\Smarty\AbstractSmartyPlugin; use Thelia\Core\Template\Smarty\Exception\SmartyPluginException; use Thelia\Core\Template\Smarty\SmartyPluginDescriptor; +use Thelia\Tools\DateTimeFormat; /** * @@ -79,29 +80,10 @@ class Format extends AbstractSmartyPlugin return ""; } - $format = null; - $output = array_key_exists("output", $params) ? $params["output"] : null; - if (array_key_exists("format", $params)) { $format = $params["format"]; } else { - $session = $this->request->getSession(); - $lang = $session->getLang(); - - if($lang) { - switch ($output) { - case "date" : - $format = $lang->getDateFormat(); - break; - case "time" : - $format = $lang->getTimeFormat(); - break; - default: - case "datetime" : - $format = $lang->getDateTimeFormat(); - break; - } - } + $format = DateTimeFormat::getInstance($this->request)->getFormat(array_key_exists("output", $params) ? $params["output"] : null); } return $date->format($format); diff --git a/core/lib/Thelia/Model/Tools/ModelCriteriaTools.php b/core/lib/Thelia/Model/Tools/ModelCriteriaTools.php index 5e22f08e9..5e5dae010 100755 --- a/core/lib/Thelia/Model/Tools/ModelCriteriaTools.php +++ b/core/lib/Thelia/Model/Tools/ModelCriteriaTools.php @@ -113,7 +113,7 @@ class ModelCriteriaTools $localeSearch = LangQuery::create()->findOneById($requestedLangId); if ($localeSearch === null) { - throw new \InvalidArgumentException(sprintf('Incorrect lang argument given in attribute loop: lang ID %d not found', $requestedLangId)); + throw new \InvalidArgumentException(sprintf('Incorrect lang argument given : lang ID %d not found', $requestedLangId)); } $locale = $localeSearch->getLocale(); diff --git a/core/lib/Thelia/Tools/DateTimeFormat.php b/core/lib/Thelia/Tools/DateTimeFormat.php new file mode 100755 index 000000000..bd6161389 --- /dev/null +++ b/core/lib/Thelia/Tools/DateTimeFormat.php @@ -0,0 +1,66 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Tools; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\DependencyInjection\ContainerInterface; + +class DateTimeFormat +{ + protected $request; + + public function __construct(Request $request) + { + $this->request = $request; + } + + public static function getInstance(Request $request) + { + return new DateTimeFormat($request); + } + + public function getFormat($output = null) + { + $lang = $this->request->getSession()->getLang(); + + $format = null; + + if($lang) { + switch ($output) { + case "date" : + $format = $lang->getDateFormat(); + break; + case "time" : + $format = $lang->getTimeFormat(); + break; + default: + case "datetime" : + $format = $lang->getDateTimeFormat(); + break; + } + } + + return $format; + } +} \ No newline at end of file diff --git a/templates/default/debug.html b/templates/default/debug.html index 1c54c05a4..5f2d2965d 100755 --- a/templates/default/debug.html +++ b/templates/default/debug.html @@ -1,2 +1,5 @@ -::{customer attr="firstname"};; -::{customer attr="titleId"};; \ No newline at end of file +{*loop type="product" name="fsdq"} + {format_date date=$CREATE_DATE} +{/loop*} + +::{product attr="createdAt" output="time" format='i'};;
\ No newline at end of file From f2aad186f63286156d2f7fe5be7e75bf5618a3d3 Mon Sep 17 00:00:00 2001 From: Etienne Roudeix Date: Fri, 6 Sep 2013 16:13:51 +0200 Subject: [PATCH 2/4] position output in loops --- core/lib/Thelia/Core/Template/Loop/Attribute.php | 3 ++- .../Thelia/Core/Template/Loop/AttributeAvailability.php | 3 ++- core/lib/Thelia/Core/Template/Loop/Country.php | 8 ++++---- core/lib/Thelia/Core/Template/Loop/Feature.php | 3 ++- .../lib/Thelia/Core/Template/Loop/FeatureAvailability.php | 3 ++- core/lib/Thelia/Core/Template/Loop/FeatureValue.php | 3 ++- core/lib/Thelia/Core/Template/Loop/Title.php | 3 ++- 7 files changed, 16 insertions(+), 10 deletions(-) diff --git a/core/lib/Thelia/Core/Template/Loop/Attribute.php b/core/lib/Thelia/Core/Template/Loop/Attribute.php index e967709f3..ecdc551d2 100755 --- a/core/lib/Thelia/Core/Template/Loop/Attribute.php +++ b/core/lib/Thelia/Core/Template/Loop/Attribute.php @@ -162,7 +162,8 @@ class Attribute extends BaseI18nLoop ->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("POSTSCRIPTUM", $attribute->getVirtualColumn('i18n_POSTSCRIPTUM')) + ->set("POSITION", $attribute->getPosition()); $loopResult->addRow($loopResultRow); } diff --git a/core/lib/Thelia/Core/Template/Loop/AttributeAvailability.php b/core/lib/Thelia/Core/Template/Loop/AttributeAvailability.php index cd5ad6564..ca4618f53 100755 --- a/core/lib/Thelia/Core/Template/Loop/AttributeAvailability.php +++ b/core/lib/Thelia/Core/Template/Loop/AttributeAvailability.php @@ -131,7 +131,8 @@ class AttributeAvailability extends BaseI18nLoop ->set("TITLE",$attributeAv->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $attributeAv->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION", $attributeAv->getVirtualColumn('i18n_DESCRIPTION')) - ->set("POSTSCRIPTUM", $attributeAv->getVirtualColumn('i18n_POSTSCRIPTUM')); + ->set("POSTSCRIPTUM", $attributeAv->getVirtualColumn('i18n_POSTSCRIPTUM')) + ->set("POSITION", $attributeAv->getPosition()); $loopResult->addRow($loopResultRow); } diff --git a/core/lib/Thelia/Core/Template/Loop/Country.php b/core/lib/Thelia/Core/Template/Loop/Country.php index aee6492f7..0aeb62b15 100755 --- a/core/lib/Thelia/Core/Template/Loop/Country.php +++ b/core/lib/Thelia/Core/Template/Loop/Country.php @@ -113,10 +113,10 @@ class Country extends BaseI18nLoop ->set("TITLE",$country->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $country->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION", $country->getVirtualColumn('i18n_DESCRIPTION')) - ->set("POSTSCRIPTUM", $country->getVirtualColumn('i18n_POSTSCRIPTUM')); - $loopResultRow->set("ISOCODE", $country->getIsocode()); - $loopResultRow->set("ISOALPHA2", $country->getIsoalpha2()); - $loopResultRow->set("ISOALPHA3", $country->getIsoalpha3()); + ->set("POSTSCRIPTUM", $country->getVirtualColumn('i18n_POSTSCRIPTUM')) + ->set("ISOCODE", $country->getIsocode()) + ->set("ISOALPHA2", $country->getIsoalpha2()) + ->set("ISOALPHA3", $country->getIsoalpha3()); $loopResult->addRow($loopResultRow); } diff --git a/core/lib/Thelia/Core/Template/Loop/Feature.php b/core/lib/Thelia/Core/Template/Loop/Feature.php index 6c2401f42..14b7afaf5 100755 --- a/core/lib/Thelia/Core/Template/Loop/Feature.php +++ b/core/lib/Thelia/Core/Template/Loop/Feature.php @@ -154,7 +154,8 @@ class Feature extends BaseI18nLoop ->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("POSTSCRIPTUM", $feature->getVirtualColumn('i18n_POSTSCRIPTUM')) + ->set("POSITION", $feature->getPosition()); $loopResult->addRow($loopResultRow); } diff --git a/core/lib/Thelia/Core/Template/Loop/FeatureAvailability.php b/core/lib/Thelia/Core/Template/Loop/FeatureAvailability.php index 45eed6dc3..38bee46f0 100755 --- a/core/lib/Thelia/Core/Template/Loop/FeatureAvailability.php +++ b/core/lib/Thelia/Core/Template/Loop/FeatureAvailability.php @@ -129,7 +129,8 @@ class FeatureAvailability extends BaseI18nLoop ->set("TITLE",$featureAv->getVirtualColumn('i18n_TITLE')) ->set("CHAPO", $featureAv->getVirtualColumn('i18n_CHAPO')) ->set("DESCRIPTION", $featureAv->getVirtualColumn('i18n_DESCRIPTION')) - ->set("POSTSCRIPTUM", $featureAv->getVirtualColumn('i18n_POSTSCRIPTUM')); + ->set("POSTSCRIPTUM", $featureAv->getVirtualColumn('i18n_POSTSCRIPTUM')) + ->set("POSITION", $featureAv->getPosition()); $loopResult->addRow($loopResultRow); } diff --git a/core/lib/Thelia/Core/Template/Loop/FeatureValue.php b/core/lib/Thelia/Core/Template/Loop/FeatureValue.php index 700eff39c..998dfe4e0 100755 --- a/core/lib/Thelia/Core/Template/Loop/FeatureValue.php +++ b/core/lib/Thelia/Core/Template/Loop/FeatureValue.php @@ -149,7 +149,8 @@ class FeatureValue extends BaseI18nLoop ->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')) - ->set("POSTSCRIPTUM", $featureValue->getVirtualColumn(FeatureAvTableMap::TABLE_NAME . '_i18n_POSTSCRIPTUM')); + ->set("POSTSCRIPTUM", $featureValue->getVirtualColumn(FeatureAvTableMap::TABLE_NAME . '_i18n_POSTSCRIPTUM')) + ->set("POSITION", $featureValue->getPosition()); $loopResult->addRow($loopResultRow); } diff --git a/core/lib/Thelia/Core/Template/Loop/Title.php b/core/lib/Thelia/Core/Template/Loop/Title.php index 38dcb3fe3..4243f83f1 100755 --- a/core/lib/Thelia/Core/Template/Loop/Title.php +++ b/core/lib/Thelia/Core/Template/Loop/Title.php @@ -89,7 +89,8 @@ class Title extends BaseI18nLoop ->set("LOCALE",$locale) ->set("DEFAULT", $title->getByDefault()) ->set("SHORT", $title->getVirtualColumn('i18n_SHORT')) - ->set("LONG", $title->getVirtualColumn('i18n_LONG')); + ->set("LONG", $title->getVirtualColumn('i18n_LONG')) + ->set("POSITION", $title->getPosition()); $loopResult->addRow($loopResultRow); } From 3ac3224e1cf222295cf98b4d1ccd2e3eff3462c2 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Fri, 6 Sep 2013 16:14:35 +0200 Subject: [PATCH 3/4] add help in BaseController for retrieving the translator (method getTranslator) --- core/lib/Thelia/Controller/BaseController.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/lib/Thelia/Controller/BaseController.php b/core/lib/Thelia/Controller/BaseController.php index 853776214..04d3d7ba0 100755 --- a/core/lib/Thelia/Controller/BaseController.php +++ b/core/lib/Thelia/Controller/BaseController.php @@ -81,6 +81,17 @@ class BaseController extends ContainerAware return $this->container->get('event_dispatcher'); } + /** + * + * return the Translator + * + * @return mixed \Thelia\Core\Translation\Translator + */ + public function getTranslator() + { + return $this->getContainer()->get('thelia.translator'); + } + /** * Return the parser context, * From 1c307385cec1f551cff8c727139ffd66f1de3001 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Fri, 6 Sep 2013 16:16:48 +0200 Subject: [PATCH 4/4] fix typo --- core/lib/Thelia/Controller/BaseController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lib/Thelia/Controller/BaseController.php b/core/lib/Thelia/Controller/BaseController.php index 776a1266b..e5b098f02 100755 --- a/core/lib/Thelia/Controller/BaseController.php +++ b/core/lib/Thelia/Controller/BaseController.php @@ -89,7 +89,7 @@ class BaseController extends ContainerAware */ public function getTranslator() { - return $this->getContainer()->get('thelia.translator'); + return $this->container->get('thelia.translator'); } /**