home | sitemap

Zoekformulier

De objecten-module kent geen standaard geen zoekformulier, resultaatpagina of detailpagina. Er zullen dus altijd eigen templates voor gemaakt moeten worden.

De objecten-module kent geen directe link die via het cms ingevoegd kan worden. Dit vanwege de vele mogelijkheden en parameters. De module kan direct worden aangeroepen via de hyperlink

/cgi/objects.cgi?site=<websitenaam>

en toont dan een standaard (test) zoekformulier, resultaatpagina en detailpagina.

Het makkelijkst is om de gewenste hyperlink incl. de nodige parameters in te stellen als redirect bij de pagina waar de module op getoond moet worden.

Eigen template(s)

De eigen template voor het zoekformulier kan in de map van de vormgeving (voor de website) worden geplaats. Deze dient de naam object_list.html te hebben.
Indien je meerdere templates wenst te gebruiken op de website (bijv. een verkort zoekformulier op de homepage en een uitgebreid formulier), dan kun je die naar wens aanmaken. De naam van het html-bestand mag vrij gekozen worden. Neem echter wel makkelijk te onthouden namen: je dient de naam namelijk mee te geven in het formulier of in de url.
Voeg bijvoorbeeld een verborgen veld toe aan het formulier met de gewenste naam van de template:

...
<input type="hidden" name="template" value="mijn_template" />
...

In bovenstaande voorbeeld heet het eigen template dus mijn_template.html. De extensie .html hoeft niet te worden opgegeven.

NB: de module gebruikt object_list.html altijd voor het zoekformulier én de resultaten. In object_list.html dienen het zoekformulier en de weergave van de resultaten dus gecombineerd te worden. Als nog geen zoekopdracht is gedaan (de gebruiker komt voor het eerst op de pagina), dan toont de module alle objecten.

Voor de detailpagina moet de standaard template object_detail.html heten. Een eigen template kan aan de module kenbaar worden gemaakt door een veld met de naam detail_template te gebruiken:

...
<input type="hidden" name="detail_template" value="mijn_template" />
...

De templates kunnen ook direct aan de module worden meegegeven via de url naar het zoekformulier of de detailpagina:

/cgi/objects.cgi?site=website;template=mijn_template;detail_template=mijn_detail_template

-of-

/website/objects/veld1/veld2/34?detail_template=mooie_template

Het zoekformulier

Om te zoeken in objecten kan het beste gebruik worden gemaakt van dropdowns (HTML select-element).

Het is ook mogelijk om 'selectors' te krijgen die meerdere velden samenvoegen, bijvoorbeeld alle landen met onder elk land alle plaatsnamen. Samengestelde lijsten zijn ook mogelijk: bijvoorbeeld met 'field1>field2' krijg je een lijst van alle unieke waarden alleen voor het opgegeven veld field1 (field1 moet dus in de zoekopdracht meegegeven zijn).
Met 'field1,field2' krijg je een lijst met alle waarden voor field1 en bijbehorende waarden voor field2.

Elke lijst bevat alle unieke kenmerken van de beschikbare objecten (de lijst bevat dus alleen kenmerken van daadwerkelijk in de database aanwezige objecten).

Om een lijst op het zoekformulier of elders in de template te kunnen gebruiken moet achter de naam _options worden toegevoegd. Als de objecten-module werkt met meerdere sets, dan dient altijd het id of de naam van de set te worden opgegeven (anders gaat de module uit van de standaard set).

Voorbeeld waarbij field1 bijv. een landnaam bevat:

<label>Landen</label>
<select name="field1">
  <option value="">Geen voorkeur</option>
  <!-- TMPL_LOOP NAME="field1_options" -->
    <option value="<!-- TMPL_VAR NAME="id" -->"><!-- TMPL_VAR NAME="label" --></option>
  <!-- /TMPL_LOOP -->
</select>

In plaats van een dropdown menu kan natuurlijk ook gewoon een lijst van hyperlinks worden gebruikt:

<h2>Landen</h2>
<ul>
<!-- TMPL_LOOP NAME="field1_options" -->
  <li><a href="/<!-- TMPL_VAR NAME="url" -->"><!-- TMPL_VAR NAME="label" --></a></li>
<!-- /TMPL_LOOP -->
</ul>

Om een lijst van een bepaalde set weer te laten geven kan de naam of het id worden toegevoegd.
Lijst van een set op basis van een naam. De naam dient omgeven te worden met een tilde (~):

...
<!-- TMPL_LOOP NAME="~mijn set~field1_options" -->
...

Lijst van een set op basis van een id.:

...
<!-- TMPL_LOOP NAME="001234_field2_options" -->
...

Ook kan de lijst van een complete set opgehaald worden met

...
<!-- TMPL_LOOP NAME="001234_set" -->
...

Om aan te geven op basis van welke variabele de huidige (selected, zie opsomming gegevens hieronder) moet worden aangegeven kan een extra variabele naam worden opgegeven:

...
<!-- TMPL_LOOP NAME="001234_set field5_rel" -->
...

Bovenstaande maakt dat in de lijst van set 001234 het item met dezelfde id als aangegeven door field5 als selected wordt gemarkeerd (zie hieronder).

Elk element in de lijst bevat vier gegevens:

Zoeken tussen relaties

Als een veld van een object een relatie aangeeft met een andere set, dan zijn alle objecten van die set ook op te vragen als een lijst. Als die set ook weer relaties met zichzelf heeft waardoor een geneste structuur ontstaat, dan kan die ook worden weergegeven.
Voorbeeld: bij een plaats kan een provincie worden ingesteld. Bij een plaats kan de provincie worden ingesteld bij field1. De lijst met provincies zit in de set 001234, waarbij de naam van een provincie in field2 staat. Om aan te geven dat er gezocht moet worden op een relatie staat achter de veldnaam _rel: 

<label>Provincie</label>
<select name="field1_rel">
  <option value="">Geen voorkeur</option>
  <!-- TMPL_LOOP NAME="001234_set" -->
    <option value="<!-- TMPL_VAR NAME="id" -->"><!-- TMPL_VAR NAME="field2" --></option>
  <!-- /TMPL_LOOP -->
</select>

Op deze manier kan dus gezocht worden naar alle plaatsen in een gekozen provincie.

Als de lijst van provincies ook alle gemeentes bevat die zijn gelinked aan een provincie, dan bevat de lijst een geneste structuur. Alle gemeentes per provincie zijn op te vragen van de subs variabele:

<label>Provincie</label>
<select name="field1_rel">
  <option value="">Geen voorkeur</option>
  <!-- TMPL_LOOP NAME="001234_set" -->
    <option value="<!-- TMPL_VAR NAME="id" -->"><!-- TMPL_VAR NAME="field2" --></option>
    <!-- TMPL_LOOP NAME="subs" -->
      <option value="<!-- TMPL_VAR NAME="id" -->">- <!-- TMPL_VAR NAME="" --></option>
    <!-- /TMPL_LOOP -->
  <!-- /TMPL_LOOP -->
</select>

Bovenstaande zal resulteren in een lijst als:

...
Gelderland
- Apeldoorn
- Zutphen
...
Overijssel
- Zwolle
...

Van-tot

Voor prijzen, gewicht, kamers, etc. kan het handig zijn om de gebruiker per staffel te laten zoeken. Indien gewenst kan dat eenvoudig worden bewerkstelligd door de naam van het gegeven te laten eindigen op _van of _tot. Voorbeeld:

Zelf een dropdown maken voor de verkoopprijs, etc. kan gewoon door zelf de waarden op te geven. Bijvoorbeeld:

<label>Prijs vanaf:</label>
<select name="field2_van">
  <option value="">Geen voorkeur</option>
  <option value="0" <!-- TMPL_IF NAME="prijs_verkoop_van" IS="0" -->selected="selected"<!-- /TMPL_IF -->>0</option>
  <option value="50000" <!-- TMPL_IF NAME="prijs_verkoop_van" IS="50000" -->selected="selected"<!-- /TMPL_IF -->>50.000</option>
  <option value="100000" <!-- TMPL_IF NAME=" prijs_verkoop_van" IS="100000" -->selected="selected"<!-- /TMPL_IF -->>100.000</option>
</select>

<label>Prijs tot:</label>
<select name="field2_tot">
  <option value="">Geen voorkeur</option>
  <option value="50000" <!-- TMPL_IF NAME="prijs_verkoop_tot" IS="50000" -->selected="selected"<!-- /TMPL_IF -->>50.000</option>
  <option value="100000" <!-- TMPL_IF NAME="prijs_verkoop_tot" IS="100000" -->selected="selected"<!-- /TMPL_IF -->>100.000</option>
  <option value="150000" <!-- TMPL_IF NAME=" prijs_verkoop_tot" IS="150000" -->selected="selected"<!-- /TMPL_IF -->>150.000</option>
</select>

Zoeken op vrije tekst

Het is ook mogelijk de bezoeker te laten zoeken op vrije tekst. Neem in dat geval een veld met de naam keyword op:

<input type="text" name="keyword" value="" />

Vrij zoeken kan alleen op gegevens in de velden field1 t/m field16.

Enkele uitleg bij vrij zoeken:

Geografisch zoeken

Het is ook mogelijk om op basis van een opgegeven postcode of locatie en afstand objecten 'in de buurt' te zoeken. Bij de objecten moet dan wel een postcode (minimaal 4 cijfers) of een coördinaat gedefinieerd en opgegeven zijn. Zoeken op postcode/afstand werkt alleen voor Nederland/Nederlandse postcodes.

Zoeken op basis van postcodes en afstand

Om te kunnen zoeken op postcode en afstand moeten 3 velden aan het formulier worden toegevoegd:

<label>Postcode:</label><input type="text" name="zipcode" value="" /><br /> <label>Afstand:</label><input type="text" name="distance" value="" /><br />
<input type="hidden" name="zipcode_field" value="field16" /> 

De velden zipcode en distance zijn nodig om te kunnen zoeken. In het veld zipcode moet de bezoeker minimaal de 4 cijfers van een postcode opgeven. De letters van een postcode doen er niet toe maar mogen wel worden opgegeven, bijv. '1234AB', 1234 AB', '1234 ab' of '1234'.

Het veld distance bevat de afstand in kilometers waarbinnen gezocht moet worden. De afstand mag door de bezoeker vrij worden opgegeven, maar gebruiksvriendelijker is een keuzemenu:

<label>Afstand:</label><select name="distance">
<option value="10">Binnen 10 kilometer</option>
<option value="20">Binnen 20 kilometer</option>
<option value="30">Binnen 30 kilometer</option>
<option value="50">Binnen 50 kilometer</option>
</select> 

Het veld zipcode_field dient een verborgen veld te zijn met als waarde (value) de naam van het veld bij de objecten dat de postcode bevat. Is gedefinieerd dat het veld field13 de postcode bevat, geef dan het veld zipcode_field als waarde 'field13'.

Zoeken op basis van locatie en afstand ((Google Maps-)coördinaten)

Om te kunnen zoeken op locatie en afstand moeten 3 velden aan het formulier worden toegevoegd:

<label>Uw locatie:</label><input type="text" name="location" value="" /><br /> <label>Afstand:</label><input type="text" name="distance" value="" /><br />
<input type="hidden" name="location_field" value="field16" /> 

De velden location en distance zijn nodig om te kunnen zoeken. In het veld location moet de bezoeker een locatie opgeven die door Google Maps omgezet kan worden in een coördinaat. Voorbeelden zijn:

'Apeldoorn'
'Stationstraat, Apeldoorn'
'Stationsstraat 250, Apeldoorn'
'6824 BV, Arnhem'

Als een locatie gevonden is, dan worden het adres en coordinaat terug gegeven en kunnen in de template worden weergegeven met resp. param_found_address en param_found_coord:

Door u opgegeven locatie: <!-- TMPL_VAR NAME="param_location" -->
Gevonden locatie: <!-- TMPL_VAR NAME="param_found_address" --> (<!-- TMPL_VAR NAME="param_found_coord" -->)

Het veld distance bevat de afstand in kilometers waarbinnen gezocht moet worden. De afstand mag door de bezoeker vrij worden opgegeven, maar gebruiksvriendelijker is een keuzemenu (zie vorige hoofdstuk).

Het veld location_field dient een verborgen veld te zijn met als waarde (value) de naam van het veld bij de objecten dat het (Google Maps-)coördinaat bevat. Is gedefinieerd dat het veld field13 het coördinaat bevat, geef dan het veld location_field als waarde 'field13'.

Tip: icons nodig om te tonen op een Google Maps kaart? kijk eens op http://code.google.com/p/google-maps-icons/wiki/IconDescriptions

Filters

Het zoeken naar objecten kan verder worden verfijnd door gebruik te maken van filters. Filters tonen per gegeven alle mogelijke opties incl. het aantal. Op die manier kan een gebruiker snel zien welke criteria er zijn en of ze niet onhandig veel resultaten opleveren. Zie de afbeelding rechts voor een voorbeeld.

Voor alle gegevens (zie Gegevens) kan een filter verkregen worden door een TMPL_LOOP variabele op te nemen met als naam:

<naam set>_<naam veld>_filter:

Levert een array om te gebruiken in een TMPL_LOOP met alle waardes voor dat veld. Per waarde zijn de volgende gegevens beschikbaar:

Als voor een filter een andere set is gebruikt (het veld van de objecten heeft een relatie met een andere set), dan zijn tevens alle velden van die objecten beschikbaar binnen de TMPL_LOOP van het filter (dus alle velden van field1 t/m field75).

Naast de array met alle waardes zijn ook de volgende variabelen beschikbaar:

<naam set>_<naam veld>_count: aantal opties binnen het filter (=lengte array)

<naam set>_<naam veld>_done: 1 als het filter is gebruikt/aangeklikt. Dit gegeven kan worden gebruikt om het filter zelf niet meer te tonen en de gemaakte keuze weer te geven.

<naam set>_<naam veld>_show: 1 als het filter niet leeg is en dus getoond kan worden. Een filter is leeg als er geen objecten (meer) zijn met mogelijke waardes voor het opgegeven veld.

Daarnaast is de algemene variabele filter_done beschikbaar die aangeeft of 1 of meerdere filters actief zijn. 

Een filter kan er bijv. als volgt uit zien:

<p>Vermogen:</p>
<ul> 
  <!-- TMPL_LOOP NAME="000725_field10_filter" -->
    <li><a href="/<!-- TMPL_VAR NAME="url" -->"><!-- TMPL_VAR NAME="label" --></a> (<!-- TMPL_VAR NAME="count" -->)</li> 
  <!-- /TMPL_LOOP -->
</ul>
<!-- TMPL_VAR NAME="000725_field10_filter_sort_field2" --> 

Filter sorteren

Indien gewenst kunnen de criteria binnen een filter gesorteerd worden. Dit kan worden bewerkstelligd voor een TMPL_VAR op te nemen die geen resultaat oplevert maar alleen tot doel heeft de module te vertellen op welk veld gesorteerd moet worden. Met

<naam set>_<naam veld>_filter_sort_<naam veld>

kan binnen het filter op de als laatste opgegeven veldnaam worden gesorteerd van laag naar hoog. Met de toevoeging _down

<naam set>_<naam veld>_filter_sort_<naam veld>_down

kan van hoog naar laag worden gesorteerd. Voorbeeld:

<!-- TMPL_VAR NAME="000123_field4_filter_sort_field8_down" -->

Het formulier

Het zoekformulier kan op basis van bovenstaande zelf worden ingericht. Als enige is nog een verborgen veld met de naam van de website vereist en een zoek-knop. Een voorbeeld:

<form action="/cgi/objects.cgi">
  <input type="hidden" name="site" value="<!-- TMPL_VAR NAME="site" -->" /> 

  <label>Land:</label>
  <select name="field1">
    <option value="">Geen voorkeur</option>
    <!-- TMPL_LOOP NAME="field1_options" -->
    <option value="<!-- TMPL_VAR NAME="id" -->"><!-- TMPL_VAR NAME="label" --></option> 
    <!-- /TMPL_LOOP -->
  </select>
  <br />
  ...
  <input type="submit" value="Zoeken" />
</form>