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();
 | |
|   }
 | |
| }
 |