diff --git a/app/src/Form/Mod/ModType.php b/app/src/Form/Mod/ModType.php index 4ada890..36ca00c 100644 --- a/app/src/Form/Mod/ModType.php +++ b/app/src/Form/Mod/ModType.php @@ -30,13 +30,12 @@ class ModType extends AbstractType $mods = $this->modRepository->findAvailableDependances($builder->getData()); } else{ - $mods = $this->modRepository->findAll(); + $mods = $this->modRepository->findBy(array(), array('nom' => 'ASC')); } $builder ->add('nom', TextType::class, [ - 'disabled' => $isEdit, 'label' => 'Nom du mod', 'required' => true, 'attr' => [ diff --git a/app/src/Repository/ModRepository.php b/app/src/Repository/ModRepository.php index e2dcf3d..a8ea7fd 100644 --- a/app/src/Repository/ModRepository.php +++ b/app/src/Repository/ModRepository.php @@ -24,7 +24,7 @@ class ModRepository extends ServiceEntityRepository { $excludedIds = []; if ($mod !== null) { - $excludedIds = $this->collectDependencyIds($mod, []); + $excludedIds = $this->collectDependentIds($mod, []); $excludedIds[] = $mod->getId(); } $qb = $this->createQueryBuilder('m'); @@ -63,6 +63,32 @@ class ModRepository extends ServiceEntityRepository return $ids; } + /** + * Collecte récursivement les IDs de tous les mods qui dépendent du mod donné + * (dépendances inverses, directes ou indirectes), via la relation `soumis`. + * + * @param int[] $visited IDs déjà visités (évite les boucles infinies) + * @return int[] + */ + private function collectDependentIds(Mod $mod, array $visited): array + { + $ids = []; + + foreach ($mod->getSoumis() as $dependent) { + $depId = $dependent->getId(); + + // Evite les boucles infinies en cas de dépendants cycliques + if (in_array($depId, $visited, true)) { + continue; + } + + $visited[] = $depId; + $ids[] = $depId; + $ids = array_merge($ids, $this->collectDependentIds($dependent, $visited)); + } + + return $ids; + } // /** // * @return Mod[] Returns an array of Mod objects