Quelques améliorations
authorx2000bedo <x2000bedo>
Wed, 4 Aug 2004 01:19:51 +0000 (01:19 +0000)
committerx2000bedo <x2000bedo>
Wed, 4 Aug 2004 01:19:51 +0000 (01:19 +0000)
htdocs/search.php
include/search.classes.inc.php
templates/search.tpl

index 76e37c1..eedca67 100644 (file)
@@ -1,31 +1,59 @@
 <?php
 require("auto.prepend.inc.php");
 require("search.classes.inc.php");
+$perpage = 10;
 // choix entre partie publique (annuaire_public est vrai) et partie privée de l'annuaire.
 $public_directory = ((isset($_REQUEST['public_directory']) && $_REQUEST['public_directory']==1));
 if ($public_directory)
     new_skinned_page('search.tpl', AUTH_PUBLIC);
 else
     new_skinned_page('search.tpl', AUTH_COOKIE);
-if (array_key_exists('rechercher', $_POST)) {
+$page->assign('public_directory',$public_directory);
+if (array_key_exists('rechercher', $_REQUEST)) {
     $page->assign('formulaire',0);
-    $nameField = new StringSField('name',array('u.nom','u.epouse'));
-    $firstnameField = new StringSField('firstname',array('u.prenom'));
-    $promoField = new PromoSField('promo','egal','u.promo');
+    $nameField = new StringSField('name',array('nom','epouse'));
+    $firstnameField = new StringSField('firstname',array('prenom'));
+    $promoField = new PromoSField('promo','egal','promo');
     $fields = new SFieldGroup(true,array($nameField,$firstnameField,$promoField));
     $nameField = new StringSField('name',array('i.nom'));
     $firstnameField = new StringSField('firstname',array('i.prenom'));
     $promoField = new PromoSField('promo','egal','i.promo');
     $fields2 = new SFieldGroup(true,array($nameField,$firstnameField,$promoField));
-    $sql = '(SELECT u.nom,u.prenom,u.promo 
-            FROM auth_user_md5 AS u  
-            WHERE '.$fields->get_where_statement().')
+    $offset = new NumericSField('offset');
+    $sqli = '(SELECT matricule
+            FROM auth_user_md5 
+            WHERE '.$fields->get_where_statement().')';
+    $result = mysql_query($sqli);
+    while ($row = mysql_fetch_row($result))
+        list($matricules[]) = $row;
+    $sqln = '(SELECT matricule
+            FROM auth_user_md5
+            WHERE matricule IN ('.implode(',',$matricules).'))
             UNION
-            (SELECT i.nom,i.prenom,i.promo
+            (SELECT i.matricule
             FROM identification AS i
-            WHERE '.$fields2->get_where_statement().')
-            ORDER BY promo DESC,nom,prenom';
+            WHERE i.matricule NOT IN ('.implode(',',$matricules).')
+            AND '.$fields2->get_where_statement().')';
+    $result = mysql_query($sqln);
+    $page->assign('nb_resultats_total',mysql_num_rows($result));
+    $sql = '(SELECT 1 AS inscrit,u.nom,u.epouse,u.prenom,u.promo,i.deces!=0 AS decede,u.username,
+            c.uid AS contact
+            FROM auth_user_md5 AS u
+            INNER JOIN identification AS i ON (i.matricule=u.matricule)
+            LEFT JOIN contacts AS c ON (c.uid = '.$_SESSION['uid'].' AND c.contact=u.user_id)
+            WHERE u.matricule IN ('.implode(',',$matricules).'))
+            UNION
+            (SELECT 0 AS inscrit,i.nom,"",i.prenom,i.promo,i.deces!=0 AS decede,"","" AS contact
+            FROM identification AS i
+            WHERE i.matricule NOT IN ('.implode(',',$matricules).')
+            AND '.$fields2->get_where_statement().')
+            ORDER BY '.implode(',',array_filter(array($fields->get_order_statement(),
+            'promo DESC,nom,prenom'))).'
+            LIMIT '.$offset->value.','.$perpage;
     $page->mysql_assign($sql, 'resultats', 'nb_resultats');
+    $page->assign('url_args',$fields->get_url());
+    $page->assign('offset',$offset->value);
+    $page->assign('perpage',$perpage);
 }
 else
     $page->assign('formulaire',1);
index 0a9f549..1b2da99 100644 (file)
@@ -24,6 +24,32 @@ class SField {
     function get_where_statement() {
         return ($this->value!='');
     }
+
+    function get_order_statement() {
+        return false;
+    }
+
+    function get_url() {
+        if ($this->value=='')
+            return false;
+        else
+            return $this->fieldFormName.'='.urlencode($this->value);
+    }
+}
+
+class NumericSField extends SField {
+    function NumericSField($_fieldFormName) {
+        $this->fieldFormName = $_fieldFormName;
+        $this->get_request();
+    }
+    
+    function get_request() {
+        parent::get_request();
+        if ($this->value=='')
+            $this->value = 0;
+        if (!preg_match("/^[0-9]+$/", $this->value))
+            $this->error('Un champ numérique contient des caractères alphanumériques.<br>');
+    }
 }
 
 class StringSField extends SField {
@@ -52,6 +78,17 @@ class StringSField extends SField {
             return false;
         return '('.implode(' OR ',array_map(array($this,'get_like'),$this->fieldDbName)).')';
     }
+
+    function get_different($field) {
+        return $field.'!="'.$this->value.'"';
+    }
+
+    function get_order_statement() {
+        if ($this->value!='')
+            return implode(',',array_map(array($this,'get_different'),$this->fieldDbName));
+        else
+            return false;
+    }
 }
 
 class PromoSField extends SField {
@@ -77,6 +114,12 @@ class PromoSField extends SField {
             return false;
         return $this->fieldDbName.$this->compareField->value.$this->value;
     }
+
+    function get_url() {
+        if (!($u=parent::get_url()))
+            return false;
+        return $u.'&'.$this->compareField->get_url();
+    }
 }
 
 class SFieldGroup {
@@ -92,9 +135,27 @@ class SFieldGroup {
         return $f->get_where_statement();
     }
 
+    function field_get_order($f) {
+        return $f->get_order_statement();
+    }
+
+    function field_get_url($f) {
+        return $f->get_url();
+    }
+
     function get_where_statement() {
         $joinText=($this->and)?' AND ':' OR ';
         return '('.implode($joinText,array_filter(array_map(array($this,'field_get_where'),$this->fields))).')';
     }
+
+    function get_order_statement() {
+        $order = array_filter(array_map(array($this,'field_get_order'),$this->fields));
+        return (count($order)>0)?implode(',',$order):false;
+    }
+
+    function get_url() {
+        $url = array_filter(array_map(array($this,'field_get_url'),$this->fields));
+        return (count($url)>0)?implode('&',$url):false;
+    }
 }
 ?>
index 2dae2a0..7e82678 100644 (file)
@@ -4,26 +4,50 @@
     Résultats
   </div>
   <p class="smaller">
-    {if $nb_resultats==0}Aucune{else}{$nb_resultats}{/if} réponse{if $nb_resultats>1}s{/if}.
+    {if $nb_resultats_total==0}Aucune{else}{$nb_resultats_total}{/if} réponse{if $nb_resultats_total>1}s{/if}.
   </p>
   <table class="bicol">
     {section name=resultat loop=$resultats}
-    <tr class="{if $smarty.section.resultat.index is even}pair{else}impair{/if}">
+    <tr class="{cycle values="pair,impair"}">
       <td>
-      <strong>{$resultats[resultat].nom} {$resultats[resultat].prenom}</strong>
+        <strong>{$resultats[resultat].nom} {$resultats[resultat].prenom}</strong>
+        {if $resultats[resultat].epouse neq ""}
+          <div>({$resultats[resultat].epouse} {$resultats[resultat].prenom})</div>
+        {/if}
+        {if $resultats[resultat].decede == 1}
+          <div>(décédé)</div>
+        {/if}
       </td>
       <td>
-      (X {$resultats[resultat].promo})
+        (X {$resultats[resultat].promo})
+        {if $resultats[resultat].inscrit==1}
+          <a href="javascript:x()"  onclick="popWin('x.php?x={$resultats[resultat].username}')">
+          <img src="images/loupe.gif" border=0 ALT="Afficher les détails"></a>
+          <a href="vcard.php/{$resultats[resultat].username}.vcf?x={$resultats[resultat].username}">
+          <img src="images/vcard.png" border=0 ALT="Afficher la carte de visite"></a>
+          <a href="mescontacts.php?action={if $resultats[resultat].contact!=""}retirer{else}ajouter{/if}&amp;user={$resultats[resultat].username}&amp;mode=normal">
+          <img src="images/{if $resultats[resultat].contact!=""}retirer{else}ajouter{/if}.gif" border=0 ALT="{if $resultats[resultat].contact!=""}Retirer de{else}Ajouter parmi{/if} mes contacts"></a>
+        {/if}
       </td>
     </tr>
     {/section}
   </table>
+  {if $perpage<$nb_resultats_total}
+    {if $offset!=0}
+        <a href="{$smarty.server.PHP_SELF}?public_directory={$public_directory}&rechercher=1&{$url_args}&offset=0">Précédent</a>
+    {/if}
+    {if $offset<$nb_resultats_total-$perpage}
+        <a
+        href="{$smarty.server.PHP_SELF}?public_directory={$public_directory}&rechercher=1&{$url_args}&offset={$offset+$perpage}">Suivant</a>
+    {/if}
+  {/if}
 {else}
   <div class="rubrique">
     Recherche
   </div>
   <div class="center">
     <form action="{$smarty.server.PHP_SELF}" method="post">
+    <input type="hidden" name="public_directory" value="{$public_directory}">
     <table class="tinybicol" cellpadding="3" summary="Recherche">
       <tr>
         <td>Nom</td>