src/Common/Controllers/CrmCrudAbstractController.php line 47

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Common\Controllers;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\{
  6.     Response,
  7.     JsonResponse
  8. };
  9. use App\Common\Controllers\CrmAbstractController;
  10. use Doctrine\DBAL\DBALException;
  11. use App\Entity\Campaign;
  12. abstract class CrmCrudAbstractController extends CrmAbstractController
  13. {
  14.     private const TEMPLATE_INDEX 'index.html.twig';
  15.     private const TEMPLATE_LISTING '_listing.html.twig';
  16.     private const TEMPLATE_ADD 'add.html.twig';
  17.     protected const MODE_INDEX 1;
  18.     protected const MODE_LISTING 2;
  19.     protected const MODE_EXPORT 3;
  20.     protected function getList(
  21.         Request $request,
  22.         int $mode,
  23.         object $service,
  24.         bool $listing false,
  25.         array $params = [],
  26.         array $filters = [],
  27.         ?string $defaultTemplate null
  28.     ): Response {
  29.         $session $request->getSession(); // MOVE TO PARENT
  30.         //$filters = [];
  31.         $this->setRequestFilters($filters$request$mode);
  32.         $items = (true === $this->useIndexMode)
  33.             ? $service->getList($mode, ...$filters)
  34.             : $service->getList(...$filters)
  35.         ;
  36.         if ($mode === self::MODE_INDEX) {
  37.             if (true === $this->hasPagin) {
  38.                 $currentPage = (int) $session->get($this->modulePrefix '_currentPage'0);
  39.                 $params array_merge(
  40.                     $params, [
  41.                         'itemsPerPage' => $this->getParameter('paging_items_per_page_25'),
  42.                         'currentPage' => $currentPage,
  43.                     ]
  44.                 );
  45.                 $data = [
  46.                     'itemsCount' => (true === $this->useIndexMode) ? $items['itemsCount'] : count(json_decode($items)),
  47.                 ];
  48.                 if (
  49.                     $request->query->getInt('setKeyword') === 1
  50.                     //&& $request->query->get('keyword') !== ''
  51.                 ) { //(true === $request->isXmlHttpRequest()) {
  52.                     return new JsonResponse($data);
  53.                 }
  54.             } else {
  55.                 $data = ['items' => $items,];
  56.             }
  57.         }
  58.         $template = (true === $request->isXmlHttpRequest() || $mode === self::MODE_LISTING)
  59.             ? self::TEMPLATE_LISTING
  60.             self::TEMPLATE_INDEX
  61.         ;
  62.         if ($template === self::TEMPLATE_LISTING && null !== $defaultTemplate) {
  63.             $template $defaultTemplate;
  64.         }
  65.         if (true === $listing) {
  66.             return new Response($items);
  67.         }
  68.         if ($mode === self::MODE_LISTING) {
  69.             $data = ['items' => $items,];
  70.         }
  71.         return $this->render(
  72.             $this->moduleTemplate $template
  73.             array_merge($data$params)
  74.         );
  75.     }
  76.     private function setRequestFilters(&$filters$requestint $mode)
  77.     {
  78.         $campaign = (isset($filters[0]) && $filters[0] instanceof Campaign)
  79.             ? $filters[0]
  80.             : null
  81.         ;
  82.         if (true === $this->hasFilter) {
  83.             $filters array_merge($filtersparent::setKeyword($request$campaign));
  84.         }
  85.         $filters array_merge($filtersparent::setSort($request$campaign));
  86.         //$filters = array_merge($filters, [parent::getSearchCriteria($request)]);
  87.         if ($mode === self::MODE_LISTING && true === $this->hasPagin) {
  88.             $filters array_merge($filtersparent::setFromToPagination($request));
  89.         }
  90.     }
  91.     public function addEntity(
  92.         Request $request,
  93.         mixed $entity,
  94.         array $options = [],
  95.         array $extraFields = [],
  96.         bool $commit true,
  97.         array $params = [],
  98.         array $removeFields = [], 
  99.         ?bool $forceEditMode null,
  100.         ?string $template null
  101.     ): mixed {
  102.         $editMod true;
  103.         if (!$entity) {
  104.             $entity = new $this->entityClassName;
  105.             $editMod false;
  106.         }
  107.         if (null !== $forceEditMode) {
  108.             $editMod $forceEditMode;
  109.         }
  110.         $options array_merge([
  111.             'csrf_protection' => false,
  112.             'allow_extra_fields' => true,
  113.         ], $options);
  114.         $form $this->createForm(
  115.             $this->formClassName
  116.             $entity
  117.             $options
  118.         );
  119.         foreach ($removeFields as $value) {
  120.             $form->remove($value);
  121.         }
  122.         $form->handleRequest($request);
  123.         if ($form->isSubmitted()) { //  && $form->isValid()
  124.             // set extra attributes
  125.             $this->setEntityAttributes($entity$extraFields);
  126.             if (!$commit) {
  127.                 return [
  128.                     'entity' => $entity,
  129.                     'form' => $form,
  130.                 ];
  131.             }
  132.             if (!$form->isValid()) {
  133.                 // TODO REVIEW VALIDATION
  134.                 throw new \Exception('Error: Data is not valid');
  135.             }
  136.             $this->entityManager->persist($entity);
  137.             $this->entityManager->flush();
  138.             return $entity;
  139.         }
  140.         $temp = (null !== $template) ? $template self::TEMPLATE_ADD;
  141.         return $this->render(
  142.             $this->moduleTemplate $temp
  143.             array_merge([
  144.                     'form' => $form->createView(),
  145.                     'entity' => $entity
  146.                     'editMod' => $editMod
  147.                 ], 
  148.                 $params
  149.             )
  150.         );
  151.     }
  152.     private function setEntityAttributes(mixed $entity, array $extraFields = []): void
  153.     {
  154.         foreach ($extraFields as $key => $value) {
  155.             $setFuncName sprintf('set%s'ucfirst($key));
  156.             if (method_exists($entity$setFuncName)) {
  157.                 $entity->$setFuncName($value);
  158.             }
  159.         }
  160.     }
  161.     /**
  162.      * @throws DBALException
  163.      */
  164.     public function deleteEntity(mixed $entity): void
  165.     {
  166.         $this->entityManager->remove($entity);
  167.         $this->entityManager->flush();
  168.     }
  169. }