Fix many uid fields in profile tables created by newdirectory.
[platal.git] / modules / search / classes.inc.php
index 7ad0e8c..c23d1c7 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2008 Polytechnique.org                              *
+ *  Copyright (C) 2003-2010 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -59,36 +59,38 @@ else
         IF(e.pub='public', je.name, '')      AS entreprise,
         IF(nw.pub='public', nw.address, '')  AS networking_address,
         IF(nw.pub='public', nwe.name, '')    AS networking_name,";
-@$globals->search->result_where_statement = '
-    LEFT JOIN  profile_education             AS edu0 ON (u.user_id = edu0.uid AND edu0.id = 0)
+@$globals->search->result_where_statement = "
+    LEFT JOIN  profile_education             AS edu0 ON (u.user_id = edu0.pid AND edu0.id = 0)
     LEFT JOIN  profile_education_enum        AS ede0 ON (ede0.id = edu0.eduid)
     LEFT JOIN  profile_education_degree_enum AS edd0 ON (edd0.id = edu0.degreeid)
     LEFT JOIN  profile_education_field_enum  AS f0   ON (f0.id = edu0.fieldid)
-    LEFT JOIN  profile_education             AS edu1 ON (u.user_id = edu1.uid AND edu1.id = 1)
+    LEFT JOIN  profile_education             AS edu1 ON (u.user_id = edu1.pid AND edu1.id = 1)
     LEFT JOIN  profile_education_enum        AS ede1 ON (ede1.id = edu1.eduid)
     LEFT JOIN  profile_education_degree_enum AS edd1 ON (edd1.id = edu1.degreeid)
     LEFT JOIN  profile_education_field_enum  AS f1   ON (f1.id = edu1.fieldid)
-    LEFT JOIN  profile_education             AS edu2 ON (u.user_id = edu2.uid AND edu2.id = 2)
+    LEFT JOIN  profile_education             AS edu2 ON (u.user_id = edu2.pid AND edu2.id = 2)
     LEFT JOIN  profile_education_enum        AS ede2 ON (ede2.id = edu2.eduid)
     LEFT JOIN  profile_education_degree_enum AS edd2 ON (edd2.id = edu2.degreeid)
     LEFT JOIN  profile_education_field_enum  AS f2   ON (f2.id = edu2.fieldid)
-    LEFT JOIN  profile_education             AS edu3 ON (u.user_id = edu3.uid AND edu3.id = 3)
+    LEFT JOIN  profile_education             AS edu3 ON (u.user_id = edu3.pid AND edu3.id = 3)
     LEFT JOIN  profile_education_enum        AS ede3 ON (ede3.id = edu3.eduid)
     LEFT JOIN  profile_education_degree_enum AS edd3 ON (edd3.id = edu3.degreeid)
     LEFT JOIN  profile_education_field_enum  AS f3   ON (f3.id = edu3.fieldid)
-    LEFT JOIN  profile_job                   AS e    ON (e.uid = u.user_id)
+    LEFT JOIN  profile_job                   AS e    ON (e.pid = u.user_id)
     LEFT JOIN  profile_job_enum              AS ee   ON (e.jobid = ee.id)
     LEFT JOIN  profile_job_sector_enum       AS es   ON (es.id = e.sectorid)
     LEFT JOIN  fonctions_def                 AS ef   ON (e.fonction = ef.id)
-    LEFT JOIN  geoloc_pays                   AS n1   ON (u.nationalite = n1.a2)
-    LEFT JOIN  geoloc_pays                   AS n2   ON (u.nationalite2 = n2.a2)
-    LEFT JOIN  geoloc_pays                   AS n3   ON (u.nationalite3 = n3.a2)
-    LEFT JOIN  adresses                      AS adr  ON (u.user_id = adr.uid AND FIND_IN_SET(\'active\',adr.statut))
-    LEFT JOIN  geoloc_pays                   AS gp   ON (adr.country = gp.a2)
-    LEFT JOIN  geoloc_region                 AS gr   ON (adr.country = gr.a2 AND adr.region = gr.region)
-    LEFT JOIN  emails                        AS em   ON (em.uid = u.user_id AND em.flags = \'active\')
-    LEFT JOIN  profile_networking            AS nw   ON (nw.uid = u.user_id)
-    LEFT JOIN  profile_networking_enum       AS nwe  ON (nwe.network_type = nw.network_type)';
+    LEFT JOIN  geoloc_countries              AS n1   ON (u.nationalite = n1.iso_3166_1_a2)
+    LEFT JOIN  geoloc_countries              AS n2   ON (u.nationalite2 = n2.iso_3166_1_a2)
+    LEFT JOIN  geoloc_countries              AS n3   ON (u.nationalite3 = n3.iso_3166_1_a2)
+    LEFT JOIN  profile_addresses             AS adr  ON (u.user_id = adr.pid
+                                                         AND FIND_IN_SET('current', adr.flags))
+    LEFT JOIN  geoloc_countries              AS gp   ON (adr.countryId = gp.iso_3166_1_a2)
+    LEFT JOIN  geoloc_administrativeareas    AS gr   ON (adr.countryId = gr.country
+                                                         AND adr.administrativeAreaId = gr.id)
+    LEFT JOIN  emails                        AS em   ON (em.uid = u.user_id AND em.flags = 'active')
+    LEFT JOIN  profile_networking            AS nw   ON (nw.pid = u.user_id)
+    LEFT JOIN  profile_networking_enum       AS nwe  ON (nwe.network_type = nw.network_type)";
 
 // }}}
 // {{{ class ThrowError
@@ -265,9 +267,9 @@ class QuickSearch extends SField
         $s = replace_accent(trim($this->value));
         $r = $s = str_replace('*','%',$s);
 
-        if (S::has_perms() && strpos($s, '@') !== false) {
+        if (S::admin() && strpos($s, '@') !== false) {
             $this->email = $s;
-        } else if (S::has_perms() && preg_match('/[0-9]+\.([0-9]+|%)\.([0-9]+|%)\.([0-9]+|%)/', $s)) {
+        } else if (S::admin() && preg_match('/[0-9]+\.([0-9]+|%)\.([0-9]+|%)\.([0-9]+|%)/', $s)) {
             $this->ip = $s;
         }
         if ($this->email || $this->ip) {
@@ -340,7 +342,14 @@ class QuickSearch extends SField
         }
         if (!empty($this->ip)) {
             $ip = ip_to_uint($this->ip);
-            $where[] = "( ls.ip = $ip OR ls.forward_ip = $ip ) AND ls.suid = 0";
+
+            // If the IP address requested for the search cannot be translated,
+            // the predicate should always be valued to false.
+            if ($ip != null) {
+                $where[] = "( ls.ip = $ip OR ls.forward_ip = $ip ) AND ls.suid = 0";
+            } else {
+                $where[] = "false";
+            }
         }
         if (!empty($this->phone)){
             require_once("profil.func.inc.php");
@@ -370,13 +379,13 @@ class QuickSearch extends SField
             $join .= "LEFT JOIN emails AS ems ON (ems.uid = u.user_id)";
         }
         if (!empty($this->ip)) {
-            $join .= "INNER JOIN logger.sessions AS ls ON (ls.uid = u.user_id)\n";
+            $join .= "INNER JOIN log_sessions AS ls ON (ls.uid = u.user_id)\n";
         }
         if (!empty($this->phone)) {
             if (!S::logged()) {
-                $join .= "INNER JOIN profile_phones AS t ON (t.uid = u.user_id AND t.pub = 'public')";
+                $join .= "INNER JOIN profile_phones AS t ON (t.pid = u.user_id AND t.pub = 'public')";
             } else {
-                $join .= "INNER JOIN profile_phones AS t ON (t.uid = u.user_id)";
+                $join .= "INNER JOIN profile_phones AS t ON (t.pid = u.user_id)";
             }
         }
         return $join;
@@ -480,7 +489,7 @@ class RefSField extends SField
 
     function too_large()
     {
-        return ($this->value=='');
+        return ($this->value == '');
     }
 
     // }}}
@@ -641,7 +650,7 @@ class StringSField extends SField
      * imposées par l'utilisateur) */
     function length()
     {
-        $cleaned = replace_accent(strtolower($this->value));
+        $cleaned = strtolower(replace_accent($this->value));
         $length  = strlen(ereg_replace('[a-z0-9]', '', $cleaned));
         return strlen($this->value) - $length;
     }
@@ -651,7 +660,7 @@ class StringSField extends SField
 
     function too_large()
     {
-        return ($this->length()<2);
+        return ($this->length() < 2);
     }
 
     // }}}
@@ -837,11 +846,14 @@ class SFieldGroup
     {
         $this->fields = $_fields;
         $this->and    = $_and;
-        foreach ($this->fields as $key=>&$field) {
-            if (is_null($field)) {
-                unset($this->fields[$key]);
+
+        $cleanFields = array();
+        foreach ($this->fields as $field) {
+            if (!is_null($field)) {
+                $cleanFields[] = $field;
             }
         }
+        $this->fields = $cleanFields;
     }
 
     // }}}
@@ -850,7 +862,7 @@ class SFieldGroup
     function too_large()
     {
         $b = true;
-        for ($i=0 ; $b && $i<count($this->fields) ; $i++) {
+        for ($i = 0; $b && $i < count($this->fields); ++$i) {
             if (!is_null($this->fields[$i])) {
                 $b = $b && $this->fields[$i]->too_large();
             }