Added functions to retrieve associated parts of an element within twig labels

This fixes #1239
This commit is contained in:
Jan Böhmer 2026-02-15 13:52:56 +01:00
parent 233c5e8550
commit aed2652f1d
3 changed files with 60 additions and 13 deletions

View file

@ -23,14 +23,18 @@ declare(strict_types=1);
namespace App\Twig\Sandbox;
use App\Entity\Base\AbstractPartsContainingDBElement;
use App\Entity\Parts\Part;
use App\Repository\AbstractPartsContainingRepository;
use App\Services\LabelSystem\LabelTextReplacer;
use Doctrine\ORM\EntityManagerInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;
class SandboxedLabelExtension extends AbstractExtension
{
public function __construct(private readonly LabelTextReplacer $labelTextReplacer)
public function __construct(private readonly LabelTextReplacer $labelTextReplacer, private readonly EntityManagerInterface $em)
{
}
@ -39,6 +43,11 @@ class SandboxedLabelExtension extends AbstractExtension
{
return [
new TwigFunction('placeholder', fn(string $text, object $label_target) => $this->labelTextReplacer->handlePlaceholderOrReturnNull($text, $label_target)),
new TwigFunction("associated_parts", $this->associatedParts(...)),
new TwigFunction("associated_parts_count", $this->associatedPartsCount(...)),
new TwigFunction("associated_parts_r", $this->associatedPartsRecursive(...)),
new TwigFunction("associated_parts_count_r", $this->associatedPartsCountRecursive(...)),
];
}
@ -48,4 +57,37 @@ class SandboxedLabelExtension extends AbstractExtension
new TwigFilter('placeholders', fn(string $text, object $label_target) => $this->labelTextReplacer->replace($text, $label_target)),
];
}
}
/**
* Returns all parts associated with the given element.
* @param AbstractPartsContainingDBElement $element
* @return Part[]
*/
public function associatedParts(AbstractPartsContainingDBElement $element): array
{
/** @var AbstractPartsContainingRepository $repo */
$repo = $this->em->getRepository($element::class);
return $repo->getParts($element);
}
public function associatedPartsCount(AbstractPartsContainingDBElement $element): int
{
/** @var AbstractPartsContainingRepository $repo */
$repo = $this->em->getRepository($element::class);
return $repo->getPartsCount($element);
}
public function associatedPartsRecursive(AbstractPartsContainingDBElement $element): array
{
/** @var AbstractPartsContainingRepository $repo */
$repo = $this->em->getRepository($element::class);
return $repo->getPartsRecursive($element);
}
public function associatedPartsCountRecursive(AbstractPartsContainingDBElement $element): int
{
/** @var AbstractPartsContainingRepository $repo */
$repo = $this->em->getRepository($element::class);
return $repo->getPartsCountRecursive($element);
}
}