isTrue();} } /** * * Classe con metodi (azioni) scatenabili su eventi personalizzabili e/o standard * @package myEvents */ abstract class myEventManager { /** @ignore */ private $Estop=-1,$EMsession,$Events=array(),$Epriorities=array(); /** @ignore */ private static $myEventManagerStatus=array(); function __construct(){ self::$myEventManagerStatus[spl_object_hash($this)]=new ArrayObject(array('class'=>get_class($this)),ArrayObject::ARRAY_AS_PROPS); $reflection = new ReflectionClass(get_class($this)); $aMethods = $reflection->getMethods(); $eventi=$this->Events; foreach ($aMethods as &$metodo) { if(preg_match('/^onGET(§([0-9]+))?$/U',$metodo->name,$p)) $this->addEvent(create_function('',"return count(\$_GET);"), $p[0], array(), max(0,intval($p[2])) ); elseif(preg_match('/^onPOST(§([0-9]+))?$/U',$metodo->name,$p)) $this->addEvent(create_function('',"return count(\$_POST);"), $p[0], array(), max(0,intval($p[2])) ); elseif(preg_match('/^onGET([A-Za-z0-9_§]+)(§([0-9]))?$/U',$metodo->name,$p)) $this->addEvent(create_function('',"return isset(\$_GET['{$p[1]}']);"), $p[0], array($_GET[$p[1]]), max(1,intval($p[3])) ); elseif(preg_match('/^onPOST([A-Za-z0-9_§]+)(§([0-9]))?$/U',$metodo->name,$p)) $this->addEvent(create_function('',"return isset(\$_POST['{$p[1]}']);"), $p[0], array($_POST[$p[1]]), max(1,intval($p[3])) ); } } /*** * Aggiunge un evento da gestire * * @param myEvent $event Istanza da aggiungere * @param string $action Azione(metodo) della classe {@link myEvenManager} da lanciare se si verifica, di default è il risultato del metodo @see myEvent::action() * @param array $parameters Eventuali parametri da passare all'azione (metodo) della classe {@link myEvenManager}, di default è il risultato del metodo @see myEvent::parameters() * @param int $prority priorità da assegnare all'evento più e grande e prima si scatena rispetto ad altri eventi */ protected function addEvent($event,$action='',array $parameters=array(),$prority=1) { //echo $action,'=>',$prority,"
"; if(is_object($event) && is_subclass_of($event,'myEvent')) { if(!$action) $action=$event->action(); if(!$parameters) $parameters=$event->parameters(); } if(!is_callable($event)&& !is_subclass_of($event,'myEvent')) throw new Exception("Impossibile aggiungere un evento che non implementi myEvent in ".get_class($this)); elseif(!method_exists($this,$action)) throw new Exception("Impossibile aggiungere evento in ".get_class($this).", il metodo $metodo non esiste" ); $obj=new stdClass(); $obj->action=&$action; $obj->event=&$event; $obj->param=&$parameters; $this->Events[]=$obj; $this->Epriorities[count($this->Events)-1]=intval($prority); return $this; } /** * Se invocata in un metodo(azione) eventuali eventi successivi non vengono saltati * @param int $jumps se 0 li salta tutti se >0 salta $jumps eventi */ protected function stopEvents($jumps=0) { $this->Estop=intval($jumps); return $this; } /** * @ignore */ final function dispatchEvents() { asort($this->Epriorities); $this->onStart(); foreach ($this->Epriorities as $i=>$p) {if($this->Estop>0) { if(--$this->Estop===0) $this->Estop=-1; continue; } $event=$this->Events[$i]->event; if ($event()) { call_user_func_array(array($this,$this->Events[$i]->action),$this->Events[$i]->param); } if($this->Estop===0) break; } $this->onClose(); } /** * Viene invocata subito dopo {@link myEventManager::dispatchEvents()} */ abstract protected function onStart(); /** * Viene invocata dopo tutti gli eventi */ abstract protected function onClose(); } ?>