<?php

abstract class aControlleurAction {

    private $suivant;

	public function getRegistre()
	{
		return Registre::getRegistre();
	}

    // Suivant
    public function getSuivant()
	{
		return $this->suivant;
	}
	public function setSuivant($s, $position = null)
	{
		if (is_array($s)){
			$this->suivant = $s;
		} else {
			if (!is_null($position)) {
				$tab_fin = array_slice($this->suivant, $position);
				$tab_deb = array_slice($this->suivant, 0, $position);
				$this->suivant = array_merge($tab_deb, array($s), $tab_fin);
			} else {
				$this->suivant[] = $s;
			}
		}
	}

	public function demarrer()
    {
		if (!is_null($this->getSuivant())) {
			// ATTENTION :
			// Il est important de laisser "count($this->getSuivant())" $this->getSuivant() peut varier de taille
			for ($i = 0; $i < count($this->getSuivant()) ; $i++) {
				//echo '<pre>'.print_r($this->getSuivant(), true).'</pre>';
				if ($this->getRegistre()->get('action_finale')) {
					// Si l'action met fin au script prématurément nous arrétons
					break;
				} else {
					$liste_actions = $this->getSuivant();
					//echo '<pre>'.print_r($liste_actions[$i], true).'</pre>';
					if ($liste_actions[$i] instanceof aControlleurAction) {
						$liste_actions[$i]->demarrer();
					} else {
						if (isset($_POST) || isset($_GET)) {
							// Méthode "vérifier" générale présente dans aControlleurAction
							$this->verifier();
							$methode_verif = 'verifier'.$liste_actions[$i];
							if (method_exists($this, $methode_verif)) {
								// Méthode "vérifier" spécifique à une action
								$this->$methode_verif();
							}
						}
						if ($liste_actions[$i] == '__defaut__') {
							$methode = 'executer';
						} else {
							$methode = 'executer'.$liste_actions[$i];
						}
						if (method_exists($this, $methode)) {
							$this->$methode();
						} else {
							$m = "La méthode $methode de la classe ".get_class($this)." est introuvable!";
	    					trigger_error($m, E_USER_ERROR);
						}
					}
				}
			}
		} else {
			$m = "Le registre ne  contient aucune action!";
    		trigger_error($m, E_USER_ERROR);
		}
    }

	public function verifier()
    {
    	// Nous rassemblons les valeurs du tableau _POST contenant des : dans des sous-tableau de _POST.
    	foreach ($_POST as $cle => $val) {
    		$morceau = array();
    		if (preg_match('/^(.+?)(:.+)+$/', $cle, $morceau)) {
    			$table = '';
    			foreach (explode(':', trim($morceau[2], ':')) as $c) {
    				$table .= '['.$c.']';
    			}
    			eval('$_POST[$morceau[1]]'.$table.' = $val;');
    			unset($_POST[$cle]);
    		}
    	}
    }

    abstract protected function executer();
}
?>