diff --git a/src/DataTables/AssemblyDataTable.php b/src/DataTables/AssemblyDataTable.php index f3854ebc..745a62b6 100644 --- a/src/DataTables/AssemblyDataTable.php +++ b/src/DataTables/AssemblyDataTable.php @@ -109,14 +109,13 @@ final class AssemblyDataTable implements DataTableTypeInterface $this->csh->add('referencedAssemblies', TextColumn::class, [ 'label' => $this->translator->trans('assembly.referencedAssembly.labelp'), 'render' => function ($value, Assembly $context): string { - $assemblies = $context->getReferencedAssemblies(); + $assemblies = $context->getAllReferencedAssembliesRecursive($context); $max = 5; $tmp = ""; for ($i = 0; $i < min($max, count($assemblies)); $i++) { - $url = $this->urlGenerator->infoURL($assemblies[$i]); - $tmp .= sprintf('%s', $url, htmlspecialchars($assemblies[$i]->getName())); + $tmp .= $this->assemblyDataTableHelper->renderName($assemblies[$i]); if ($i < count($assemblies) - 1) { $tmp .= ", "; } diff --git a/src/Entity/AssemblySystem/Assembly.php b/src/Entity/AssemblySystem/Assembly.php index 5ce060d8..cb6e94de 100644 --- a/src/Entity/AssemblySystem/Assembly.php +++ b/src/Entity/AssemblySystem/Assembly.php @@ -393,20 +393,37 @@ class Assembly extends AbstractStructuralDBElement } /** - * Get all referenced assemblies which uses this assembly. + * Get all assemblies and sub-assemblies recursive that are referenced in the assembly bom entries. * - * @return Assembly[] all referenced assemblies which uses this assembly as a one-dimensional array of assembly objects + * @param Assembly $assembly Assembly, which is to be processed recursively. + * @param array $processedAssemblies (optional) a list of the already edited assemblies to avoid circulatory references. + * @return Assembly[] A flat list of all recursively found assemblies. */ - public function getReferencedAssemblies(): array + public function getAllReferencedAssembliesRecursive(Assembly $assembly, array &$processedAssemblies = []): array { $assemblies = []; - foreach($this->bom_entries as $entry) { - if ($entry->getReferencedAssembly() !== null) { - $assemblies[] = $entry->getReferencedAssembly(); + // Avoid circular references + if (in_array($assembly, $processedAssemblies, true)) { + return $assemblies; + } + + // Add the current assembly to the processed + $processedAssemblies[] = $assembly; + + // Iterate by the bom entries of the current assembly + foreach ($assembly->getBomEntries() as $bomEntry) { + if ($bomEntry->getReferencedAssembly() !== null) { + $referencedAssembly = $bomEntry->getReferencedAssembly(); + + $assemblies[] = $referencedAssembly; + + // Continue recursively to process sub-assemblies + $assemblies = array_merge($assemblies, $this->getAllReferencedAssembliesRecursive($referencedAssembly, $processedAssemblies)); } } return $assemblies; } + } diff --git a/templates/assemblies/info/info.html.twig b/templates/assemblies/info/info.html.twig index d787ea08..09817386 100644 --- a/templates/assemblies/info/info.html.twig +++ b/templates/assemblies/info/info.html.twig @@ -64,18 +64,18 @@ {% block card_content %}
-
- {% include "assemblies/info/_part.html.twig" %} -
{% include "assemblies/info/_info.html.twig" %}
+
+ {% include "assemblies/info/_part.html.twig" %} +
{% include "assemblies/info/_builds.html.twig" %}