Zum Inhalt springen

einfache Suchabfrage

Erstellt am 19. September 2012 · 5 Antworten · letzte Antwort am 8. Oktober 2012

Tags: Frage

wurgli ·

Hallo,

gleich mal vorweg ... beschäftige mich erst seit kurzem mit Extbase / Fluid und bin somit noch kompletter Neuling.

Ich hab mir mittels Extension Builder nun meine Tabellen inkl. Relationen angelegt und mir die List/Show/Edit/... Controller Actions anlegen lassen, danach meine Views wie gewünscht angepasst usw.

Nun habe ich eine Auflistung all meiner Datensätze und möchte diese aber um eine Suchabfrage erweitern, wie z.B. die Eingabe eines Namens bzw. die Einschränkung auf einzelne Kategorien.

Ich habe zwar schon eine die Anleitungen über die Erstellung von Formularen gelesen , habe aber ehrlich gesagt keine Ahnung wie und wo ich jetzt genau beginne bzw. wie ich auf die übermittelten Eingaben (GET/POST) zugreifen kann.

Hat jemand vielleicht ein paar Tips für mich oder vielleicht ein paar Codeschnipsel anhand deren ich weiter suchen könnte?

wurgli ·

Ok ... also ich habe nun mittels folgenden Code mein Formular aufgebaut

<f:form action="list" name="formular" object="{formular}">
    <f:form.textbox name="name" property="name" /><br/>
    <f:form.submit value="Senden" />
</f:form>

Mittels

var_dump($this->request->getArguments());

kann ich die GET/POST Variablen ja schon mal sehen.

Aber wie greife ich nun in meiner listAction darauf zu?

chvonrohr ·

hey,

Das macht Extbase normalerweise für dich.

Für Suchformulare empfiehlt es sich eine Filter Entity anzulegen.
Also wenn du zum Beispiel eine Liste mit Personen hast (Person Model) dann machst du einfach ein PersonFilter Model mit den Suchvariablen (+ getter/setter):

class Tx_DeineExtension_Domain_Model_PersonFilter extends Tx_Extbase_DomainObject_AbstractEntity {

	/**
	 * @var string
	 */
	protected $searchName;

	// ...

dein Form sieht dann so aus:

<f:form action="list" name="personFilter" object="{personFilter}">
    <f:form.textbox property="searchName" /><br/>
    <f:form.submit value="Senden" />
</f:form>

und im Controller kannst du das Filter Objekt einfach entgegen nehmen:

/**
 * action list
 *
 * @param Tx_DeineExtension_Domain_Model_PersonFilter $personFilter
 * @return void
 */
 public function listAction(Tx_DeineExtension_Domain_Model_PersonFilter $personFilter = NULL) {
	$this->view->assign('personen', $this->personRepository->findByFilter($personFilter));
	$this->view->assign('personFilter', $personFilter);

Das Filter Objekt übergibst du dem Repository, das einen Query generiert und den Namen aus deinem $personFilter liest.

alles klar?
Scheint auf den ersten Blick umständlich, aber ist sehr übersichtlich und extrem einfach erweiterbar.

wurgli ·

Ehrlich gesagt nein :o

Also grundsätzlich klingt ja alles logisch und nachvollziehbar, nur sobald ich mein Formular absende, bekomme ich sofort eine Fehlermeldung.

PHP Catchable Fatal Error: Argument 1 passed to Tx_Prints_Controller_PictureController::listAction() must be an instance of Tx_Prints_Domain_Model_PictureFilter, none given in /var/www/typo3conf/ext/prints/Classes/Controller/PictureController.php line 59

line 59 ist der Funktionsaufruf der listAction

public function listAction(Tx_Prints_Domain_Model_PictureFilter $pictureFilter) {

Kommentar vor dem Funktionsaufruf natürlich berücksichtigt

* @param Tx_Prints_Domain_Model_PictureFilter $pictureFilter

Nehme ich die Parameter aus dem Funktionsaufruf und sende das Formular ab ... kann ich problemlos mittels

var_dump($this->request->getArguments());

die Eingegebenen Daten sehen.

Was mach ich also falsch?
Gibt's dazu vielleicht irgend ein fertiges Beispiel?

chvonrohr ·

Glaube das ist schon ziemlich korrekt so - irgendwo noch ein Detail.
Irgendwie kann Extbase aus den gesendeten Daten dein PictureFilter nicht erzeugen.

Prüfe mal ob:
- Beim Form name="pictureFilter" steht
- Alle gesendeten Feldnamen (<input name="extname[pictureFilter][feldname]">) korrekt geschrieben sind und im Objekt PictureFilter existieren

Und ändere in der listAction die Zeile folgendermassen:

public function listAction(Tx_Prints_Domain_Model_PictureFilter $pictureFilter = NULL) {

Damit meckert er auch nicht, wenn noch kein Filter übergeben wurde, was ja beim ersten Listenaufruf passiert...

Die Beispielextension "sjr_offers" hat dies so implementiert, Model heisst "Demand" und wird in OfferController->indexAction abgerufen (auch mit "= NULL")
http://typo3.org/extensions/repository/view/sjr_offers

wurgli ·

Schön langsam am Verzweifeln #angry#

Ja im Form steht name="pictureFilter"

Feldnamen sehen so aus

<input type="text" name="tx_prints_pi1[pictureFilter][searchName]" value=""/>

$pictureFilter = NULL liefert mir jetzt zwar mehr keine Fehlermeldung, ändert aber nichts daran, dass die Variable leer bleibt.

Ein var_dump($this->request->getArguments()); bringt folgendes

array(3) { ["action"]=> string(4) "list" ["controller"]=> string(7) "Picture" ["pictureFilter"]=> array(3) { ["searchName"]=> string(4) "Test" } }

Also Daten werden übergeben ... nur nicht richtig.