LSobject : Add possibility to add extra displayed columns in search result
authorBenjamin Renard <brenard@easter-eggs.com>
Tue, 17 Jun 2014 14:08:41 +0000 (16:08 +0200)
committerBenjamin Renard <brenard@easter-eggs.com>
Tue, 17 Jun 2014 14:08:41 +0000 (16:08 +0200)
doc/conf/LSobject/LSsearch.docbook
public_html/conf/LSobjects/config.LSobjects.LSpeople.php
public_html/includes/class/class.LSsearch.php
public_html/includes/class/class.LSsearchEntry.php
public_html/lang/generate_lang_file.php
public_html/templates/default/viewSearch.tpl
public_html/view.php

index 728a219..7327bbd 100644 (file)
@@ -38,6 +38,20 @@ configuration des &LSobjects;, dans la variable <varname>LSsearch</varname>
   'predefinedFilters' => array(
     'filter1' => 'label filter1',
     'filter2' => 'label filter2'
+  ),
+  'extraDisplayedColumns' => array(
+    'col1' => array(
+      'label' => 'label column 1',
+      'LSformat' => '[LSformat]'
+    ),
+    'col2' => array(
+      'label' => 'label column 2',
+      'LSformat' => '[LSformat]',
+      'alternativeLSformats' => array (
+        '[LSformat 1]',
+        '[LSformat 2]'
+      )
+    )
   )
 );]]>
 </programlisting>
@@ -217,6 +231,44 @@ contexte dans lequel cette recherche est effectuée.</para>
   </listitem>
 </varlistentry> 
 
+<varlistentry>
+  <term>extraDisplayedColumns</term>
+  <listitem>
+    <para>Tableau associatif contenant des colonnes supplémentaires à afficher dans les
+    résultats de recherche. Les clés sont les identifiants des colonnes supplémentaires
+    et les valeurs sont leur configuration définie à partir des paramètres suivant :</para>
+
+    <variablelist>
+
+      <varlistentry>
+        <term>label</term>
+        <listitem>
+          <simpara>Le label de la colonne.</simpara>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>LSformat</term>
+        <listitem>
+          <simpara>Le &LSformat; d'affichage de la colonne. Ce format est composé à partir
+          des attributs des objets LDAP dans leur format brut.</simpara>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>alternativeLSformats</term>
+        <listitem>
+          <simpara>Tableau des &LSformats; alternatifs à utiliser si le résultat du format
+          principal est vide. Les formats définis dans cette liste sont essayés les uns
+          après les autres et le premier &LSformat; retournant une valeur non-vide est
+          utilisé.</simpara>
+        </listitem>
+      </varlistentry>
+
+    </variablelist>
+  </listitem>
+</varlistentry>
+
 </variablelist>
 </para>
 
index b18d523..96ce030 100644 (file)
@@ -143,6 +143,12 @@ $GLOBALS['LSobjects']['LSpeople'] = array (
     'predefinedFilters' => array (
       '(jpegPhoto=*)' => 'With photo',
       '(!(jpegPhoto=*))' => 'Without photo'
+    ),
+    'extraDisplayedColumns' => array (
+      'mail' => array (
+        'label' => 'Mail',
+        'LSformat' => '%{mail}'
+      ),
     )
   ),
   
index 398db9b..dc990f1 100644 (file)
@@ -60,7 +60,8 @@ class LSsearch {
     'nbObjectsByPage' => NB_LSOBJECT_LIST,
     'nbPageLinkByPage' => 10,
     'customInfos' => array(),
-    'withoutCache' => false
+    'withoutCache' => false,
+    'extraDisplayedColumns' => false,
   );
   
   // The cache of search parameters
@@ -365,7 +366,7 @@ class LSsearch {
     
     // Sort By
     if (isset($params['sortBy']) && is_string($params['sortBy'])) {
-      if (in_array($params['sortBy'],array('displayName','subDn'))) {
+      if (in_array($params['sortBy'],array('displayName','subDn')) || ($this ->extraDisplayedColumns && isset($this ->extraDisplayedColumns[$params['sortBy']]))) {
         if ($this -> params['sortBy'] == $params['sortBy']) {
           $this -> toggleSortDirection();
         }
@@ -452,6 +453,11 @@ class LSsearch {
       }
     }
 
+    // Extra Columns
+    if (isset($params['extraDisplayedColumns'])) {
+      $this -> params['extraDisplayedColumns']=(bool)$params['extraDisplayedColumns'];
+    }
+
     // predefinedFilter
     if (isset($params['predefinedFilter'])) {
       if (is_string($params['predefinedFilter'])) {
@@ -788,6 +794,31 @@ class LSsearch {
     else {
       $retval['attributes']=$attrs;
     }
+
+    // Extra Columns
+    if ($this -> params['extraDisplayedColumns'] && is_array($this -> config['extraDisplayedColumns'])) {
+      foreach ($this -> config['extraDisplayedColumns'] as $id => $conf) {
+        $attrs=getFieldInFormat($conf['LSformat']);
+        if(is_array($conf['alternativeLSformats'])) {
+          foreach ($conf['alternativeLSformats'] as $format) {
+            $attrs=array_merge($attrs,getFieldInFormat($format));
+          }
+        }
+        else {
+          $attrs=array_merge($attrs,getFieldInFormat($conf['alternativeLSformats']));
+        }
+        if(is_array($retval['attributes'])) {
+          $retval['attributes']=array_merge($attrs,$retval['attributes']);
+        }
+        else {
+          $retval['attributes']=$attrs;
+        }
+      }
+    }
+
+    if (is_array($retval['attributes'])) {
+      $retval['attributes']=array_unique($retval['attributes']);
+    }
     
     $this -> _searchParams = $retval;
   }
@@ -1042,6 +1073,14 @@ class LSsearch {
                        }
       return $retval;
     }
+    elseif ($key=='extraDisplayedColumns') {
+      if ($this->params['extraDisplayedColumns'] && is_array($this -> config['extraDisplayedColumns'])) {
+        return $this -> config['extraDisplayedColumns'];
+      }
+      else {
+        return False;
+      }
+    }
     else {
       throw new Exception('Incorrect property !');
     }
index 00e6806..35c492e 100644 (file)
@@ -174,6 +174,20 @@ class LSsearchEntry {
       }
       return;
     }
+    elseif (is_array($this->LSsearch->extraDisplayedColumns) && array_key_exists($key,$this->LSsearch->extraDisplayedColumns)) {
+      if(isset($this -> cache[$key])) {
+        return $this -> cache[$key];
+      }
+      $ret=$this -> getFData($this->LSsearch->extraDisplayedColumns[$key]['LSformat']);
+      if (empty($ret) && is_array($this->LSsearch->extraDisplayedColumns[$key]['alternativeLSformats'])) {
+        foreach($this->LSsearch->extraDisplayedColumns[$key]['alternativeLSformats'] as $format) {
+          $ret=$this -> getFData($format);
+          if (!empty($ret)) break;
+        }
+      }
+      $this -> cache[$key] = $ret;
+      return $ret;
+    }
     elseif (in_array($key,array_keys($this -> attrs))) {
       return $this -> attrs[$key];
     }
index 27cb02b..1d52500 100755 (executable)
@@ -122,6 +122,11 @@ if (loadDir('../'.LS_OBJECTS_DIR) && loadDir('../'.LS_LOCAL_DIR.LS_OBJECTS_DIR))
         add($lay);
       }
     }
+    if (is_array($conf['LSsearch']['extraDisplayedColumns'])) {
+      foreach($conf['LSsearch']['extraDisplayedColumns'] as $cid => $cconf) {
+        add($cconf['label']);
+      }
+    }
 
     
     if(is_array($conf['attrs'])) {
index 462453e..23898be 100644 (file)
         {/if}
         </th>
       {/if}
+      {if $LSsearch->extraDisplayedColumns}
+        {foreach from=$LSsearch->extraDisplayedColumns item=conf key=cid}
+        <th class='LSobject-list'>
+        {if $LSsearch->sort}
+          <a href='view.php?LSobject={$LSsearch->LSobject}&amp;sortBy={$cid}&amp;nocache={$smarty.now}'>
+          {if $LSsearch->sortBy == $cid}
+            <strong>{tr msg=$conf.label}</strong>
+            <img src='{img name=$LSsearch->sortDirection}' class='LSobject-list-ordersense' alt='{$LSsearch->sortDirection}'/>
+          {else}
+            {tr msg=$conf.label}
+          {/if}
+          </a>
+        {else}
+          {tr msg=$conf.label}
+        {/if}
+        </th>
+        {/foreach}
+      {/if}
       <th class='LSobject-list'>{$LSsearch->label_actions}</th>
     </tr>
     {foreach from=$page.list item=object}
     <tr class='{cycle values="LSobject-list,LSobject-list LSobject-list-bis"}'>
         <td class='LSobject-list LSobject-list-names'><a href='view.php?LSobject={$LSsearch->LSobject}&amp;dn={$object->dn|escape:'url'}'  class='LSobject-list'>{$object->displayName}</a> </td>
         {if $LSsearch->displaySubDn}<td class='LSobject-list'>{$object->subDn}</td>{/if}
+        {if $LSsearch->extraDisplayedColumns}
+          {foreach from=$LSsearch->extraDisplayedColumns item=conf key=cid}
+          <td class='LSobject-list'>{$object->$cid}</th>
+          {/foreach}
+        {/if}
         <td class='LSobject-list LSobject-list-actions'>
         {foreach from=$object->actions item=item}
           <a href='{$item.url}'  class='LSobject-list-actions'><img src='{img name=$item.action}' alt='{$item.label}' title='{$item.label}'/></a>
index 6e5f109..78afd76 100644 (file)
@@ -109,6 +109,7 @@ if(LSsession :: startLSsession()) {
           LStemplate :: assign('pagetitle',$object -> getLabel());
           
           $LSsearch = new LSsearch($LSobject,'LSview');
+          $LSsearch -> setParam('extraDisplayedColumns',True);
           $LSsearch -> setParamsFormPostData();
           
           $searchForm = array (