Fix: Admin taxon update: Cannot set child as parent to node

This commit is contained in:
Norbert Glanc 2025-10-02 12:26:35 +02:00
parent 717d8da6d1
commit 2519a88fec
39 changed files with 166 additions and 1 deletions

View file

@ -48,7 +48,7 @@
</form>
</div>
</div>
{{ tree.render(taxon.children) }}
{{ tree.render(taxon.children.toArray|filter(c => c.id != taxon.id)) }}
</li>
{% endfor %}
</ul>

View file

@ -38,5 +38,9 @@
<service id="sylius.generator.taxon_slug" class="Sylius\Component\Taxonomy\Generator\TaxonSlugGenerator" />
<service id="Sylius\Component\Taxonomy\Generator\TaxonSlugGeneratorInterface" alias="sylius.generator.taxon_slug" />
<service id="sylius.validator.taxon_parent" class="Sylius\Bundle\TaxonomyBundle\Validator\TaxonParentValidator">
<tag name="validator.constraint_validator" alias="sylius_taxon_parent_validator" />
</service>
</services>
</container>

View file

@ -13,6 +13,11 @@
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/services/constraint-mapping-1.0.xsd">
<class name="Sylius\Component\Taxonomy\Model\Taxon">
<constraint name="Sylius\Bundle\TaxonomyBundle\Validator\Constraints\TaxonParent">
<option name="groups">
<value>sylius</value>
</option>
</constraint>
<property name="translations">
<constraint name="Valid" />
</property>

View file

@ -14,6 +14,8 @@ sylius:
slug:
not_blank: يرجى إدخال الاسم المختصر للتصنيف.
unique: يجب أن يكون الاسم المختصر للتصنيف فريدًا.
parent:
is_invalid: 'لا يمكنك تعيين تصنيف فرعي كتصنيف رئيسي.'
taxonomy:
name:
max_length: يجب ألا يكون اسم التصنيف أطول من 255 حرفًا.

View file

@ -6,6 +6,8 @@ sylius:
name:
max_length: Назва катэгорыі не можа быць даўжэй за 255 сімвалаў.
not_blank: Калі ласка, увядзіце назву катэгорыі.
parent:
is_invalid: 'Немагчыма прызначыць падпарадкаваны таксон як бацькоўскі таксон.'
taxonomy:
name:
max_length: Назва катэгорыі не можа быць даўжэй за 255 сімвалаў.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Моля, въведете слъг на категорията.
unique: Слъг на категорията трябва да е уникален.
parent:
is_invalid: 'Не можете да зададете дъщерен таксон като родителски таксон.'
taxonomy:
name:
max_length: Името на категорията не трябва да бъде по-дълго от 255 знака.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Prosím vložte slug taxonu.
unique: Slug taxonu musí být unikátní.
parent:
is_invalid: 'Nelze přiřadit podřízený taxon jako nadřazený taxon.'
taxonomy:
name:
max_length: Název taxonomie nesmí být delší než 255 znaků.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Angiv taksonomi slug.
unique: Taksonomi slug skal være unik.
parent:
is_invalid: 'Du kan ikke tildele en underordnet taxon som en overordnet taxon.'
taxonomy:
name:
max_length: Taksonominavn må ikke være længere end 255 tegn.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Bitte eine Kategorie SEO-URL angeben.
unique: SEO-URL der Kategorie muss eindeutig sein.
parent:
is_invalid: 'Ein untergeordneter Taxon kann nicht als übergeordneter Taxon zugewiesen werden.'
taxonomy:
name:
max_length: Name darf nicht länger als 255 Zeichen sein.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Bitte eine Kategorie SEO-URL angeben.
unique: SEO-URL der Kategorie muss eindeutig sein.
parent:
is_invalid: 'Ein untergeordneter Taxon kann nicht als übergeordneter Taxon zugewiesen werden.'
taxonomy:
name:
max_length: Name darf nicht länger als 255 Zeichen sein.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Παρακαλώ εισάγετε ένα μοναδικό αναγνωριστικό (slug) την ταξινομική κατηγορία.
unique: Υπάρχει ήδη ταξινομική κατηγορία με αυτό το αναγνωριστικό (slug).
parent:
is_invalid: 'Δεν μπορείτε να ορίσετε έναν θυγατρικό ταξινομικό όρο ως γονικό ταξινομικό όρο.'
taxonomy:
name:
max_length: Το όνομα ταξινομικής κατηγορίας δεν πρέπει να είναι μεγαλύτερο από 255 χαρακτήρες.

View file

@ -14,6 +14,8 @@ sylius:
slug:
not_blank: Please enter taxon slug.
unique: Taxon slug must be unique.
parent:
is_invalid: 'You cannot assign a child taxon as a parent taxon.'
taxonomy:
name:
max_length: Taxonomy name must not be longer than 255 characters.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Por favor, introduzca el slug del taxón.
unique: El slug del taxón debe ser único.
parent:
is_invalid: 'No se puede asignar un taxón hijo como taxón padre.'
taxonomy:
name:
max_length: El nombre de la taxonomía no debe ser más largo de 255 caracteres.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: لطفا علامت دسته را وارد کنید.
unique: علامت دسته باید یکتا باشد.
parent:
is_invalid: 'نمی‌توانید یک رده فرزند را به عنوان رده والد اختصاص دهید.'
taxonomy:
name:
max_length: رده نباید بیش از 255 حرف باشد.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Veuillez entrer le slug du taxon.
unique: Le slug du taxon doit être unique.
parent:
is_invalid: 'Vous ne pouvez pas attribuer un taxon enfant comme taxon parent.'
taxonomy:
name:
max_length: La taxonomie ne peux dépasser les 255 caractères.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Molimo unesite slug kategorije.
unique: Slug kategorije mora biti jedinstven.
parent:
is_invalid: 'Ne možete dodijeliti podređeni takson kao nadređeni takson.'
taxonomy:
name:
max_length: Naziv kategorije ne smije biti duži od 255 znakova.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Kérem adja meg a taxon url kompatibilis megnevezését.
unique: A taxon url kompatibilis megnevezésének egyedinek kell lennie.
parent:
is_invalid: 'Egy alárendelt taxont nem lehet szülő taxonként hozzárendelni.'
taxonomy:
name:
max_length: A taxonómia neve nem lehet hosszabb 255 karakternél.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Silahkan masukkan siput tanpa pamrih.
unique: Siput taksi harus unik.
parent:
is_invalid: 'Anda tidak dapat menetapkan takson anak sebagai takson induk.'
taxonomy:
name:
max_length: Nama taksonomi tidak boleh lebih dari 255 karakter.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Vinsamlega sláðu inn vefslóðarheiti vöruflokks.
unique: Vefslóðarheiti vöruflokks verður að vera einstakt.
parent:
is_invalid: 'Ekki er hægt að úthluta barnataxoni sem foreldrataxoni.'
taxonomy:
name:
max_length: Nafn flokkunarkerfis má ekki vera lengra en 255 stafir.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Inserisci lo il SEO-URL della classe tassa
unique: Il SEP-URL della classe tassa deve essere unico.
parent:
is_invalid: 'Non è possibile assegnare un taxon figlio come taxon genitore.'
taxonomy:
name:
max_length: Il nome della tassonomia non deve essere più lungo di 255 caratteri.

View file

@ -9,6 +9,8 @@ sylius:
name:
max_length: Taksono pavadinimas neturi būti ilgesnis nei 255 simboliai.
not_blank: Įveskite taksono pavadinimą.
parent:
is_invalid: 'Negalite priskirti vaikų taksono kaip tėvinio taksono.'
taxonomy:
name:
max_length: Taksonomijos pavadinimas neturi būti ilgesnis kaip 255 simboliai.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Таксоны эмхэлсэн холбоосыг оруулна уу.
unique: Таксоны эмхэлсэн холбоос давтагдашгүй байх ёстой.
parent:
is_invalid: 'Хүүхдийн таксоныг эцэг таксон болгон оноох боломжгүй.'
taxonomy:
name:
max_length: Таксонимийн нэр 255 тэмдэгтээс ихгүй байх ёстой.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Gelieve een korte naam in te vullen.
unique: Taxon korte naam moet uniek zijn.
parent:
is_invalid: 'U kunt geen kindtaxon toewijzen als een oudertaxis.'
taxonomy:
name:
max_length: Taxonomienaam mag niet langer zijn dan 255 karakters.

View file

@ -10,6 +10,8 @@ sylius:
name:
max_length: Taksonominavn kan ikke være lengre enn 255 tegn.
not_blank: Angi taksonominavn.
parent:
is_invalid: 'Du kan ikke tildele en barnetaxon som en foreldretaxon.'
taxonomy:
name:
max_length: Taksonominavn kan ikke være lengre enn 255 tegn.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Wprowadź fragment URL kategorii.
unique: Fragment URL kategorii musi być unikalny.
parent:
is_invalid: 'Nie można przypisać potomnego taksonu jako taksonu nadrzędnego.'
taxonomy:
name:
max_length: Nazwa taksonomii nie może być dłuższa niż 255 znaków.

View file

@ -10,6 +10,8 @@ sylius:
name:
max_length: O nome do táxon não deve ter mais que 255 caracteres.
not_blank: Por favor, digite o nome do táxon.
parent:
is_invalid: 'Não é possível atribuir um táxon filho como táxon pai.'
taxonomy:
name:
max_length: O nome da taxonomia não deve ter mais que 255 caracteres.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Por favor, digite o slug da Categoria.
unique: Slug da Categoria deve ser único.
parent:
is_invalid: 'Você não pode atribuir um táxon filho como táxon pai.'
taxonomy:
name:
max_length: Nome da Categoria não deve ser maior que 255 caracteres.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Vă rugăm să completați slugul taxonului.
unique: Valoarea din câmpul "slug" trebuie să fie unică.
parent:
is_invalid: 'Nu puteți atribui un taxon copil ca taxon părinte.'
taxonomy:
name:
max_length: Numele categorizării nu poate depăși 255 de caractere.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Пожалуйста, введите псевдоним для категории.
unique: Псевдоним для категории должен быть уникальным.
parent:
is_invalid: 'Нельзя назначить дочерний таксон в качестве родительского таксона.'
taxonomy:
name:
max_length: Название категории не должно быть длиннее 255 символов.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Prosím, zadajte "slug" kategórie.
unique: '"Slug" kategórie musí byť jedinečný.'
parent:
is_invalid: 'Nie je možné priradiť podriadený taxón ako nadradený taxón.'
taxonomy:
name:
max_length: Názov triedenia nesmie byť dlhší ako 255 znakov.

View file

@ -9,6 +9,8 @@ sylius:
name:
max_length: Ime taksona ne sme biti daljše od 255 znakov.
not_blank: Prosimo, vnesite ime taksona.
parent:
is_invalid: 'Podrejenega taksona ni mogoče dodeliti kot nadrejenega taksona.'
taxonomy:
name:
max_length: Ime taksonomije ne sme biti daljše od 255 znakov.

View file

@ -9,6 +9,8 @@ sylius:
name:
max_length: Emri i taksës nuk duhet të përmbajë më shumë se 255 karaktere.
not_blank: Fut emrin e taksës.
parent:
is_invalid: 'Nuk mund të caktoni një takson fëmijë si takson prind.'
taxonomy:
name:
max_length: Emri i kategorisë së taksimit nuk duhet të përmbajë më shumë se 255 karaktere.

View file

@ -5,3 +5,5 @@ sylius:
taxon:
code:
not_blank: Unesite taxon kod.
parent:
is_invalid: 'Није могуће доделити подређени таксон као надређени таксон.'

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: กรุณาใส่ Slug
unique: Slug ต้องไม่ซ้ำกัน
parent:
is_invalid: 'ไม่สามารถกำหนด taxon ลูกเป็น taxon พ่อแม่ได้'
taxonomy:
name:
max_length: ชื่อหมวดหมู่ต้องมีความยาวไม่เกิน 255 ตัวอักษร

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Lütfen kategori harf dizisi girin.
unique: Sınıf kütle birimi benzersiz olmalıdır.
parent:
is_invalid: 'Bir alt taksonu üst takson olarak atayamazsınız.'
taxonomy:
name:
max_length: Sınıflandırma adı 255 karakterden uzun olamaz.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: Будь ласка, введіть слаґ таксону.
unique: Слаґ таксону повинен бути унікальним.
parent:
is_invalid: 'Неможливо призначити дочірній таксон як батьківський таксон.'
taxonomy:
name:
max_length: Назва таксономії не має бути довшою за 255 символів.

View file

@ -13,6 +13,8 @@ sylius:
slug:
not_blank: 请输入分类标识。
unique: 分类标识必须是唯一的。
parent:
is_invalid: '不能将子分类指定为父分类。'
taxonomy:
name:
max_length: 分类名称不能超过 255 个字符。

View file

@ -0,0 +1,31 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Sylius\Bundle\TaxonomyBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
final class TaxonParent extends Constraint
{
public string $message = 'sylius.taxon.parent.is_invalid';
public function validatedBy()
{
return 'sylius_taxon_parent_validator';
}
public function getTargets(): string
{
return self::CLASS_CONSTRAINT;
}
}

View file

@ -0,0 +1,57 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Sylius\Bundle\TaxonomyBundle\Validator;
use Sylius\Bundle\TaxonomyBundle\Validator\Constraints\TaxonParent;
use Sylius\Component\Taxonomy\Model\TaxonInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Webmozart\Assert\Assert;
final class TaxonParentValidator extends ConstraintValidator
{
public function validate(mixed $value, Constraint $constraint): void
{
/** @var TaxonParent $constraint */
Assert::isInstanceOf($constraint, TaxonParent::class);
if (!$value instanceof TaxonInterface) {
return;
}
$taxon = $value;
$parent = $taxon->getParent();
if (null === $parent) {
return;
}
if ($parent === $taxon) {
$this->context
->buildViolation($constraint->message)
->atPath('parent')
->addViolation();
return;
}
if (null !== $taxon->getId() && null !== $parent->getId() && $taxon->getId() === $parent->getId()) {
$this->context
->buildViolation($constraint->message)
->atPath('parent')
->addViolation();
return;
}
}
}