DynamicField.class.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <?php
  2. /**
  3. * Define a dynamicfield.
  4. * @author Charles DUBOIS
  5. * @category Plugin
  6. * @license MIT
  7. */
  8. class DynamicField extends Entity{
  9. public $id;
  10. public $slug; //Slug (Texte)
  11. public $type; //Type (Liste)
  12. public $label; //Libellé (Texte)
  13. public $mandatory; //Obligatoire (Booléen)
  14. public $readonly; //Lecture seule (Booléen)
  15. public $sort; //Ordre (Entier)
  16. public $default; //Valeur par défaut (Texte)
  17. public $description; //Description (Texte)
  18. public $meta; //Meta (Texte Long)
  19. public $form; //Formulaire (int)
  20. public $row; //Line (int)
  21. public $column; //Colonne (int)
  22. public $state; //Etat (Texte)
  23. protected $TABLE_NAME = 'dynamicform_field';
  24. public $entityLabel = 'Formulaire';
  25. public $fields = array(
  26. 'id' => 'key',
  27. 'slug' => array('type'=>'string', 'label' => 'Slug'),
  28. 'type' => array('type'=>'string', 'label' => 'Type'),
  29. 'label' => array('type'=>'string', 'label' => 'Libellé'),
  30. 'mandatory' => array('type'=>'boolean', 'label' => 'Obligatoire'),
  31. 'readonly' => array('type'=>'boolean', 'label' => 'Lecture seule'),
  32. 'default' => array('type'=>'string', 'label' => 'Valeur par défaut'),
  33. 'description' => array('type'=>'string', 'label' => 'Description'),
  34. 'meta' => array('type'=>'longstring', 'label' => 'Meta'),
  35. 'state' => array('type'=>'string', 'label' => 'Etat'),
  36. 'form' => array('type'=>'string', 'label' => 'Formulaire','link'=>'plugin/dynamicform/DynamicForm.class.php'),
  37. 'row' => array('type'=>'string', 'label' => 'Ligne'),
  38. 'sort' => array('type'=>'int', 'label' => 'Ordre'),
  39. 'column' => array('type'=>'string', 'label' => 'Colonne')
  40. );
  41. //Colonnes indexées
  42. public $indexes = array('form');
  43. /**
  44. * Enregistre un champ dynamique en fonction de son type (fieldType) et de ses options de contexte (firm, scope, uid)
  45. * @param <Array> tableau de paramètres composé de :
  46. * $params['field'] le champ dynamique à afficher format array provenant de l'objet dynamicField
  47. * $params['value'] la valeur du champ dynamique
  48. * $params['types'] les fieldType::available() passés en paramètres pour question de perf
  49. * $params['options'] les options contextuelles de mise en page, firm, scope, uid...
  50. */
  51. public static function record($params){
  52. global $myFirm;
  53. Plugin::need('dynamicform/DynamicValue');
  54. if(!isset($params['field'])) throw new Exception('Champ non identifié');
  55. if(!isset($params['value'])) throw new Exception('Valeur non identifiée');
  56. if(!isset($params['options'])) throw new Exception('Options du champ non identifiées');
  57. $types = isset($params['types']) ? $params['types'] : FieldType::available();
  58. $type = $types[$params['field']->type];
  59. $value = DynamicValue::load(array_merge(array('field'=>$params['field']->id,'firm'=>$myFirm->id),$params['options']));
  60. $value = $value ? $value : new DynamicValue();
  61. $valueTable = DynamicValue::tableName();
  62. foreach($params['field']->foreign() as $key => $val) {
  63. if(strpos($key, $valueTable)===false) continue;
  64. $key = str_replace($valueTable.'_join_', '', $key);
  65. if(($key == 'created' || $key == 'creator') && empty($val)) continue;
  66. $value->$key = $val;
  67. }
  68. //Si une valeur existe déja en base
  69. $value->firm = $myFirm->id;
  70. if(isset($params['options']['firm'])) $value->firm = $params['options']['firm'];
  71. if(!empty($params['options']['scope'])) $value->scope = $params['options']['scope'];
  72. if(!empty($params['options']['uid'])) $value->uid = $params['options']['uid'];
  73. $value->field = $params['field']->id;
  74. $value->value = $params['value'];
  75. try{
  76. //Si necessaire, le type transforme/verifie la valeur avant enregistrement
  77. //(ex: le mdp est crypté avant save)
  78. if(property_exists($type,"onSave")){
  79. $method = $type->onSave;
  80. $value->value = $method($value->value,$params);
  81. }
  82. if(!is_null($value->value))
  83. $value->save();
  84. }catch(Exception $e){
  85. throw new Exception("Champ ".$params['field']->label." : ".$e->getMessage());
  86. }
  87. }
  88. /**
  89. * Affiche un champ dynamique en fonction de son type (fieldType) et de ses options de contexte (firm, scope, uid)
  90. * @param <Array> tableau de paramètres composé de :
  91. * $params['field'] le champ dynamique à afficher format array provenant de l'objet dynamicField
  92. * $params['value'] la valeur du champ dynamique
  93. * $params['types'] les fieldType::available() passés en paramètres pour question de perf
  94. * $params['options'] les options contextuelles de mise en page, firm, scope, uid...
  95. * @return <String> tableau des options de ciblage des champs à récupérer
  96. */
  97. public static function show($params){
  98. global $myFirm;
  99. $params['options'] = isset($params['options']) ? $params['options'] : array();
  100. $types = !isset($params['types']) || is_null($params['types']) ? FieldType::available() : $params['types'];
  101. $value = isset($params['value']) ? $params['value'] : '';
  102. $field = $params['field'];
  103. $options = array_merge(array(
  104. 'label' => 'block', // inline (input group) / block (label classique) / none (pas de label)
  105. 'legend' => 'block', // block (span text muted) / none (pas de label)
  106. 'scope' => '', // ex : client
  107. 'uid' => '', // ex : 12
  108. 'firm' => $myFirm->id // ex : 1
  109. ),$params['options']);
  110. $field['options'] = $options;
  111. $stream = '';
  112. if(is_string($field['type']))
  113. $field['type'] = $types[$field['type']];
  114. $type = $field['type'];
  115. $field['type'] = $field['type']->slug;
  116. //On remplit les metas quoi qu'il en soit pour pouvoir récupérer toutes les valeurs d'un dictionary / list
  117. if(isset($field['meta']) && !empty($field['meta'])){
  118. $meta = json_decode(base64_decode($field['meta']),true);
  119. if(is_array($meta)){
  120. foreach($meta as $index=>$item)
  121. $field['attributes']['data-'.$index] = $item;
  122. }
  123. }
  124. //On remplit avec la valeurs existant en bdd si existante
  125. if(!empty($value)){
  126. $field['value'] = $value;
  127. if(property_exists($type,"onLoad")){
  128. $method = $type->onLoad;
  129. $field['value'] = $method($field['value']);
  130. }
  131. }
  132. $field['id'] = $field['slug'];
  133. if(isset($field['mandatory']) && $field['mandatory'] == 1) $field['required'] = true;
  134. if(isset($field['readonly']) && $field['readonly'] == 1) $field['attributes'] = array('readonly'=>'"readonly"');
  135. if(!empty($options['input-class'])){
  136. if(!isset($field['attributes']['class'])) $field['attributes']['class'] = '';
  137. $field['attributes']['class'] = $field['attributes']['class'].' '.$options['input-class'];
  138. }
  139. $line = FieldType::toHtml($field,$types);
  140. if($options['label'] == 'block' && !empty($line['label'])) $stream .= '<label>'.$line['label'].'</label>';
  141. if($options['legend'] == 'block' && !empty($line['legend'])) $stream .= '<span class="text-muted">'.$line['legend'].'</span>';
  142. if($options['label'] == 'inline'){
  143. $stream .= '<div class="input-group mb-1 '.$options['input-group-class'].'">';
  144. $stream .= '<div class="input-group-prepend">
  145. <label class="input-group-text" for="'.$field['id'].'">'.$line['label'].'</label>
  146. </div>';
  147. }
  148. $stream .= $line['input'];
  149. if($options['label'] == 'inline') $stream .= '</div>';
  150. return $stream;
  151. }
  152. }
  153. ?>