From fc49767503159037f1f3814b1e369c24186fc67b Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Tue, 18 May 2021 11:07:06 +0200 Subject: [PATCH] add additional domains for navigation --- core/Entity/Site/Navigation.php | 29 +++++++-- .../Site/NavigationAdditionalDomainType.php | 55 +++++++++++++++++ core/Form/Site/NavigationType.php | 15 +++++ .../form/bootstrap_4_form_theme.html.twig | 1 - .../site/navigation_admin/_form.html.twig | 59 ++++++++++++++++++- core/Router/SiteRouteLoader.php | 26 +++++++- 6 files changed, 175 insertions(+), 10 deletions(-) create mode 100644 core/Form/Site/NavigationAdditionalDomainType.php diff --git a/core/Entity/Site/Navigation.php b/core/Entity/Site/Navigation.php index 79195f3..2a0536a 100644 --- a/core/Entity/Site/Navigation.php +++ b/core/Entity/Site/Navigation.php @@ -22,32 +22,37 @@ class Navigation implements EntityInterface * @ORM\GeneratedValue * @ORM\Column(type="integer") */ - private $id; + protected $id; /** * @ORM\Column(type="string", length=255) */ - private $label; + protected $label; /** * @ORM\Column(type="string", length=255) */ - private $code; + protected $code; /** * @ORM\Column(type="string", length=255) */ - private $domain; + protected $domain; + + /** + * @ORM\Column(type="text", nullable=true) + */ + protected $additionalDomains = []; /** * @ORM\OneToMany(targetEntity=Menu::class, mappedBy="navigation") */ - private $menus; + protected $menus; /** * @ORM\Column(type="string", length=10) */ - private $locale = 'en'; + protected $locale = 'en'; public function __construct() { @@ -95,6 +100,18 @@ class Navigation implements EntityInterface return $this; } + public function getAdditionalDomains(): array + { + return (array) json_decode($this->additionalDomains, true); + } + + public function setAdditionalDomains(array $additionalDomains): self + { + $this->additionalDomains = json_encode($additionalDomains); + + return $this; + } + /** * @return Collection|Menu[] */ diff --git a/core/Form/Site/NavigationAdditionalDomainType.php b/core/Form/Site/NavigationAdditionalDomainType.php new file mode 100644 index 0000000..bf58ba3 --- /dev/null +++ b/core/Form/Site/NavigationAdditionalDomainType.php @@ -0,0 +1,55 @@ +add( + 'domain', + TextType::class, + [ + 'label' => 'Domain', + 'required' => true, + 'help' => 'Regular expression: do not add the delimiter', + 'attr' => [ + ], + 'constraints' => [ + new NotBlank(), + ], + ] + ); + + $builder->add( + 'type', + ChoiceType::class, + [ + 'label' => 'Type', + 'required' => true, + 'choices' => [ + 'Domain' => 'domain', + 'Regular expression' => 'regexp', + ], + 'attr' => [ + ], + 'constraints' => [ + new NotBlank(), + ], + ] + ); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + ]); + } +} diff --git a/core/Form/Site/NavigationType.php b/core/Form/Site/NavigationType.php index 291c7a0..4adb99b 100644 --- a/core/Form/Site/NavigationType.php +++ b/core/Form/Site/NavigationType.php @@ -9,6 +9,8 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Validator\Constraints\Length; use Symfony\Component\Validator\Constraints\NotBlank; +use App\Core\Form\Site\NavigationAdditionalDomainType; +use Symfony\Component\Form\Extension\Core\Type\CollectionType; class NavigationType extends AbstractType { @@ -56,6 +58,19 @@ class NavigationType extends AbstractType ] ); + $builder->add( + 'additionalDomains', + CollectionType::class, + [ + 'entry_type' => NavigationAdditionalDomainType::class, + 'label' => 'Additional domains', + 'by_reference' => false, + 'allow_add' => true, + 'allow_delete' => true, + 'prototype' => true, + ] + ); + $builder->add( 'locale', TextType::class, diff --git a/core/Resources/views/form/bootstrap_4_form_theme.html.twig b/core/Resources/views/form/bootstrap_4_form_theme.html.twig index 10ab5c0..7228c94 100644 --- a/core/Resources/views/form/bootstrap_4_form_theme.html.twig +++ b/core/Resources/views/form/bootstrap_4_form_theme.html.twig @@ -38,7 +38,6 @@ {% endblock %} {% block collection_block_widget %} -
{% for item in form.value %}
diff --git a/core/Resources/views/site/navigation_admin/_form.html.twig b/core/Resources/views/site/navigation_admin/_form.html.twig index f684b15..10aa00d 100644 --- a/core/Resources/views/site/navigation_admin/_form.html.twig +++ b/core/Resources/views/site/navigation_admin/_form.html.twig @@ -1,12 +1,69 @@
- {% for item in ['label', 'domain', 'locale', 'code'] %} + {% for item in ['label', 'locale', 'code'] %}
{{ form_row(form[item]) }}
{% endfor %} + +
+ {{ form_row(form.domain) }} +
+ + {% set collection_name = 'additional-domains' %} + {% set label_add = 'Add' %} + {% set label_delete = 'Delete' %} + +
+ {{ form_label(form.additionalDomains) }} + + {% for item in form.additionalDomains %} +
+
+ {% for child in item %} +
+ {{ form_row(child) }} +
+ {% endfor %} + +
+ + + {{ label_delete|trans }} + + +
+
+
+ {% endfor %} +
+
+ + {{ label_add|trans }} + +
+
+
+ {{ form_rest(form) }} +
diff --git a/core/Router/SiteRouteLoader.php b/core/Router/SiteRouteLoader.php index 662d61b..f76a3d1 100644 --- a/core/Router/SiteRouteLoader.php +++ b/core/Router/SiteRouteLoader.php @@ -70,6 +70,7 @@ class SiteRouteLoader extends Loader '_menu' => $menu->getId(), '_page' => $node->getPage() ? $node->getPage()->getId() : null, '_navigation' => $navigation->getId(), + 'domain' => $navigation->getDomain(), ]; foreach ($node->getParameters() as $parameter) { @@ -86,14 +87,35 @@ class SiteRouteLoader extends Loader $requirements['_locale'] = $navigation->getLocale(); + $additionalDomains = $navigation->getAdditionalDomains(); + + if (count($additionalDomains)) { + $host = '{domain}'; + $domains = [ + preg_quote($navigation->getDomain()), + ]; + + foreach ($additionalDomains as $additionalDomain) { + if ('domain' === $additionalDomain['type']) { + $domains[] = preg_quote($additionalDomain['domain']); + } elseif ('regexp' === $additionalDomain['type']) { + $domains[] = $additionalDomain['domain']; + } + } + + $requirements['domain'] = sprintf('(%s)', implode('|', $domains)); + } else { + $host = $navigation->getDomain(); + } + $url = $node->getUrl(); if (!$uniqueness[$navigation->getDomain()]) { $url = sprintf('/%s%s', $navigation->getLocale(), $url); } - $route = new Route($url, $defaults, $requirements); - $route->setHost($navigation->getDomain()); + $route = new Route($url, $defaults, $requirements, [], $host); + //$route->setHost($navigation->getDomain()); $routes->add($node->getRouteName(), $route); }