[HomePage :: Module :: Eigenes Modul mit imBuilding erstellen :: Dieser Seite] |
Nutzen wir das Criteria Element um unsere Daten zu filtern |
Module bauen mit imBuilding - Tutorial - Seite 11
Nächste Seite:#
Vorige Seite: Berechtigungen zufügen
Wir bauen eine Filter-Funktion
Das Criteria Element ist für uns eines der wichtigsten Elemente, mit denen wir Arbeiten: Es hilft uns, nur die gefragten Daten aus der Datenbank abzurufen. Als erstes erstellen wir also eine einzige Funktion, die alle eventuell benötigten Kriterien enthält und für weitere Funktionen bereithält:
$criteria = new icms_db_criteria_Compo();
if($start) $criteria->setStart($start);
if($limit) $criteria->setLimit;
if($ideas_id) $criteria->add(new icms_db_criteria_Item("ideas_id", TRUE));
if($seo) $criteria->add(new icms_db_criteria_Item('short_url', $seo,'LIKE'));
if($created_by) $criteria->add(new icms_db_criteria_Item("created_by", $created_by));
if($started) $criteria->add(new icms_db_criteria_Item("started", TRUE));
if($finished) $criteria->add(new icms_db_criteria_Item("finished", TRUE));
if($status) $criteria->add(new icms_db_criteria_Item("status", $status));
if($updated) {
$critTray = new icms_db_criteria_Compo();
$critTray->add(new icms_db_criteria_Item('updated_on', 0, "!="));
$criteria->add($critTray);
}
$this->setGrantedObjectsCriteria($criteria, "ideas_view");
return $criteria;
}
Das sind soweit erst mal die Felder, für die Abfragekriterien. Der erste Teil meiner Variable ist exakt so benannt, wie das entsprechende Feld und sollte als übergebenen Wert genau den enthalten, den wir suchen. Ab $updated ist sind es keine Felder mehr: Wenn $updated als TRUE gefragt ist, werden alle herausgesucht, die bereits aktualisiert sind. $start und $limit legen start und limit der Abfrage fest, order und sort dienen zum sortieren der Daten
Schauen wir uns zunächst das erste an:
Hier erstellen wir ein neues Kriterien-Element. Wo man die entsprechende Datei findet ist ja mittlerweile bekannt: /icms/db/criteria/Compo.php
Der Construcor ist: __construct($ele=null, $condition='AND').
- $ele ist das element und steht als Standard auf NULL.
- Standard Condition ist "AND"
Für die Criterien unserer Abfrage ist mehr als ein Element notwendig und die Kondition "AND" ist auch passend, also lassen wir das wie es ist. Mit $criteria->add() fügt man nun neue Kriterien-Elemente hinzu Ein neues Kriterien-Element wird erzeugt durch
Also schauen wir uns an, was es erzeugt. Der Constructor lautet: __construct($column, $value='', $operator='=', $prefix = '', $function = '')
- $column ist die spalte in der Datenbank
- $value ist der Wert, der gesucht wird
- $operator ist der operator mit dem abgefragt wird (kann beispielsweise auch ">", ">=", "<", ">=", "!=" sein)
- prefix unsere DB-prefix, die bei der Installation festgelegt wurde
Außer den ersten 3 Variablen wird man selten was anderes brauchen.
Heißt damit, wenn $active != FALSE suchen wir in der DB alle Ideas, in denen die spalte "active" = 1 ist. Prefix kennt IPF selbst und wird diese automatisch vor das Feld setzen.
$critTray = new icms_db_criteria_Compo();
$critTray->add(new icms_db_criteria_Item('updated_on', 0, "!="));
$criteria->add($critTray);
}
Was machen wir hier? Wir suchen nach allen Daten, wo das Feld "updated_on" nicht 0 ist, also bereits aktualisiert wurde.
- setStart() legt den Start der Abfrage fest (z.B. Bei einer pagination)
- setLimit() legt das Limit fest
- setSort() und setOrder() dienen der Sortierung
- setGroupby würde die Ergebnisse Gruppieren
Nun das wichtige: bevor wir den Wert $criteria zurückgeben gibt es noch etwas, das sich alleine vom Aufbau stark unterscheidet:
Das sind unsere Berechtigungen. Hier holen wir nur die Elemente, für die der aktuelle Nutzer auch die Berechtigungen hat.
Holen wir die Daten aus der Datenbank
Auch hierfür bauen wir eine einfache Funktion, mit der wir alle gesuchten Objekte von der Datenbank holen. Wir nennen die Funktion getIdeas und setzen die gleichen Variablen wie bei der getIdeasCriterias Funktion:
$criteria = $this->getIdeasCriterias($active, $ideas_id, $short_url, $created_by, $started, $finished, $status, $updated, $start, $limit, $order, $sort);
$ideas = $this->getObjects($criteria, TRUE, FALSE);
$ret = array();
foreach ($ideas as $idea){
$ret[$idea['ideas_id']] = $idea;
}
return $ret;
}
Was machen wir? Als erstes holen wir die Kriterien-Elemente für die Datenbank aus unserer Kriterien-Funktion und dann ist der ganze Zauber das aufrufen der Funktion
Diese finden wir in icms/ipf/Handler.php und ist wie folgt definiert:
- $criteria = NULL, man würde also ohne jegliches Kriterium alle aus der Datenbank holen
- $id_as_key = false haben wir auf TRUE, weil wir in den geholten Daten die Schlüssel des array als ID des Objects haben wollen
- $as_object = true haben wir als FALSE, weil wir keinen Array als Objekt holen wollen
- $sql dient dazue, eigenen SQL-Code für die Abfrage zu verwenden, allerdings wird der SQL-Code nicht mit der Variable übergeben Siehe nacholgendes Beispiel
- $debug sollte nur während der Entwicklung auf true gesetzt werden. Dadurch sieht man im Front-End in dicker roter Schrift die Abfrage, was nicht empfehlenswert ist. Um Die Funktion mit debugger schnell nutzen zu können kann man einfach ein D hinter getObjects hängen. Also $this->getObjectsD($criteria, true, false). Dadurch wird der Debugger ebenso auf true gesetzt.
$criteria = new icms_db_criteria_Compo(new icms_db_criteria_Item("any_field", $value));
$sql = "SELECT DISTINCT (name) FROM " . $this->table . $criteria->renderWhere();
$this->generalSQL = $sql;
$objects = $this->getObjects (FALSE, TRUE, FALSE, TRUE);
return $objects;
}
Zählen wir die Daten nach Kriterium
Vorneweg: Es gibt in icms/ipf/Handler.php die Funktion getCount($criteria = FALSE), womit man im Prinzif die SQL-Abfrage "SELECT (*) COUNT" ausführt. Für unsere Zählfunktion nehmen wir also wieder die gleichen Variablen wie in beiden Funktionen zuvor und geben getCount($criteria) zurück:
$criteria = $this->getIdeasCriterias($active, $ideas_id, $short_url, $created_by, $started, $finished, $status, $updated, $start, $limit, $order, $sort);
return $this->getCount($criteria);
}
Der gelieferte Wert ist die Anzahl der Objekte.
Holen wir ein einzelnes Objekt mit bekannter ID
Das geht nun mal ohne weiteres: im icms/ipf/Handler.php gibt es die Funktion get($id), an welche wir nur die gewünschte ideas_id übergeben müssen.
Holen wir ein einzelnes Objekt mit bekannter SEO-URL
Module bauen mit imBuilding - Tutorial - Seite 11
Nächste Seite:#
Vorige Seite: Berechtigungen zufügen