add additional domains for navigation

This commit is contained in:
Simon Vieille 2021-05-18 11:07:06 +02:00
parent d18b77c83a
commit fc49767503
6 changed files with 175 additions and 10 deletions

View file

@ -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[]
*/

View file

@ -0,0 +1,55 @@
<?php
namespace App\Core\Form\Site;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
class NavigationAdditionalDomainType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->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([
]);
}
}

View file

@ -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,

View file

@ -38,7 +38,6 @@
{% endblock %}
{% block collection_block_widget %}
<div data-collection="collection-{{ collection_name }}">
{% for item in form.value %}
<div data-collection-item="{{ loop.index }}">

View file

@ -1,12 +1,69 @@
<div class="row">
<div class="col-12 p-3">
<div class="row">
{% for item in ['label', 'domain', 'locale', 'code'] %}
{% for item in ['label', 'locale', 'code'] %}
<div class="col-12">
{{ form_row(form[item]) }}
</div>
{% endfor %}
<div class="col-12">
{{ form_row(form.domain) }}
</div>
{% set collection_name = 'additional-domains' %}
{% set label_add = 'Add' %}
{% set label_delete = 'Delete' %}
<div data-collection="collection-{{ collection_name }}" class="col-12">
{{ form_label(form.additionalDomains) }}
{% for item in form.additionalDomains %}
<div data-collection-item="{{ loop.index }}">
<div class="row">
{% for child in item %}
<div class="col-12 col-md-3 pr-3">
{{ form_row(child) }}
</div>
{% endfor %}
<div class="col-12 col-md-3">
<span data-collection-delete-container class="btn btn-sm btn-danger" style="margin-top: 2.1rem">
<span data-collection-delete="{{ loop.index }}">
{{ label_delete|trans }}
</span>
</span>
</div>
</div>
</div>
{% endfor %}
</div>
<div data-collection-add="collection-{{ collection_name }}" class="collection-add col-12">
<span class="btn btn-sm btn-primary" data-collection-add="collection-{{ collection_name }}">
{{ label_add|trans }}
</span>
</div>
<template type="text/template" id="collection-{{ collection_name }}">
<div data-collection-item="__name__">
<div class="row">
{% for child in form.additionalDomains.vars.prototype %}
<div class="col-12 col-md-3 pr-3">
{{ form_row(child) }}
</div>
{% endfor %}
<div class="col-12 col-md-3">
<span data-collection-delete-container class="btn btn-sm btn-danger" style="margin-top: 2.1rem">
{{ label_delete|trans }}
</span>
</div>
</div>
</div>
</template>
</div>
</div>
</div>
<div class="d-none">
{{ form_rest(form) }}
</div>

View file

@ -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);
}