. */ namespace App\Controller; use App\Entity\Base\AbstractStructuralDBElement; use App\Entity\Parts\Category; use App\Entity\Parts\Footprint; use App\Entity\Parts\Manufacturer; use App\Entity\Parts\MeasurementUnit; use App\Services\Trees\NodesListBuilder; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\ResponseEvent; use Symfony\Component\Routing\Annotation\Route; use Symfony\Contracts\Translation\TranslatorInterface; /** * @Route("/select_api") * @package App\Controller */ class SelectAPIController extends AbstractController { private $nodesListBuilder; private $translator; public function __construct(NodesListBuilder $nodesListBuilder, TranslatorInterface $translator) { $this->nodesListBuilder = $nodesListBuilder; $this->translator = $translator; } /** * @Route("/category", name="select_category") */ public function category(): Response { return $this->getResponseForClass(Category::class); } /** * @Route("/footprint", name="select_footprint") */ public function footprint(): Response { return $this->getResponseForClass(Footprint::class, true); } /** * @Route("/manufacturer", name="select_manufacturer") */ public function manufacturer(): Response { return $this->getResponseForClass(Manufacturer::class, true); } /** * @Route("/measurement_unit", name="select_measurement_unit") */ public function measurement_unit(): Response { return $this->getResponseForClass(MeasurementUnit::class, true); } protected function getResponseForClass(string $class, bool $include_empty = false): Response { $test_obj = new $class; $this->denyAccessUnlessGranted('read', $test_obj); $nodes = $this->nodesListBuilder->typeToNodesList($class); $json = $this->buildJSONStructure($nodes); if ($include_empty) { array_unshift($json, [ 'text' => '', 'value' => null, 'data-subtext' => $this->translator->trans('part_list.action.select_null'), ]); } return $this->json($json); } protected function buildJSONStructure(array $nodes_list): array { $entries = []; foreach ($nodes_list as $node) { /** @var AbstractStructuralDBElement $node */ $entry = [ 'text' => str_repeat('   ', $node->getLevel()) . htmlspecialchars($node->getName()), 'value' => $node->getID(), 'data-subtext' => $node->getParent() ? $node->getParent()->getFullPath() : null, ]; $entries[] = $entry; } return $entries; } }