diff --git a/doc/conf/LSobject/LSsearch.docbook b/doc/conf/LSobject/LSsearch.docbook
index 5693dc3b..728a2196 100644
--- a/doc/conf/LSobject/LSsearch.docbook
+++ b/doc/conf/LSobject/LSsearch.docbook
@@ -13,6 +13,11 @@ configuration des &LSobjects;, dans la variable LSsearch
'attr1',
'attr2',
...
+ 'attr3' => array(
+ 'searchLSformat' => '[LSformat]',
+ 'approxLSformat' => '[LSformat]',
+ ),
+ ...
),
'params' => array(
// Paramètres de la recherche
@@ -48,15 +53,58 @@ configuration des &LSobjects;, dans la variable LSsearch
passé par l'utilisateur, &LdapSaisie; composera un filtre LDAP à partir de
cette liste.
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 :
(|(attr1=*motif*)(attr2=*motif*)...)
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 :
(|(attr1=~motif)(attr2~=motif)...)
+ 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 searchLSformat
+ et approxLSformat.
Ces filtres, une fois composés, sont insérés dans un autre,
filtrant en plus sur les ObjectClass du type
d'&LSobject; de la manière suivante :
+
+
+ Paramètres des attributs
+
+
+ searchLSformat
+
+ 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.
+ Ce &LSformat; est composé à l'aide des éléments name, le nom de
+ l'attribut et pattern, le motif de recherche.
+
+ Exemple
+
+
+ Le filtre déduit doit obligatoirement commencer par ( et
+ se terminer par ).
+
+
+
+
+ approxLSformat
+
+ 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.
+ Ce &LSformat; est composé à l'aide des éléments name, le nom de
+ l'attribut et pattern, le motif de recherche.
+
+ Exemple
+
+
+ Le filtre déduit doit obligatoirement commencer par ( et
+ se terminer par ).
+
+
+
+
+
diff --git a/public_html/includes/class/class.LSldapObject.php b/public_html/includes/class/class.LSldapObject.php
index 944b8576..43649429 100644
--- a/public_html/includes/class/class.LSldapObject.php
+++ b/public_html/includes/class/class.LSldapObject.php
@@ -700,21 +700,39 @@ class LSldapObject {
*/
function getPatternFilter($pattern=null,$approx=null) {
if ($pattern!=NULL) {
+ $attrs=array();
if (is_array($this -> config['LSsearch']['attrs'])) {
- $attrs=$this -> config['LSsearch']['attrs'];
- }
- else {
- $attrs=array($this -> config['rdn']);
- }
- $pfilter='(|';
- if ($approx) {
- foreach ($attrs as $attr_name) {
- $pfilter.='('.$attr_name.'~='.$pattern.')';
+ foreach ($this -> config['LSsearch']['attrs'] as $key => $val) {
+ if (is_int($key)) {
+ $attrs[$val]=array();
+ }
+ else {
+ $attrs[$key]=$val;
+ }
}
}
else {
- foreach ($attrs as $attr_name) {
- $pfilter.='('.$attr_name.'=*'.$pattern.'*)';
+ $attrs=array($this -> config['rdn'] => array());
+ }
+ $pfilter='(|';
+ if ($approx) {
+ 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 {
+ 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.=')';
diff --git a/public_html/includes/class/class.LSsearch.php b/public_html/includes/class/class.LSsearch.php
index 19cc68c0..c2ca82ff 100644
--- a/public_html/includes/class/class.LSsearch.php
+++ b/public_html/includes/class/class.LSsearch.php
@@ -574,10 +574,22 @@ class LSsearch {
$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)) {
- $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)) {
@@ -586,8 +598,24 @@ class LSsearch {
}
$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;
}