Part-DB.Part-DB-server/src/Controller/LabelController.php

156 lines
6.4 KiB
PHP
Raw Normal View History

2020-04-14 11:07:07 +02:00
<?php
2022-11-29 21:21:26 +01:00
/*
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
2020-05-10 21:39:31 +02:00
declare(strict_types=1);
2020-04-14 11:07:07 +02:00
/**
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
2022-11-29 22:28:53 +01:00
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
2020-04-14 11:07:07 +02:00
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace App\Controller;
2020-04-16 19:56:30 +02:00
use App\Entity\Base\AbstractDBElement;
use App\Entity\LabelSystem\LabelOptions;
2020-04-14 11:07:07 +02:00
use App\Entity\LabelSystem\LabelProfile;
2023-06-12 23:39:30 +02:00
use App\Entity\LabelSystem\LabelSupportedElement;
use App\Exceptions\TwigModeException;
2020-04-16 19:56:30 +02:00
use App\Form\LabelSystem\LabelDialogType;
use App\Repository\DBElementRepository;
2020-04-16 19:56:30 +02:00
use App\Services\ElementTypeNameGenerator;
2020-04-14 11:07:07 +02:00
use App\Services\LabelSystem\LabelGenerator;
use App\Services\Misc\RangeParser;
2020-04-16 19:56:30 +02:00
use Doctrine\ORM\EntityManagerInterface;
2022-08-14 19:32:53 +02:00
use InvalidArgumentException;
2020-04-14 11:07:07 +02:00
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormError;
2020-04-16 19:56:30 +02:00
use Symfony\Component\HttpFoundation\Request;
2020-08-21 22:43:37 +02:00
use Symfony\Component\HttpFoundation\Response;
2020-04-14 11:07:07 +02:00
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
2020-04-14 11:07:07 +02:00
2023-05-28 01:21:05 +02:00
#[Route(path: '/label')]
2020-04-14 11:07:07 +02:00
class LabelController extends AbstractController
{
public function __construct(protected LabelGenerator $labelGenerator, protected EntityManagerInterface $em, protected ElementTypeNameGenerator $elementTypeNameGenerator, protected RangeParser $rangeParser, protected TranslatorInterface $translator)
2020-04-14 11:07:07 +02:00
{
}
2023-05-28 01:21:05 +02:00
#[Route(path: '/dialog', name: 'label_dialog')]
#[Route(path: '/{profile}/dialog', name: 'label_dialog_profile')]
2020-08-21 22:43:37 +02:00
public function generator(Request $request, ?LabelProfile $profile = null): Response
2020-04-16 19:56:30 +02:00
{
2020-05-04 23:21:58 +02:00
$this->denyAccessUnlessGranted('@labels.create_labels');
//If we inherit a LabelProfile, the user need to have access to it...
2023-06-11 14:55:06 +02:00
if ($profile instanceof LabelProfile) {
2020-05-04 23:21:58 +02:00
$this->denyAccessUnlessGranted('read', $profile);
}
2023-06-11 14:55:06 +02:00
$label_options = $profile instanceof LabelProfile ? $profile->getOptions() : new LabelOptions();
2020-04-16 19:56:30 +02:00
//We have to disable the options, if twig mode is selected and user is not allowed to use it.
2023-06-12 23:39:30 +02:00
$disable_options = 'twig' === $label_options->getProcessMode() && !$this->isGranted('@labels.use_twig');
$form = $this->createForm(LabelDialogType::class, null, [
'disable_options' => $disable_options,
]);
2020-04-16 19:56:30 +02:00
//Try to parse given target_type and target_id
2023-06-12 23:39:30 +02:00
$target_type = $request->query->getEnum('target_type', LabelSupportedElement::class, null);
2020-04-16 19:56:30 +02:00
$target_id = $request->query->get('target_id', null);
$generate = $request->query->getBoolean('generate', false);
2023-06-12 23:39:30 +02:00
if (!$profile instanceof LabelProfile && $target_type instanceof LabelSupportedElement) {
2020-04-16 19:56:30 +02:00
$label_options->setSupportedElement($target_type);
}
if (is_string($target_id)) {
$form['target_id']->setData($target_id);
2020-04-16 19:56:30 +02:00
}
$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
2023-06-11 14:55:06 +02:00
if (($form->isSubmitted() && $form->isValid()) || ($generate && !$form->isSubmitted() && $profile instanceof LabelProfile)) {
$target_id = (string) $form->get('target_id')->getData();
$targets = $this->findObjects($form_options->getSupportedElement(), $target_id);
if ($targets !== []) {
try {
$pdf_data = $this->labelGenerator->generateLabel($form_options, $targets);
$filename = $this->getLabelName($targets[0], $profile);
} catch (TwigModeException $exception) {
$form->get('options')->get('lines')->addError(new FormError($exception->getMessage()));
}
} else {
//$this->addFlash('warning', 'label_generator.no_entities_found');
$form->get('target_id')->addError(
new FormError($this->translator->trans('label_generator.no_entities_found'))
);
}
2020-04-16 19:56:30 +02:00
}
2023-05-28 01:21:05 +02:00
return $this->render('label_system/dialog.html.twig', [
'form' => $form,
2020-04-16 19:56:30 +02:00
'pdf_data' => $pdf_data,
'filename' => $filename,
'profile' => $profile,
2020-04-16 19:56:30 +02:00
]);
}
protected function getLabelName(AbstractDBElement $element, ?LabelProfile $profile = null): string
{
2020-05-10 21:39:31 +02:00
$ret = 'label_'.$this->elementTypeNameGenerator->getLocalizedTypeLabel($element);
2020-04-16 19:56:30 +02:00
$ret .= $element->getID();
2020-05-10 21:39:31 +02:00
return $ret.'.pdf';
2020-04-16 19:56:30 +02:00
}
2023-06-12 23:39:30 +02:00
protected function findObjects(LabelSupportedElement $type, string $ids): array
2020-04-16 19:56:30 +02:00
{
$id_array = $this->rangeParser->parse($ids);
/** @var DBElementRepository $repo */
2023-06-12 23:39:30 +02:00
$repo = $this->em->getRepository($type->getEntityClass());
2020-05-10 21:39:31 +02:00
return $repo->getElementsFromIDArray($id_array);
2020-04-16 19:56:30 +02:00
}
2020-05-10 21:39:31 +02:00
}