gmarche/src/Framework/Actions/CrudAction.php

256 lines
7.6 KiB
PHP

<?php
namespace Framework\Actions;
use App\Gmarche\Table\AntenneTable;
use Framework\Database\Hydrator;
use Framework\Database\Table;
use Framework\Renderer\RendererInterface;
use Framework\Router;
use Framework\Session\FlashService;
use Framework\Validator;
use App\Product\Entity\Product;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface as Request;
class CrudAction
{
/**
* @var RendererInterface
*/
private $renderer;
/**
* @var Router
*/
private $router;
/**
* @var Table
*/
protected $table;
/**
* @var AntenneTable
*/
protected $table2;
/**
* @var FlashService
*/
private $flash;
/**
* @var string
*/
protected $viewPath;
/**
* @var string
*/
protected $routePrefix;
/**
* @var string
*/
protected $messages = [
'create' => "L'élément truc a bien été créé", /* truc sera remplacé par le vrai nom ensuite */
'edit' => "L'élément truc a bien été modifié", /* truc sera remplacé par le vrai nom ensuite */
'delete' => "L'élément truc a bien été supprimé" /* truc sera remplacé par le vrai nom ensuite */
];
/**
* @var array
*/
protected $acceptedParams = [];
use RouterAwareAction;
public function __construct(
RendererInterface $renderer,
Router $router,
Table $table,
FlashService $flash
) {
$this->renderer = $renderer;
$this->router = $router;
$this->table = $table;
$this->flash = $flash;
}
public function __invoke(Request $request)
{
$this->renderer->addGlobal('viewPath', $this->viewPath);
$this->renderer->addGlobal('routePrefix', $this->routePrefix);
if ($request->getMethod() === 'DELETE') {
return $this->delete($request);
}
if (substr((string)$request->getUri(), -3) === 'new') {
return $this->create($request);
}
if ($request->getAttribute('id')) {
return $this->edit($request);
}
return $this->index($request);
}
/**
* Affiche la liste des éléments
* @param Request $request
* @return string
*/
public function index(Request $request): string
{
$params = $request->getQueryParams();
$items = $this->table->findAll()->paginate(12, $params['p'] ?? 1);
return $this->renderer->render($this->viewPath . '/index', compact('items'));
}
/**
* Edite un élément
* @param Request $request
* @return ResponseInterface|string
*/
public function edit(Request $request)
{
$id = (int)$request->getAttribute('id');
$item = $this->table->find($id);
$antenne = $item->antenneId;
if ($request->getMethod() === 'POST') {
$validator = $this->getValidator($request);
if ($validator->isValid()) {
$this->table->update($id, $this->prePersist($request, $item));
$this->postPersist($request, $item);
// On récupère le nom du produit pour l'afficher dans le message de success
$requete = $this->prePersist($request, $item);
$occurrence = $requete['name'];
$message_edit = $this->messages['edit'];
$message_edit = str_replace('truc', "'".$occurrence."'", $message_edit );
$this->flash->success($message_edit);
$region = $request->getAttribute('region');
$slug = $request->getAttribute('slug');
return $this->redirect($this->routePrefix . '.index',compact('region','slug','antenne' ));
}
$errors = $validator->getErrors();
Hydrator::hydrate($request->getParsedBody(), $item);
}
$errors = $errors ?? '';
return $this->renderer->render(
$this->viewPath . '/edit',
$this->formParams(compact('item', 'errors'))
);
}
/**
* Crée un nouvel élément
* @param Request $request
* @return ResponseInterface|string
*/
public function create(Request $request)
{
$item = $this->getNewEntity();
if ($request->getMethod() === 'POST') {
$validator = $this->getValidator($request);
if ($validator->isValid()) {
$this->table->insert($this->prePersist($request, $item));
$region = $request->getAttribute('region');
$slug = $request->getAttribute('slug');
$antenne = $request->getParsedBody()['antenne_id'];
$this->postPersist($request, $item);
// On récupère le nom du produit pour l'afficher dans le message de success
$requete = $this->prePersist($request, $item);
$occurrence = $requete['name'];
$message_create = $this->messages['create'];
$message_create = str_replace('truc', "'".$occurrence."'", $message_create );
$this->flash->success($this->messages['create']);
return $this->redirect($this->routePrefix . '.index',compact('region','slug','antenne' ));
}
Hydrator::hydrate($request->getParsedBody(), $item);
$errors = $validator->getErrors();
}
$errors = $errors ?? '';
return $this->renderer->render(
$this->viewPath . '/create',
$this->formParams(compact('item', 'errors'))
);
}
/**
* Action de suppression
*
* @param Request $request
* @return ResponseInterface
*/
public function delete(Request $request)
{
$this->table->delete($request->getAttribute('id'));
$region = $request->getAttribute('region');
$slug = $request->getAttribute('slug');
$antenne = $request->getParsedBody()['antenne_id'];
// On récupère le nom du produit pour l'afficher dans le message de success
$occurrence = $request->getParsedBody()['produit_name'];
$message_delete = $this->messages['delete'];
$message_delete = str_replace('truc', "'".$occurrence."'", $message_delete );
$this->flash->success($message_delete);
return $this->redirect($this->routePrefix . '.index',compact('region','slug','antenne' ));
}
/**
* Filtre les paramètres reçus par la requête
*
* @param Request $request
* @return array
*/
protected function prePersist(Request $request, $item): array
{
return array_filter(array_merge($request->getParsedBody(), $request->getUploadedFiles()), function ($key) {
return in_array($key, $this->acceptedParams);
}, ARRAY_FILTER_USE_KEY);
}
/**
* Permet d'effectuer un traitement après la persistence
* @param Request $request
* @param $item
*/
protected function postPersist(Request $request, $item): void
{
}
/**
* Génère le validateur pour valider les données
*
* @param Request $request
* @return Validator
*/
protected function getValidator(Request $request)
{
return new Validator(array_merge($request->getParsedBody(), $request->getUploadedFiles()));
}
/**
* Génère une nouvelle entité pour l'action de création
*
* @return mixed
*/
protected function getNewEntity()
{
$entity = $this->table->getEntity();
return new $entity();
}
/**
* Permet de traiter les paramètres à envoyer à la vue
*
* @param $params
* @return array
*/
protected function formParams(array $params): array
{
return $params;
}
}