<?php
declare(strict_types=1);
namespace App\Common\Controllers;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\{
Response,
JsonResponse
};
use App\Common\Controllers\CrmAbstractController;
use Doctrine\DBAL\DBALException;
use App\Entity\Campaign;
abstract class CrmCrudAbstractController extends CrmAbstractController
{
private const TEMPLATE_INDEX = 'index.html.twig';
private const TEMPLATE_LISTING = '_listing.html.twig';
private const TEMPLATE_ADD = 'add.html.twig';
protected const MODE_INDEX = 1;
protected const MODE_LISTING = 2;
protected const MODE_EXPORT = 3;
protected function getList(
Request $request,
int $mode,
object $service,
bool $listing = false,
array $params = [],
array $filters = [],
?string $defaultTemplate = null
): Response {
$session = $request->getSession(); // MOVE TO PARENT
//$filters = [];
$this->setRequestFilters($filters, $request, $mode);
$items = (true === $this->useIndexMode)
? $service->getList($mode, ...$filters)
: $service->getList(...$filters)
;
if ($mode === self::MODE_INDEX) {
if (true === $this->hasPagin) {
$currentPage = (int) $session->get($this->modulePrefix . '_currentPage', 0);
$params = array_merge(
$params, [
'itemsPerPage' => $this->getParameter('paging_items_per_page_25'),
'currentPage' => $currentPage,
]
);
$data = [
'itemsCount' => (true === $this->useIndexMode) ? $items['itemsCount'] : count(json_decode($items)),
];
if (
$request->query->getInt('setKeyword') === 1
//&& $request->query->get('keyword') !== ''
) { //(true === $request->isXmlHttpRequest()) {
return new JsonResponse($data);
}
} else {
$data = ['items' => $items,];
}
}
$template = (true === $request->isXmlHttpRequest() || $mode === self::MODE_LISTING)
? self::TEMPLATE_LISTING
: self::TEMPLATE_INDEX
;
if ($template === self::TEMPLATE_LISTING && null !== $defaultTemplate) {
$template = $defaultTemplate;
}
if (true === $listing) {
return new Response($items);
}
if ($mode === self::MODE_LISTING) {
$data = ['items' => $items,];
}
return $this->render(
$this->moduleTemplate . $template,
array_merge($data, $params)
);
}
private function setRequestFilters(&$filters, $request, int $mode)
{
$campaign = (isset($filters[0]) && $filters[0] instanceof Campaign)
? $filters[0]
: null
;
if (true === $this->hasFilter) {
$filters = array_merge($filters, parent::setKeyword($request, $campaign));
}
$filters = array_merge($filters, parent::setSort($request, $campaign));
//$filters = array_merge($filters, [parent::getSearchCriteria($request)]);
if ($mode === self::MODE_LISTING && true === $this->hasPagin) {
$filters = array_merge($filters, parent::setFromToPagination($request));
}
}
public function addEntity(
Request $request,
mixed $entity,
array $options = [],
array $extraFields = [],
bool $commit = true,
array $params = [],
array $removeFields = [],
?bool $forceEditMode = null,
?string $template = null
): mixed {
$editMod = true;
if (!$entity) {
$entity = new $this->entityClassName;
$editMod = false;
}
if (null !== $forceEditMode) {
$editMod = $forceEditMode;
}
$options = array_merge([
'csrf_protection' => false,
'allow_extra_fields' => true,
], $options);
$form = $this->createForm(
$this->formClassName,
$entity,
$options
);
foreach ($removeFields as $value) {
$form->remove($value);
}
$form->handleRequest($request);
if ($form->isSubmitted()) { // && $form->isValid()
// set extra attributes
$this->setEntityAttributes($entity, $extraFields);
if (!$commit) {
return [
'entity' => $entity,
'form' => $form,
];
}
if (!$form->isValid()) {
// TODO REVIEW VALIDATION
throw new \Exception('Error: Data is not valid');
}
$this->entityManager->persist($entity);
$this->entityManager->flush();
return $entity;
}
$temp = (null !== $template) ? $template : self::TEMPLATE_ADD;
return $this->render(
$this->moduleTemplate . $temp,
array_merge([
'form' => $form->createView(),
'entity' => $entity,
'editMod' => $editMod
],
$params
)
);
}
private function setEntityAttributes(mixed $entity, array $extraFields = []): void
{
foreach ($extraFields as $key => $value) {
$setFuncName = sprintf('set%s', ucfirst($key));
if (method_exists($entity, $setFuncName)) {
$entity->$setFuncName($value);
}
}
}
/**
* @throws DBALException
*/
public function deleteEntity(mixed $entity): void
{
$this->entityManager->remove($entity);
$this->entityManager->flush();
}
}