Implemented front-office login

This commit is contained in:
franck
2013-07-17 18:49:23 +02:00
parent 4842d0c006
commit 8296051937
58 changed files with 1626 additions and 1407 deletions

265
composer.lock generated
View File

@@ -11,12 +11,12 @@
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
"reference": "v4.5.0"
"reference": "107b3055a10eb824701463602f77fbc8129180a2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/v4.5.0",
"reference": "v4.5.0",
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/107b3055a10eb824701463602f77fbc8129180a2",
"reference": "107b3055a10eb824701463602f77fbc8129180a2",
"shasum": ""
},
"require": {
@@ -47,7 +47,7 @@
"keywords": [
"html"
],
"time": "2013-02-18 00:04:08"
"time": "2013-07-17 04:56:29"
},
{
"name": "ircmaxell/password-compat",
@@ -94,12 +94,12 @@
"source": {
"type": "git",
"url": "https://github.com/kriswallsmith/assetic.git",
"reference": "82e8fc20a3b043b378a7efbda9e3d406d420f00e"
"reference": "f9f754dc7524acd6daf0bf510d22c055b4967e08"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/82e8fc20a3b043b378a7efbda9e3d406d420f00e",
"reference": "82e8fc20a3b043b378a7efbda9e3d406d420f00e",
"url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/f9f754dc7524acd6daf0bf510d22c055b4967e08",
"reference": "f9f754dc7524acd6daf0bf510d22c055b4967e08",
"shasum": ""
},
"require": {
@@ -114,9 +114,9 @@
"leafo/scssphp": "*",
"leafo/scssphp-compass": "*",
"mrclay/minify": "*",
"phpunit/phpunit": ">=3.7,<4.0",
"phpunit/phpunit": "~3.7",
"ptachoire/cssembed": "*",
"twig/twig": ">=1.6,<2.0"
"twig/twig": "~1.6"
},
"suggest": {
"leafo/lessphp": "Assetic provides the integration with the lessphp LESS compiler",
@@ -157,7 +157,7 @@
"compression",
"minification"
],
"time": "2013-06-13 16:47:03"
"time": "2013-07-11 15:56:23"
},
{
"name": "leafo/lessphp",
@@ -165,12 +165,12 @@
"source": {
"type": "git",
"url": "https://github.com/leafo/lessphp.git",
"reference": "ff86f2941c3f3d67d56acad2f8902ca57c73b359"
"reference": "366fb52798d4f120503af0703da11cba4ad06f8d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/leafo/lessphp/zipball/ff86f2941c3f3d67d56acad2f8902ca57c73b359",
"reference": "ff86f2941c3f3d67d56acad2f8902ca57c73b359",
"url": "https://api.github.com/repos/leafo/lessphp/zipball/366fb52798d4f120503af0703da11cba4ad06f8d",
"reference": "366fb52798d4f120503af0703da11cba4ad06f8d",
"shasum": ""
},
"type": "library",
@@ -198,7 +198,7 @@
],
"description": "lessphp is a compiler for LESS written in PHP.",
"homepage": "http://leafo.net/lessphp/",
"time": "2013-05-22 17:52:29"
"time": "2013-07-09 16:25:09"
},
{
"name": "propel/propel",
@@ -487,24 +487,24 @@
},
{
"name": "symfony/class-loader",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/ClassLoader",
"source": {
"type": "git",
"url": "https://github.com/symfony/ClassLoader.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/ClassLoader/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/ClassLoader/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"require-dev": {
"symfony/finder": ">=2.0,<3.0"
"symfony/finder": "~2.0"
},
"type": "library",
"extra": {
@@ -537,17 +537,17 @@
},
{
"name": "symfony/config",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/Config",
"source": {
"type": "git",
"url": "https://github.com/symfony/Config.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Config/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/Config/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
@@ -580,21 +580,21 @@
],
"description": "Symfony Config Component",
"homepage": "http://symfony.com",
"time": "2013-05-10 18:08:31"
"time": "2013-07-10 14:03:01"
},
{
"name": "symfony/console",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/Console",
"source": {
"type": "git",
"url": "https://github.com/symfony/Console.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Console/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/Console/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
@@ -627,21 +627,21 @@
],
"description": "Symfony Console Component",
"homepage": "http://symfony.com",
"time": "2013-06-13 07:47:06"
"time": "2013-07-08 14:34:53"
},
{
"name": "symfony/dependency-injection",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/DependencyInjection",
"source": {
"type": "git",
"url": "https://github.com/symfony/DependencyInjection.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
@@ -649,7 +649,7 @@
},
"require-dev": {
"symfony/config": ">=2.2,<2.3-dev",
"symfony/yaml": ">=2.0,<3.0"
"symfony/yaml": "~2.0"
},
"suggest": {
"symfony/config": "2.2.*",
@@ -686,24 +686,24 @@
},
{
"name": "symfony/event-dispatcher",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/EventDispatcher",
"source": {
"type": "git",
"url": "https://github.com/symfony/EventDispatcher.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"require-dev": {
"symfony/dependency-injection": ">=2.0,<3.0"
"symfony/dependency-injection": "~2.0"
},
"suggest": {
"symfony/dependency-injection": "2.2.*",
@@ -740,17 +740,17 @@
},
{
"name": "symfony/filesystem",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/Filesystem",
"source": {
"type": "git",
"url": "https://github.com/symfony/Filesystem.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Filesystem/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/Filesystem/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
@@ -787,17 +787,17 @@
},
{
"name": "symfony/finder",
"version": "v2.3.1",
"version": "v2.3.2",
"target-dir": "Symfony/Component/Finder",
"source": {
"type": "git",
"url": "https://github.com/symfony/Finder.git",
"reference": "v2.3.1"
"reference": "v2.3.2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Finder/zipball/v2.3.1",
"reference": "v2.3.1",
"url": "https://api.github.com/repos/symfony/Finder/zipball/v2.3.2",
"reference": "v2.3.2",
"shasum": ""
},
"require": {
@@ -830,27 +830,27 @@
],
"description": "Symfony Finder Component",
"homepage": "http://symfony.com",
"time": "2013-06-02 12:05:51"
"time": "2013-07-01 12:17:23"
},
{
"name": "symfony/form",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/Form",
"source": {
"type": "git",
"url": "https://github.com/symfony/Form.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Form/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/Form/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
"php": ">=5.3.3",
"symfony/event-dispatcher": ">=2.1,<3.0",
"symfony/locale": ">=2.0,<3.0",
"symfony/event-dispatcher": "~2.1",
"symfony/locale": "~2.0",
"symfony/options-resolver": ">=2.1,<2.3-dev",
"symfony/property-access": ">=2.2,<2.3-dev"
},
@@ -889,21 +889,21 @@
],
"description": "Symfony Form Component",
"homepage": "http://symfony.com",
"time": "2013-06-13 07:35:18"
"time": "2013-06-23 07:35:41"
},
{
"name": "symfony/http-foundation",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/HttpFoundation",
"source": {
"type": "git",
"url": "https://github.com/symfony/HttpFoundation.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
@@ -939,37 +939,37 @@
],
"description": "Symfony HttpFoundation Component",
"homepage": "http://symfony.com",
"time": "2013-06-13 12:48:26"
"time": "2013-07-15 12:12:07"
},
{
"name": "symfony/http-kernel",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/HttpKernel",
"source": {
"type": "git",
"url": "https://github.com/symfony/HttpKernel.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/HttpKernel/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/HttpKernel/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
"php": ">=5.3.3",
"psr/log": ">=1.0,<2.0",
"symfony/event-dispatcher": ">=2.1,<3.0",
"psr/log": "~1.0",
"symfony/event-dispatcher": "~2.1",
"symfony/http-foundation": ">=2.2,<2.3-dev"
},
"require-dev": {
"symfony/browser-kit": "2.2.*",
"symfony/class-loader": ">=2.1,<3.0",
"symfony/config": ">=2.0,<3.0",
"symfony/class-loader": "~2.1",
"symfony/config": "~2.0",
"symfony/console": "2.2.*",
"symfony/dependency-injection": ">=2.0,<3.0",
"symfony/finder": ">=2.0,<3.0",
"symfony/process": ">=2.0,<3.0",
"symfony/dependency-injection": "~2.0",
"symfony/finder": "~2.0",
"symfony/process": "~2.0",
"symfony/routing": ">=2.2,<2.3-dev",
"symfony/stopwatch": ">=2.2,<2.3-dev"
},
@@ -1008,25 +1008,24 @@
],
"description": "Symfony HttpKernel Component",
"homepage": "http://symfony.com",
"time": "2013-06-19 12:09:49"
"time": "2013-07-15 12:28:01"
},
{
"name": "symfony/icu",
"version": "v1.2.0",
"version": "v1.0.0",
"target-dir": "Symfony/Component/Icu",
"source": {
"type": "git",
"url": "https://github.com/symfony/Icu.git",
"reference": "v1.2.0"
"reference": "v1.0.0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Icu/zipball/v1.2.0",
"reference": "v1.2.0",
"url": "https://api.github.com/repos/symfony/Icu/zipball/v1.0.0",
"reference": "v1.0.0",
"shasum": ""
},
"require": {
"lib-icu": ">=4.4",
"php": ">=5.3.3",
"symfony/intl": ">=2.3,<3.0"
},
@@ -1056,26 +1055,26 @@
"icu",
"intl"
],
"time": "2013-06-03 18:32:58"
"time": "2013-06-03 18:32:07"
},
{
"name": "symfony/intl",
"version": "v2.3.1",
"version": "v2.3.2",
"target-dir": "Symfony/Component/Intl",
"source": {
"type": "git",
"url": "https://github.com/symfony/Intl.git",
"reference": "v2.3.1"
"reference": "v2.3.2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Intl/zipball/v2.3.1",
"reference": "v2.3.1",
"url": "https://api.github.com/repos/symfony/Intl/zipball/v2.3.2",
"reference": "v2.3.2",
"shasum": ""
},
"require": {
"php": ">=5.3.3",
"symfony/icu": ">=1.0-RC,<2.0"
"symfony/icu": "~1.0-RC"
},
"require-dev": {
"symfony/filesystem": ">=2.1"
@@ -1133,21 +1132,21 @@
"l10n",
"localization"
],
"time": "2013-05-18 11:21:22"
"time": "2013-07-08 13:00:35"
},
{
"name": "symfony/locale",
"version": "v2.3.1",
"version": "v2.3.2",
"target-dir": "Symfony/Component/Locale",
"source": {
"type": "git",
"url": "https://github.com/symfony/Locale.git",
"reference": "v2.3.1"
"reference": "v2.3.2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Locale/zipball/v2.3.1",
"reference": "v2.3.1",
"url": "https://api.github.com/repos/symfony/Locale/zipball/v2.3.2",
"reference": "v2.3.2",
"shasum": ""
},
"require": {
@@ -1181,21 +1180,21 @@
],
"description": "Symfony Locale Component",
"homepage": "http://symfony.com",
"time": "2013-04-11 09:29:25"
"time": "2013-07-01 12:24:43"
},
{
"name": "symfony/options-resolver",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/OptionsResolver",
"source": {
"type": "git",
"url": "https://github.com/symfony/OptionsResolver.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/OptionsResolver/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/OptionsResolver/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
@@ -1237,17 +1236,17 @@
},
{
"name": "symfony/process",
"version": "v2.3.1",
"version": "v2.3.2",
"target-dir": "Symfony/Component/Process",
"source": {
"type": "git",
"url": "https://github.com/symfony/Process.git",
"reference": "v2.3.1"
"reference": "v2.3.2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Process/zipball/v2.3.1",
"reference": "v2.3.1",
"url": "https://api.github.com/repos/symfony/Process/zipball/v2.3.2",
"reference": "v2.3.2",
"shasum": ""
},
"require": {
@@ -1280,21 +1279,21 @@
],
"description": "Symfony Process Component",
"homepage": "http://symfony.com",
"time": "2013-05-06 20:03:44"
"time": "2013-07-01 12:24:43"
},
{
"name": "symfony/property-access",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/PropertyAccess",
"source": {
"type": "git",
"url": "https://github.com/symfony/PropertyAccess.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/PropertyAccess/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/PropertyAccess/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
@@ -1342,27 +1341,27 @@
},
{
"name": "symfony/routing",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/Routing",
"source": {
"type": "git",
"url": "https://github.com/symfony/Routing.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Routing/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/Routing/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"require-dev": {
"doctrine/common": ">=2.2,<3.0",
"psr/log": ">=1.0,<2.0",
"doctrine/common": "~2.2",
"psr/log": "~1.0",
"symfony/config": ">=2.2,<2.3-dev",
"symfony/yaml": ">=2.0,<3.0"
"symfony/yaml": "~2.0"
},
"suggest": {
"doctrine/common": "~2.2",
@@ -1396,21 +1395,21 @@
],
"description": "Symfony Routing Component",
"homepage": "http://symfony.com",
"time": "2013-05-10 16:49:00"
"time": "2013-06-23 06:56:04"
},
{
"name": "symfony/translation",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/Translation",
"source": {
"type": "git",
"url": "https://github.com/symfony/Translation.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Translation/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/Translation/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
@@ -1418,7 +1417,7 @@
},
"require-dev": {
"symfony/config": ">=2.0,<2.3-dev",
"symfony/yaml": ">=2.2,<3.0"
"symfony/yaml": "~2.2"
},
"suggest": {
"symfony/config": "2.2.*",
@@ -1455,28 +1454,28 @@
},
{
"name": "symfony/validator",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/Validator",
"source": {
"type": "git",
"url": "https://github.com/symfony/Validator.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Validator/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/Validator/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
"php": ">=5.3.3",
"symfony/translation": ">=2.0,<3.0"
"symfony/translation": "~2.0"
},
"require-dev": {
"symfony/config": ">=2.2,<2.3-dev",
"symfony/http-foundation": ">=2.1,<3.0",
"symfony/locale": ">=2.0,<3.0",
"symfony/yaml": ">=2.0,<3.0"
"symfony/http-foundation": "~2.1",
"symfony/locale": "~2.0",
"symfony/yaml": "~2.0"
},
"suggest": {
"doctrine/common": "~2.2",
@@ -1512,21 +1511,21 @@
],
"description": "Symfony Validator Component",
"homepage": "http://symfony.com",
"time": "2013-06-02 12:05:41"
"time": "2013-07-02 07:41:45"
},
{
"name": "symfony/yaml",
"version": "v2.2.3",
"version": "v2.2.4",
"target-dir": "Symfony/Component/Yaml",
"source": {
"type": "git",
"url": "https://github.com/symfony/Yaml.git",
"reference": "v2.2.3"
"reference": "v2.2.4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Yaml/zipball/v2.2.3",
"reference": "v2.2.3",
"url": "https://api.github.com/repos/symfony/Yaml/zipball/v2.2.4",
"reference": "v2.2.4",
"shasum": ""
},
"require": {
@@ -1559,7 +1558,7 @@
],
"description": "Symfony Yaml Component",
"homepage": "http://symfony.com",
"time": "2013-05-10 18:08:31"
"time": "2013-07-11 09:28:01"
}
],
"packages-dev": [
@@ -1569,12 +1568,12 @@
"source": {
"type": "git",
"url": "https://github.com/fzaninotto/Faker.git",
"reference": "8b9bb44bbf864a63c2eece6744fc40240877b0c6"
"reference": "3613b1466d5e9518b83f87d828f93f962ff0f997"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fzaninotto/Faker/zipball/8b9bb44bbf864a63c2eece6744fc40240877b0c6",
"reference": "8b9bb44bbf864a63c2eece6744fc40240877b0c6",
"url": "https://api.github.com/repos/fzaninotto/Faker/zipball/3613b1466d5e9518b83f87d828f93f962ff0f997",
"reference": "3613b1466d5e9518b83f87d828f93f962ff0f997",
"shasum": ""
},
"require": {
@@ -1607,7 +1606,7 @@
"faker",
"fixtures"
],
"time": "2013-07-08 09:31:33"
"time": "2013-07-15 16:26:12"
},
{
"name": "phpunit/php-code-coverage",

View File

@@ -39,30 +39,28 @@ use Thelia\Model\ConfigQuery;
use Thelia\Tools\Redirect;
use Symfony\Component\Validator\Exception\ValidatorException;
use Thelia\Core\Security\Exception\AuthenticationException;
use Thelia\Core\Template\ParserContext;
use Thelia\Core\Security\Exception\UsernameNotFoundException;
class Customer implements EventSubscriberInterface
{
/**
* @var Thelia\Core\Security\SecurityContext
*/
private $securityContext;
protected $securityContext;
public function __construct(SecurityContext $context) {
$this->securityContext = $context;
/**
* @var Thelia\Core\Template\ParserContext
*/
protected $parserContext;
$context->setContext(SecurityContext::CONTEXT_FRONT_OFFICE);
}
private function getSecurityContext($context) {
$this->securityContext->setContext($context === false ? SecurityContext::CONTEXT_FRONT_OFFICE : $context);
return $securityContext;
public function __construct(SecurityContext $securityContext, ParserContext $parserContext) {
$this->securityContext = $securityContext;
$this->parserContext = $parserContext;
}
public function create(ActionEvent $event)
{
$event->getDispatcher()->dispatch(TheliaEvents::BEFORE_CREATECUSTOMER, $event);
$request = $event->getRequest();
@@ -94,25 +92,35 @@ class Customer implements EventSubscriberInterface
$data["password"],
$request->getSession()->getLang()
);
} catch (\PropelException $e) {
Tlog::getInstance()->error(sprintf('error during creating customer on action/createCustomer with message "%s"', $e->getMessage()));
$event->setFormError($customerCreation);
}
//Customer is create, he is automatically connected
}
else {
$event->setFormError($customerCreation);
}
}
$event->getDispatcher()->dispatch(TheliaEvents::AFTER_CREATECUSTOMER, $event);
// Connect the newly created user,and redirect to the success URL
$this->processSuccessfulLogin($event, $customer, $customerCreation, true);
} catch (\PropelException $e) {
Tlog::getInstance()->error(sprintf('error during creating customer on action/createCustomer with message "%s"', $e->getMessage()));
$message = "Failed to create your account, please try again.";
}
}
else {
$message = "Missing or invalid data";
}
}
else {
$message = "Wrong form method !";
}
$this->parserContext->set('customer_creation_error_message', $message);
$event->setFormError($customerCreation);
}
public function modify(ActionEvent $event)
{
$event->getDispatcher()->dispatch(TheliaEvents::BEFORE_CHANGECUSTOMER, $event);
$request = $event->getRequest();
$customerModification = new CustomerModification($request);
@@ -140,15 +148,44 @@ class Customer implements EventSubscriberInterface
$data["zipcode"],
$data["country"]
);
} catch(\PropelException $e) {
$event->getDispatcher()->dispatch(TheliaEvents::AFTER_CHANGECUSTOMER, $event);
// Update the logged-in user, and redirect to the success URL (exits)
// We don-t send the login event, as the customer si already logged.
$this->processSuccessfulLogin($event, $customer, $customerModification);
}
catch(\PropelException $e) {
Tlog::getInstance()->error(sprintf('error during modifying customer on action/modifyCustomer with message "%s"', $e->getMessage()));
$event->setFormError($customerModification);
$message = "Failed to change your account, please try again.";
}
} else {
$event->setFormError($customerModification);
}
else {
$message = "Missing or invalid data";
}
}
else {
$message = "Wrong form method !";
}
$this->parserContext->set('customer_change_error_message', $message);
$event->setFormError($customerModification);
}
/**
* Perform user logout. The user is redirected to the provided view, if any.
*
* @param ActionEvent $event
*/
public function logout(ActionEvent $event)
{
$event->getDispatcher()->dispatch(TheliaEvents::CUSTOMER_LOGOUT, $event);
$this->getSecurityContext()->clear();
}
/**
@@ -170,39 +207,33 @@ class Customer implements EventSubscriberInterface
try {
$user = $authenticator->getAuthentifiedUser();
// Success -> store user in security context
$this->getSecurityContext()->setUser($user);
// Log authentication success
AdminLog::append("Authentication successufull", $request, $user);
// Get the success URL to redirect the user to
$successUrl = $form->getForm()->get('success_url')->getData();
if (null == $successUrl) $successUrl = ConfigQuery::read('base_url', '/');
// Redirect to the success URL
return Redirect::exec(URL::absoluteUrl($successUrl));
$this->processSuccessfulLogin($event, $user, $form);
}
catch (ValidatorException $ex) {
$message = "Missing or invalid information. Please check your input.";
}
catch (UsernameNotFoundException $ex) {
$message = "This email address was not found.";
}
catch (AuthenticationException $ex) {
$message = "Login failed. Please check your username and password.";
}
catch (\Exception $ex) {
$message = sprintf("Unable to process your request. Please try again (%s).", $ex->getMessage());
$message = sprintf("Unable to process your request. Please try again (%s in %s).", $ex->getMessage(), $ex->getFile());
}
// Store the form name in session (see Form Smarty plugin to find usage of this parameter)
$request->getSession()->setErrorFormName($form->getName());
// Put the message in the ParserContext to make it available to the template
$this->parserContext->set('customer_login_error_message', $message);
// A this point, the same view is displayed again.
}
public function changePassword(ActionEvent $event)
{
// TODO
}
/**
@@ -230,8 +261,36 @@ class Customer implements EventSubscriberInterface
return array(
"action.createCustomer" => array("create", 128),
"action.modifyCustomer" => array("modify", 128),
"action.loginCustomer" => array("login", 128)
"action.loginCustomer" => array("login", 128),
"action.logoutCustomer" => array("logout", 128),
);
}
/**
* Stores the current user in the security context, and redirect to the
* success_url.
*
* @param CustomerModel $user the logged user
*/
protected function processSuccessfulLogin(ActionEvent $event, CustomerModel $user, BaseForm $form, $sendLoginEvent = false)
{
// Success -> store user in security context
$this->getSecurityContext()->setUser($user);
if ($sendLoginEvent) $event->getDispatcher()->dispatch(TheliaEvents::CUSTOMER_LOGIN, $event);
// Redirect to the success URL
return Redirect::exec($form->getSuccessUrl());
}
/**
* Return the security context, beeing sure that we're in the CONTEXT_FRONT_OFFICE context
*
* @return SecurityContext the security context
*/
protected function getSecurityContext() {
$this->securityContext->setContext(SecurityContext::CONTEXT_FRONT_OFFICE);
return $this->securityContext;
}
}

View File

@@ -94,8 +94,9 @@ class BaseAdminController extends ContainerAware
catch (AuthenticationException $ex) {
// User is not authenticated, and templates requires authentication -> redirect to login page
// (see Thelia\Core\Template\Smarty\Plugins\Security)
Redirect::exec(URL::absoluteUrl('admin/login')); // FIXME shoud be a parameter
// We user login_tpl as a path, not a template.
Redirect::exec(URL::absoluteUrl($ex->getLoginTemplate()));
}
}

View File

@@ -44,7 +44,7 @@ class SessionController extends BaseAdminController {
$this->getSecurityContext()->clear();
// Go back to login page.
return Redirect::exec(URL::absoluteUrl('admin/login'));
return Redirect::exec(URL::absoluteUrl('/admin/login')); // FIXME - should be a parameter
}
public function checkLoginAction()
@@ -62,15 +62,10 @@ class SessionController extends BaseAdminController {
$this->getSecurityContext()->setUser($user);
// Log authentication success
AdminLog::append("Authentication successufull", $request, $user);
// Get the success URL to redirect the user to
$successUrl = $form->getForm()->get('success_url')->getData();
if (null == $successUrl) $successUrl = 'admin/home';
AdminLog::append("Authentication successuful", $request, $user);
// Redirect to the success URL
return Redirect::exec(URL::absoluteUrl($successUrl));
return Redirect::exec($form->getSuccessUrl());
}
catch (ValidatorException $ex) {

View File

@@ -20,7 +20,9 @@
<service id="thelia.action.customer" class="Thelia\Action\Customer" scope="request">
<tag name="kernel.event_subscriber"/>
<argument type="service" id="thelia.securityContext"/>
<argument type="service" id="thelia.parser.context"/>
</service>
</services>

View File

@@ -58,16 +58,24 @@
<argument type="service" id="request" />
</service>
<!-- Parser context -->
<service id="thelia.parser.context" class="Thelia\Core\Template\ParserContext" scope="request">
<argument type="service" id="request" />
</service>
<!-- Parser configuration -->
<service id="thelia.parser" class="Thelia\Core\Template\Smarty\SmartyParser" scope="request">
<argument type="service" id="request" />
<argument type="service" id="event_dispatcher"/>
<argument type="service" id="thelia.parser.context"/>
<argument >false</argument>
<argument >%kernel.environment%</argument>
<argument >%kernel.debug%</argument>
</service>
<!-- Smarty parser plugins -->
<service id="smarty.plugin.assetic" class="Thelia\Core\Template\Smarty\Plugins\Assetic" >

View File

@@ -48,9 +48,14 @@ final class TheliaEvents
*/
const INCLUSION = "thelia.include";
const BEFORE_CREATECUSTOMER = "action.before_createcustomer";
const CUSTOMER_LOGOUT = "action.customer_logout";
const CUSTOMER_LOGIN = "action.customer_login";
const BEFORE_CREATECUSTOMER = "action.before_createcustomer";
const AFTER_CREATECUSTOMER = "action.after_createcustomer";
const BEFORE_CHANGECUSTOMER = "action.before_changecustomer";
const AFTER_CHANGECUSTOMER = "action.after_changecustomer";
const CREATECUSTOMER_CUSTOMREF = "customer.creation.customref";
}

View File

@@ -90,8 +90,6 @@ class ViewListener implements EventSubscriberInterface
// Redirect to the login template
$event->setResponse(Redirect::exec(URL::viewUrl($ex->getLoginTemplate())));
}
throw new \Exception("toto !");
}
public function beforeKernelView(GetResponseForControllerResultEvent $event)

View File

@@ -27,6 +27,7 @@ use Symfony\Component\HttpFoundation\Session\Session as BaseSession;
use Thelia\Core\Security\User\UserInterface;
use Thelia\Form\BaseForm;
use Thelia\Model\ConfigQuery;
use Thelia\Tools\URL;
class Session extends BaseSession {
@@ -109,7 +110,7 @@ class Session extends BaseSession {
*/
public function getReturnToUrl()
{
return $this->get('return_to_url', ConfigQuery::read('base_url'));
return $this->get('return_to_url', URL::getIndexPage());
}
}

View File

@@ -37,7 +37,7 @@ class CustomerUsernamePasswordFormAuthenticator extends UsernamePasswordFormAuth
$loginForm,
new CustomerUserProvider(),
array(
'username_field_name', 'email'
'username_field_name' => 'email'
)
);
}

View File

@@ -0,0 +1,62 @@
<?php
/*************************************************************************************/
/* */
/* Thelia */
/* */
/* Copyright (c) OpenStudio */
/* email : info@thelia.net */
/* web : http://www.thelia.net */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 3 of the License */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* */
/*************************************************************************************/
namespace Thelia\Core\Template;
use Thelia\Model\ConfigQuery;
use Thelia\Core\HttpFoundation\Request;
use Thelia\Tools\URL;
/**
* The parser context is an application-wide context, which stores var-value pairs.
* Theses pairs are injected in the parser and becomes available to the templates.
*
* @author Franck Allimant <franck@cqfdev.fr>
*/
class ParserContext implements \IteratorAggregate
{
private $store = array();
public function __construct(Request $request) {
// Setup basic variables
$this
->set('base_url' , ConfigQuery::read('base_url', '/'))
->set('index_page' , URL::getIndexPage())
->set('return_to_url' , URL::absoluteUrl($request->getSession()->getReturnToUrl()))
;
}
public function set($name, $value) {
$this->store[$name] = $value;
return $this;
}
public function get($name) {
return $this->store[$name];
}
public function getIterator() {
return new \ArrayIterator( $this->store );
}
}

View File

@@ -73,7 +73,7 @@ class SmartyAssetsManager
$url = $this->assetic_manager->asseticize(
$asset_dir.'/'.$asset_file,
$this->web_root."/".$this->path_relative_to_web_root,
URL::absoluteUrl($this->path_relative_to_web_root),
URL::absoluteUrl($this->path_relative_to_web_root, array(), true /* path only */),
$assetType,
$filters,
$debug

View File

@@ -61,10 +61,17 @@ class UrlGenerator implements SmartyPluginInterface
*/
public function generateViewUrlFunction($params, &$smarty)
{
// the path to process
// the view name (without .html)
$view = trim($params['view']);
return URL::viewUrl($view, $this->getArgsFromParam($params));
// the related action (optionale)
$action = trim($params['action']);
$args = $this->getArgsFromParam($params);
if (! empty($action)) $args['action'] = $action;
return URL::viewUrl($view, $args);
}
/**
@@ -82,18 +89,6 @@ class UrlGenerator implements SmartyPluginInterface
return array();
}
/**
* Process view url generator function
*
* @param array $params
* @param unknown $smarty
* @return string no text is returned.
*/
public function generateReturnToUrl($params, &$smarty)
{
return URL::absoluteUrl($this->request->getSession()->getReturnToUrl());
}
/**
* Define the various smarty plugins hendled by this class
*
@@ -103,8 +98,7 @@ class UrlGenerator implements SmartyPluginInterface
{
return array(
new SmartyPluginDescriptor('function', 'url', $this, 'generateUrlFunction'),
new SmartyPluginDescriptor('function', 'viewurl', $this, 'generateViewUrlFunction'),
new SmartyPluginDescriptor('function', 'return_to_url', $this, 'generateReturnToUrl')
new SmartyPluginDescriptor('function', 'viewurl', $this, 'generateViewUrlFunction')
);
}
}

View File

@@ -12,6 +12,8 @@ use Thelia\Core\Template\ParserInterface;
use Thelia\Core\Template\Smarty\SmartyPluginInterface;
use Thelia\Core\Template\Exception\ResourceNotFoundException;
use Thelia\Core\Template\ParserContext;
use Thelia\Model\ConfigQuery;
/**
*
@@ -23,7 +25,9 @@ class SmartyParser extends Smarty implements ParserInterface
public $plugins = array();
protected $request, $dispatcher;
protected $request;
protected $dispatcher;
protected $parserContext;
protected $template = "";
@@ -36,12 +40,15 @@ class SmartyParser extends Smarty implements ParserInterface
* @param string $env
* @param bool $debug
*/
public function __construct(Request $request, EventDispatcherInterface $dispatcher, $template = false, $env = "prod", $debug = false)
public function __construct(
Request $request, EventDispatcherInterface $dispatcher, ParserContext $parserContext,
$template = false, $env = "prod", $debug = false)
{
parent::__construct();
$this->request = $request;
$this->dispatcher = $dispatcher;
$this->parserContext = $parserContext;
// Configure basic Smarty parameters
@@ -51,11 +58,11 @@ class SmartyParser extends Smarty implements ParserInterface
$cache_dir = THELIA_ROOT . 'cache/'. $env .'/smarty/cache';
if (! is_dir($cache_dir)) @mkdir($cache_dir, 0777, true);
$this->setTemplate($template ?: 'smarty-sample'); // FIXME: put this in configuration
$this->setCompileDir($compile_dir);
$this->setCacheDir($cache_dir);
$this->setTemplate($template ?: ConfigQuery::read('active-template', 'default'));
$this->debugging = $debug;
// Prevent smarty ErrorException: Notice: Undefined index bla bla bla...
@@ -110,8 +117,13 @@ class SmartyParser extends Smarty implements ParserInterface
* @param array $parameters an associative array of names / value pairs
* @return string the rendered template text
*/
public function render($realTemplateName, array $parameters)
public function render($realTemplateName, array $parameters = array())
{
// Assign the parserContext variables
foreach($this->parserContext as $var => $value) {
$this->assign($var, $value);
}
$this->assign($parameters);
return $this->fetch($realTemplateName);
@@ -126,11 +138,12 @@ class SmartyParser extends Smarty implements ParserInterface
{
try {
$templateFile = $this->getTemplateFilePath();
} catch(\RuntimeException $e) {
}
catch(\RuntimeException $e) {
return new Response($e->getMessage(), "404");
}
return $this->fetch($templateFile);
return $this->render($templateFile);
}
/**

View File

@@ -46,7 +46,6 @@ class AdminLogin extends BaseForm {
->add("remember_me", "checkbox", array(
'value' => 'yes'
))
->add("success_url", "text")
;
}

View File

@@ -31,6 +31,7 @@ use Symfony\Component\Form\Extension\Csrf\CsrfExtension;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider;
use Symfony\Component\Validator\Validation;
use Thelia\Model\ConfigQuery;
use Thelia\Tools\URL;
abstract class BaseForm {
/**
@@ -72,7 +73,7 @@ abstract class BaseForm {
// If not already set, define the success_url field
if (! $this->formBuilder->has('success_url')) {
$this->formBuilder->add("success_url", "text")
$this->formBuilder->add("success_url", "text");
}
$this->form = $this->formBuilder->getForm();

View File

@@ -46,7 +46,6 @@ class CustomerLogin extends BaseForm {
)
))
->add("remember_me", "checkbox")
->add("success_url", "text")
;
}

View File

@@ -149,11 +149,11 @@ abstract class Address implements ActiveRecordInterface
protected $cellphone;
/**
* The value for the default field.
* The value for the is_default field.
* Note: this column has a database default value of: 0
* @var int
*/
protected $default;
protected $is_default;
/**
* The value for the created_at field.
@@ -193,7 +193,7 @@ abstract class Address implements ActiveRecordInterface
*/
public function applyDefaultValues()
{
$this->default = 0;
$this->is_default = 0;
}
/**
@@ -618,14 +618,14 @@ abstract class Address implements ActiveRecordInterface
}
/**
* Get the [default] column value.
* Get the [is_default] column value.
*
* @return int
*/
public function getDefault()
public function getIsDefault()
{
return $this->default;
return $this->is_default;
}
/**
@@ -992,25 +992,25 @@ abstract class Address implements ActiveRecordInterface
} // setCellphone()
/**
* Set the value of [default] column.
* Set the value of [is_default] column.
*
* @param int $v new value
* @return \Thelia\Model\Address The current object (for fluent API support)
*/
public function setDefault($v)
public function setIsDefault($v)
{
if ($v !== null) {
$v = (int) $v;
}
if ($this->default !== $v) {
$this->default = $v;
$this->modifiedColumns[] = AddressTableMap::DEFAULT;
if ($this->is_default !== $v) {
$this->is_default = $v;
$this->modifiedColumns[] = AddressTableMap::IS_DEFAULT;
}
return $this;
} // setDefault()
} // setIsDefault()
/**
* Sets the value of [created_at] column to a normalized version of the date/time value specified.
@@ -1064,7 +1064,7 @@ abstract class Address implements ActiveRecordInterface
*/
public function hasOnlyDefaultValues()
{
if ($this->default !== 0) {
if ($this->is_default !== 0) {
return false;
}
@@ -1140,8 +1140,8 @@ abstract class Address implements ActiveRecordInterface
$col = $row[TableMap::TYPE_NUM == $indexType ? 14 + $startcol : AddressTableMap::translateFieldName('Cellphone', TableMap::TYPE_PHPNAME, $indexType)];
$this->cellphone = (null !== $col) ? (string) $col : null;
$col = $row[TableMap::TYPE_NUM == $indexType ? 15 + $startcol : AddressTableMap::translateFieldName('Default', TableMap::TYPE_PHPNAME, $indexType)];
$this->default = (null !== $col) ? (int) $col : null;
$col = $row[TableMap::TYPE_NUM == $indexType ? 15 + $startcol : AddressTableMap::translateFieldName('IsDefault', TableMap::TYPE_PHPNAME, $indexType)];
$this->is_default = (null !== $col) ? (int) $col : null;
$col = $row[TableMap::TYPE_NUM == $indexType ? 16 + $startcol : AddressTableMap::translateFieldName('CreatedAt', TableMap::TYPE_PHPNAME, $indexType)];
if ($col === '0000-00-00 00:00:00') {
@@ -1454,8 +1454,8 @@ abstract class Address implements ActiveRecordInterface
if ($this->isColumnModified(AddressTableMap::CELLPHONE)) {
$modifiedColumns[':p' . $index++] = 'CELLPHONE';
}
if ($this->isColumnModified(AddressTableMap::DEFAULT)) {
$modifiedColumns[':p' . $index++] = 'DEFAULT';
if ($this->isColumnModified(AddressTableMap::IS_DEFAULT)) {
$modifiedColumns[':p' . $index++] = 'IS_DEFAULT';
}
if ($this->isColumnModified(AddressTableMap::CREATED_AT)) {
$modifiedColumns[':p' . $index++] = 'CREATED_AT';
@@ -1519,8 +1519,8 @@ abstract class Address implements ActiveRecordInterface
case 'CELLPHONE':
$stmt->bindValue($identifier, $this->cellphone, PDO::PARAM_STR);
break;
case 'DEFAULT':
$stmt->bindValue($identifier, $this->default, PDO::PARAM_INT);
case 'IS_DEFAULT':
$stmt->bindValue($identifier, $this->is_default, PDO::PARAM_INT);
break;
case 'CREATED_AT':
$stmt->bindValue($identifier, $this->created_at ? $this->created_at->format("Y-m-d H:i:s") : null, PDO::PARAM_STR);
@@ -1636,7 +1636,7 @@ abstract class Address implements ActiveRecordInterface
return $this->getCellphone();
break;
case 15:
return $this->getDefault();
return $this->getIsDefault();
break;
case 16:
return $this->getCreatedAt();
@@ -1688,7 +1688,7 @@ abstract class Address implements ActiveRecordInterface
$keys[12] => $this->getCountryId(),
$keys[13] => $this->getPhone(),
$keys[14] => $this->getCellphone(),
$keys[15] => $this->getDefault(),
$keys[15] => $this->getIsDefault(),
$keys[16] => $this->getCreatedAt(),
$keys[17] => $this->getUpdatedAt(),
);
@@ -1785,7 +1785,7 @@ abstract class Address implements ActiveRecordInterface
$this->setCellphone($value);
break;
case 15:
$this->setDefault($value);
$this->setIsDefault($value);
break;
case 16:
$this->setCreatedAt($value);
@@ -1832,7 +1832,7 @@ abstract class Address implements ActiveRecordInterface
if (array_key_exists($keys[12], $arr)) $this->setCountryId($arr[$keys[12]]);
if (array_key_exists($keys[13], $arr)) $this->setPhone($arr[$keys[13]]);
if (array_key_exists($keys[14], $arr)) $this->setCellphone($arr[$keys[14]]);
if (array_key_exists($keys[15], $arr)) $this->setDefault($arr[$keys[15]]);
if (array_key_exists($keys[15], $arr)) $this->setIsDefault($arr[$keys[15]]);
if (array_key_exists($keys[16], $arr)) $this->setCreatedAt($arr[$keys[16]]);
if (array_key_exists($keys[17], $arr)) $this->setUpdatedAt($arr[$keys[17]]);
}
@@ -1861,7 +1861,7 @@ abstract class Address implements ActiveRecordInterface
if ($this->isColumnModified(AddressTableMap::COUNTRY_ID)) $criteria->add(AddressTableMap::COUNTRY_ID, $this->country_id);
if ($this->isColumnModified(AddressTableMap::PHONE)) $criteria->add(AddressTableMap::PHONE, $this->phone);
if ($this->isColumnModified(AddressTableMap::CELLPHONE)) $criteria->add(AddressTableMap::CELLPHONE, $this->cellphone);
if ($this->isColumnModified(AddressTableMap::DEFAULT)) $criteria->add(AddressTableMap::DEFAULT, $this->default);
if ($this->isColumnModified(AddressTableMap::IS_DEFAULT)) $criteria->add(AddressTableMap::IS_DEFAULT, $this->is_default);
if ($this->isColumnModified(AddressTableMap::CREATED_AT)) $criteria->add(AddressTableMap::CREATED_AT, $this->created_at);
if ($this->isColumnModified(AddressTableMap::UPDATED_AT)) $criteria->add(AddressTableMap::UPDATED_AT, $this->updated_at);
@@ -1941,7 +1941,7 @@ abstract class Address implements ActiveRecordInterface
$copyObj->setCountryId($this->getCountryId());
$copyObj->setPhone($this->getPhone());
$copyObj->setCellphone($this->getCellphone());
$copyObj->setDefault($this->getDefault());
$copyObj->setIsDefault($this->getIsDefault());
$copyObj->setCreatedAt($this->getCreatedAt());
$copyObj->setUpdatedAt($this->getUpdatedAt());
if ($makeNew) {
@@ -2094,7 +2094,7 @@ abstract class Address implements ActiveRecordInterface
$this->country_id = null;
$this->phone = null;
$this->cellphone = null;
$this->default = null;
$this->is_default = null;
$this->created_at = null;
$this->updated_at = null;
$this->alreadyInSave = false;

View File

@@ -36,7 +36,7 @@ use Thelia\Model\Map\AddressTableMap;
* @method ChildAddressQuery orderByCountryId($order = Criteria::ASC) Order by the country_id column
* @method ChildAddressQuery orderByPhone($order = Criteria::ASC) Order by the phone column
* @method ChildAddressQuery orderByCellphone($order = Criteria::ASC) Order by the cellphone column
* @method ChildAddressQuery orderByDefault($order = Criteria::ASC) Order by the default column
* @method ChildAddressQuery orderByIsDefault($order = Criteria::ASC) Order by the is_default column
* @method ChildAddressQuery orderByCreatedAt($order = Criteria::ASC) Order by the created_at column
* @method ChildAddressQuery orderByUpdatedAt($order = Criteria::ASC) Order by the updated_at column
*
@@ -55,7 +55,7 @@ use Thelia\Model\Map\AddressTableMap;
* @method ChildAddressQuery groupByCountryId() Group by the country_id column
* @method ChildAddressQuery groupByPhone() Group by the phone column
* @method ChildAddressQuery groupByCellphone() Group by the cellphone column
* @method ChildAddressQuery groupByDefault() Group by the default column
* @method ChildAddressQuery groupByIsDefault() Group by the is_default column
* @method ChildAddressQuery groupByCreatedAt() Group by the created_at column
* @method ChildAddressQuery groupByUpdatedAt() Group by the updated_at column
*
@@ -89,7 +89,7 @@ use Thelia\Model\Map\AddressTableMap;
* @method ChildAddress findOneByCountryId(int $country_id) Return the first ChildAddress filtered by the country_id column
* @method ChildAddress findOneByPhone(string $phone) Return the first ChildAddress filtered by the phone column
* @method ChildAddress findOneByCellphone(string $cellphone) Return the first ChildAddress filtered by the cellphone column
* @method ChildAddress findOneByDefault(int $default) Return the first ChildAddress filtered by the default column
* @method ChildAddress findOneByIsDefault(int $is_default) Return the first ChildAddress filtered by the is_default column
* @method ChildAddress findOneByCreatedAt(string $created_at) Return the first ChildAddress filtered by the created_at column
* @method ChildAddress findOneByUpdatedAt(string $updated_at) Return the first ChildAddress filtered by the updated_at column
*
@@ -108,7 +108,7 @@ use Thelia\Model\Map\AddressTableMap;
* @method array findByCountryId(int $country_id) Return ChildAddress objects filtered by the country_id column
* @method array findByPhone(string $phone) Return ChildAddress objects filtered by the phone column
* @method array findByCellphone(string $cellphone) Return ChildAddress objects filtered by the cellphone column
* @method array findByDefault(int $default) Return ChildAddress objects filtered by the default column
* @method array findByIsDefault(int $is_default) Return ChildAddress objects filtered by the is_default column
* @method array findByCreatedAt(string $created_at) Return ChildAddress objects filtered by the created_at column
* @method array findByUpdatedAt(string $updated_at) Return ChildAddress objects filtered by the updated_at column
*
@@ -199,7 +199,7 @@ abstract class AddressQuery extends ModelCriteria
*/
protected function findPkSimple($key, $con)
{
$sql = 'SELECT ID, TITLE, CUSTOMER_ID, CUSTOMER_TITLE_ID, COMPANY, FIRSTNAME, LASTNAME, ADDRESS1, ADDRESS2, ADDRESS3, ZIPCODE, CITY, COUNTRY_ID, PHONE, CELLPHONE, DEFAULT, CREATED_AT, UPDATED_AT FROM address WHERE ID = :p0';
$sql = 'SELECT ID, TITLE, CUSTOMER_ID, CUSTOMER_TITLE_ID, COMPANY, FIRSTNAME, LASTNAME, ADDRESS1, ADDRESS2, ADDRESS3, ZIPCODE, CITY, COUNTRY_ID, PHONE, CELLPHONE, IS_DEFAULT, CREATED_AT, UPDATED_AT FROM address WHERE ID = :p0';
try {
$stmt = $con->prepare($sql);
$stmt->bindValue(':p0', $key, PDO::PARAM_INT);
@@ -776,16 +776,16 @@ abstract class AddressQuery extends ModelCriteria
}
/**
* Filter the query on the default column
* Filter the query on the is_default column
*
* Example usage:
* <code>
* $query->filterByDefault(1234); // WHERE default = 1234
* $query->filterByDefault(array(12, 34)); // WHERE default IN (12, 34)
* $query->filterByDefault(array('min' => 12)); // WHERE default > 12
* $query->filterByIsDefault(1234); // WHERE is_default = 1234
* $query->filterByIsDefault(array(12, 34)); // WHERE is_default IN (12, 34)
* $query->filterByIsDefault(array('min' => 12)); // WHERE is_default > 12
* </code>
*
* @param mixed $default The value to use as filter.
* @param mixed $isDefault The value to use as filter.
* Use scalar values for equality.
* Use array values for in_array() equivalent.
* Use associative array('min' => $minValue, 'max' => $maxValue) for intervals.
@@ -793,16 +793,16 @@ abstract class AddressQuery extends ModelCriteria
*
* @return ChildAddressQuery The current query, for fluid interface
*/
public function filterByDefault($default = null, $comparison = null)
public function filterByIsDefault($isDefault = null, $comparison = null)
{
if (is_array($default)) {
if (is_array($isDefault)) {
$useMinMax = false;
if (isset($default['min'])) {
$this->addUsingAlias(AddressTableMap::DEFAULT, $default['min'], Criteria::GREATER_EQUAL);
if (isset($isDefault['min'])) {
$this->addUsingAlias(AddressTableMap::IS_DEFAULT, $isDefault['min'], Criteria::GREATER_EQUAL);
$useMinMax = true;
}
if (isset($default['max'])) {
$this->addUsingAlias(AddressTableMap::DEFAULT, $default['max'], Criteria::LESS_EQUAL);
if (isset($isDefault['max'])) {
$this->addUsingAlias(AddressTableMap::IS_DEFAULT, $isDefault['max'], Criteria::LESS_EQUAL);
$useMinMax = true;
}
if ($useMinMax) {
@@ -813,7 +813,7 @@ abstract class AddressQuery extends ModelCriteria
}
}
return $this->addUsingAlias(AddressTableMap::DEFAULT, $default, $comparison);
return $this->addUsingAlias(AddressTableMap::IS_DEFAULT, $isDefault, $comparison);
}
/**

View File

@@ -15,6 +15,7 @@ use Thelia\Core\Security\User\UserInterface;
use Propel\Runtime\Connection\ConnectionInterface;
use Propel\Runtime\Propel;
use Thelia\Model\Map\CustomerTableMap;
use Thelia\Core\Security\Role\Role;
/**
* Skeleton subclass for representing a row from the 'customer' table.
@@ -87,7 +88,7 @@ class Customer extends BaseCustomer implements UserInterface
->setCellphone($cellphone)
->setZipcode($zipcode)
->setCountryId($countryId)
->setDefault(1)
->setIsDefault(1)
->setCustomer($this)
->save($con);
@@ -114,7 +115,7 @@ class Customer extends BaseCustomer implements UserInterface
protected function generateRef()
{
return date("YmdHI");
return date("YmdHisu");
}
public function setPassword($password)

View File

@@ -145,9 +145,9 @@ class AddressTableMap extends TableMap
const CELLPHONE = 'address.CELLPHONE';
/**
* the column name for the DEFAULT field
* the column name for the IS_DEFAULT field
*/
const DEFAULT = 'address.DEFAULT';
const IS_DEFAULT = 'address.IS_DEFAULT';
/**
* the column name for the CREATED_AT field
@@ -171,11 +171,11 @@ class AddressTableMap extends TableMap
* e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id'
*/
protected static $fieldNames = array (
self::TYPE_PHPNAME => array('Id', 'Title', 'CustomerId', 'CustomerTitleId', 'Company', 'Firstname', 'Lastname', 'Address1', 'Address2', 'Address3', 'Zipcode', 'City', 'CountryId', 'Phone', 'Cellphone', 'Default', 'CreatedAt', 'UpdatedAt', ),
self::TYPE_STUDLYPHPNAME => array('id', 'title', 'customerId', 'customerTitleId', 'company', 'firstname', 'lastname', 'address1', 'address2', 'address3', 'zipcode', 'city', 'countryId', 'phone', 'cellphone', 'default', 'createdAt', 'updatedAt', ),
self::TYPE_COLNAME => array(AddressTableMap::ID, AddressTableMap::TITLE, AddressTableMap::CUSTOMER_ID, AddressTableMap::CUSTOMER_TITLE_ID, AddressTableMap::COMPANY, AddressTableMap::FIRSTNAME, AddressTableMap::LASTNAME, AddressTableMap::ADDRESS1, AddressTableMap::ADDRESS2, AddressTableMap::ADDRESS3, AddressTableMap::ZIPCODE, AddressTableMap::CITY, AddressTableMap::COUNTRY_ID, AddressTableMap::PHONE, AddressTableMap::CELLPHONE, AddressTableMap::DEFAULT, AddressTableMap::CREATED_AT, AddressTableMap::UPDATED_AT, ),
self::TYPE_RAW_COLNAME => array('ID', 'TITLE', 'CUSTOMER_ID', 'CUSTOMER_TITLE_ID', 'COMPANY', 'FIRSTNAME', 'LASTNAME', 'ADDRESS1', 'ADDRESS2', 'ADDRESS3', 'ZIPCODE', 'CITY', 'COUNTRY_ID', 'PHONE', 'CELLPHONE', 'DEFAULT', 'CREATED_AT', 'UPDATED_AT', ),
self::TYPE_FIELDNAME => array('id', 'title', 'customer_id', 'customer_title_id', 'company', 'firstname', 'lastname', 'address1', 'address2', 'address3', 'zipcode', 'city', 'country_id', 'phone', 'cellphone', 'default', 'created_at', 'updated_at', ),
self::TYPE_PHPNAME => array('Id', 'Title', 'CustomerId', 'CustomerTitleId', 'Company', 'Firstname', 'Lastname', 'Address1', 'Address2', 'Address3', 'Zipcode', 'City', 'CountryId', 'Phone', 'Cellphone', 'IsDefault', 'CreatedAt', 'UpdatedAt', ),
self::TYPE_STUDLYPHPNAME => array('id', 'title', 'customerId', 'customerTitleId', 'company', 'firstname', 'lastname', 'address1', 'address2', 'address3', 'zipcode', 'city', 'countryId', 'phone', 'cellphone', 'isDefault', 'createdAt', 'updatedAt', ),
self::TYPE_COLNAME => array(AddressTableMap::ID, AddressTableMap::TITLE, AddressTableMap::CUSTOMER_ID, AddressTableMap::CUSTOMER_TITLE_ID, AddressTableMap::COMPANY, AddressTableMap::FIRSTNAME, AddressTableMap::LASTNAME, AddressTableMap::ADDRESS1, AddressTableMap::ADDRESS2, AddressTableMap::ADDRESS3, AddressTableMap::ZIPCODE, AddressTableMap::CITY, AddressTableMap::COUNTRY_ID, AddressTableMap::PHONE, AddressTableMap::CELLPHONE, AddressTableMap::IS_DEFAULT, AddressTableMap::CREATED_AT, AddressTableMap::UPDATED_AT, ),
self::TYPE_RAW_COLNAME => array('ID', 'TITLE', 'CUSTOMER_ID', 'CUSTOMER_TITLE_ID', 'COMPANY', 'FIRSTNAME', 'LASTNAME', 'ADDRESS1', 'ADDRESS2', 'ADDRESS3', 'ZIPCODE', 'CITY', 'COUNTRY_ID', 'PHONE', 'CELLPHONE', 'IS_DEFAULT', 'CREATED_AT', 'UPDATED_AT', ),
self::TYPE_FIELDNAME => array('id', 'title', 'customer_id', 'customer_title_id', 'company', 'firstname', 'lastname', 'address1', 'address2', 'address3', 'zipcode', 'city', 'country_id', 'phone', 'cellphone', 'is_default', 'created_at', 'updated_at', ),
self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, )
);
@@ -186,11 +186,11 @@ class AddressTableMap extends TableMap
* e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0
*/
protected static $fieldKeys = array (
self::TYPE_PHPNAME => array('Id' => 0, 'Title' => 1, 'CustomerId' => 2, 'CustomerTitleId' => 3, 'Company' => 4, 'Firstname' => 5, 'Lastname' => 6, 'Address1' => 7, 'Address2' => 8, 'Address3' => 9, 'Zipcode' => 10, 'City' => 11, 'CountryId' => 12, 'Phone' => 13, 'Cellphone' => 14, 'Default' => 15, 'CreatedAt' => 16, 'UpdatedAt' => 17, ),
self::TYPE_STUDLYPHPNAME => array('id' => 0, 'title' => 1, 'customerId' => 2, 'customerTitleId' => 3, 'company' => 4, 'firstname' => 5, 'lastname' => 6, 'address1' => 7, 'address2' => 8, 'address3' => 9, 'zipcode' => 10, 'city' => 11, 'countryId' => 12, 'phone' => 13, 'cellphone' => 14, 'default' => 15, 'createdAt' => 16, 'updatedAt' => 17, ),
self::TYPE_COLNAME => array(AddressTableMap::ID => 0, AddressTableMap::TITLE => 1, AddressTableMap::CUSTOMER_ID => 2, AddressTableMap::CUSTOMER_TITLE_ID => 3, AddressTableMap::COMPANY => 4, AddressTableMap::FIRSTNAME => 5, AddressTableMap::LASTNAME => 6, AddressTableMap::ADDRESS1 => 7, AddressTableMap::ADDRESS2 => 8, AddressTableMap::ADDRESS3 => 9, AddressTableMap::ZIPCODE => 10, AddressTableMap::CITY => 11, AddressTableMap::COUNTRY_ID => 12, AddressTableMap::PHONE => 13, AddressTableMap::CELLPHONE => 14, AddressTableMap::DEFAULT => 15, AddressTableMap::CREATED_AT => 16, AddressTableMap::UPDATED_AT => 17, ),
self::TYPE_RAW_COLNAME => array('ID' => 0, 'TITLE' => 1, 'CUSTOMER_ID' => 2, 'CUSTOMER_TITLE_ID' => 3, 'COMPANY' => 4, 'FIRSTNAME' => 5, 'LASTNAME' => 6, 'ADDRESS1' => 7, 'ADDRESS2' => 8, 'ADDRESS3' => 9, 'ZIPCODE' => 10, 'CITY' => 11, 'COUNTRY_ID' => 12, 'PHONE' => 13, 'CELLPHONE' => 14, 'DEFAULT' => 15, 'CREATED_AT' => 16, 'UPDATED_AT' => 17, ),
self::TYPE_FIELDNAME => array('id' => 0, 'title' => 1, 'customer_id' => 2, 'customer_title_id' => 3, 'company' => 4, 'firstname' => 5, 'lastname' => 6, 'address1' => 7, 'address2' => 8, 'address3' => 9, 'zipcode' => 10, 'city' => 11, 'country_id' => 12, 'phone' => 13, 'cellphone' => 14, 'default' => 15, 'created_at' => 16, 'updated_at' => 17, ),
self::TYPE_PHPNAME => array('Id' => 0, 'Title' => 1, 'CustomerId' => 2, 'CustomerTitleId' => 3, 'Company' => 4, 'Firstname' => 5, 'Lastname' => 6, 'Address1' => 7, 'Address2' => 8, 'Address3' => 9, 'Zipcode' => 10, 'City' => 11, 'CountryId' => 12, 'Phone' => 13, 'Cellphone' => 14, 'IsDefault' => 15, 'CreatedAt' => 16, 'UpdatedAt' => 17, ),
self::TYPE_STUDLYPHPNAME => array('id' => 0, 'title' => 1, 'customerId' => 2, 'customerTitleId' => 3, 'company' => 4, 'firstname' => 5, 'lastname' => 6, 'address1' => 7, 'address2' => 8, 'address3' => 9, 'zipcode' => 10, 'city' => 11, 'countryId' => 12, 'phone' => 13, 'cellphone' => 14, 'isDefault' => 15, 'createdAt' => 16, 'updatedAt' => 17, ),
self::TYPE_COLNAME => array(AddressTableMap::ID => 0, AddressTableMap::TITLE => 1, AddressTableMap::CUSTOMER_ID => 2, AddressTableMap::CUSTOMER_TITLE_ID => 3, AddressTableMap::COMPANY => 4, AddressTableMap::FIRSTNAME => 5, AddressTableMap::LASTNAME => 6, AddressTableMap::ADDRESS1 => 7, AddressTableMap::ADDRESS2 => 8, AddressTableMap::ADDRESS3 => 9, AddressTableMap::ZIPCODE => 10, AddressTableMap::CITY => 11, AddressTableMap::COUNTRY_ID => 12, AddressTableMap::PHONE => 13, AddressTableMap::CELLPHONE => 14, AddressTableMap::IS_DEFAULT => 15, AddressTableMap::CREATED_AT => 16, AddressTableMap::UPDATED_AT => 17, ),
self::TYPE_RAW_COLNAME => array('ID' => 0, 'TITLE' => 1, 'CUSTOMER_ID' => 2, 'CUSTOMER_TITLE_ID' => 3, 'COMPANY' => 4, 'FIRSTNAME' => 5, 'LASTNAME' => 6, 'ADDRESS1' => 7, 'ADDRESS2' => 8, 'ADDRESS3' => 9, 'ZIPCODE' => 10, 'CITY' => 11, 'COUNTRY_ID' => 12, 'PHONE' => 13, 'CELLPHONE' => 14, 'IS_DEFAULT' => 15, 'CREATED_AT' => 16, 'UPDATED_AT' => 17, ),
self::TYPE_FIELDNAME => array('id' => 0, 'title' => 1, 'customer_id' => 2, 'customer_title_id' => 3, 'company' => 4, 'firstname' => 5, 'lastname' => 6, 'address1' => 7, 'address2' => 8, 'address3' => 9, 'zipcode' => 10, 'city' => 11, 'country_id' => 12, 'phone' => 13, 'cellphone' => 14, 'is_default' => 15, 'created_at' => 16, 'updated_at' => 17, ),
self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, )
);
@@ -225,7 +225,7 @@ class AddressTableMap extends TableMap
$this->addColumn('COUNTRY_ID', 'CountryId', 'INTEGER', true, null, null);
$this->addColumn('PHONE', 'Phone', 'VARCHAR', false, 20, null);
$this->addColumn('CELLPHONE', 'Cellphone', 'VARCHAR', false, 20, null);
$this->addColumn('DEFAULT', 'Default', 'TINYINT', false, null, 0);
$this->addColumn('IS_DEFAULT', 'IsDefault', 'TINYINT', false, null, 0);
$this->addColumn('CREATED_AT', 'CreatedAt', 'TIMESTAMP', false, null, null);
$this->addColumn('UPDATED_AT', 'UpdatedAt', 'TIMESTAMP', false, null, null);
} // initialize()
@@ -405,7 +405,7 @@ class AddressTableMap extends TableMap
$criteria->addSelectColumn(AddressTableMap::COUNTRY_ID);
$criteria->addSelectColumn(AddressTableMap::PHONE);
$criteria->addSelectColumn(AddressTableMap::CELLPHONE);
$criteria->addSelectColumn(AddressTableMap::DEFAULT);
$criteria->addSelectColumn(AddressTableMap::IS_DEFAULT);
$criteria->addSelectColumn(AddressTableMap::CREATED_AT);
$criteria->addSelectColumn(AddressTableMap::UPDATED_AT);
} else {
@@ -424,7 +424,7 @@ class AddressTableMap extends TableMap
$criteria->addSelectColumn($alias . '.COUNTRY_ID');
$criteria->addSelectColumn($alias . '.PHONE');
$criteria->addSelectColumn($alias . '.CELLPHONE');
$criteria->addSelectColumn($alias . '.DEFAULT');
$criteria->addSelectColumn($alias . '.IS_DEFAULT');
$criteria->addSelectColumn($alias . '.CREATED_AT');
$criteria->addSelectColumn($alias . '.UPDATED_AT');
}

View File

@@ -27,19 +27,30 @@ use Thelia\Model\ConfigQuery;
class URL
{
public static function getIndexPage() {
return ConfigQuery::read('base_url', '/') . "index_dev.php"; // FIXME !
}
/**
* Returns the Absolute URL for a given path relative to web root
* Returns the Absolute URL for a given path relative to web root. By default,
* the index.php (or index_dev.php) script name is added to the URL, use
* $path_only = true to get a path without the index script.
*
* @param string $path the relative path
* @param mixed $parameters An array of parameters
* @param array $parameters An array of parameters
* @param boolean $path_only if true, getIndexPage() will not be added
*
* @return string The generated URL
*/
public static function absoluteUrl($path, array $parameters = array())
public static function absoluteUrl($path, array $parameters = array(), $path_only = false)
{
// Already absolute ?
if (substr($path, 0, 4) != 'http')
$base = ConfigQuery::read('base_url', '/') . ltrim($path, '/');
if (substr($path, 0, 4) != 'http') {
$root = $path_only ? ConfigQuery::read('base_url', '/') : self::getIndexPage();
$base = $root . $path;
}
else
$base = $path;
@@ -49,7 +60,9 @@ class URL
$queryString = sprintf("%s=%s&", urlencode($name), urlencode($value));
}
if ('' !== $queryString = rtrim($queryString, "&")) $queryString = '?' . $queryString;
$sepChar = strstr($base, '?') === false ? '?' : '&';
if ('' !== $queryString = rtrim($queryString, "&")) $queryString = $sepChar . $queryString;
return $base . $queryString;
}
@@ -63,7 +76,8 @@ class URL
* @return string The generated URL
*/
public static function viewUrl($viewName, array $parameters = array()) {
$path = sprintf("%s?view=%s", ConfigQuery::read('base_url', '/'), $viewName);
$path = sprintf("%s?view=%s", self::getIndexPage(), $viewName);
return self::absoluteUrl($path, $parameters);
}

View File

@@ -7,3 +7,4 @@ Variables Config à initialiser:
- base_admin_template : chemin du template admin relatif au repertoire template (ex. admin/default)
- default_locale : la locale par défaut (ex. en_US), à utiliser pour les fichiers de traduction
- asset_dir_from_web_root : le chemin relatif à /web du repertoires des assets (ex. assets)
- active_template: chemin du template front relatif au repertoire template (ex. default)

View File

@@ -491,7 +491,7 @@ CREATE TABLE `address`
`country_id` INTEGER NOT NULL,
`phone` VARCHAR(20),
`cellphone` VARCHAR(20),
`default` TINYINT DEFAULT 0,
`is_default` TINYINT DEFAULT 0,
`created_at` DATETIME,
`updated_at` DATETIME,
PRIMARY KEY (`id`),

View File

@@ -359,7 +359,7 @@
<column name="country_id" required="true" type="INTEGER" />
<column name="phone" size="20" type="VARCHAR" />
<column name="cellphone" size="20" type="VARCHAR" />
<column defaultValue="0" name="default" type="TINYINT" />
<column defaultValue="0" name="is_default" type="TINYINT" />
<foreign-key foreignTable="customer" name="fk_address_customer_id" onDelete="CASCADE" onUpdate="RESTRICT">
<reference foreign="id" local="customer_id" />
</foreign-key>

View File

@@ -1,4 +1,4 @@
{check_auth context="admin" roles="ROLE_ADMIN" login_url="login"}
{check_auth context="admin" roles="ROLE_ADMIN" login_tpl="/admin/login"}
{$page_title={intl l='Home'}}
{include file='includes/header.inc.html'}

View File

@@ -14,14 +14,14 @@
<h1>{intl l='Thelia Back Office'}</h1>
{form name="thelia.admin.login" success_url="home" error_url="login"}
<form action="checklogin" method="post" class="well form-inline" {form_enctype form=$form}>
<form action="{url path='/admin/checklogin'}" method="post" class="well form-inline" {form_enctype form=$form}>
{if isset($message)}<div class="alert alert-error">{$message}</div>{/if}
{form_hidden_fields form=$form}
{form_field form=$form field='success_url'}
<input type="hidden" name="{$name}" value="{url path='admin'}" /> {* on success, redirect to /admin *}
<input type="hidden" name="{$name}" value="{url path='/admin'}" /> {* on success, redirect to /admin *}
{/form_field}
{form_field form=$form field='username'}

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

View File

@@ -1,7 +1,31 @@
{include file="includes/header.html"}
{form name="thelia.customer.creation"}
<form method="post" action="index_dev.php?action=createCustomer&view=connexion" {form_enctype form=$form} >
{* We use $index_page as form action to avoid mixing post and get data *}
<form action="{$index_page}" method="post" {form_enctype form=$form}>
{*
The two fields below are not par of the Login form, they are here to defines
the action to process, and the view to render once the form is submited
*}
<input type="hidden" name="action" value="createCustomer" /> {* the action triggered by this form *}
<input type="hidden" name="view" value="connexion" /> {* the view to return to if the form cannot be validated *}
{*
This field is common to all BaseForm instances (thus, this one), and defines
the URL the customer is redirected to once the form has been successfully
processed
*}
{form_field form=$form field='success_url'}
<input type="hidden" name="{$name}" value="{$return_to_url}" /> {* the url the user is redirected to on login success *}
{/form_field}
{*
customer_creation_error_message is defined in Customer action processor class,
and passed the parser through the ParserContext service.
*}
{if isset($customer_creation_error_message)}<div class="alert alert-error">{$customer_creation_error_message}</div>{/if}
{form_hidden_fields form=$form}

View File

@@ -1,2 +0,0 @@
include 1 success<br />
#INCLUDE "subinclude1.html"

View File

@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<title>{$page_title|default:{intl l="Thelia II"}}</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
{stylesheets file='../assets/css/*' filters='less,cssembed'}
<link rel="stylesheet" href="{$asset_url}">
{/stylesheets}
</head>
<body>
<div>
{loop type="auth" name="customer_info_block" roles="ROLE_CUSTOMER" context="front"}
<p>Your are logged in ! <a href="{viewurl view='index' action='logoutCustomer'}">Logout</a></p>
{/loop}
{loop type="auth" name="admin_info_block" roles="ROLE_ADMIN" context="admin"}
<p>You are logged as administrator</p>
{/loop}
{elseloop rel="customer_info_block"}
You are not logged in. <a href="{viewurl view='login'}">Login now</a> or <a href="{viewurl view='connexion'}">create your account</a>
{/elseloop}
</div>
<hr />

View File

@@ -1,26 +1,151 @@
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div>TODO write content<br />
<THELIA_cat type="category">
#__COUNT__ - #TITLE <br />
nb child : #NB_CHILD <br /><br />
</THELIA_cat>
{include file="includes/header.html"}
<div>
<TEST_equal test="equal" variable="3" value="1">
test vrai
</TEST_equal>
test faux
<//TEST_equal>
<br />
<REPEAT_loopy start="6" end="12" increment="1">
Compteur = #INDEX<br />
</REPEAT_loopy>
{loop type="auth" name="auth_test" context="front" roles="ROLE_CUSTOMER"}
<p>Customer is authentified :-)</p>
{/loop}
{elseloop rel="auth_test"}
<p>Customer is not authentified :-(</p>
{/elseloop}
An image from asset directory :
{images file='assets/img/logo-thelia-34px.png'}<img src="{$asset_url}" alt="{intl l='Thelia, solution e-commerce libre'}" />{/images}
</div>
<div>
{intl l='An internationalized string'}
</div>
<div>
jQuery data: <span id="jquery_block"></span>
</div>
<div>
<p>Category loop example</p>
<ul>
{loop type="category" name="catloop1"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}, children: {$NB_CHILD}
{ifloop rel="inner1"}
<ul>
{loop type="category" name="inner1" parent="{$ID}"}
<li>Sub cat {$ID} (parent is {$PARENT}): {$TITLE}</li>
{/loop}
</ul>
{/ifloop}
</li>
{/loop}
</ul>
</div>
<div>
<p>Conditional example #1</p>
{ifloop rel="catloop2"}
Hey ! Loop catloop2 is not empty:
<ul>
{loop type="category" name="catloop2" parent="12"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}</li>
{/loop}
</ul>
{/ifloop}
{elseloop rel="catloop2"}
<p>Loop catloop2 is empty</p>
{/elseloop}
</div>
<div>
<p>Conditional example #2</p>
{ifloop rel="catloop3"}
Loop catloop3 is not empty:
<ul>
{loop type="category" name="catloop3" parent="0"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}</li>
{/loop}
</ul>
{/ifloop}
{elseloop rel="catloop3"}
<p>Loop catloop3 is empty</p>
{/elseloop}
{elseloop rel="catloop2"}
<p>... but catloop2 is still empty :-)</p>
{/elseloop}
</div>
</body>
</html>
<div>
<p>Traditional for loop</p>
{for $index=5 to 12 step 1}
Compteur = {$index}<br />
{/for}
</div>
<div>
<p>Some pagination</p>
<p>PAGE 1</p>
<ul>
{loop type="category" name="catloopwithpagination1" limit="2" page="1"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}</li>
{/loop}
</ul>
<p>PAGE 2</p>
<ul>
{loop type="category" name="catloopwithpagination2" limit="2" page="2"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}</li>
{/loop}
</ul>
<p>PAGE 1000</p>
<ul>
{loop type="category" name="catloopwithpagination1000" limit="2" page="1000"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}</li>
{/loop}
{elseloop rel="catloopwithpagination1000"}
NO RESULTS
{/elseloop}
</ul>
</div>
<div>
<p>Some pagination with page choice</p>
{assign var=current_page value=2}
<p>PAGE {$current_page} :</p>
<ul>
{loop type="category" name="catloopwithpaginationchoice" limit="2" page="{$current_page}"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}</li>
{/loop}
</ul>
<p>page choice</p>
{pageloop rel="catloopwithpaginationchoice"}
{if ${PAGE} != {$current_page}}
{if {$PAGE} > {$current_page}-10 AND {$PAGE} < {$current_page}+10}
{$PAGE}
{/if}
{if {$PAGE} == {$current_page}-10 OR {$PAGE} == {$current_page}+10}
...
{/if}
{if ({$PAGE} < {$current_page}-10 OR {$PAGE} > {$current_page}+10) AND ({$PAGE}%10 == 0 OR ${PAGE} == {$LAST} OR ${PAGE} == 1)}
{$PAGE}
{/if}
{else}
{ {$PAGE} }
{/if}
{if {$PAGE} != {$LAST}}
-
{/if}
{/pageloop}
</div>
{include file="includes/footer.html"}

View File

@@ -0,0 +1,52 @@
{include file="includes/header.html"}
<h1>{intl l='Please login'}</h1>
{form name="thelia.customer.login" }
{* We use $index_page as form action to avoid mixing post and get data *}
<form action="{$index_page}" method="post" {form_enctype form=$form}>
{*
The two fields below are not par of the Login form, they are here to defines
the action to process, and the view to render once the form is submited
*}
<input type="hidden" name="action" value="loginCustomer" /> {* the action triggered by this form *}
<input type="hidden" name="view" value="login" /> {* the view to return to if the form cannot be validated *}
{*
This field is common to all BaseForm instances (thus, this one), and defines
the URL the customer is redirected to once the form has been successfully
processed
*}
{form_field form=$form field='success_url'}
<input type="hidden" name="{$name}" value="{$return_to_url}" /> {* the url the user is redirected to on login success *}
{/form_field}
{*
customer_login_error_message is defined in Customer action processor class,
and passed the parser through the ParserContext service.
*}
{if isset($customer_login_error_message)}<div class="alert alert-error">{$customer_login_error_message}</div>{/if}
{form_hidden_fields form=$form}
{form_field form=$form field="email"}
{if #error}{#message}{/if}
<label>{intl l="Your e-mail address"}: </label><input type="email" name="{$name}" {$attr} ><br />
{/form_field}
{form_field form=$form field='password'}
<label>{intl l="Your password"}: </label><input type="password" name="{$name}" {$attr}> <br />
{/form_field}
{form_field form=$form field='remember_me'}
<label class="checkbox"> <input type="checkbox" name="{$name}" value="{$value}" {$attr} {if $options.checked}checked="checked"{/if}/> {intl l='Remember me'}</label>
{/form_field}
<button type="submit">{intl l='Login'}</button>
</form>
{/form}
{include file='includes/footer.html'}

View File

@@ -0,0 +1,6 @@
{check_auth context="front" roles="ROLE_CUSTOMER" login_tpl="login"}
{$page_title="{intl l='My Account'}"}
{include file="includes/header.html"}
{include file="includes/footer.html"}

View File

@@ -1 +0,0 @@
subinclude1 success

View File

@@ -1,11 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>{$page_title|default:{intl l="Thelia II"}}</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
{stylesheets file='../assets/css/*' filters='less,cssembed'}
<link rel="stylesheet" href="{$asset_url}">
{/stylesheets}
</head>
<body>

View File

@@ -1,151 +0,0 @@
{include file="includes/header.html"}
<div>
{loop type="auth" name="auth_test" context="front" roles="ROLE_CUSTOMER"}
<p>Customer is authentified :-)</p>
{/loop}
{elseloop rel="auth_test"}
<p>Customer is not authentified :-(</p>
{/elseloop}
An image from asset directory :
{images file='assets/img/logo-thelia-34px.png'}<img src="{$asset_url}" alt="{intl l='Thelia, solution e-commerce libre'}" />{/images}
</div>
<div>
{intl l='An internationalized string'}
</div>
<div>
jQuery data: <span id="jquery_block"></span>
</div>
<div>
<p>Category loop example</p>
<ul>
{loop type="category" name="catloop1"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}, children: {$NB_CHILD}
{ifloop rel="inner1"}
<ul>
{loop type="category" name="inner1" parent="{$ID}"}
<li>Sub cat {$ID} (parent is {$PARENT}): {$TITLE}</li>
{/loop}
</ul>
{/ifloop}
</li>
{/loop}
</ul>
</div>
<div>
<p>Conditional example #1</p>
{ifloop rel="catloop2"}
Hey ! Loop catloop2 is not empty:
<ul>
{loop type="category" name="catloop2" parent="12"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}</li>
{/loop}
</ul>
{/ifloop}
{elseloop rel="catloop2"}
<p>Loop catloop2 is empty</p>
{/elseloop}
</div>
<div>
<p>Conditional example #2</p>
{ifloop rel="catloop3"}
Loop catloop3 is not empty:
<ul>
{loop type="category" name="catloop3" parent="0"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}</li>
{/loop}
</ul>
{/ifloop}
{elseloop rel="catloop3"}
<p>Loop catloop3 is empty</p>
{/elseloop}
{elseloop rel="catloop2"}
<p>... but catloop2 is still empty :-)</p>
{/elseloop}
</div>
<div>
<p>Traditional for loop</p>
{for $index=5 to 12 step 1}
Compteur = {$index}<br />
{/for}
</div>
<div>
<p>Some pagination</p>
<p>PAGE 1</p>
<ul>
{loop type="category" name="catloopwithpagination1" limit="2" page="1"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}</li>
{/loop}
</ul>
<p>PAGE 2</p>
<ul>
{loop type="category" name="catloopwithpagination2" limit="2" page="2"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}</li>
{/loop}
</ul>
<p>PAGE 1000</p>
<ul>
{loop type="category" name="catloopwithpagination1000" limit="2" page="1000"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}</li>
{/loop}
{elseloop rel="catloopwithpagination1000"}
NO RESULTS
{/elseloop}
</ul>
</div>
<div>
<p>Some pagination with page choice</p>
{assign var=current_page value=2}
<p>PAGE {$current_page} :</p>
<ul>
{loop type="category" name="catloopwithpaginationchoice" limit="2" page="{$current_page}"}
<li>{$LOOP_COUNT}/{$LOOP_TOTAL} : {$ID} {$TITLE}</li>
{/loop}
</ul>
<p>page choice</p>
{pageloop rel="catloopwithpaginationchoice"}
{if ${PAGE} != {$current_page}}
{if {$PAGE} > {$current_page}-10 AND {$PAGE} < {$current_page}+10}
{$PAGE}
{/if}
{if {$PAGE} == {$current_page}-10 OR {$PAGE} == {$current_page}+10}
...
{/if}
{if ({$PAGE} < {$current_page}-10 OR {$PAGE} > {$current_page}+10) AND ({$PAGE}%10 == 0 OR ${PAGE} == {$LAST} OR ${PAGE} == 1)}
{$PAGE}
{/if}
{else}
{ {$PAGE} }
{/if}
{if {$PAGE} != {$LAST}}
-
{/if}
{/pageloop}
</div>
{include file="includes/footer.html"}