PHP-Export - Filterkriterien
Aus OpenEstate-Wiki
| 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
- An Stelle von
Beispiel für einen Filter
Mit der Datei includes/class.filter_action.php wird der Immobilienbestand nach Vermarktungsart gefiltert.
<?php/*** Website-Export, Filter nach Vermarktungsart** @author Andreas Rudolph & Walter Wagner* @copyright 2009, OpenEstate.org* @license http://www.gnu.org/licenses/gpl-3.0.txt*/if (!defined('IN_WEBSITE')) exit;
require_once( 'include/class.filter.php' );
class ImmoToolFilter_action extends ImmoToolFilter
{/*** Überprüfung, ob ein Objekt von dem Filter erfasst wird.*/function filter( $object, &$items )
{$action = $object['action'];
if (!is_string($action)) return;
if (!is_array($items[$action])) $items[$action] = array();
$items[$action][] = $object['id'];
}/*** Name des Filters.*/function getName()
{return 'action';
}/*** Titel des Filters, abhängig von der Sprache.*/function getTitle( &$translations, $lang )
{$title = $translations['labels']['estate.action'];
return is_string($title)? $title: $this->getName();
}/*** HTML-Code zur Auswahl des Filterkriteriums erzeugen.*/function getWidget( $selectedValue, $lang, &$translations, &$setup )
{$widget = '';
$sortedActions = $translations['openestate']['actions'];
asort($sortedActions);
if (is_array($sortedActions) && count($sortedActions)>0)
{$by = $this->getTitle( $translations, $lang );
$widget .= '<select id="filter_' . $this->getName() . '" name="filter[' . $this->getName() . ']">';
$widget .= '<option value="">[ ' . $by . ' ]</option>';
foreach ($sortedActions as $action=>$txt)
{$selected = ($selectedValue==$action)? 'selected="selected"': '';
$widget .= '<option value="' . $action . '" ' . $selected . '>' . $txt . '</option>';
}$widget .= '</select>';
}return $widget;
}}?>
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.
- An Stelle von
- 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
$translationswird 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
$langwird 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
nullzurückliefert, wird kein Eingabefeld erzeugt. - Im Parameter
$selectedValuewird der aktuell gewählte Wert des Filters übermittelt. - Im Parameter
$langwird der zweistellige ISO-Sprachcode der gewählten Sprache übermittelt. - Im Parameter
$translationswird ein Array mit allen hinterlegten Übersetzungen zur aktuellen Sprache übermittelt. - Im Parameter
$setupwird die Konfiguration der Seite übermittelt.
- Diese Funktion liefert den HTML-Code zum Eingabefeld des Filters zurück. Wenn diese Funktion nicht definiert ist, oder
- 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
$objectwird das Array der zu prüfenden Immobilie übermittelt. Das Array wurde ermittelt aus data/[NR]/object.php. - Im Parameter
$itemswird 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
function filter( $object, &$items )
{$action = $object['action'];
if (!is_string($action)) return;
if (!is_array($items[$action])) $items[$action] = array();
$items[$action][] = $object['id'];
}
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
function filter( $object, &$items )
{$types = $object['type_path'];
if (!is_array($types)) $types = array( $object['type'] );
foreach ($types as $type)
{if (!is_array($items[$type])) $items[$type] = array();
$items[$type][] = $object['id'];
}}
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
function filter( $object, &$items )
{$alter = $object['attributes']['zustand']['alter']['value'];
if (!is_string($alter) || strtolower($alter)!='neubau') return;
if (!is_array($items['1'])) $items['1'] = array();
$items['1'][] = $object['id'];
}
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
function getTitle( &$translations, $lang )
{$title = $translations['labels']['estate.filter.neubau'];
return is_string($title)? $title: $this->getName();
}
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
function getTitle( &$translations, $lang )
{if ($lang=='de') return 'Mein Filter';
if ($lang=='en') return 'My Filter';
// eventuell um weitere Sprachen erweitern...return $this->getName();
}
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
function getWidget( $selectedValue, $lang, &$translations, &$setup )
{$widget = '';
$sortedActions = $translations['openestate']['actions'];
asort($sortedActions);
if (is_array($sortedActions) && count($sortedActions)>0)
{$by = $this->getTitle( $translations, $lang );
$widget .= '<select id="filter_' . $this->getName() . '" name="filter[' . $this->getName() . ']">';
$widget .= '<option value="">[ ' . $by . ' ]</option>';
foreach ($sortedActions as $action=>$txt)
{$selected = ($selectedValue==$action)? 'selected="selected"': '';
$widget .= '<option value="' . $action . '" ' . $selected . '>' . $txt . '</option>';
}$widget .= '</select>';
}return $widget;
}
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
function getWidget( $selectedValue, $lang, &$translations, &$setup )
{$checked = ($selectedValue=='1')? 'checked="checked"': '';
$widget = '<div class="nowrap">';
$widget .= '<input id="filter_' . $this->getName() .'" name="filter[' . $this->getName() .']" value="1" type="checkbox" '.$checked.'/>';
$widget .= '<label for="filter_' . $this->getName() .'">' . $this->getTitle( $translations, $lang ) . '</label>';
$widget .= '</div>';
return $widget;
}
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.

