From c924b2a5bd4bd554e05ca01bd6546108382d1430 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Wed, 23 Oct 2013 18:02:04 +0200 Subject: [PATCH 1/3] create form for language url --- core/lib/Thelia/Config/Resources/config.xml | 1 + .../Thelia/Config/Resources/routing/admin.xml | 11 +++ .../Controller/Admin/LangController.php | 31 ++++++- core/lib/Thelia/Form/Lang/LangUrlForm.php | 86 +++++++++++++++++++ install/insert.sql | 3 +- templates/admin/default/languages.html | 49 +++++------ 6 files changed, 152 insertions(+), 29 deletions(-) create mode 100644 core/lib/Thelia/Form/Lang/LangUrlForm.php diff --git a/core/lib/Thelia/Config/Resources/config.xml b/core/lib/Thelia/Config/Resources/config.xml index da28af735..02a4b202b 100755 --- a/core/lib/Thelia/Config/Resources/config.xml +++ b/core/lib/Thelia/Config/Resources/config.xml @@ -155,6 +155,7 @@
+ diff --git a/core/lib/Thelia/Config/Resources/routing/admin.xml b/core/lib/Thelia/Config/Resources/routing/admin.xml index 19346ca1c..ad45941f8 100755 --- a/core/lib/Thelia/Config/Resources/routing/admin.xml +++ b/core/lib/Thelia/Config/Resources/routing/admin.xml @@ -953,6 +953,17 @@ Thelia\Controller\Admin\LangController::defaultBehaviorAction + + Thelia\Controller\Admin\LangController::domainAction + + + + Thelia\Controller\Admin\LangController::activateDomainAction + + + + Thelia\Controller\Admin\LangController::deactivateDomainAction + diff --git a/core/lib/Thelia/Controller/Admin/LangController.php b/core/lib/Thelia/Controller/Admin/LangController.php index 0b882579a..ec46412e9 100644 --- a/core/lib/Thelia/Controller/Admin/LangController.php +++ b/core/lib/Thelia/Controller/Admin/LangController.php @@ -231,7 +231,6 @@ class LangController extends BaseAdminController if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::UPDATE)) return $response; $error_msg = false; - $exception = false; $behaviorForm = new LangDefaultBehaviorForm($this->getRequest()); @@ -258,4 +257,34 @@ class LangController extends BaseAdminController // At this point, the form has error, and should be redisplayed. return $this->renderDefault(); } + + public function domainAction() + { + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::UPDATE)) return $response; + + $error_msg = false; + } + + public function activateDomainAction() + { + $this->domainActivation(1); + } + + public function deactivateDomainAction() + { + $this->domainActivation(0); + } + + private function domainActivation($activate) + { + if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::UPDATE)) return $response; + + $error_msg = false; + + ConfigQuery::create() + ->filterByName('one_domain_foreach_lang') + ->update(array('Value' => $activate)); + + $this->redirectToRoute('admin.configuration.languages'); + } } \ No newline at end of file diff --git a/core/lib/Thelia/Form/Lang/LangUrlForm.php b/core/lib/Thelia/Form/Lang/LangUrlForm.php new file mode 100644 index 000000000..ab4fd9fc1 --- /dev/null +++ b/core/lib/Thelia/Form/Lang/LangUrlForm.php @@ -0,0 +1,86 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Form\Lang; +use Symfony\Component\Validator\Constraints\NotBlank; +use Thelia\Form\BaseForm; +use Thelia\Model\LangQuery; + + +/** + * Class LangUrlForm + * @package Thelia\Form\Lang + * @author Manuel Raynaud + */ +class LangUrlForm extends BaseForm +{ + const LANG_PREFIX = 'url'; + + /** + * + * in this function you add all the fields you need for your Form. + * Form this you have to call add method on $this->formBuilder attribute : + * + * $this->formBuilder->add("name", "text") + * ->add("email", "email", array( + * "attr" => array( + * "class" => "field" + * ), + * "label" => "email", + * "constraints" => array( + * new \Symfony\Component\Validator\Constraints\NotBlank() + * ) + * ) + * ) + * ->add('age', 'integer'); + * + * @return null + */ + protected function buildForm() + { + foreach (LangQuery::create()->find() as $lang) { + $this->formBuilder->add( + self::LANG_PREFIX . $lang->getId(), + 'text', + array( + 'constraints' => array( + new NotBlank() + ), + "attr" => array( + "tag" => "url", + "url_id" => $lang->getId(), + ), + + ) + ); + } + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return 'thelia_language_url'; + } +} \ No newline at end of file diff --git a/install/insert.sql b/install/insert.sql index 1e83c666d..61decf7b2 100755 --- a/install/insert.sql +++ b/install/insert.sql @@ -29,7 +29,8 @@ INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updat ('thelia_customer_remember_me_cookie_expiration', 31536000, 0, 0, NOW(), NOW()), ('session_config.handlers', 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler', 0, 0, NOW(), NOW()), ('company_name','', 0, 0, NOW(), NOW()), -('contact_email','', 0, 0, NOW(), NOW()) +('contact_email','', 0, 0, NOW(), NOW()), +('one_domain_foreach_lang','0', 1, 1, NOW(), NOW()) ; diff --git a/templates/admin/default/languages.html b/templates/admin/default/languages.html index b1a0433da..72dbcdd43 100644 --- a/templates/admin/default/languages.html +++ b/templates/admin/default/languages.html @@ -116,45 +116,40 @@
-
{intl l="Association language/URL"}
- - - -
- - -
- - -
- -
- +
{intl l="Using a domain or subdomain for each language"}
+ {form name="thelia.lang.url"} + + {form_hidden_fields form=$form} + {form_tagged_fields form=$form tag='url'} + {if $attr_list.url_id} + {loop type="lang" name="lang.list" id=$attr_list.url_id backend_context="1"} - - - - - - - - - - + + + {/loop} + {/if} + {/form_tagged_fields} - +
{intl l="France"}
{intl l="English"}
{intl l="Spanish"}{$TITLE}
- + + {if $one_domain_per_lang == 0} + {intl l="activate"} + {else} + {intl l="deactivate"} + {/if} + +
- + {/form}
From a7796cf481d848ed97e20f56d7115625ac5df504 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Wed, 23 Oct 2013 19:04:49 +0200 Subject: [PATCH 2/3] manage lanf <=> url assignment --- core/lib/Thelia/Action/Lang.php | 13 ++++- .../Thelia/Config/Resources/routing/admin.xml | 2 +- .../Controller/Admin/LangController.php | 39 +++++++++++++ core/lib/Thelia/Core/Event/TheliaEvents.php | 23 ++++---- core/lib/Thelia/Form/Lang/LangUrlEvent.php | 46 +++++++++++++++ core/lib/Thelia/Form/Lang/LangUrlForm.php | 3 +- templates/admin/default/languages.html | 58 ++++++++++--------- 7 files changed, 142 insertions(+), 42 deletions(-) create mode 100644 core/lib/Thelia/Form/Lang/LangUrlEvent.php diff --git a/core/lib/Thelia/Action/Lang.php b/core/lib/Thelia/Action/Lang.php index da5a07197..1c74da3bd 100644 --- a/core/lib/Thelia/Action/Lang.php +++ b/core/lib/Thelia/Action/Lang.php @@ -29,6 +29,7 @@ use Thelia\Core\Event\Lang\LangDeleteEvent; use Thelia\Core\Event\Lang\LangToggleDefaultEvent; use Thelia\Core\Event\Lang\LangUpdateEvent; use Thelia\Core\Event\TheliaEvents; +use Thelia\Form\Lang\LangUrlEvent; use Thelia\Model\ConfigQuery; use Thelia\Model\LangQuery; use Thelia\Model\Lang as LangModel; @@ -102,6 +103,15 @@ class Lang extends BaseAction implements EventSubscriberInterface ->update(array('Value' => $event->getDefaultBehavior())); } + public function langUrl(LangUrlEvent $event) + { + foreach($event->getUrl() as $id => $url){ + LangQuery::create() + ->filterById($id) + ->update(array('Url' => $url)); + } + } + /** * Returns an array of event names this subscriber wants to listen to. * @@ -129,7 +139,8 @@ class Lang extends BaseAction implements EventSubscriberInterface TheliaEvents::LANG_TOGGLEDEFAULT => array('toggleDefault', 128), TheliaEvents::LANG_CREATE => array('create', 128), TheliaEvents::LANG_DELETE => array('delete', 128), - TheliaEvents::LANG_DEFAULTBEHAVIOR => array('defaultBehavior', 128) + TheliaEvents::LANG_DEFAULTBEHAVIOR => array('defaultBehavior', 128), + TheliaEvents::LANG_URL => array('langUrl', 128) ); } } \ No newline at end of file diff --git a/core/lib/Thelia/Config/Resources/routing/admin.xml b/core/lib/Thelia/Config/Resources/routing/admin.xml index 42bb0eaba..8a6037844 100755 --- a/core/lib/Thelia/Config/Resources/routing/admin.xml +++ b/core/lib/Thelia/Config/Resources/routing/admin.xml @@ -966,7 +966,7 @@ Thelia\Controller\Admin\LangController::defaultBehaviorAction - + Thelia\Controller\Admin\LangController::domainAction diff --git a/core/lib/Thelia/Controller/Admin/LangController.php b/core/lib/Thelia/Controller/Admin/LangController.php index ec46412e9..9b6074955 100644 --- a/core/lib/Thelia/Controller/Admin/LangController.php +++ b/core/lib/Thelia/Controller/Admin/LangController.php @@ -36,6 +36,8 @@ use Thelia\Form\Exception\FormValidationException; use Thelia\Form\Lang\LangCreateForm; use Thelia\Form\Lang\LangDefaultBehaviorForm; use Thelia\Form\Lang\LangUpdateForm; +use Thelia\Form\Lang\LangUrlEvent; +use Thelia\Form\Lang\LangUrlForm; use Thelia\Model\ConfigQuery; use Thelia\Model\LangQuery; @@ -57,6 +59,13 @@ class LangController extends BaseAdminController public function renderDefault(array $param = array()) { + $data = array(); + foreach (LangQuery::create()->find() as $lang) { + $data[LangUrlForm::LANG_PREFIX.$lang->getId()] = $lang->getUrl(); + } + $langUrlForm = new LangUrlForm($this->getRequest(), 'form', $data); + $this->getParserContext()->addForm($langUrlForm); + return $this->render('languages', array_merge($param, array( 'lang_without_translation' => ConfigQuery::getDefaultLangWhenNoTranslationAvailable(), 'one_domain_per_lang' => ConfigQuery::read("one_domain_foreach_lang", false) @@ -263,6 +272,36 @@ class LangController extends BaseAdminController if (null !== $response = $this->checkAuth(AdminResources::LANGUAGE, AccessManager::UPDATE)) return $response; $error_msg = false; + $langUrlForm = new LangUrlForm($this->getRequest()); + + try { + $form = $this->validateForm($langUrlForm); + + $data = $form->getData(); + $event = new LangUrlEvent(); + foreach ($data as $key => $value) { + $pos= strpos($key, LangUrlForm::LANG_PREFIX); + if(false !== strpos($key, LangUrlForm::LANG_PREFIX)) { + $event->addUrl(substr($key,strlen(LangUrlForm::LANG_PREFIX)), $value); + } + } + + $this->dispatch(TheliaEvents::LANG_URL, $event); + + $this->redirectToRoute('admin.configuration.languages'); + } catch (FormValidationException $ex) { + // Form cannot be validated + $error_msg = $this->createStandardFormValidationErrorMessage($ex); + } catch (\Exception $ex) { + // Any other error + $error_msg = $ex->getMessage(); + } + + $this->setupFormErrorContext( + $this->getTranslator()->trans("%obj creation", array('%obj' => 'Lang')), $error_msg, $langUrlForm, $ex); + + // At this point, the form has error, and should be redisplayed. + return $this->renderDefault(); } public function activateDomainAction() diff --git a/core/lib/Thelia/Core/Event/TheliaEvents.php b/core/lib/Thelia/Core/Event/TheliaEvents.php index 22e5a1841..8327cc3c3 100755 --- a/core/lib/Thelia/Core/Event/TheliaEvents.php +++ b/core/lib/Thelia/Core/Event/TheliaEvents.php @@ -697,20 +697,21 @@ final class TheliaEvents /************ LANG MANAGEMENT ****************************/ - const LANG_UPDATE = 'action.lang.update'; - const LANG_CREATE = 'action.lang.create'; - const LANG_DELETE = 'action.lang.delete'; + const LANG_UPDATE = 'action.lang.update'; + const LANG_CREATE = 'action.lang.create'; + const LANG_DELETE = 'action.lang.delete'; - const LANG_DEFAULTBEHAVIOR = 'action.lang.defaultBehavior'; + const LANG_DEFAULTBEHAVIOR = 'action.lang.defaultBehavior'; + const LANG_URL = 'action.lang.url'; - const LANG_TOGGLEDEFAULT = 'action.lang.toggleDefault'; + const LANG_TOGGLEDEFAULT = 'action.lang.toggleDefault'; - const BEFORE_UPDATELANG = 'action.lang.beforeUpdate'; - const AFTER_UPDATELANG = 'action.lang.afterUpdate'; + const BEFORE_UPDATELANG = 'action.lang.beforeUpdate'; + const AFTER_UPDATELANG = 'action.lang.afterUpdate'; - const BEFORE_CREATELANG = 'action.lang.beforeCreate'; - const AFTER_CREATELANG = 'action.lang.afterCreate'; + const BEFORE_CREATELANG = 'action.lang.beforeCreate'; + const AFTER_CREATELANG = 'action.lang.afterCreate'; - const BEFORE_DELETELANG = 'action.lang.beforeDelete'; - const AFTER_DELETELANG = 'action.lang.afterDelete'; + const BEFORE_DELETELANG = 'action.lang.beforeDelete'; + const AFTER_DELETELANG = 'action.lang.afterDelete'; } diff --git a/core/lib/Thelia/Form/Lang/LangUrlEvent.php b/core/lib/Thelia/Form/Lang/LangUrlEvent.php new file mode 100644 index 000000000..de8248c81 --- /dev/null +++ b/core/lib/Thelia/Form/Lang/LangUrlEvent.php @@ -0,0 +1,46 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Form\Lang; +use Thelia\Core\Event\ActionEvent; + + +/** + * Class LangUrlEvent + * @package Thelia\Form\Lang + * @author Manuel Raynaud + */ +class LangUrlEvent extends ActionEvent +{ + protected $url = array(); + + public function addUrl($id, $url) + { + $this->url[$id] = $url; + } + + public function getUrl() + { + return $this->url; + } +} \ No newline at end of file diff --git a/core/lib/Thelia/Form/Lang/LangUrlForm.php b/core/lib/Thelia/Form/Lang/LangUrlForm.php index ab4fd9fc1..ec9837329 100644 --- a/core/lib/Thelia/Form/Lang/LangUrlForm.php +++ b/core/lib/Thelia/Form/Lang/LangUrlForm.php @@ -34,7 +34,7 @@ use Thelia\Model\LangQuery; */ class LangUrlForm extends BaseForm { - const LANG_PREFIX = 'url'; + const LANG_PREFIX = 'url_'; /** * @@ -69,6 +69,7 @@ class LangUrlForm extends BaseForm "attr" => array( "tag" => "url", "url_id" => $lang->getId(), + "url_title" => $lang->getTitle() ), ) diff --git a/templates/admin/default/languages.html b/templates/admin/default/languages.html index 72dbcdd43..5fe0c9e61 100644 --- a/templates/admin/default/languages.html +++ b/templates/admin/default/languages.html @@ -118,36 +118,38 @@
{intl l="Using a domain or subdomain for each language"}
{form name="thelia.lang.url"} -
+ {form_hidden_fields form=$form} - - - {form_tagged_fields form=$form tag='url'} - {if $attr_list.url_id} - {loop type="lang" name="lang.list" id=$attr_list.url_id backend_context="1"} - - - - - {/loop} - {/if} - {/form_tagged_fields} - - - - - + + +
{$TITLE}
- {if $one_domain_per_lang == 0} - {intl l="activate"} - {else} - {intl l="deactivate"} - {/if} + + + {form_tagged_fields form=$form tag='url'} + {if $attr_list.url_id} + + + + + {/if} + {/form_tagged_fields} + + + + + - - -
{$attr_list.url_title} +
+ +
+
+ {if $one_domain_per_lang == 0} + {intl l="activate"} + {else} + {intl l="deactivate"} + {/if} - -
+ +
{/form} From bfbb9c46dbd33616b0d4e9709daf3552795ab796 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Wed, 23 Oct 2013 19:21:30 +0200 Subject: [PATCH 3/3] hide default_lang_without_translation config parameter --- install/insert.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/insert.sql b/install/insert.sql index 61decf7b2..89454096b 100755 --- a/install/insert.sql +++ b/install/insert.sql @@ -8,7 +8,7 @@ INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updat ('session_config.default', '1', 1, 1, NOW(), NOW()), ('verifyStock', '1', 0, 0, NOW(), NOW()), ('active-template', 'default', 0, 0, NOW(), NOW()), -('default_lang_without_translation', '1', 0, 0, NOW(), NOW()), +('default_lang_without_translation', '1', 1, 1, NOW(), NOW()), ('rewriting_enable', '0', 0, 0, NOW(), NOW()), ('imagine_graphic_driver', 'gd', 0, 0, NOW(), NOW()), ('default_images_quality_percent', '75', 0, 0, NOW(), NOW()),