Prepares database for job terms.
[platal.git] / modules / search.php
index 6629cc2..cc12371 100644 (file)
@@ -25,10 +25,10 @@ class SearchModule extends PLModule
     {
         return array(
             'search'              => $this->make_hook('quick',          AUTH_PUBLIC),
-            'search/adv'          => $this->make_hook('advanced',       AUTH_COOKIE),
+            'search/adv'          => $this->make_hook('advanced',       AUTH_COOKIE, 'directory_ax'),
             'advanced_search.php' => $this->make_hook('redir_advanced', AUTH_PUBLIC),
-            'search/autocomplete' => $this->make_hook('autocomplete',   AUTH_COOKIE, 'user', NO_AUTH),
-            'search/list'         => $this->make_hook('list',           AUTH_COOKIE, 'user', NO_AUTH),
+            'search/autocomplete' => $this->make_hook('autocomplete',   AUTH_COOKIE, 'directory_ax', NO_AUTH),
+            'search/list'         => $this->make_hook('list',           AUTH_COOKIE, 'directory_ax', NO_AUTH),
         );
     }
 
@@ -43,22 +43,29 @@ class SearchModule extends PLModule
         Platal::page()->assign('formulaire',1);
     }
 
-    function handler_quick(&$page, $action = null, $subaction = null)
+    /** 
+     * $model: The way of presenting the results: minifiche, trombi, geoloc.
+     * $byletter: Show only names beginning with this letter
+     */
+    function handler_quick(&$page, $model = null, $byletter = null)
     {
         global $globals;
 
-        $res = XDB::query("SELECT  MIN(diminutif), MAX(diminutif)
-                             FROM  groups
-                            WHERE  cat = 'Promotions'");
-        list($min, $max) = $res->fetchOneRow();
-        $page->assign('promo_min', $min);
-        $page->assign('promo_max', $max);
-
-        if (Env::has('quick') || $action == 'geoloc') {
-            $quick = trim(Env::v('quick'));
+        if (Env::has('quick') || $model == 'geoloc') {
+            $quick = Env::t('quick');
             if (S::logged() && !Env::has('page')) {
                 S::logger()->log('search', 'quick=' . $quick);
             }
+
+            if ($quick == '') {
+                $page->trigWarning('Aucun critère de recherche n\'est spécifié.');
+                $page->changeTpl('search/index.tpl');
+                $page->setTitle('Annuaire');
+                $page->assign('formulaire', 1);
+                $page->addJsLink('ajax.js');
+                return;
+            }
+
             $list = 'profile|prf|fiche|fic|referent|ref|mentor';
             if (S::admin()) {
                 $list .= '|admin|adm|ax';
@@ -91,25 +98,33 @@ class SearchModule extends PLModule
                 $url .= 'action=search&q=' . urlencode(substr($quick, 4));
                 $url .= '&group=' . urlencode('-Equipe,-Main,-PmWiki,-Site,-Review');
                 pl_redirect($url);
+            } elseif (strpos($quick, 'trombi:') === 0) {
+                $promo = substr($quick, 7);
+                $res = XDB::query("SELECT  diminutif
+                                     FROM  groups
+                                    WHERE  cat = 'Promotions' AND diminutif = {?}",
+                                  $promo);
+                if ($res->numRows() == 0) {
+                    $page->trigWarning("La promotion demandée n'est pas valide: $promo");
+                } else {
+                    http_redirect('http://www.polytechnique.net/login/' . $promo . '/annuaire/trombi');
+                }
             }
 
             $page->assign('formulaire', 0);
 
             require_once 'userset.inc.php';
-            $view = new SearchSet(true, $action == 'geoloc' && substr($subaction, -3) == 'swf');
-            $view->addMod('minifiche', 'Mini-fiches', true, array('with_score' => true));
+            $view = new SearchSet(true);
+            $view->addMod('minifiche', 'Mini-fiches', true, array('with_score' => true, 'starts_with' => $byletter));
             if (S::logged() && !Env::i('nonins')) {
                 $view->addMod('trombi', 'Trombinoscope', false, array('with_promo' => true, 'with_score' => true));
                 // TODO: Reactivate when the new map is completed.
                 // $view->addMod('geoloc', 'Planisphère', false, array('with_annu' => 'search/adv'));
             }
-            $view->apply('search', $page, $action, $subaction);
+            $view->apply('search', $page, $model);
 
             $nb_tot = $view->count();
             $page->assign('search_results_nb', $nb_tot);
-            if ($subaction) {
-                return;
-            }
             if (!S::logged() && $nb_tot > $globals->search->public_max) {
                 $page->trigError('Votre recherche a généré trop de résultats pour un affichage public.');
             } elseif ($nb_tot > $globals->search->private_max) {
@@ -122,20 +137,20 @@ class SearchModule extends PLModule
             $page->addJsLink('ajax.js');
         }
 
-        $this->load('search.inc.php');
         $page->changeTpl('search/index.tpl');
         $page->setTitle('Annuaire');
     }
 
-    function handler_advanced(&$page, $action = null, $subaction = null)
+    /** $model is the way of presenting the results: minifiche, trombi, geoloc.
+     */
+    function handler_advanced(&$page, $model = null, $byletter = null)
     {
         global $globals;
         require_once 'geocoding.inc.php';
-        $this->load('search.inc.php');
         $page->assign('advanced',1);
         $page->addJsLink('jquery.autocomplete.js');
 
-        if (!Env::has('rechercher') && $action != 'geoloc') {
+        if (!Env::has('rechercher') && $model != 'geoloc') {
             $this->form_prepare();
         } else {
             if (!Env::has('page')) {
@@ -143,24 +158,24 @@ class SearchModule extends PLModule
             }
 
             require_once 'userset.inc.php';
-            $view = new SearchSet(false, $action == 'geoloc' && substr($subaction, -3) == 'swf');
-            $view->addMod('minifiche', 'Mini-fiches', true);
+            $view = new SearchSet(false);
+            $view->addMod('minifiche', 'Mini-fiches', true, array('starts_with' => $byletter));
             $view->addMod('trombi', 'Trombinoscope', false, array('with_promo' => true));
             // TODO: Reactivate when the new map is completed.
             // $view->addMod('geoloc', 'Planisphère', false, array('with_annu' => 'search/adv'));
-            $view->apply('search/adv', $page, $action, $subaction);
+            $view->apply('search/adv', $page, $model);
 
-            if ($subaction) {
-                return;
-            }
             $nb_tot = $view->count();
             if ($nb_tot > $globals->search->private_max) {
                 $this->form_prepare();
                 $page->trigError('Recherche trop générale.');
+            } else if ($nb_tot == 0) {
+                $this->form_prepare();
+                $page->trigError('Il n\'existe personne correspondant à ces critères dans la base !');
             }
         }
 
-        $page->changeTpl('search/index.tpl', $action == 'mini' ? SIMPLE : SKINNED);
+        $page->changeTpl('search/index.tpl', $model == 'mini' ? SIMPLE : SKINNED);
         $page->addJsLink('ajax.js');
         $page->assign('public_directory',0);
     }
@@ -195,7 +210,6 @@ class SearchModule extends PLModule
             die();
         }
 
-        require_once 'directory.enums.inc.php';
         $enums = array(
             'binetTxt'           => DirEnum::BINETS,
             'groupexTxt'         => DirEnum::GROUPESX,
@@ -209,7 +223,7 @@ class SearchModule extends PLModule
             'nationaliteTxt'     => DirEnum::NATIONALITIES,
             'schoolTxt'          => DirEnum::EDUSCHOOLS,
         );
-        if (!array_key_exists($enums, $type)) {
+        if (!array_key_exists($type, $enums)) {
             exit();
         }
 
@@ -242,50 +256,53 @@ class SearchModule extends PLModule
 
     function handler_list(&$page, $type = null, $idVal = null)
     {
+        $page->assign('name', $type);
+        $page->assign('with_text_value', true);
+        $page->assign('onchange', "document.forms.recherche.{$type}Txt.value = this.options[this.selectedIndex].text");
+
         // Give the list of all values possible of type and builds a select input for it
         $ids = null;
-        require_once 'directory.enums.inc.php';
 
         switch ($type) {
         case 'binet':
-            $ids = DirEnum::getOptions(DirEnum::BINETS);
+            $ids = DirEnum::getOptionsIter(DirEnum::BINETS);
             break;
           case 'networking_type':
-            $ids = DirEnum::getOptions(DirEnum::NETWORKS);
+            $ids = DirEnum::getOptionsIter(DirEnum::NETWORKS);
             break;
           case 'country':
-            $ids = DirEnum::getOptions(DirEnum::COUNTRIES);
+            $ids = DirEnum::getOptionsIter(DirEnum::COUNTRIES);
             $page->assign('onchange', 'changeCountry(this.value)');
             break;
           case 'diploma':
             if (Env::has('school') && Env::i('school') != 0) {
-              $ids = DirEnum::getOptions(DirEnum::EDUDEGREES, Env::i('school'));
+              $ids = DirEnum::getOptionsIter(DirEnum::EDUDEGREES, Env::i('school'));
             } else {
-              $ids = DirEnum::getOptions(DirEnum::EDUDEGREES);
+              $ids = DirEnum::getOptionsIter(DirEnum::EDUDEGREES);
             }
             break;
           case 'groupex':
-            $ids = DirEnum::getOptions(DirEnum::GROUPESX);
+            $ids = DirEnum::getOptionsIter(DirEnum::GROUPESX);
             break;
           case 'nationalite':
-            $ids = DirEnum::getOptions(DirEnum::NATIONALITIES);
+            $ids = DirEnum::getOptionsIter(DirEnum::NATIONALITIES);
             break;
-        case 'region':
-            if ($isset($_REQUEST['country'])) {
-                $ids = DirEnum::getOptions(DirEnum::ADMINAREAS, $_REQUEST['country']);
+          case 'region':
+            if (Env::has('country')) {
+                $ids = DirEnum::getOptionsIter(DirEnum::ADMINAREAS, Env::v('country'));
             } else {
-                $ids = DirEnum::getOptions(DirEnum::ADMINAREAS);
+                $ids = DirEnum::getOptionsIter(DirEnum::ADMINAREAS);
             }
             break;
           case 'school':
-            $ids = DirEnum::getOptions(DirEnum::EDUSCHOOLS);
+            $ids = DirEnum::getOptionsIter(DirEnum::EDUSCHOOLS);
             $page->assign('onchange', 'changeSchool(this.value)');
             break;
           case 'section':
-            $ids = DirEnum::getOptions(DirEnum::SECTIONS);
+            $ids = DirEnum::getOptionsIter(DirEnum::SECTIONS);
             break;
           case 'secteur':
-            $ids = DirEnum::getOptions(DirEnum::SECTORS);
+            $ids = DirEnum::getOptionsIter(DirEnum::SECTORS);
             break;
           default: exit();
         }
@@ -296,10 +313,7 @@ class SearchModule extends PLModule
         }
         pl_content_headers("text/xml");
         $page->changeTpl('include/field.select.tpl', NO_SKIN);
-        $page->assign('name', $type);
         $page->assign('list', $ids);
-        $page->assign('with_text_value', true);
-        $page->assign('onchange', "document.forms.recherche.{$type}Txt.value = this.options[this.selectedIndex].text");
     }
 }