From 9815fb147faf7bd16d545f117468e3e5a5b36ef0 Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Wed, 3 May 2017 01:12:35 +0200 Subject: [PATCH] LSattr_html :: jsonCompositeAttribute : first version --- .../LSformElement_jsonCompositeAttribute.css | 34 +++ ...ass.LSattr_html_jsonCompositeAttribute.php | 32 +++ ...s.LSformElement_jsonCompositeAttribute.php | 254 ++++++++++++++++++ .../LSformElement_jsonCompositeAttribute.tpl | 7 + ...rmElement_jsonCompositeAttribute_field.tpl | 36 +++ 5 files changed, 363 insertions(+) create mode 100644 public_html/css/default/LSformElement_jsonCompositeAttribute.css create mode 100644 public_html/includes/class/class.LSattr_html_jsonCompositeAttribute.php create mode 100644 public_html/includes/class/class.LSformElement_jsonCompositeAttribute.php create mode 100644 public_html/templates/default/LSformElement_jsonCompositeAttribute.tpl create mode 100644 public_html/templates/default/LSformElement_jsonCompositeAttribute_field.tpl diff --git a/public_html/css/default/LSformElement_jsonCompositeAttribute.css b/public_html/css/default/LSformElement_jsonCompositeAttribute.css new file mode 100644 index 00000000..28b641f3 --- /dev/null +++ b/public_html/css/default/LSformElement_jsonCompositeAttribute.css @@ -0,0 +1,34 @@ +ul.LSformElement_jsonCompositeAttribute li { + border: 1px dotted #CCC; + padding: 2px; +} + +ul.LSformElement_jsonCompositeAttribute li.noValue { + border: none; +} + +ul.LSformElement_jsonCompositeAttribute p { + margin: 0; +} + +ul.LSformElement_jsonCompositeAttribute p label { + font-weight: bold; +} + +div.jsonCompositeAttribute_possibleValues ul { + list-style-type: none; + padding: 0; + margin: 0; + border: 1px solid #CCC; + border-collapse: collapse; +} + +div.jsonCompositeAttribute_possibleValues li { + border-bottom: 1px solid #CCC; + margin-bottom: 2px; +} + +div.jsonCompositeAttribute_possibleValues li:hover { + background-color: #CCC; + cursor: pointer; +} diff --git a/public_html/includes/class/class.LSattr_html_jsonCompositeAttribute.php b/public_html/includes/class/class.LSattr_html_jsonCompositeAttribute.php new file mode 100644 index 00000000..ce8bddcf --- /dev/null +++ b/public_html/includes/class/class.LSattr_html_jsonCompositeAttribute.php @@ -0,0 +1,32 @@ + + */ +class LSattr_html_jsonCompositeAttribute extends LSattr_html { + + var $LSformElement_type = 'jsonCompositeAttribute'; + +} diff --git a/public_html/includes/class/class.LSformElement_jsonCompositeAttribute.php b/public_html/includes/class/class.LSformElement_jsonCompositeAttribute.php new file mode 100644 index 00000000..ee0f47d0 --- /dev/null +++ b/public_html/includes/class/class.LSformElement_jsonCompositeAttribute.php @@ -0,0 +1,254 @@ + + */ + +class LSformElement_jsonCompositeAttribute extends LSformElement { + + var $template = 'LSformElement_jsonCompositeAttribute.tpl'; + var $fieldTemplate = 'LSformElement_jsonCompositeAttribute_field.tpl'; + + function LSformElement_jsonCompositeAttribute (&$form, $name, $label, $params,&$attr_html){ + parent :: LSformElement($form, $name, $label, $params,$attr_html); + if (is_array($this -> params['html_options']['components'])) { + $this -> components = $this -> params['html_options']['components']; + } + } + + /* + * Composants des valeurs composites : + * + * Format : + * array ( + * '[clé composant1]' => array ( + * 'label' => '[label composant]', + * 'type' => '[type de composant]', + * 'required' => '[booléen obligatoire]' + * ), + * '[clé composant 2]' => array ( + * 'label' => 'label2', + * 'type' => 'select_list', + * 'options' => array([config as LSattr_html_select_list html_options]), + * ), + * [...] + * ) + * Types : + * - 'select_list' => Composant alimenté à partir d'une liste de valeur configurable + * de la même manière qu'un LSattr_html :: select_list. + * - 'text' => saisie manuelle + * + */ + var $components = array(); + + /** + * Retourne les infos d'affichage de l'élément + * + * Cette méthode retourne les informations d'affichage de l'élement + * + * @retval array + */ + function getDisplay(){ + $return = $this -> getLabelInfos(); + + $parseValues=array(); + $invalidValues=array(); + foreach($this -> values as $val) { + $decodedValue=json_decode($val, true); + if (is_array($decodedValue)) { + $parseValue=array('value' => $val); + foreach($decodedValue as $c => $cvalue) { + $parseValue[$c]=$this -> translateComponentValue($c,$cvalue); + } + $parseValues[]=$parseValue; + } + else { + $invalidValues[]=$val; + } + } + + $components = $this -> components; + foreach($components as $c => $cconf) { + if ($cconf['type']=='select_list') { + $components[$c]['possible_values']=$this -> getSelectListComponentPossibleValues($c); + } + } + + $return['html'] = $this -> fetchTemplate(NULL, + array( + 'parseValues' => $parseValues, + 'components' => $components + ) + ); + LSsession :: addCssFile('LSformElement_jsonCompositeAttribute.css'); + return $return; + } + + + /** + * Retourne le code HTML d'un champ vide + * + * @retval string Code HTML d'un champ vide. + */ + function getEmptyField() { + return $this -> fetchTemplate($this -> fieldTemplate,array('components' => $this -> components)); + } + + /** + * Traduit la valeur d'un composant + * + * Retourne un array contenant : + * - label : l'étiquette de la valeur ou 'no' sinon + * - value : la valeur brute + * - translated : la valeur traduite ou la valeur elle même + * + * @param[in] $c string Le nom du composant + * @param[in] $val string La valeur + * + * @retval array + **/ + function translateComponentValue($c,$val) { + $retval = array ( + 'translated' => $val, + 'value' => $val, + ); + if (isset($this -> components[$c])) { + if ($this -> components[$c]['type']=='select_list') { + $retval['translated'] = $this -> getSelectListComponentValueLabel($c,$val); + } + //elseif type == 'text' => aucune transformation + } + return $retval; + } + + protected $_cache_getSelectListComponentPossibleValues=array(); + protected function getSelectListComponentPossibleValues($c) { + if (!isset($this -> _cache_getSelectListComponentPossibleValues[$c])) { + if (!LSsession :: loadLSclass('LSattr_html_select_list')) return; + $this -> _cache_getSelectListComponentPossibleValues[$c]=LSattr_html_select_list :: getPossibleValues($this -> components[$c]['options'], $this -> name, $this->attr_html->attribute->ldapObject); + } + return $this -> _cache_getSelectListComponentPossibleValues[$c]; + } + + protected function getSelectListComponentValueLabel($c,$value) { + if ($this -> getSelectListComponentPossibleValues($c)) { + foreach ($this -> _cache_getSelectListComponentPossibleValues[$c] as $v => $label) { + if (is_array($label)) { + if (!isset($label['possible_values'])) continue; + foreach ($label['possible_values'] as $vk => $vl) + if ($vk == $$value) return $vl; + } + if ($v == $value) return $label; + } + } + return; + } + + /** + * Recupère la valeur de l'élement passée en POST + * + * Cette méthode vérifie la présence en POST de la valeur de l'élément et la récupère + * pour la mettre dans le tableau passer en paramètre avec en clef le nom de l'élément + * + * @param[] array Pointeur sur le tableau qui recupèrera la valeur. + * + * @retval boolean true si la valeur est présente en POST, false sinon + */ + function getPostData(&$return) { + if($this -> isFreeze()) { + return true; + } + + $count=0; + $end=false; + $return[$this -> name]=array(); + while ($end==false) { + $value=array(); + $parseValue=array(); + $errors=array(); + $unemptyComponents=array(); + foreach ($this -> components as $c => $cconf) { + if (isset($_POST[$this -> name.'__'.$c][$count])) { + $parseValue[$c]=$_POST[$this -> name.'__'.$c][$count]; + if ($cconf['required'] && empty($parseValue[$c])) { + $errors[]=getFData(__('Component %{c} must be defined'),__($cconf['label'])); + continue; + } + if (empty($parseValue[$c])) { + continue; + } + $unemptyComponents[]=$c; + if ($cconf['type']=='select_list') { + if (!$this -> getSelectListComponentValueLabel($c, $parseValue[$c])) { + $errors[]=getFData(__('Invalid value for component %{c}.'),__($cconf['label'])); + } + } + if (is_array($cconf['check_data'])) { + foreach($cconf['check_data'] as $ruleType => $rconf) { + $className='LSformRule_'.$ruleType; + if (LSsession::loadLSclass($className)) { + $r=new $className(); + if (!$r -> validate($parseValue[$c],$rconf,$this)) { + if (isset($rconf['msg'])) { + $errors[]=getFData(__($rconf['msg']),__($cconf['label'])); + } + else { + $errors[]=getFData(__('Invalid value for component %{c}.'),__($cconf['label'])); + } + } + } + else { + $errors[]=getFData(__("Can't validate value of component %{c}."),__($cconf['label'])); + } + } + } + $value[$c]=$parseValue[$c]; + } + else { + // end of value break + $end=true; + break; + } + + } + if (!$end) { + if (!empty($unemptyComponents)) { + foreach($errors as $e) { + $this -> form -> setElementError($this -> attr_html,$e); + } + $return[$this -> name][]=json_encode($value); + } + $count++; + } + } + return true; + } + +} diff --git a/public_html/templates/default/LSformElement_jsonCompositeAttribute.tpl b/public_html/templates/default/LSformElement_jsonCompositeAttribute.tpl new file mode 100644 index 00000000..7c1cccd9 --- /dev/null +++ b/public_html/templates/default/LSformElement_jsonCompositeAttribute.tpl @@ -0,0 +1,7 @@ + diff --git a/public_html/templates/default/LSformElement_jsonCompositeAttribute_field.tpl b/public_html/templates/default/LSformElement_jsonCompositeAttribute_field.tpl new file mode 100644 index 00000000..31030e13 --- /dev/null +++ b/public_html/templates/default/LSformElement_jsonCompositeAttribute_field.tpl @@ -0,0 +1,36 @@ +{if $freeze} + {if isset($parseValue)} + {foreach $components as $c => $cconf} + {if !isset($parseValue[$c])}{continue}{/if} +

+ + {$parseValue[$c].translated} +

+ {/foreach} + {else} + {$noValueTxt} + {/if} +{else} + {foreach $components as $c => $cconf} +

+ + {if $cconf.type=='select_list'} + + {else} + + {/if} +

+ {/foreach} +{/if}