LSattr_ldap:📅 replace unique format parameter by a list

This commit is contained in:
Benjamin Renard 2023-08-18 12:25:50 +02:00
parent fde66b2335
commit 05519c5432
Signed by: bn8
GPG key ID: 3E2E1CE1907115BC
2 changed files with 41 additions and 22 deletions

View file

@ -18,7 +18,11 @@
<citetitle>Structure</citetitle>... <citetitle>Structure</citetitle>...
<![CDATA['ldap_options' => array ( <![CDATA['ldap_options' => array (
'timestamp' => [Booléen], // Si la date est stockée au format timestamp 'timestamp' => [Booléen], // Si la date est stockée au format timestamp
'format' => '[Format de stockage]', // Default : "YmdHisO" 'formats' => array(
'[Format de stockage principal]', // Par défaut : "YmdHisO"
'[Formats de stockage alternatifs]', // Par défaut : "YmdHis.vO" & "YmdHis.uO"
[...]
),
'timezone' => '[Fuseau horaire]', // Default : "UTC" 'timezone' => '[Fuseau horaire]', // Default : "UTC"
),]]> ),]]>
... ...
@ -39,26 +43,30 @@
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term>format</term> <term>formats</term>
<listitem> <listitem>
<para>Format de stockage de la date dans l'annuaire. Ce format est composé à <para>Formats de stockage de la date dans l'annuaire. Ces formats sont composés à
partir des motifs clés gérés par la fonction <function>date()</function> partir des motifs clés gérés par la fonction <function>date()</function>
de &php;. Pour plus d'information, consulter de &php;. Pour plus d'information, consulter
<ulink url='http://www.php.net/date'>la documentation officielle</ulink>. <ulink url='http://www.php.net/date'>la documentation officielle</ulink>. Plusieurs
<note><simpara>La valeur par défaut est <emphasis>YmdHisO</emphasis>, formats peuvent être définis, mais en cas de stockage d'une nouvelle valeur, se sera
correspondant à la syntaxe <literal>Generalized Time</literal> (sans les le premier format défini qui sera utilisé.
micro-secondes) telle que définie dans la <note><simpara>La valeur par défaut est <emphasis>["YmdHisO", "YmdHis.vO", "YmdHis.uO"]</emphasis>,
correspondant à la syntaxe <literal>Generalized Time</literal> (sans et avec les milli-secondes
ou micro-secondes) telle que définie dans la
<ulink url='https://tools.ietf.org/html/rfc4517'>RFC4517</ulink>. Exemples : <ulink url='https://tools.ietf.org/html/rfc4517'>RFC4517</ulink>. Exemples :
<literal>20091206230506Z</literal> <literal>20091206230506Z</literal>
<emphasis>(=2009/12/06 23:05:66 UTC)</emphasis> ou <emphasis>(=2009/12/06 23:05:66 UTC)</emphasis>,
<literal>20190613143537+0200</literal> <literal>20190613143537+0200</literal>
<emphasis>(=2019/06/13 14:35:37 UTC+0200)</emphasis>.</simpara></note> <emphasis>(=2019/06/13 14:35:37 UTC+0200)</emphasis> ou
<literal>20230818121005.307+0200</literal>
<emphasis>(=2023/08/18 12:10:05.307 UTC+0200)</emphasis>.</simpara></note>
<warning><simpara>Si vous exploitez un attribut stockant une date incluant les <warning><simpara>Si vous exploitez un attribut stockant une date incluant les
micro-secondes, ce type d'attribut LDAP sera capable de gérer l'interpratation des milli-secondes ou les micro-secondes, ce type d'attribut LDAP sera capable de gérer
valeurs stockées en configurant le format <literal>YmdHis.uO</literal>. En outre, l'interpratation des valeurs stockées, en outre le type d'attribut &LSattr_html_date;,
le type d'attribut &LSattr_html_date;, s'appuyant sur les méthodes standards s'appuyant sur les méthodes standards <literal>strftime()</literal> et
<literal>strftime()</literal> et <literal>strptime()</literal>, ne permettra pas <literal>strptime()</literal>, ne permettra pas aujourd'hui leur saisie et affichage.
aujourd'hui la saisie et l'affichage des millisecondes.</simpara></warning> </simpara></warning>
</para> </para>
</listitem> </listitem>

View file

@ -40,9 +40,12 @@ class LSattr_ldap_date extends LSattr_ldap {
} }
$retval=array(); $retval=array();
foreach($data as $val) { foreach($data as $val) {
$datetime = date_create_from_format($this -> getFormat(), $val); foreach($this -> getFormats() as $format) {
if ($datetime instanceof DateTime) { $datetime = date_create_from_format($format, $val);
$retval[] = $datetime -> format('U'); if ($datetime instanceof DateTime) {
$retval[] = $datetime -> format('U');
break;
}
} }
} }
return $retval; return $retval;
@ -65,7 +68,7 @@ class LSattr_ldap_date extends LSattr_ldap {
foreach($data as $val) { foreach($data as $val) {
$datetime = date_create("@$val"); $datetime = date_create("@$val");
$datetime -> setTimezone($timezone); $datetime -> setTimezone($timezone);
$datetime_string = $datetime -> format($this -> getFormat()); $datetime_string = $datetime -> format($this -> getFormats(true));
// Replace +0000 or -0000 end by Z // Replace +0000 or -0000 end by Z
$datetime_string = preg_replace('/[\+\-]0000$/', 'Z', $datetime_string); $datetime_string = preg_replace('/[\+\-]0000$/', 'Z', $datetime_string);
@ -76,12 +79,20 @@ class LSattr_ldap_date extends LSattr_ldap {
} }
/** /**
* Return the storage date format * Return the storage date formats
* Note: The first one will be used to store the value
* *
* @return string The storage date format * @return array<string> The storage date formats
**/ **/
public function getFormat() { public function getFormats($first=false) {
return $this -> getConfig('ldap_options.format', 'YmdHisO'); $formats = $this -> getConfig('ldap_options.formats', [], 'array');
if (!$formats) {
$format = $this -> getConfig('ldap_options.format');
$formats = $format ? [$format] : ['YmdHisO', 'YmdHis.vO', 'YmdHis.uO'];
}
if ($first)
return $formats?$formats[0]:null;
return $formats;
} }
} }