LSformElement_supannCompositeAttribute: add flexibility

- Add possibility to override parse/format value methods to handle
  different composite value formats
- Add possibility to configure date components LDAP format
This commit is contained in:
Benjamin Renard 2021-06-11 14:25:52 +02:00
parent 441b5d0af9
commit 88bb4eef49
2 changed files with 172 additions and 97 deletions

View file

@ -315,6 +315,38 @@ function supannParseCompositeValue($val) {
return; return;
} }
/**
* Format une valeur composite SUPANN
*
* Exemple de valeur en entrée :
*
* array (
* 'key1' => 'value1',
* 'key2' => 'value2',
* 'key3' => 'value3',
* )
*
* Exemple de valeur généré :
*
* [key1=value1][key2=value2][key3=value3]
*
* Les clés sont traitées dans l'ordre d'apparition dans le tableau et
* seul les clés avec une valeur non vide sont présentes dans le résultat.
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param[in] $val Tableau associatif des valeurs
*
* @retval array Un tableau contenant key->value ou false en cas d'erreur
**/
function supannFormatCompositeValue($val) {
$retval = "";
foreach($val as $k => $v)
if (!is_empty($v))
$retval .= "[".$k."=".$v.']';
return $retval;
}
/*********************************************************************** /***********************************************************************
* Fonctions relatives aux entités * Fonctions relatives aux entités
**********************************************************************/ **********************************************************************/

View file

@ -69,7 +69,6 @@ class LSformElement_supannCompositeAttribute extends LSformElement {
var $_postParsedData=null; var $_postParsedData=null;
/** /**
* Constructor * Constructor
* *
@ -103,10 +102,13 @@ class LSformElement_supannCompositeAttribute extends LSformElement {
case 'date': case 'date':
case 'datetime': case 'datetime':
$this -> components[$c]['format'] = 'd/m/Y'; $this -> components[$c]['timezone'] = LSconfig :: get('timezone', null, null, $this -> components[$c]);
$this -> components[$c]['naive'] = $this -> components[$c]['timezone'] == 'naive';
$this -> components[$c]['ldap_format'] = LSconfig :: get('format', null, null, $this -> components[$c]);
$this -> components[$c]['php_format'] = 'd/m/Y';
$this -> components[$c]['js_format'] = '%d/%m/%Y'; $this -> components[$c]['js_format'] = '%d/%m/%Y';
if (cconf['type'] == 'datetime') { if (cconf['type'] == 'datetime') {
$this -> components[$c]['format'] .= ' H:i:s'; $this -> components[$c]['php_format'] .= ' H:i:s';
$this -> components[$c]['js_format'] .= ' %H:%M:%S'; $this -> components[$c]['js_format'] .= ' %H:%M:%S';
} }
break; break;
@ -114,6 +116,36 @@ class LSformElement_supannCompositeAttribute extends LSformElement {
} }
} }
/**
* Parse une valeur composite gérer par ce type d'attribut
*
* Par défaut, cette méthode fait appel à la fonction supannParseCompositeValue()
* fournie par le LSaddon supann, mais elle peut-être réécrite (parrallèlement à
* la méthode formatCompositeValue()) pour supporter un autre format de valeur
* composite.
*
* @param $value string La valeur à parser
* @return array|null La valeur parsée, ou NULL en cas de problème
*/
public function parseCompositeValue($value) {
return supannParseCompositeValue($value);
}
/**
* Format une valeur composite gérer par ce type d'attribut
*
* Par défaut, cette méthode fait appel à la fonction supannFormatCompositeValue()
* fournie par le LSaddon supann, mais elle peut-être réécrite (parrallèlement à
* la méthode parseCompositeValue()) pour supporter un autre format de valeur
* composite.
*
* @param $value string La valeur à parser
* @return array|null|false La valeur formatée, NULL en cas de valeur vide, ou False en cas de problème
*/
public function formatCompositeValue($value) {
return supannFormatCompositeValue($value);
}
/** /**
* Retourne les infos d'affichage de l'élément * Retourne les infos d'affichage de l'élément
* *
@ -127,7 +159,7 @@ class LSformElement_supannCompositeAttribute extends LSformElement {
$parseValues=array(); $parseValues=array();
$invalidValues=array(); $invalidValues=array();
foreach($this -> values as $val) { foreach($this -> values as $val) {
$keyValue=supannParseCompositeValue($val); $keyValue = $this -> parseCompositeValue($val);
if ($keyValue) { if ($keyValue) {
$parseValue=array('value' => $val); $parseValue=array('value' => $val);
foreach($keyValue as $key => $value) { foreach($keyValue as $key => $value) {
@ -247,10 +279,14 @@ class LSformElement_supannCompositeAttribute extends LSformElement {
case 'date': case 'date':
case 'datetime': case 'datetime':
$retval['datetime'] = ldapDate2DateTime($val, LSconfig :: get('timezone', null, 'string', $this -> components[$c]) == 'naive'); $retval['datetime'] = ldapDate2DateTime(
$val,
$this -> components[$c]['naive'],
$this -> components[$c]['ldap_format']
);
self :: log_trace("translateComponentValue($c, $val): datetime = ".varDump($retval['datetime'])); self :: log_trace("translateComponentValue($c, $val): datetime = ".varDump($retval['datetime']));
if ($retval['datetime']) { if ($retval['datetime']) {
$retval['translated'] = $retval['datetime'] -> format($this -> components[$c]['format']); $retval['translated'] = $retval['datetime'] -> format($this -> components[$c]['php_format']);
self :: log_trace("translateComponentValue($c, $val): translated = '".$retval['translated']."'"); self :: log_trace("translateComponentValue($c, $val): translated = '".$retval['translated']."'");
} }
else { else {
@ -302,26 +338,27 @@ class LSformElement_supannCompositeAttribute extends LSformElement {
return true; return true;
} }
$count=0; $count = 0;
$end=false; $end = false;
$parseValues=array(); $parseValues = array();
$return[$this -> name]=array(); $return[$this -> name] = array();
while ($end==false) { while ($end==false) {
$value=""; $value = array();
$parseValue=array(); $parseValue = array();
$errors=array(); $errors = array();
$unemptyComponents=array(); $unemptyComponents = array();
foreach ($this -> components as $c => $cconf) { foreach ($this -> components as $c => $cconf) {
if (isset($_POST[$this -> name.'__'.$c][$count])) { if (isset($_POST[$this -> name.'__'.$c][$count])) {
$parseValue[$c]=$_POST[$this -> name.'__'.$c][$count]; $parseValue[$c] = $_POST[$this -> name.'__'.$c][$count];
if ($cconf['required'] && empty($parseValue[$c])) { if ($cconf['required'] && empty($parseValue[$c])) {
$errors[]=getFData(__('Component %{c} must be defined'),__($cconf['label'])); $errors[] = getFData(__('Component %{c} must be defined'),__($cconf['label']));
continue; continue;
} }
if (empty($parseValue[$c])) { if (empty($parseValue[$c])) {
continue; continue;
} }
$unemptyComponents[]=$c; $unemptyComponents[] = $c;
// Handle POST component value (by type)
switch ($cconf['type']) { switch ($cconf['type']) {
case 'table': case 'table':
$pv = supannParseLabeledValue($parseValue[$c]); $pv = supannParseLabeledValue($parseValue[$c]);
@ -344,11 +381,12 @@ class LSformElement_supannCompositeAttribute extends LSformElement {
case 'date': case 'date':
case 'datetime': case 'datetime':
$datetime = date_create_from_format($cconf['format'], $parseValue[$c]); $datetime = date_create_from_format($cconf['php_format'], $parseValue[$c]);
if ($datetime) { if ($datetime) {
$parseValue[$c] = dateTime2LdapDate( $parseValue[$c] = dateTime2LdapDate(
$datetime, $datetime,
LSconfig :: get('timezone', null, 'string', $cconf) $this -> components[$c]['timezone'],
$this -> components[$c]['ldap_format']
); );
} }
else { else {
@ -369,6 +407,7 @@ class LSformElement_supannCompositeAttribute extends LSformElement {
break; break;
} }
// Check component value (if configured)
if (isset($cconf['check_data']) && is_array($cconf['check_data'])) { if (isset($cconf['check_data']) && is_array($cconf['check_data'])) {
foreach($cconf['check_data'] as $ruleType => $rconf) { foreach($cconf['check_data'] as $ruleType => $rconf) {
$className='LSformRule_'.$ruleType; $className='LSformRule_'.$ruleType;
@ -388,27 +427,31 @@ class LSformElement_supannCompositeAttribute extends LSformElement {
} }
} }
} }
$value.="[".$c."=".$parseValue[$c].']';
$value[$c] = $parseValue[$c];
} }
else { else {
// end of value break // end of value break
$end=true; $end=true;
break; break;
} }
} }
// Format value
$value = $this -> formatCompositeValue($value);
if (!$end) { if (!$end) {
if (!empty($unemptyComponents)) { if (!empty($unemptyComponents)) {
foreach($errors as $e) { foreach($errors as $e) {
$this -> form -> setElementError($this -> attr_html,$e); $this -> form -> setElementError($this -> attr_html,$e);
} }
$return[$this -> name][]=$value; $return[$this -> name][] = $value;
$parseValues[]=$parseValue; $parseValues[] = $parseValue;
} }
$count++; $count++;
} }
} }
$this -> _postParsedData=$parseValues; $this -> _postParsedData = $parseValues;
return true; return true;
} }