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/config.xml b/core/lib/Thelia/Config/Resources/config.xml index 69874762a..06f2acf48 100755 --- a/core/lib/Thelia/Config/Resources/config.xml +++ b/core/lib/Thelia/Config/Resources/config.xml @@ -156,6 +156,7 @@
+ diff --git a/core/lib/Thelia/Config/Resources/routing/admin.xml b/core/lib/Thelia/Config/Resources/routing/admin.xml index d6c46af78..8a6037844 100755 --- a/core/lib/Thelia/Config/Resources/routing/admin.xml +++ b/core/lib/Thelia/Config/Resources/routing/admin.xml @@ -966,6 +966,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..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) @@ -231,7 +240,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 +266,64 @@ 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; + $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() + { + $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/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 new file mode 100644 index 000000000..ec9837329 --- /dev/null +++ b/core/lib/Thelia/Form/Lang/LangUrlForm.php @@ -0,0 +1,87 @@ +. */ +/* */ +/*************************************************************************************/ + +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(), + "url_title" => $lang->getTitle() + ), + + ) + ); + } + } + + /** + * @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..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()), @@ -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..5fe0c9e61 100644 --- a/templates/admin/default/languages.html +++ b/templates/admin/default/languages.html @@ -116,45 +116,42 @@
-
{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} + + + + + {/if} + {/form_tagged_fields} + + + + + + + +
{$attr_list.url_title} +
+ +
+
+ {if $one_domain_per_lang == 0} + {intl l="activate"} + {else} + {intl l="deactivate"} + {/if} -
- - -
- - -
- -
- - - - - - - - - - - - - - - - - - - - - -
{intl l="France"}
{intl l="English"}
{intl l="Spanish"}
- -
+ +
- + {/form}