<?php
/**
* AlertManager
*
* @version $Id$
* @copyright 2009
*/
/** Documentation technique
*
* ------------------
* Oouverture de l'objet :
* Vous pouvez récupérer l'objet d'alert dans Alert::Open().
* Exemple : $Objet_Alert = Alert::Open()
* après vous pouvez vous amuser a faire toutes les alerts que vous voulez.
*
* ------------------
* Capturer un Event
* Objet: Alert
* Method: $id = CaptureEvent($function, $action = ALERT_ALL, $module = ALERT_ALL)
*
* Ouvrez un objet alert pour pouvoir enregister l'event. Ensuite appellez
* la méthode CaptureEvent selon la syntaxe ci-dessus.
*
* ---- Liste des paramètres :
* --$function : non de la fonction à executer quand l'alert est déclanché.
* Peux aussi être un script PHP sous la forme d'une chaine de caractère.
* Cette fonction doit retourner true pour autoriser l'environnement à faire
* l'action qui a été demandé, false pour empêcher l'action. Cette fonction est
* appelé avec trois argument dans un ordre précis : $param qui est un tableau des fonctions qui ont
* été demandés à être executé avec l'alert, $mod qui est le nom du module visé
* et $action qui est l'action capturé.
*
* --$action (défaut: ALERT_ALL) : Action que l'on veut capturer. On peux aussi mettre la constante
* ALERT_ALL pour capturer tous les alertes d'un module en particulier.
*
* --$module (défaut: ALERT_ALL) : Module que l'on surveiller. On peux mettre
* ALERT_ALL pour surveiller tous les modules.
*
* ---- Valeur de retour :
* Si la capture a été enregistré avec succés, alors la méthode renvoit
* l'identifiant de l'enregistrement.
*
* -----------------
* Envoyer une alerte
* Objet: Alert
* Method: $result = SendAlert($module, $action, $parameter)
*
* ---- Liste des paramètres :
* --$module : nom du module que l'on veut déclancher.
*
* --$action : action que l'on veux executer.
*
* --parameter : Tableau contenant les paramètres à utiliser pour executer
* l'action du module spécifié.
*
* ---- Valeur de retour
* retourne un booléen qui dit si l'action est autorisé ou non par tous les
* modules qui surveiller cette action.
*
* -----------------
* Déboguer l'environnement d'alert.
* Objet: Alert
* Method: Debug()
*
* Permet d'afficher la liste de tous les events capturés ainsi que leurs
* configuration.
*
* -----------------
* Executer l'action d'un module en annançant l'alert
* Function ExeModFun($module, $action, $parameter)
*
* ---- Liste des paramètres :
* --$module : Module que l'on souhaite executer
*
* --$action : Action du module que l'on veux faire
*
* --$parameter (défaut: NULL) : Soit une chaine de caractère, soit un tableau. Contient le(s)
* arguments à utiliser pour executer l'action du module.
* */
define('ALERT_ALL', '*');
class Alert {
private $alert = array();
static private $env;
static private $EnvID;
static public function Open() {
if (!self::$EnvID) {
self::$EnvID = new self;
}
return self::$EnvID;
}
/*Vérifie la validité de la création d'une session*/
function __construct(){
self::$env++;
if (self::$env > 1) {
trigger_error('Deux environnements alert ont été executés', E_USER_WARNING);
} else {
self::$EnvID = $this;
}
}
/*Permet de capturer un event
$function : code PHP à executer
$module : module à surveiller
$action : action à surveiller
retourne un identifiant d'alert ou false en cas d'echec*/
public function CaptureEvent($function, $action = ALERT_ALL, $module = ALERT_ALL){
if (!function_exists($function) && is_string($function)) {
$function = create_function('$param, $mod, $action', $function);
} elseif (!function_exists($function)) {
trigger_error('Alert(CaptureEvent): Impossible d\'enregistrer la fonction. Fonction invalide.', E_USER_ERROR);
die;
}
$alert = array(
'function' => $function,
'action' => $action,
'module' => $module
);
array_push($this->alert, $alert);
return array_search($alert, $this->alert);
}
public function Debug() {
var_dump($this->alert);
}
/*Fonction utilisateur pour générer une alerte.
$module : module concerné par l'alerte
$action : action concerné par l'alerte
Aucun retour pour cette fonction.*/
public function SendAlert($module, $action, $parameter = array()){
$list = $this->SendAlert_a($module, $action, $parameter);
$return = true;
foreach($list as $element){
$return = $element && $return;
if (!$return)
break;
}
return $return;
}
/////////////// Alert par tableau /////////////////
/*Fonction privé qui s'occupe d'executer les actions demandés par l'objet*/
private function ExeAlert($real, $module, $action, $parameter){
$return = array();
foreach($this->alert as $alert){
if ($alert['action'] == $action && $alert['module'] == $module) {
$return[] = $alert['function']($parameter, $real[0], $real[1]);
}
}
return $return;
}
/*Fonction utilisateur pour générer une alerte.
$module : module concerné par l'alerte
$action : action concerné par l'alerte
Aucun retour pour cette fonction.*/
public function SendAlert_a($module, $action, $parameter){
$return = array();
$real = array(0 => $module, 1 => $action);
$return = array_merge($return, $this->ExeAlert($real, ALERT_ALL, ALERT_ALL, $parameter));
$return = array_merge($return, $this->ExeAlert($real, ALERT_ALL, $action, $parameter));
$return = array_merge($return, $this->ExeAlert($real, $module, ALERT_ALL, $parameter));
$return = array_merge($return, $this->ExeAlert($real, $module, $action, $parameter));
return $return;
}
}
function ExeModFun($module, $action = 'index', $parameter = array()){
if (!is_array($parameter))
$parameter = array($parameter);
$alert = Alert::Open();
if (!method_exists($module, $action)
&& $alert->SendAlert('alert', 'ExeMod_Error', array(
'module' => $module,
'action' => $action,
'param' => $parameter)
)) {
return false;
}
if ($alert->SendAlert($module, $action, $parameter)){
$retour = call_user_func_array(array($module, $action), $parameter);
return ($retour == NULL)?(TRUE):($retour);
}
return FALSE;
}
?>