PHP OOP-Ansatz für einen Filter

baserider

Well-known member
ID: 174417
L
10 März 2007
682
23
Hi,

es gibt mehrere Hersteller und jeder Hersteller hat andere Produkte. Es soll zu jedem Hersteller einen Filter geben, also ein Formular mit verschiedenen Kriterien.

Gibt es für sowas auch schon ein Pattern, was man verwenden könnte?

ich dachte zum Schluss an sowas in der Art:

$filter->showFilter($hersteller)

Ich bin mir nicht sicher ob man für jeden Hersteller eine eigene Klasse anlegt oder alles in einer Klasse erledigt. Es müsste ja ebenfalls für jeden Hersteller eine andere MYQSL-Abfrage hinterlegt werden.
 
Klingt nach einem Decorator :think:
Dass du quasi je nach Hersteller n anderes Formular "draufdekorierst".
 
ein Decorator würde aber, wie du sagst etwas dazu dekorieren, was eigentlich gesucht wird, ist ein Filter der nach bestimmten Kriterien Objekte entfernt (die auf die die Eigenschaften nicht zutreffen).

Schau dir mal Zend_Filter an, eventuell kann das als Vorlage dienen ;)
Sollten durch die Eingabemaske auch oder-Bedingungen kommen, könnte man an der Stelle ja 2 Suchen durchführen und dann die Ergebnisse zusammenmergen.
 
Ich bin eher von dem Formular (wie in Post #1 beschrieben) ausgegangen und hab mir die linke Leiste von Amazon vorgestellt, wo ich je Kategorie verschiedene Filtermöglichkeiten kriege, um auswählen zu können.
 
Hmm, ja, wenn es nicht ein Filter auf Objekte sein soll, muss man natürlich einen anderen Weg gehen.

Trotzdem würde ich es ähnlich machen, viele verschiedene Filter einem SuperFilter hinzufügen und dieser SuperFilter kann aus den einzelnen Filtern dann einen MySQL-Query erstellen.
 
Trotzdem würde ich es ähnlich machen, viele verschiedene Filter einem SuperFilter hinzufügen und dieser SuperFilter kann aus den einzelnen Filtern dann einen MySQL-Query erstellen.

Das hört sich doch gut an. Hast du das auf Zend_Filter bezogen oder wie kann ich mir denn so eine Implementierung grob vorstellen?
 
Jup, dachte ich mir schon so.
man fügt eben einzelne Filter (Display > 7 Zoll, Preis < 500€) einem Filter-Aggregator hinzu, und der baut daraus dann einen SQL-Query.

Quasi durch OOP die Filterbedingungen zusammenbauen und dann als SQL-Query ausdrücken.
 
Das scheint genau das richtige zu sein. Könntest du mir evtl. mal ein kleines Bsp. geben? Also nur mal angedeutet?
 
PHP:
$filter = new Baserider_Filter();
$filter->add(new Baserider_Filter_Price(Baserider_Filter_Price::LOWER, 500));
$filter->add(new Baserider_Filter_Manufacturer('Asus'));

$echo $filter->asSqlQuery();

PHP:
public function asSqlQuery() {
  $query = 'SELECT * FROM products';

  $conditions = array(); 
  foreach($this->_filter as $filter)
    $conditions[] = '(' . $filter->asSqlCondition() . ')';
  
  if(count($conditions) > 0)
    $query .= ' WHERE ';

  $query .= implode(' AND ', $conditions);
  return $query;
}


Sollten die Bedingungen nicht einfach nur auf Spalten einer Tabelle sondern Joins angewendet werden, wird dies natürlich ein wenig komplexer, aber immernoch gut realisierbar.
 
ok, das hilft mir weiter :) danke.
Ist das auch ein Pattern, nach dem du vorgegangen bist? wenn ja wie nennt sich das?
 
Eine Frage noch:

Du übergibst doch der Funktion addFilter ein Argument. In meinem Fall wäre das ja ein Formularwert. Was ist, wenn es den Wert nicht gibt? Wird dann innerhalb der Funktion geprüft oder immer schon vor dem Aufruf; also

PHP:
if (isset($_POST['varbiable'])){
  $filter->add(...)
}
 
ok, das hilft mir weiter :) danke.
Ist das auch ein Pattern, nach dem du vorgegangen bist? wenn ja wie nennt sich das?
ist kein wirkliches Pattern

Du übergibst doch der Funktion addFilter ein Argument. In meinem Fall wäre das ja ein Formularwert. Was ist, wenn es den Wert nicht gibt? Wird dann innerhalb der Funktion geprüft oder immer schon vor dem Aufruf; also
natürlich musst du dein Formular validieren und sollte dort eine solche Bedingung vorhanden sein, musst du ein zugehöriges Filter-Objekt erzeugen und dem Filter-Aggregator hinzufügen :roll:
 
Danke, hast mir weitergeholfen .-)
Ich hatte wegen dem Pattern gefragt, weil hier ja zu Anfang das Dekorator-Pattern genannt wurde und das hat etwas Ahnlichkeit, nachdem ich etwas Infos darüber gesammelt habe.