<?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);
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 {
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 {
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 {
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;
+ }
}
?>
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}&user={$resultats[resultat].username}&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>