| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 | 
							- <?php
 
- /*
 
- 	Effet de workflow
 
- 	Modifie une entité
 
- */
 
- class EntityEffect{
 
- 	//Descriptif du type d'effet
 
- 	public static function manifest($key = null){
 
- 		$manifest = array(
 
- 			'slug' => 'entity',
 
- 			'label' => 'Modifier/Supprimer une entité',
 
- 			'class' => get_called_class(),
 
- 			'path' => __FILE__,
 
- 			'icon' => 'fas fa-database',
 
- 			'color' => '#ff9f43'
 
- 		);
 
- 		if(!isset($key)) return $manifest;
 
- 		return isset($manifest[$key]) ? $manifest[$key] : '' ;
 
- 	}
 
- 	public static function actions($key = null){
 
- 		$actions = array(
 
- 			'delete' => array('label' => 'Supprimer'),
 
- 			'update' => array('label' => 'Modifier')
 
- 		);
 
- 		if(!isset($key)) return $actions;
 
- 		return isset($actions[$key]) ? $actions[$key] : array('label'=>'Non définit');
 
- 	}
 
- 	//méthode d'affichage de l'effet
 
- 	public static function form($item){
 
- 		$html  = '';
 
- 		$class = get_called_class();
 
- 		ob_start();
 
- 		require_once(__DIR__.SLASH.'..'.SLASH.'WorkflowEvent.class.php');
 
- 		$events = WorkflowEvent::events(null,Workflow::TYPE_LIST);
 
- 		$randomId = sha1(mt_rand(0,1000).time());
 
- 		$conditions = !empty($item['effect-conditions']) ? base64_encode(json_encode(filters_set($item['effect-conditions']['advanced']))) : '';
 
- 		$changes = !empty($item['entity-change']) ? base64_encode(utf8_decode($item['entity-change'])) : '';
 
- 		?>
 
- 		<div class="effect-block" data-id="<?php echo $randomId; ?>">
 
- 			<div class="input-group">
 
- 				<div class="input-group-text input-group-append input-group-prepend ">
 
- 				Action
 
- 				</div>
 
- 				<select data-id="entity-action" onchange="workflow_effect_entity_action($(this).closest('.workflow-effect-form'))" class="form-control entity-action" required>
 
- 				<option value = "">-</option>
 
- 				<?php foreach (self::actions() as $key => $value): ?>
 
- 					<option <?php echo !empty($item['entity-action']) && $key==$item['entity-action'] ? 'selected="selected"':'' ; ?> value="<?php echo $key; ?>"><?php echo $value['label']; ?></option>
 
- 				<?php endforeach; ?>
 
- 				</select>
 
- 				<div class="input-group-text input-group-prepend">
 
- 				Entité
 
- 				</div>
 
- 				<select onchange="workflow_effect_entity_conditions($(this).closest('.workflow-effect-form'))" data-id="entity-entity" class="form-control entity-entity" required>
 
- 					<option value = "">-</option>
 
- 					<?php foreach($events as $event): ?>
 
- 					<option data-entity="<?php echo base64_encode(json_encode($event['entity'])); ?>" <?php echo isset($item['entity-entity']) && $item['entity-entity']== $event['entity']['slug'] ? 'selected="selected"' : ''; ?> value="<?php echo $event['entity']['slug']; ?>">
 
- 						<?php echo $event['entity']['label']; ?>
 
- 					</option>
 
- 					<?php endforeach; ?>
 
- 				</select>
 
- 			</div>
 
- 			<div class="entity-effect-where-block <?php echo empty($item['entity-entity'])?'hidden':''; ?>" data-conditions="<?php echo $conditions; ?>">
 
- 				<hr/>
 
- 				<h5 class="text-muted">Conditions <i class="far fa-question-circle right" title="Utiliser le mot clé {{current}} pour acceder à l'entitée courant, exemple {{current.id}} pour récuperer son id"></i></h5>
 
- 				<div class="clear"></div>
 
- 				<div class="entity-effect-conditions"></div>
 
- 			</div>
 
- 			<div class="entity-effect-change-block <?php echo !empty($item['entity-action']) && $item['entity-action']!='update'?'hidden':''; ?>" data-changes="<?php echo $changes; ?>">
 
- 				<hr/>
 
- 				<h5 class="text-muted">Modifier les colonnes</h5>
 
- 				<div class="entity-effect-change">
 
- 					<select  class="form-control form-control-sm effect-change" onchange="effect_entity_change_add($(this).closest('.workflow-effect-form') )"></select>
 
- 					<input type="hidden" data-id="entity-change" value="<?php echo isset($item['entity-change'])?$item['entity-change']:''; ?>">
 
- 					<ul class="list-group mt-2 effect-change-fields">
 
- 						<li class="list-group-item p-2 hidden" data-slug="{{slug}}"  data-label="{{label}}" data-field-type="{{type}}">
 
- 							<div class="input-group input-group-sm">
 
- 								<div class="input-group-prepend ">
 
- 									<div class="input-group-text ">{{label}} <small class="text-primary font-weight-bold pl-2"> =</small></div>
 
- 								</div>
 
- 								<input value="{{value}}" onblur="effect_entity_change_save(this)" class="form-control value" type="text">
 
- 								<div class="btn btn-danger  btn-sm" onclick="effect_entity_change_remove(this)"><i class="fas fa-trash"></i></div>
 
- 							</div>
 
- 						</li>
 
- 					</ul>
 
- 				</div>
 
- 			</div>
 
- 		</div>
 
- 		<script type="text/javascript">
 
- 			function workflow_effect_entity_conditions(form){
 
- 				var select = form.find('.entity-entity');
 
- 				var option = $('option:selected',select);
 
- 				$('.entity-effect-conditions,.effect-change',form).html('<option value="">-</option>');
 
- 				if(select.val()==''){
 
- 					$('.entity-effect-where-block',form).addClass('hidden');
 
- 					return;
 
- 				}
 
- 				var defaultConditions = $('.entity-effect-where-block',form).attr('data-conditions');
 
- 				if(defaultConditions){
 
- 					defaultConditions = atob(defaultConditions);
 
- 				}
 
- 				var entity = JSON.parse(atob(option.attr('data-entity')));
 
- 				var html = '<select  data-id="effect-conditions" data-type="filter" data-default=\''+defaultConditions+'\' data-only-advanced>';
 
- 				for(var slug in entity.fields){
 
- 					var field = entity.fields[slug];
 
- 					html += '<option value="'+slug+'" data-filter-type="text">'+field.label+'</option>';
 
- 					$('.effect-change',form).append('<option value="'+slug+'" data-filter-type="text">'+field.label+'</option>');
 
- 				}
 
- 		       html += '</select>';
 
- 		       var whereSelect = $(html);
 
- 		       $('.entity-effect-conditions',form).html(whereSelect);
 
- 		       $('.entity-effect-where-block',form).removeClass('hidden');
 
- 		       init_components(form);
 
- 			}
 
- 			function workflow_effect_entity_action(form){
 
- 				var select = form.find('.entity-action');
 
- 				if(select.val()=='update'){
 
- 					$('.entity-effect-change-block',form).removeClass('hidden');
 
- 				}else{
 
- 					$('.entity-effect-change-block',form).addClass('hidden');
 
- 				}
 
- 			}
 
- 			function effect_entity_change_add(form,data){
 
- 				var btn = form.find('.btn-add');
 
- 				var entity = JSON.parse(atob($('[data-id="entity-entity"] option:selected').attr('data-entity')));
 
- 				if(!data){
 
- 					var data = entity.fields[$('.effect-change',form).val()];
 
- 					data.slug = $('.effect-change',form).val();
 
- 				}
 
- 				var line = $('.effect-change-fields li:eq(0)').template(data);
 
- 				$('.effect-change-fields',form).append(line);
 
- 				effect_entity_change_save(btn);
 
- 			}
 
- 			function effect_entity_change_remove(element){
 
- 				$(element).closest('li').remove();
 
- 				effect_entity_change_save(element);
 
- 			}
 
- 			function effect_entity_change_search(form){
 
- 				var changes = $('.entity-effect-change-block',form).attr('data-changes');
 
- 				changes = changes ? JSON.parse(atob(changes)) : '';
 
- 				for(var key in changes){
 
- 					var change  = changes[key];
 
- 					effect_entity_change_add(form,change);
 
- 				}
 
- 			}
 
- 			function effect_entity_change_save(element){
 
- 				var form = $(element).closest('.workflow-effect-form');
 
- 				var json = [];
 
- 				$('.effect-change-fields .list-group-item:not(:eq(0))').each(function(i,line){
 
- 					var line = $(line);
 
- 					json.push({
 
- 						value : line.find('.value').val(),
 
- 						slug : line.attr('data-slug'),
 
- 						label : line.attr('data-label')
 
- 					});
 
- 				});
 
- 				$('[data-id="entity-change"]',form).val(JSON.stringify(json));
 
- 			}
 
- 			function workflow_effect_entity_init(tr){
 
- 				var form = tr.find('.workflow-effect-form');
 
- 				workflow_effect_entity_conditions(form)
 
- 				effect_entity_change_search(form,function(){
 
- 					effect_entity_change_save(form.find('.entity-entity'));
 
- 				});
 
- 			}
 
- 		</script>
 
- 		<?php
 
- 		$html = ob_get_clean();
 
- 		return $html;
 
- 	}
 
- 	public static function run($effect,$parameters = array()){
 
- 		global $conf;
 
- 		$logs = '';
 
- 		if( in_array($parameters['workflow']['type'] , array( Workflow::TYPE_ENTITY, Workflow::TYPE_LIST))  ){
 
- 			if(isset($parameters['current'])) $parameters['current'] = $parameters['current']->toArray();
 
- 			if(isset($parameters['old'])) $parameters['old'] = $parameters['old']->toArray();
 
- 		}
 
- 		$effect->values['entity-entity'] = template($effect->values['entity-entity'],$parameters,true);
 
- 		//var_dump($effect,$parameters);
 
- 		$entitySlug = $effect->values['entity-entity'];
 
- 		$entity = array();
 
- 		foreach ( WorkflowEvent::events(null,Workflow::TYPE_LIST) as $event) {
 
- 			if($event['entity']['slug'] == $entitySlug){
 
- 				$entity = $event['entity'];
 
- 				break;
 
- 			}
 
- 		}
 
- 		//var_dump($effect);
 
- 		$filters = array();
 
- 		foreach($effect->values['effect-conditions']['advanced'] as $filter){
 
- 			if(isset($filter['value']) && isset($filter['value'][0])) $filter['value'][0] = template($filter['value'][0],$parameters,true);
 
- 			$filters[] = $filter;
 
- 		}
 
- 		$whereQuery = 'SELECT id FROM {{table}} WHERE 1 ';
 
- 		$queryData = array();
 
- 		filter_secure_query($filters,array_keys($entity['fields']),$whereQuery,$queryData);
 
- 		$targetsQuery = $entity['class']::staticQuery($whereQuery,$queryData);
 
- 		foreach ($targetsQuery->fetchAll() as $line)
 
- 			$targetsIds[] = $line['id'];
 
- 		//récuperation de l'entité cible de l'effet
 
- 		require_once($entity['file']);
 
- 		switch($effect->values['entity-action']){
 
- 			case 'update':
 
- 				$changes = array();
 
- 				foreach(json_decode($effect->values['entity-change'],true) as $field){
 
- 					$changes[$field['slug']] = $field['value'];
 
- 				}
 
- 				$entity['class']::change($changes,array('id:IN'=>$targetsIds));
 
- 			break;
 
- 			case 'delete':
 
- 				$entity['class']::delete(array('id:IN'=>$targetsIds));
 
- 			break;
 
- 		}
 
- 		$logs .= '<i class="'.self::manifest('icon').'"></i> Lancement de "'.self::manifest('label').'"<br>';
 
- 		$results = true;
 
- 		$logs .= 'Résultat '.$results.'<br>';
 
- 		return $logs;
 
- 	}
 
- }
 
- ?>
 
 
  |