256 lines
7.6 KiB
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;
|
|
}
|
|
}
|