<?php
declare(strict_types=1);
namespace App\Common\Controllers;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\{
Request,
Response,
JsonResponse,
RequestStack
};
use Symfony\Component\HttpFoundation\Session\Session;
use Doctrine\Persistence\ManagerRegistry;
use App\Entity\Campaign;
abstract class CrmAbstractController extends AbstractController
{
protected ?string $entityClassName = null;
protected ?string $formClassName = null;
protected ?string $moduleService = null;
protected ?string $modulePrefix = null;
protected ?string $moduleTemplate = null;
protected bool $hasPagin = false;
protected ?array $defaultSort = [];
protected bool $hasFilter = true;
protected bool $useIndexMode = false;
protected object $entityManager;
public function __construct(ManagerRegistry $doctrine)
{
$this->entityManager = $doctrine->getManager();
$moduleDetails = $this->initModuleDetails();
$this->entityClassName = $moduleDetails['entityClassName'];
$this->formClassName = $moduleDetails['formClassName'] ?? null;
$this->moduleService = $moduleDetails['moduleService'] ?? null;
$this->modulePrefix = $moduleDetails['modulePrefix'] ?? null;
$this->moduleTemplate = $moduleDetails['moduleTemplate'] ?? null;
$this->hasPagin = $moduleDetails['hasPagin'] ?? false;
$this->defaultSort = $moduleDetails['defaultSort'] ?? null;
$this->hasFilter = $moduleDetails['hasFilter'] ?? true;
$this->useIndexMode = $moduleDetails['useIndexMode'] ?? false;
}
abstract protected function initModuleDetails();
protected function setKeyword(Request $request, ?Campaign $campaign = null): array
{
$session = $request->getSession();
$setKeyword = (bool) $request->get('setKeyword', 0);
$keyword = '';
$key = ($campaign)
? sprintf('%s_%d_keyword', $this->modulePrefix, $campaign->getId())
: sprintf('%s_keyword', $this->modulePrefix)
;
if (true === $setKeyword) {
$keyword = trim($request->get('keyword', ''));
$session->set($key, $keyword);
} elseif ($session->has($key)) {
$keyword = $session->get($key);
}
return [$keyword];
}
protected function setSort(Request $request, ?Campaign $campaign = null): array
{
$session = $request->getSession();
$params = [
'field' => $request->query->get('field', null),
'op' => $request->query->get('op', null),
];
$key = ($campaign)
? sprintf('%s_%d_sort', $this->modulePrefix, $campaign->getId())
: sprintf('%s_sort', $this->modulePrefix)
;
if (empty($params['field']) || empty($params['op'])) {
$params = $session->get($key);
if (empty($params['field']) || empty($params['op'])) {
if (isset($this->defaultSort) and is_array($this->defaultSort)) {
$params = $this->defaultSort;
}
}
} else {
$session->set($key, $params);
}
return [$params];
}
protected function csvExportResponse(
Request $request,
object $service,
string $filename,
?string $data = null,
?string $funcName = null
): Response {
if (!$data) {
$serviceFunction = ($funcName) ? $funcName : 'getList';
if (true === $this->hasFilter) {
$filters = $this->setKeyword($request);
}
$filters = array_merge($filters ?? [], $this->setSort($request));
$filters = array_merge($filters, [null, null]);
$filters = array_merge($filters, [true]);
$data = (true === $this->useIndexMode)
? $service->$serviceFunction(3, ...$filters)
: $service->$serviceFunction(...$filters)
;
$data = $service->getCsvExportData($data);
}
$response = new Response($data);
$response->headers->set('Content-Type', 'text/csv');
$response->headers->set('Content-Disposition', 'attachment; filename="'.$filename.'"');
$response->headers->set('charset', 'utf-8');
$response->setCharset('utf-8');
return $response;
}
protected function setItemsPerPage(Request $request, Session $session): void
{
$itemsPerPage = (int) $request->get('items_per_page', null);
if ($itemsPerPage) {
$session->set(
$this->modulePrefix . '_items_per_page',
$itemsPerPage
);
}
}
private function getItemsPerPage(Session $session): int
{
$itemsPerPage = ($session->has($this->modulePrefix . '_items_per_page'))
? (int) $session->get($this->modulePrefix . '_items_per_page')
: (int) $this->getParameter('paging_items_per_page_25')
;
return $itemsPerPage;
}
protected function setFromToPagination(Request $request): array
{
$session = $request->getSession();
$this->setItemsPerPage($request, $session);
$from = 0;
$to = $this->getItemsPerPage($session); // (int) $this->getParameter('paging_items_per_page_25');
$page = $request->get('page');
if (is_numeric($page)) {
$session->set($this->modulePrefix . '_currentPage', $page);
} elseif ($session->has($this->modulePrefix . '_currentPage')) {
$page = $session->get($this->modulePrefix . '_currentPage');
}
if($page > 0) {
$from = (int) $page * $to;
}
return [$from, $to];
}
/*protected function setItemsPerPage(Request $request)
{
$this->getItemsPerPage($request);
$set_items_per_page = (bool) $request->get('set_items_per_page', null);
if ($set_items_per_page) {
$session = $request->getSession();
$session->set(
$this->modulePrefix . '_itemsPerPage',
(int) $request->get('items_per_page')
);
}
}*/
}