PHP-Export - Filterkriterien

Aus OpenEstate-Wiki

Wechseln zu: Navigation, Suche
Website-Export via ImmoTool
PHP-Export - Filterkriterien

Inhaltsverzeichnis

Wie funktioniert das Filtern?

Da die PHP-Skripte zwecks minimaler Anforderungen ohne Datenbank auskommen sollen, wurde folgender Filter-Mechanismus implementiert.

  • Eine Filteroperation wird vorab auf jeder Immobilie im Bestand ausgeführt. Das Ergebnis der Filterung wird im Ordner cache zwischengespeichert.
  • Wenn aus der Immobilienübersicht (index.php) heraus ein Filter ausgewählt wurde, wird nach einem zwischengespeicherten Eintrag im cache-Ordner gesucht.
    • Wird ein zwischengespeicherter Filter gefunden, wird dieser geladen und in der Immobilienübersicht angewendet.
    • Wird kein zwischengespeicherter Filter gefunden, filtert das Programm den Objektbestand und erzeugt den fehlenden Eintrag im cache-Ordner. Das zur Laufzeit ermittelte Filter-Ergebnis wird dann in der Immobilienübersicht angewendet.

Eigene Filter programmieren

Es können beliebig viele Filterkriterien programmiert werden.

  • Für jeden Filter muss eine PHP-Datei im Ordner includes vorliegen.
  • Die Benennung der PHP-Datei ist allgemein: class.filter_[name].php
    • An Stelle von [name] muss ein eindeutiger interner Name gewählt werden.
    • z.B. class.filter_myfilter.php

Beispiel für einen Filter

Mit der Datei includes/class.filter_action.php wird der Immobilienbestand nach Vermarktungsart gefiltert.

  1. <?php
  2. /**
  3.  * Website-Export, Filter nach Vermarktungsart
  4.  *
  5.  * @author Andreas Rudolph & Walter Wagner
  6.  * @copyright 2009, OpenEstate.org
  7.  * @license http://www.gnu.org/licenses/gpl-3.0.txt
  8.  */
  9.  
  10. if (!defined('IN_WEBSITE')) exit;
  11. require_once( 'include/class.filter.php' );
  12.  
  13. class ImmoToolFilter_action extends ImmoToolFilter 
  14. {
  15.   /**
  16.    * Überprüfung, ob ein Objekt von dem Filter erfasst wird. 
  17.    */
  18.   function filter( $object, &$items )
  19.   {
  20.     $action = $object['action'];
  21.     if (!is_string($action)) return;
  22.     if (!is_array($items[$action])) $items[$action] = array();
  23.     $items[$action][] = $object['id'];
  24.   }
  25.  
  26.   /**
  27.    * Name des Filters.
  28.    */
  29.   function getName()
  30.   {
  31.     return 'action';
  32.   }
  33.  
  34.   /**
  35.    * Titel des Filters, abhängig von der Sprache.
  36.    */
  37.   function getTitle( &$translations, $lang )
  38.   {
  39.     $title = $translations['labels']['estate.action'];
  40.     return is_string($title)? $title: $this->getName();
  41.   }
  42.  
  43.   /**
  44.    * HTML-Code zur Auswahl des Filterkriteriums erzeugen. 
  45.    */
  46.   function getWidget( $selectedValue, $lang, &$translations, &$setup )
  47.   {
  48.     $widget = '';
  49.     $sortedActions = $translations['openestate']['actions'];
  50.     asort($sortedActions);
  51.     if (is_array($sortedActions) && count($sortedActions)>0)
  52.     {
  53.       $by = $this->getTitle( $translations, $lang );
  54.       $widget .= '<select id="filter_' . $this->getName() . '" name="filter[' . $this->getName() . ']">';
  55.       $widget .= '<option value="">[ ' . $by . ' ]</option>';
  56.       foreach ($sortedActions as $action=>$txt)
  57.       {
  58.         $selected = ($selectedValue==$action)? 'selected="selected"': '';
  59.         $widget .= '<option value="' . $action . '" ' . $selected . '>' . $txt . '</option>';
  60.       }
  61.       $widget .= '</select>';
  62.     }
  63.     return $widget;
  64.   }
  65. }
  66. ?>

Am obigen Quelltext werden die Anforderungen an einen Filter deutlich:

  • Jeder Filter ist als Klasse implementiert und erbt die Eigenschaften von ImmoToolFilter. (siehe Zeile 11 & 13)
  • Die Benennung der Filter-Klasse ist allgemein fest vorgegeben mit: ImmoToolFilter_[NAME]
    • An Stelle von [NAME] muss der interne Name des Filter angegeben sein, in diesem Falle action.
  • Die Filter-Klasse muss eine Funktion getName() implementieren. (siehe Zeile 29)
    • Diese Funktion liefert den internen Namen des Filters, in diesem Falle action.
  • Die Filter-Klasse muss eine Funktion getTitle( &$translations, $lang ) implementieren. (siehe Zeile 37)
    • Diese Funktion liefert die Übersetzung des Filters in einer bestimmten Sprache zurück.
    • Im Parameter $translations wird ein Array mit allen hinterlegten Übersetzungen zur aktuellen Sprache übermittelt. Wenn für den Filter eine Übersetzung in data/i18n_de.php vorliegt, kann darauf zurückgegriffen werden.
    • Im Parameter $lang wird der zweistellige ISO-Sprachcode der gewählten Sprache übermittelt.
  • Die Filter-Klasse kann eine Funktion getWidget( $selectedValue, $lang, &$translations, &$setup ) implementieren. (siehe Zeile 46)
    • Diese Funktion liefert den HTML-Code zum Eingabefeld des Filters zurück. Wenn diese Funktion nicht definiert ist, oder null zurückliefert, wird kein Eingabefeld erzeugt.
    • Im Parameter $selectedValue wird der aktuell gewählte Wert des Filters übermittelt.
    • Im Parameter $lang wird der zweistellige ISO-Sprachcode der gewählten Sprache übermittelt.
    • Im Parameter $translations wird ein Array mit allen hinterlegten Übersetzungen zur aktuellen Sprache übermittelt.
    • Im Parameter $setup wird die Konfiguration der Seite übermittelt.
  • Die Filter-Klasse muss eine Funktion filter( $object, &$items ) implementieren. (siehe Zeile 18)
    • In dieser Funktion wird die Filterung einer Immobilie durchgeführt.
    • Im Parameter $object wird das Array der zu prüfenden Immobilie übermittelt. Das Array wurde ermittelt aus data/[NR]/object.php.
    • Im Parameter $items wird das allgemeine Filter-Array übermittelt. Die ID der zu filternden Immobilie kann innerhalb dieses Arrays an verschiedenen Stellen zugeordnet werden.

Codebeispiele zu filter()

Nach Vermarktungsart filtern

  1.   function filter( $object, &$items )
  2.   {
  3.     $action = $object['action'];
  4.     if (!is_string($action)) return;
  5.     if (!is_array($items[$action])) $items[$action] = array();
  6.     $items[$action][] = $object['id'];
  7.   }

Der obige Ausschnitt stammt aus class.filter_action.php

  • In Zeile 20 wird die Vermarktungsart ermittelt. Wenn die Vermarktungsart ungültig ist, wird die Funktion abgebrochen. (Zeile 21).
  • Wenn für die Vermarktungsart noch keine Filterungen stattfanden, wird ein leeres Array erzeugt. (Zeile 23)
  • Die ID der Immobilie wird in das Filter-Array zur Vermarktungsart übernommen.

Nach Objektart filtern

  1.   function filter( $object, &$items )
  2.   {
  3.     $types = $object['type_path'];
  4.     if (!is_array($types)) $types = array( $object['type'] );
  5.     foreach ($types as $type)
  6.     {
  7.       if (!is_array($items[$type])) $items[$type] = array();
  8.       $items[$type][] = $object['id'];
  9.     }
  10.   }

Der obige Ausschnitt stammt aus class.filter_type.php

  • In Zeile 20 & 21 wird ein Array mit den Immobilienarten einer Immobilie erzeugt.
  • Für jede Immobilienart der Immobilie wird in Zeile 22 bis 26 ein Filter-Eintrag registriert.

Nach Neubauobjekten filtern

  1.   function filter( $object, &$items )
  2.   {
  3.     $alter = $object['attributes']['zustand']['alter']['value'];
  4.     if (!is_string($alter) || strtolower($alter)!='neubau') return;
  5.     if (!is_array($items['1'])) $items['1'] = array();
  6.     $items['1'][] = $object['id'];
  7.   }

Der obige Ausschnitt stammt aus class.filter_neubau.php

  • In Zeile 20 wird das Zustands-Attribut 'Alter' der Immobilie ermittelt.
  • Nur wenn es sich um ein Neubauobjekt handelt, findet eine Filterung statt.

Codebeispiele zu getTitle()

Die Übersetzung eines Filters ist prinzipiell auf zweierlei Art möglich.

Filter aus einer Übersetzungsdatei übersetzen

  1.   function getTitle( &$translations, $lang )
  2.   {
  3.     $title = $translations['labels']['estate.filter.neubau'];
  4.     return is_string($title)? $title: $this->getName();
  5.   }

Der obige Ausschnitt stammt aus class.filter_neubau.php.

  • Für den Neubaufilter liegt eine Übersetzung in der globalen Übersetzungsdatei (z.B. data/i18n_de.php) vor.
  • Der Wert wird entsprechend aus dem Übersetzungs-Array ermittelt. (Zeile 39 & 40)

Filter explizit übersetzen

  1.   function getTitle( &$translations, $lang )
  2.   {
  3.     if ($lang=='de') return 'Mein Filter';
  4.     if ($lang=='en') return 'My Filter';
  5.     // eventuell um weitere Sprachen erweitern...
  6.     return $this->getName();
  7.   }

Der obige Ausschnitt kann verwendet werden, wenn kein Eintrag in der globalen Übersetzungsdatei für den Filter vorliegt. Für alle vom ImmoTool ausgelieferten Filter-Klassen wird es globale Übersetzungen geben. Bei Eigenentwicklungen oder Tests kann dieser 'Workaround' aber durchaus hilfreich sein.

Codebeispiele zu getWidget()

Für jeden Filter kann ein individuelles Eingabefeld programmiert werden. Der erzeugte HTML-Code wird im Filtermenü der Immobilienübersicht (index.php) dargestellt.

Selectbox für einen Filter erzeugen

  1.   function getWidget( $selectedValue, $lang, &$translations, &$setup )
  2.   {
  3.     $widget = '';
  4.     $sortedActions = $translations['openestate']['actions'];
  5.     asort($sortedActions);
  6.     if (is_array($sortedActions) && count($sortedActions)>0)
  7.     {
  8.       $by = $this->getTitle( $translations, $lang );
  9.       $widget .= '<select id="filter_' . $this->getName() . '" name="filter[' . $this->getName() . ']">';
  10.       $widget .= '<option value="">[ ' . $by . ' ]</option>';
  11.       foreach ($sortedActions as $action=>$txt)
  12.       {
  13.         $selected = ($selectedValue==$action)? 'selected="selected"': '';
  14.         $widget .= '<option value="' . $action . '" ' . $selected . '>' . $txt . '</option>';
  15.       }
  16.       $widget .= '</select>';
  17.     }
  18.     return $widget;
  19.   }

Der obige Ausschnitt stammt aus class.filter_action.php.

  • Es wird eine Auswahl aus allen Vermarktungsarten erzeugt, für die eine Übersetzung vorliegt. (Zeile 49)
  • Ggf. wird der aktuell gewählte Filter vorgemerkt. (Zeile 58)

Checkbox für einen Filter erzeugen

  1.   function getWidget( $selectedValue, $lang, &$translations, &$setup )
  2.   {
  3.     $checked = ($selectedValue=='1')? 'checked="checked"': '';
  4.     $widget = '<div class="nowrap">';
  5.     $widget .= '<input id="filter_' . $this->getName() .'" name="filter[' . $this->getName() .']" value="1" type="checkbox" '.$checked.'/>';
  6.     $widget .= '<label for="filter_' . $this->getName() .'">' . $this->getTitle( $translations, $lang ) . '</label>';
  7.     $widget .= '</div>';
  8.     return $widget;
  9.   }

Der obige Ausschnitt stammt aus class.filter_neubau.php.

  • Dieser Filter besteht aus nur einer Option. Zur (De)Aktivierung des Filters wird eine Checkbox erzeugt. (Zeile 50)
  • Ggf. wird der aktuell gewählte Filter vorgemerkt. (Zeile 48)

Filter in die Website integrieren

Den Filter in der Immobilienübersicht ansteuern

Alle hinterlegten Filter-Klassen können in der Immobilienübersicht (index.php) über den Parameter filter angesteuert werden.

Ein Eingabefeld für den Filter erzeugen

Eventuell ist es gewünscht, dass der Website-Besucher die Filterkriterien selbst an/abschalten kann. Dafür muss ein Eingabefeld in der Immobilienübersicht (index.php) erzeugt werden.

  • Jeder darzustellende Filter muss in der Konfigurationsvariablen $FilterOptions hinterlegt sein.
Persönliche Werkzeuge