Adds search on subadministrativearea (Closes #1312).
authorStéphane Jacob <sj@m4x.org>
Wed, 29 Dec 2010 01:07:27 +0000 (02:07 +0100)
committerRaphaël Barrois <raphael.barrois@polytechnique.org>
Sat, 29 Jan 2011 19:40:43 +0000 (20:40 +0100)
Signed-off-by: Stéphane Jacob <sj@m4x.org>
classes/direnum.php
include/ufbuilder.inc.php
modules/search.php
templates/search/adv.form.tpl

index 0268ca9..bbb2869 100644 (file)
@@ -46,6 +46,7 @@ class DirEnum
     const NATIONALITIES  = 'nationalities';
     const COUNTRIES      = 'countries';
     const ADMINAREAS     = 'adminareas';
+    const SUBADMINAREAS  = 'subadminareas';
     const LOCALITIES     = 'localities';
 
     const COMPANIES      = 'companies';
@@ -600,6 +601,19 @@ class DE_AdminAreas extends DE_WithSuboption
 }
 // }}}
 
+// {{{ class DE_SubAdminAreas
+class DE_SubAdminAreas extends DE_WithSuboption
+{
+    protected $idfield   = 'geoloc_subadministrativeareas.id';
+    protected $optfield  = 'geoloc_subadministrativeareas.administrativearea';
+    protected $valfield  = 'geoloc_subadministrativeareas.name';
+    protected $from      = 'geoloc_subadministrativeareas';
+
+    protected $ac_join   = 'INNER JOIN profile_addresses ON (profile_addresses.subadministrativeAreaId = geoloc_subadministrativeareas.id)';
+    protected $ac_unique = 'profile_addresses.pid';
+}
+// }}}
+
 // {{{ class DE_Localities
 class DE_Localities extends DirEnumeration
 {
index f189ca3..79b918a 100644 (file)
@@ -193,7 +193,8 @@ class UFB_AdvancedSearch extends UserFilterBuilder
 
             new UFBF_Town('city', 'Ville / Code Postal'),
             new UFBF_Country('countryTxt', 'country', 'Pays'),
-            new UFBF_AdminArea('region', 'Région'),
+            new UFBF_AdminArea('administrativearea', 'Région'),
+            new UFBF_SubAdminArea('subadministrativearea', 'Département'),
 
             new UFBF_JobCompany('entreprise', 'Entreprise'),
             new UFBF_JobDescription('jobdescription', 'Fonction'),
@@ -861,6 +862,32 @@ class UFBF_AdminArea extends UFBF_Index
 }
 // }}}
 
+// {{{ class UFBF_SubAdminArea
+class UFBF_SubAdminArea extends UFBF_Index
+{
+    protected $direnum = DirEnum::SUBADMINAREAS;
+    protected $onlycurrentfield;
+
+    public function __construct($envfield, $formtext = '', $onlycurrentfield = 'only_current')
+    {
+        parent::__construct($envfield, $formtext);
+        $this->onlycurrentfield = $onlycurrentfield;
+    }
+
+
+    protected function buildUFC(UserFilterBuilder &$ufb)
+    {
+        if ($ufb->isOn($this->onlycurrentfield)) {
+            $flags = UFC_Address::FLAG_CURRENT;
+        } else {
+            $flags = UFC_Address::FLAG_ANY;
+        }
+
+        return new UFC_AddressField($this->val, UFC_AddressField::FIELD_SUBADMAREA, UFC_Address::TYPE_ANY, $flags);
+    }
+}
+// }}}
+
 // {{{ class UFBF_JobCompany
 class UFBF_JobCompany extends UFBF_Text
 {
index 1848e70..feea72a 100644 (file)
@@ -313,12 +313,20 @@ class SearchModule extends PLModule
           case 'nationalite':
             $ids = DirEnum::getOptionsIter(DirEnum::NATIONALITIES);
             break;
-          case 'region':
+          case 'administrativearea':
             if (Env::has('country')) {
                 $ids = DirEnum::getOptionsIter(DirEnum::ADMINAREAS, Env::v('country'));
             } else {
                 $ids = DirEnum::getOptionsIter(DirEnum::ADMINAREAS);
             }
+            $page->assign('onchange', 'changeAdministrativeArea(this.value)');
+            break;
+          case 'subadministrativearea':
+            if (Env::has('administrativearea')) {
+                $ids = DirEnum::getOptionsIter(DirEnum::SUBADMINAREAS, Env::v('administrativearea'));
+            } else {
+                $ids = DirEnum::getOptionsIter(DirEnum::SUBADMINAREAS);
+            }
             break;
           case 'school':
             $ids = DirEnum::getOptionsIter(DirEnum::EDUSCHOOLS);
index b239e4e..9940d40 100644 (file)
       };
   }
 
-  // when changing country, open up region choice
+  // when changing country, open up administrativearea choice
   function changeCountry(a2) {
     $(".autocompleteTarget[name='country']").attr('value',a2);
 
     if (a2) {
       $(".autocomplete[name='countryTxt']").addClass('hidden_valid');
 
-      $("[name='region']").parent().load(baseurl + 'list/region/', { country:a2 }, function() {
-          if ($("select[name='region']").children("option").size() > 1) {
-            $("select[name='region']").attr('value', '{/literal}{$smarty.request.region}{literal}');
+      $("[name='administrativearea']").parent().load(baseurl + 'list/administrativearea/', { country:a2 }, function() {
+          if ($("select[name='administrativearea']").children("option").size() > 1) {
+            $("select[name='administrativearea']").attr('value', '{/literal}{$smarty.request.administrativearea}{literal}');
 
-            $("tr#region_ln").show();
+            $("tr#administrativearea_list").show();
           } else {
-            $("select[name='region']").attr('value', '');
+            $("select[name='administrativearea']").attr('value', '');
 
-            $("tr#region_ln").hide();
+            $("tr#administrativearea_list").hide();
           }
         });
     } else {
       $(".autocomplete[name='countryTxt']").removeClass('hidden_valid');
 
-      $("select[name='region']").attr('value', '');
+      $("select[name='administrativearea']").attr('value', '');
+      $("select[name='subadministrativearea']").attr('value', '');
 
-      $("tr#region_ln").hide();
+      $("tr#administrativearea_list").hide();
+      $("tr#subadministrativearea_list").hide();
+    }
+  }
+
+  // when changing administrativearea, open up subadministrativearea choice
+  function changeAdministrativeArea(id) {
+    if (id) {
+      $("[name='subadministrativearea']").parent().load(baseurl + 'list/subadministrativearea/', { administrativearea:id }, function() {
+          if ($("select[name='subadministrativearea']").children("option").size() > 1) {
+            $("select[name='subadministrativearea']").attr('value', '{/literal}{$smarty.request.subadministrativearea}{literal}');
+            $("tr#subadministrativearea_list").show();
+          } else {
+            $("select[name='subadministrativearea']").attr('value', '');
+            $("tr#subadministrativearea_list").hide();
+          }
+        });
+    } else {
+      $("select[name='subadministrativearea']").attr('value', '');
+      $("tr#subadministrativearea_list").hide();
     }
   }
 
       if (nameRealField == name)
         return null;
 
-      // if changing country, might want to open region choice
+      // if changing country, might want to open administrativearea choice
       if (nameRealField == 'country')
         return function(i) {
             if (i.extra[0] < 0) {
       $(".autocomplete[name='countryTxt']").change(function() { changeCountry(''); });
 
       changeCountry({/literal}'{$smarty.request.country}'{literal});
+      changeAdministrativeArea({/literal}'{$smarty.request.administrativearea}'{literal});
 
       $(".autocomplete[name='schoolTxt']").change(function() { changeSchool(''); });
 
@@ -354,10 +375,16 @@ function cleanForm(f) {
         <a href="country" class="autocompleteToSelect">{icon name="table" title="Tous les pays"}</a>
       </td>
     </tr>
-    <tr id="region_ln">
-      <td>Région ou département</td>
+    <tr id="administrativearea_list">
+      <td>Région, province, état&hellip;</td>
+      <td>
+        <input name="administrativearea" type="hidden" size="32" value="{$smarty.request.administrativearea}" />
+      </td>
+    </tr>
+    <tr id="subadministrativearea_list">
+      <td>Département, comté&hellip;</td>
       <td>
-        <input name="region" type="hidden" size="32" value="{$smarty.request.region}"/>
+        <input name="subadministrativearea" type="hidden" size="32" value="{$smarty.request.subadministrativearea}" />
       </td>
     </tr>
     <tr>