<?php
/***************************************************************************
- * Copyright (C) 2003-2007 Polytechnique.org *
+ * Copyright (C) 2003-2008 Polytechnique.org *
* http://opensource.polytechnique.org/ *
* *
* This program is free software; you can redistribute it and/or modify *
if (Env::has('quick') || $action == 'geoloc') {
$quick = trim(Env::v('quick'));
+ if (S::logged() && !Env::has('page')) {
+ $_SESSION['log']->log('search', 'quick=' . $quick);
+ }
$list = 'profile|prf|fiche|fic|referent|ref|mentor';
if (S::has_perms()) {
$list .= '|admin|adm|ax';
}
- if (preg_match('/^(' . $list . '):([-a-z]+(\.[-a-z]+(\.\d{2,4})?)?)$/', $quick, $matches)) {
+ if (preg_match('/^(' . $list . '):([-a-z]+(\.[-a-z]+(\.\d{2,4})?)?)$/', replace_accent($quick), $matches)) {
$forlife = $matches[2];
switch($matches[1]) {
case 'admin': case 'adm':
$base = 'referent/';
break;
}
- pl_redirect($base . $forlife);
+
+ require_once 'user.func.inc.php';
+ $login = get_user_forlife($forlife, '_silent_user_callback');
+ if ($login) {
+ pl_redirect($base . $login);
+ }
+ $_REQUEST['quick'] = $forlife;
+ $_GET['quick'] = $forlife;
} elseif (strpos($quick, 'doc:') === 0) {
$url = 'Docs/Recherche?';
$url .= 'action=search&q=' . urlencode(substr($quick, 4));
- $url .= '&group=' . urlencode('-Equipe,-Main,-PmWiki,-Site');
+ $url .= '&group=' . urlencode('-Equipe,-Main,-PmWiki,-Site,-Review');
pl_redirect($url);
}
if (!S::logged() && $nb_tot > $globals->search->public_max) {
new ThrowError('Votre recherche a généré trop de résultats pour un affichage public.');
} elseif ($nb_tot > $globals->search->private_max) {
- new ThrowError('Recherche trop générale');
+ new ThrowError('Recherche trop générale. Une <a href="search/adv">recherche avancée</a> permet de préciser la recherche.');
} elseif (empty($nb_tot)) {
- new ThrowError('il n\'existe personne correspondant à ces critères dans la base !');
+ new ThrowError('Il n\'existe personne correspondant à ces critères dans la base !');
}
} else {
$page->assign('formulaire',1);
'text' => "(a.cat = 'GroupesX' OR a.cat = 'Institutions') AND pub = 'public' AND nom",
'exact' => false),
'section' => array('field' => 'id', 'table' => 'sections', 'text' => 'text', 'exact' => false),
- 'school' => array('field' => 'id', 'table' => 'applis_def', 'text' => 'text', 'exact' => false)
+ 'school' => array('field' => 'id', 'table' => 'applis_def', 'text' => 'text', 'exact' => false),
+ 'city' => array('table' => 'geoloc_city', 'text' => 'name', 'exact' => false)
);
+ if (!Env::has('page')) {
+ $_SESSION['log']->log('search', 'adv=' . var_export($_GET, true));
+ }
foreach ($textFields as $field=>&$query) {
if (!Env::v($field) && Env::v($field . 'Txt')) {
$res = XDB::query("SELECT {$query['field']}
$view = new SearchSet(false, $action == 'geoloc' && substr($subaction, -3) == 'swf');
$view->addMod('minifiche', 'Minifiches', true);
$view->addMod('trombi', 'Trombinoscope', false, array('with_promo' => true));
- $view->addMod('geoloc', 'Planisphère', false, array('with_annu' => 'search/adv'));
+ //$view->addMod('geoloc', 'Planisphère', false, array('with_annu' => 'search/adv'));
$view->apply('search/adv', $page, $action, $subaction);
if ($subaction) {
$nb_tot = $view->count();
if ($nb_tot > $globals->search->private_max) {
$this->form_prepare();
- new ThrowError('Recherche trop générale');
+ new ThrowError('Recherche trop générale.');
}
}
}
// default search
- $q = preg_quote($q);
$unique = '`user_id`';
$db = '`auth_user_md5`';
$realid = false;
$beginwith = true;
$field2 = false;
- $qsearch = $q;
+ $qsearch = str_replace(array('%', '_'), '', $q);
switch ($type) {
case 'binetTxt':
break;
case 'firstname':
$field = '`prenom`';
- $q = '(^|[ \\-])'.$q;
$beginwith = false;
break;
case 'fonctionTxt':
$field = '`fonction_fr`';
$unique = '`uid`';
$realid = '`fonctions_def`.`id`';
- $qsearch = '(^|[ /\\-])'.$q;
$beginwith = false;
break;
case 'groupexTxt':
case 'name':
$field = '`nom`';
$field2 = '`nom_usage`';
- $qsearch = '(^|[ \\-])'.$q;
$beginwith = false;
break;
case 'nationaliteTxt':
case 'nickname':
$field = '`profile_nick`';
$db = '`auth_user_quick`';
- $qsearch = '(^|[ \\-])'.$q;
$beginwith = false;
break;
case 'poste':
default: exit();
}
+ function make_field_test($fields, $beginwith) {
+ $tests = array();
+ $tests[] = $fields . ' LIKE CONCAT({?}, \'%\')';
+ if (!$beginwith) {
+ $tests[] = $fields . ' LIKE CONCAT(\'% \', {?}, \'%\')';
+ $tests[] = $fields . ' LIKE CONCAT(\'%-\', {?}, \'%\')';
+ }
+ return '(' . implode(' OR ', $tests) . ')';
+ }
$field_select = $field;
+ $field_t = make_field_test($field, $beginwith);
if ($field2) {
- $field_select = 'IF('.$field.' REGEXP {?}, '.$field.', '.$field2.')';
- }
-
- if ($beginwith) {
- $qsearch = '^'.$qsearch;
+ $field2_t = make_field_test($field2, $beginwith);
+ $field_select = 'IF(' . $field_t . ', ' . $field . ', ' . $field2. ')';
}
- $list = XDB::iterator('SELECT '.$field_select.' AS field,
- COUNT(DISTINCT '.$unique.') AS nb
- '.($realid?(', '.$realid.' AS id'):'').'
- FROM '.$db.'
- WHERE '.$field.' REGEXP {?}'.
- ($field2?(' OR '.$field2.' REGEXP {?}'):'').'
- GROUP BY '.$field_select.'
+ $list = XDB::iterator('SELECT ' . $field_select . ' AS field,
+ COUNT(DISTINCT ' . $unique . ') AS nb
+ ' . ($realid ? (', ' . $realid . ' AS id') : '') . '
+ FROM ' . $db . '
+ WHERE ' . $field_t .
+ ($field2 ? (' OR ' . $field2_t) : '') . '
+ GROUP BY ' . $field_select . '
ORDER BY nb DESC
LIMIT 11',
- $qsearch, $qsearch, $qsearch, $qsearch);
+ $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch,
+ $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch);
$nbResults = 0;
$res = "";
while ($result = $list->next()) {
FROM '.$db.$where.'
GROUP BY '.$field.'
ORDER BY '.$field));
+ $page->assign('with_text_value', true);
+ $page->assign('onchange', "document.forms.recherche.{$type}Txt.value = this.options[this.selectedIndex].text");
}
}