add additional domains for navigation
This commit is contained in:
parent
d18b77c83a
commit
fc49767503
|
@ -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[]
|
||||
*/
|
||||
|
|
55
core/Form/Site/NavigationAdditionalDomainType.php
Normal file
55
core/Form/Site/NavigationAdditionalDomainType.php
Normal 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([
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
|
|
|
@ -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 }}">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue