[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:

public function getIdeasCriterias($active = FALSE, $ideas_id = FALSE, $short_url = FALSE, $created_by = FALSE, $started = FALSE, $finished = FALSE, $status = FALSE, $updated = FALSE , $start = 0, $limit = 0, $order = "title", $sort="ASC" ) {
  $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:

$criteria = new icms_db_criteria_Compo();

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

new icms_db_criteria_Item();

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.

if($active) $criteria->add(new icms_db_criteria_Item("active", TRUE));

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.

if($updated) {
  $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:

$this->setGrantedObjectsCriteria($criteria, "ideas_view");

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:

public function getIdeas($active = FALSE, $ideas_id = FALSE, $short_url = FALSE, $created_by = FALSE, $started = FALSE, $finished = FALSE, $status = FALSE, $updated = FALSE , $start = 0, $limit = 0, $order = "title", $sort="ASC" ) {
  $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

$this->getObjects($criteria, TRUE, FALSE);

Diese finden wir in icms/ipf/Handler.php und ist wie folgt definiert:

getObjects($criteria = null, $id_as_key = false, $as_object = true, $sql = false, $debug = false)
  • $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.
Beispiel zur Verwendung von $sql in $this->getObjects():
function getSomething($value) {
    $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:

public function getIdeasCount($active = FALSE, $ideas_id = FALSE, $short_url = FALSE, $created_by = FALSE, $started = FALSE, $finished = FALSE, $status = FALSE, $updated = FALSE , $start = 0, $limit = 0, $order = "title", $sort="ASC" ) {
  $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

Diese Seite wurde 2 Mal geändert
Aktualisierung 07.01.2013 von sato-san
Diese Seite wurde erstellt am 02.08.2012 von QM-B
Diese Seite wurde 712 Mal angesehen

Kommentar

Benutzer Diskussion
lotus
Geschrieben am: 03.10.2013 05:24  Aktualisiert: 03.10.2013 05:24
Ist fast schon zuhause hier
Angemeldet am: 26.05.2008
aus:
Beiträge: 409
 nun die große Frage...

Wie geht es weiter? Nochn Glas Bier

Die hier veröffentlichten Artikel und Kommentare stehen uneingeschränkt im alleinigen Verantwortungsbereich des jeweiligen Autors.