. */ namespace App\Controller; use App\Entity\Base\AbstractDBElement; use App\Entity\Contracts\NamedElementInterface; use App\Entity\LabelSystem\LabelOptions; use App\Entity\LabelSystem\LabelProfile; use App\Entity\Parts\Part; use App\Form\LabelOptionsType; use App\Form\LabelSystem\LabelDialogType; use App\Helpers\LabelResponse; use App\Repository\DBElementRepository; use App\Services\ElementTypeNameGenerator; use App\Services\LabelSystem\LabelGenerator; use App\Services\Misc\RangeParser; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Form\SubmitButton; use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\ResponseHeaderBag; use Symfony\Component\Routing\Annotation\Route; /** * @Route("/label") * @package App\Controller */ class LabelController extends AbstractController { protected $labelGenerator; protected $em; protected $elementTypeNameGenerator; protected $rangeParser; public function __construct(LabelGenerator $labelGenerator, EntityManagerInterface $em, ElementTypeNameGenerator $elementTypeNameGenerator, RangeParser $rangeParser) { $this->labelGenerator = $labelGenerator; $this->em = $em; $this->elementTypeNameGenerator = $elementTypeNameGenerator; $this->rangeParser = $rangeParser; } /** * @Route("/{profile}/{part}/view") */ public function view(LabelProfile $profile, Part $part) { $label = $this->labelGenerator->generateLabel($profile->getOptions(), $part); $response = new LabelResponse($label); $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE, 'label.pdf'); return $response; } /** * @Route("/dialog", name="label_dialog") * @Route("/{profile}/dialog", name="label_dialog_profile") */ public function generator(Request $request, ?LabelProfile $profile = null) { if ($profile) { $label_options = $profile->getOptions(); } else { $label_options = new LabelOptions(); } $form = $this->createForm(LabelDialogType::class); //Try to parse given target_type and target_id $target_type = $request->query->get('target_type', null); $target_id = $request->query->get('target_id', null); $generate = $request->query->getBoolean('generate', false); if ($profile === null && is_string($target_type)) { $label_options->setSupportedElement($target_type); } if (is_string($target_id)) { $form['target_id']->setData($target_id); } $form['options']->setData($label_options); $form->handleRequest($request); /** @var LabelOptions $form_options */ $form_options = $form['options']->getData(); $pdf_data = null; $filename = 'invalid.pdf'; //Generate PDF either when the form is submitted and valid, or the form was not submit yet, and generate is set if (($form->isSubmitted() && $form->isValid()) || ($generate && !$form->isSubmitted() && $profile !== null)) { $target_id = (string) $form->get('target_id')->getData(); $targets = $this->findObjects($form_options->getSupportedElement(), $target_id); $pdf_data = $this->labelGenerator->generateLabel($form_options, $targets); $filename = $this->getLabelName($targets[0], $profile); } return $this->render('LabelSystem/dialog.html.twig', [ 'form' => $form->createView(), 'pdf_data' => $pdf_data, 'filename' => $filename, ]); } protected function getLabelName(AbstractDBElement $element, ?LabelProfile $profile = null): string { $ret = 'label_' . $this->elementTypeNameGenerator->getLocalizedTypeLabel($element); $ret .= $element->getID(); return $ret . '.pdf'; } protected function findObjects(string $type, string $ids): array { if(!isset(LabelGenerator::CLASS_SUPPORT_MAPPING[$type])) { throw new \InvalidArgumentException('The given type is not known and can not be mapped to a class!'); } $id_array = $this->rangeParser->parse($ids); /** @var DBElementRepository $repo */ $repo = $this->em->getRepository(LabelGenerator::CLASS_SUPPORT_MAPPING[$type]); return $repo->getElementsFromIDArray($id_array); } }