87 lines
2.4 KiB
PHP
87 lines
2.4 KiB
PHP
<?php
|
|
namespace nur\v\base;
|
|
|
|
use nur\b\ValueException;
|
|
use nur\F;
|
|
use nur\str;
|
|
|
|
trait TActionSupport {
|
|
/**
|
|
* @return string nom du paramètre qui contient l'action à effectuer.
|
|
* retourner null pour désactiver le support des actions
|
|
*/
|
|
protected function ACTION_PARAM(): ?string {
|
|
return static::ACTION_PARAM;
|
|
}
|
|
|
|
/** @return array liste des actions valides */
|
|
protected function VALID_ACTIONS(): ?array {
|
|
return static::VALID_ACTIONS;
|
|
}
|
|
|
|
/** @var string|false action à déclencher manuellement */
|
|
private $doAction;
|
|
|
|
function doAction(string $action): void {
|
|
$this->doAction = $action;
|
|
}
|
|
|
|
/** obtenir l'action demandée par l'utilisateur */
|
|
protected function getAction(): ?string {
|
|
$action = $this->doAction;
|
|
if ($action === false) return null;
|
|
if ($action === null) {
|
|
$actionParam = $this->ACTION_PARAM();
|
|
if ($actionParam === null) return null;
|
|
$action = F::get($actionParam);
|
|
}
|
|
return $action;
|
|
}
|
|
|
|
/** vérifier si $action est une action valide */
|
|
protected function isValidAction(string $action): bool {
|
|
if ($action === $this->doAction) return true;
|
|
$validActions = $this->VALID_ACTIONS();
|
|
return $validActions !== null && in_array($action, $validActions);
|
|
}
|
|
|
|
/** retourner true si on va déclencher une action */
|
|
protected function willDispatchAction(): bool {
|
|
if ($this->doAction === false) return false;
|
|
$action = $this->getAction();
|
|
return $action !== null && $this->isValidAction($action);
|
|
}
|
|
|
|
private $actionDispatched = false;
|
|
private $actionCompleted = true;
|
|
function dispatchAction(bool $dispatch=true): void {
|
|
if ($this->actionDispatched) return;
|
|
if ($dispatch) {
|
|
$action = $this->getAction();
|
|
if ($action !== null) {
|
|
if (!$this->isValidAction($action)) {
|
|
throw ValueException::invalid_value($action, "action");
|
|
}
|
|
$method = str_replace("-", "_", $action) . "_action";
|
|
$method = str::us2camel($method);
|
|
$retval = $this->$method();
|
|
$this->actionCompleted = $retval !== false;
|
|
}
|
|
} else {
|
|
$this->doAction = false;
|
|
}
|
|
$this->actionDispatched = true;
|
|
}
|
|
|
|
function haveContent(): bool {
|
|
return parent::haveContent() && (
|
|
!$this->actionCompleted || !$this->willDispatchAction()
|
|
);
|
|
}
|
|
|
|
function afterSetup(): void {
|
|
$this->dispatchAction();
|
|
parent::afterSetup();
|
|
}
|
|
}
|