123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- <?php
- /**
- * Define a workflowevent.
- * Un evenement peut etre déclaré (register) puis executé (triiger) et
- * lancement de ce fait tous les workflow attachés a celui ci
- * @author Administrateur
- * @category Plugin
- * @license MIT
- */
- class WorkflowEvent extends Entity{
- public $id;
- public $slug; //Slug (Texte)
- public $workflow; //Workflow (Entier)
- const EVENT_CRON = 'cron';
- protected $TABLE_NAME = 'workflow_workflow_event';
- public $fields = array(
- 'id' => 'key',
- 'slug' => 'string',
- 'workflow' => array('type'=>'int','link'=>'plugin/workflow/Workflow.class.php')
- );
- //Colonnes indexées
- public $indexes = array();
- //Renvois les événements (par défaut et plugin) en fonction du slug fournis ou du type de workflow compatibles
- public static function events($slug = null,$type=null,$getContext = false){
- //Récuperation des événements plugins et par défaut
- $events = array();
- Plugin::callHook("workflow_event",array(&$events) );
- //Si le type est précisé, on ne retourne que les evenements qui correspondent
- if(isset($type)){
- foreach ($events as $key => $event) {
- if($event['type'] != $type) unset($events[$key]);
- }
- }
- if(!isset($slug)) return $events;
- //On ne retourne que les evenements et pas les autres infos fournies dans la déclaration de l'evenemtn (register)
- foreach ($events as $eventGroup) {
- foreach ($eventGroup['events'] as $currentSlug=>$event) {
- if($currentSlug == $slug){
- if($getContext) return $eventGroup;
- return array(
- 'label' => $event,
- 'type' =>$eventGroup['type']
- );
- }
- }
- }
- return array(
- 'label' => 'Non définit',
- 'type' => Workflow::TYPE_GLOBAL
- );
- }
- public static function registerEntity($file,$options = array()){
- require_once($file);
- $class = str_replace('.class.php','',basename($file));
- $plugin = basename(dirname($file));
- $slug = strtolower($plugin.'-'.$class);
- $instance = new $class();
- $fields = array();
- foreach ($instance->fields as $field => $type) {
- if(isset($options['fields-remove']) && in_array($field, $options['fields-remove'])) continue;
- if(!is_array($type)) $type = array('type'=>$type,'column'=>$field);
- if(!isset( $type['column'] )) $type['column'] = $field;
- $label = isset($type['label'])? $type['label']:$field;
- $fields[$field] = array('label'=>$label,'type'=>$type['type']);
- }
- return array(
- 'type' => Workflow::TYPE_ENTITY,
- 'entity' => array(
- 'label' => $class::entityLabel(),
- 'file' => $file,
- 'class' => $class,
- 'slug' => $slug,
- 'fields' => $fields
- ),
- 'events' => array(
- $slug.'-create' => 'A la création',
- $slug.'-update' => 'A la modification',
- $slug.'-delete' => 'A la suppression'
- )
- );
- }
- public static function registerList($file,$options = array()){
- require_once($file);
- $class = str_replace('.class.php','',basename($file));
- $plugin = basename(dirname($file));
- $slug = strtolower($plugin.'-'.$class);
- $instance = new $class();
- $fields = array();
- foreach ($instance->fields as $field => $type) {
- if(isset($options['fields-remove']) && in_array($field, $options['fields-remove'])) continue;
- if(!is_array($type)) $type = array('type'=>$type,'column'=>$field);
- if(!isset( $type['column'] )) $type['column'] = $field;
- $label = isset($type['label'])? $type['label']:$field;
- $fields[$field] = array('label'=>$label,'type'=>$type['type']);
- }
- $options = array_merge(array('events'=>array()),$options);
- return array(
- 'type' => Workflow::TYPE_LIST,
- 'list' => function(){
- require_once($file);
- return $class::loadAll();
- },
- 'entity' => array(
- 'label' => $class::entityLabel(),
- 'file' => $file,
- 'class' => $class,
- 'slug' => $slug,
- 'fields' => $fields
- ),
- 'events' => $options['events']
- );
- }
- //lancer un evenement en fonction de son slug et des parametres fournis lors du lancement
- public static function trigger($slug,$parameters = array(),$workflow = null){
- require_once(__DIR__.SLASH.'Workflow.class.php');
- $causes = Workflow::causes();
- $logs = '';
- $where = array('slug'=>$slug);
- if(isset($workflow)) $where['workflow'] = $workflow;
- //continue l'execution du workflow même si le navigateur se déconnecte
- ignore_user_abort(true);
- set_time_limit(0);
- //Récuperation des workflows lié a cet évenement
- foreach(self::loadAll($where, null, null, array('*'), 1) as $event){
- //récuperation du workflow
- $workflow = $event->join('workflow');
- //Ajout des infos de l'évenement au tableau des parametres utilisé par les causes/effet
- $parameters['event'] = $event->toArray();
- $eventType = WorkflowEvent::events($event->slug,null,true);
- if($eventType['type'] == Workflow::TYPE_LIST && isset($eventType['list'])){
- $parameters['list'] = $eventType['list']();
- }
- //Lancement du workflow concerné (on lui donne les type de causes possible pour des raison de perfs)
- $logs = $workflow->run($causes,$parameters);
- //Ajout des résultats du lancement à l'historique du workflow
- $history = new History();
- $history->scope = 'workflow';
- $history->uid = $workflow->id;
- $history->comment = implode('<br/>',$logs);
- $history->icon = History::TYPE_COMMENT;
- $history->save();
- }
- return $logs;
- }
- }
- ?>
|