LSsearch : Added searchLSformat and approxLSformat parameter for searched attributes
authorBenjamin Renard <brenard@easter-eggs.com>
Fri, 28 Jun 2013 07:44:02 +0000 (09:44 +0200)
committerBenjamin Renard <brenard@easter-eggs.com>
Fri, 28 Jun 2013 07:44:02 +0000 (09:44 +0200)
doc/conf/LSobject/LSsearch.docbook
public_html/includes/class/class.LSldapObject.php
public_html/includes/class/class.LSsearch.php

index 5693dc3..728a219 100644 (file)
@@ -13,6 +13,11 @@ configuration des &LSobjects;, dans la variable <varname>LSsearch</varname>
     'attr1',
     'attr2',
     ...
     'attr1',
     'attr2',
     ...
+    'attr3' => array(
+      'searchLSformat' => '[LSformat]',
+      'approxLSformat' => '[LSformat]',
+    ),
+    ...
   ),
   'params' => array(
     // Paramètres de la recherche
   ),
   'params' => array(
     // Paramètres de la recherche
@@ -48,15 +53,58 @@ configuration des &LSobjects;, dans la variable <varname>LSsearch</varname>
     passé par l'utilisateur, &LdapSaisie; composera un filtre LDAP à partir de
     cette liste.</para>
     <para>Lors d'une recherche non-approximative, le filtre de recherche sera
     passé par l'utilisateur, &LdapSaisie; composera un filtre LDAP à partir de
     cette liste.</para>
     <para>Lors d'une recherche non-approximative, le filtre de recherche sera
-    composé de la manière suivante :
+    composé (par défaut) de la manière suivante :
     <programlisting>(|(attr1=*motif*)(attr2=*motif*)...)</programlisting></para>
     <para>Lors d'une recherche approximative, le filtre de recherche sera
     <programlisting>(|(attr1=*motif*)(attr2=*motif*)...)</programlisting></para>
     <para>Lors d'une recherche approximative, le filtre de recherche sera
-    composé de la manière suivante :
+    composé (par défaut) de la manière suivante :
     <programlisting>(|(attr1=~motif)(attr2~=motif)...)</programlisting></para>
     <programlisting>(|(attr1=~motif)(attr2~=motif)...)</programlisting></para>
+    <para>Il est également possible de paramétrer la manière dont sera composé le filtre
+    de recherche attribut par attribut à l'aide des paramètres <emphasis>searchLSformat</emphasis>
+    et <emphasis>approxLSformat</emphasis>.</para>
     <important><simpara>Ces filtres, une fois composés, sont insérés dans un autre,
     filtrant en plus sur les <emphasis>ObjectClass</emphasis> du type
     d'&LSobject; de la manière suivante :</simpara>
     <programlisting><![CDATA[(& (&(objectclass=oc1)(objectclass=oc2)) (filtre) )]]></programlisting></important>
     <important><simpara>Ces filtres, une fois composés, sont insérés dans un autre,
     filtrant en plus sur les <emphasis>ObjectClass</emphasis> du type
     d'&LSobject; de la manière suivante :</simpara>
     <programlisting><![CDATA[(& (&(objectclass=oc1)(objectclass=oc2)) (filtre) )]]></programlisting></important>
+
+    <variablelist>
+    <title>Paramètres des attributs</title>
+
+<varlistentry>
+  <term>searchLSformat</term>
+  <listitem>
+    <para>Ce paramètre est un &LSformat; permettant de définir, attribut par attribut, comment le
+    filtre de recherche LDAP est composé à partir d'un motif de recherche et en cas de recherche
+    non-approximative.</para>
+    <para>Ce &LSformat; est composé à l'aide des éléments <emphasis>name</emphasis>, le nom de
+    l'attribut et <emphasis>pattern</emphasis>, le motif de recherche.
+    <programlisting>
+    <citetitle>Exemple</citetitle>
+<![CDATA[(%{name}=%{pattern})]]>
+    </programlisting></para>
+    <important><simpara>Le filtre déduit doit obligatoirement commencer par <emphasis>(</emphasis> et
+    se terminer par <emphasis>)</emphasis>.</simpara></important>
+  </listitem>
+</varlistentry>
+
+<varlistentry>
+  <term>approxLSformat</term>
+  <listitem>
+    <para>Ce paramètre est un &LSformat; permettant de définir, attribut par attribut, comment le
+    filtre de recherche LDAP est composé à partir d'un motif de recherche et en cas de recherche
+    approximative.</para>
+    <para>Ce &LSformat; est composé à l'aide des éléments <emphasis>name</emphasis>, le nom de
+    l'attribut et <emphasis>pattern</emphasis>, le motif de recherche.
+    <programlisting>
+    <citetitle>Exemple</citetitle>
+<![CDATA[(%{name}=~%{pattern})]]>
+    </programlisting></para>
+    <important><simpara>Le filtre déduit doit obligatoirement commencer par <emphasis>(</emphasis> et
+    se terminer par <emphasis>)</emphasis>.</simpara></important>
+  </listitem>
+</varlistentry>
+
+    </variablelist>
+
   </listitem>
 </varlistentry>
 
   </listitem>
 </varlistentry>
 
index 944b857..4364942 100644 (file)
@@ -700,21 +700,39 @@ class LSldapObject {
    */ 
   function getPatternFilter($pattern=null,$approx=null) {
     if ($pattern!=NULL) {
    */ 
   function getPatternFilter($pattern=null,$approx=null) {
     if ($pattern!=NULL) {
+      $attrs=array();
       if (is_array($this -> config['LSsearch']['attrs'])) {
       if (is_array($this -> config['LSsearch']['attrs'])) {
-        $attrs=$this -> config['LSsearch']['attrs'];
+        foreach ($this -> config['LSsearch']['attrs'] as $key => $val) {
+          if (is_int($key)) {
+            $attrs[$val]=array();
+          }
+          else {
+            $attrs[$key]=$val;
+          }
+        }
       }
       else {
       }
       else {
-        $attrs=array($this -> config['rdn']);
+        $attrs=array($this -> config['rdn'] => array());
       }
       $pfilter='(|';
       if ($approx) {
       }
       $pfilter='(|';
       if ($approx) {
-        foreach ($attrs as $attr_name) {
-          $pfilter.='('.$attr_name.'~='.$pattern.')';
+        foreach ($attrs as $attr_name => $attr_opts) {
+          if (isset($attr_opts['approxLSformat'])) {
+            $pfilter.=getFData($attr_opts['approxLSformat'],array('name' => $attr_name, 'pattern' => $pattern));
+          }
+          else {
+            $pfilter.='('.$attr_name.'~='.$pattern.')';
+          }
         }
       }
       else {
         }
       }
       else {
-        foreach ($attrs as $attr_name) {
-          $pfilter.='('.$attr_name.'=*'.$pattern.'*)';
+        foreach ($attrs as $attr_name => $attr_opts) {
+          if (isset($attr_opts['searchLSformat'])) {
+            $pfilter.=getFData($attr_opts['searchLSformat'],array('name' => $attr_name, 'pattern' => $pattern));
+          }
+          else {
+            $pfilter.='('.$attr_name.'=*'.$pattern.'*)';
+          }
         }
       }
       $pfilter.=')';
         }
       }
       $pfilter.=')';
index 19cc68c..c2ca82f 100644 (file)
@@ -574,10 +574,22 @@ class LSsearch {
       $pattern=$this -> params['pattern'];
     }
     if (self :: isValidPattern($pattern)) {
       $pattern=$this -> params['pattern'];
     }
     if (self :: isValidPattern($pattern)) {
-      $operator=( ($params['approx'])?'approx':'contains' );
-      $attrsList=LSconfig::get("LSobjects.".$this -> LSobject.".LSsearch.attrs");
+      $attrsConfig=LSconfig::get("LSobjects.".$this -> LSobject.".LSsearch.attrs");
+      $attrsList=array();
       if (!is_array($attrsList)) {
       if (!is_array($attrsList)) {
-        $attrsList = array_keys(LSconfig::get("LSobjects.".$this -> LSobject.".attrs"));
+        foreach(LSconfig::get("LSobjects.".$this -> LSobject.".attrs") as $attr) {
+          $attrsList[$attr]=array();
+        }
+      }
+      else {
+        foreach($attrsConfig as $key => $val) {
+          if(is_int($key)) {
+            $attrsList[$val]=array();
+          }
+          else {
+            $attrsList[$key]=$val;
+          }
+        }
       }
       
       if (empty($attrsList)) {
       }
       
       if (empty($attrsList)) {
@@ -586,8 +598,24 @@ class LSsearch {
       }
       
       $filters=array();
       }
       
       $filters=array();
-      foreach ($attrsList as $attr) {
-        $filter=Net_LDAP2_Filter::create($attr,$operator,$pattern);
+      foreach ($attrsList as $attr => $opts) {
+        if ($params['approx']) {
+          if (isset($opts['approxLSformat'])) {
+            $filter=Net_LDAP2_Filter::parse(getFData($opts['approxLSformat'],array('name'=>$attr,'pattern'=>$pattern)));
+          }
+          else {
+            $filter=Net_LDAP2_Filter::create($attr,'approx',$pattern);
+          }
+        }
+        else {
+          if (isset($opts['searchLSformat'])) {
+            $filter=Net_LDAP2_Filter::parse(getFData($opts['searchLSformat'],array('name'=>$attr,'pattern'=>$pattern)));
+          }
+          else {
+            $filter=Net_LDAP2_Filter::create($attr,'contains',$pattern);
+          }
+        }
+
         if (!Net_LDAP2::isError($filter)) {
           $filters[]=$filter;
         }
         if (!Net_LDAP2::isError($filter)) {
           $filters[]=$filter;
         }