diff --git a/core/lib/Thelia/Config/Resources/config.xml b/core/lib/Thelia/Config/Resources/config.xml
index 74a645cb9..c5c91a10e 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/Controller/BaseController.php b/core/lib/Thelia/Controller/BaseController.php
index 5fbcc56d2..e5b098f02 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->container->get('thelia.translator');
+ }
+
/**
* Return the parser context,
*
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);
}
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