einfache Suchabfrage

  • wurgli wurgli
    Jedi-Meister
    0 x
    396 Beiträge
    0 Hilfreiche Beiträge
    19. 09. 2012, 23:26

    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?

  • Hilfreichster Beitrag

  • chvonrohr chvonrohr
    TYPO3-Anwärter
    1 x
    7 Beiträge
    1 Hilfreiche Beiträge
    27. 09. 2012, 09:53 - Hilfreichster Beitrag

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

    1. class Tx_DeineExtension_Domain_Model_PersonFilter extends Tx_Extbase_DomainObject_AbstractEntity {
    2.  
    3. /**
    4. * @var string
    5. */
    6. protected $searchName;
    7.  
    8. // ...

    dein Form sieht dann so aus:

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

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

    1. /**
    2.  * action list
    3.  *
    4.  * @param Tx_DeineExtension_Domain_Model_PersonFilter $personFilter
    5.  * @return void
    6.  */
    7. public function listAction(Tx_DeineExtension_Domain_Model_PersonFilter $personFilter = NULL) {
    8. $this->view->assign('personen', $this->personRepository->findByFilter($personFilter));
    9. $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.


  • 1
  • wurgli wurgli
    Jedi-Meister
    0 x
    396 Beiträge
    0 Hilfreiche Beiträge
    20. 09. 2012, 23:10

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

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

    Mittels

    1. 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 chvonrohr
    TYPO3-Anwärter
    1 x
    7 Beiträge
    1 Hilfreiche Beiträge
    27. 09. 2012, 09:53

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

    1. class Tx_DeineExtension_Domain_Model_PersonFilter extends Tx_Extbase_DomainObject_AbstractEntity {
    2.  
    3. /**
    4. * @var string
    5. */
    6. protected $searchName;
    7.  
    8. // ...

    dein Form sieht dann so aus:

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

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

    1. /**
    2.  * action list
    3.  *
    4.  * @param Tx_DeineExtension_Domain_Model_PersonFilter $personFilter
    5.  * @return void
    6.  */
    7. public function listAction(Tx_DeineExtension_Domain_Model_PersonFilter $personFilter = NULL) {
    8. $this->view->assign('personen', $this->personRepository->findByFilter($personFilter));
    9. $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 wurgli
    Jedi-Meister
    0 x
    396 Beiträge
    0 Hilfreiche Beiträge
    02. 10. 2012, 22:00

    Ehrlich gesagt nein :o

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

    1. 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

    1. public function listAction(Tx_Prints_Domain_Model_PictureFilter $pictureFilter) {

    Kommentar vor dem Funktionsaufruf natürlich berücksichtigt

    1. * @param Tx_Prints_Domain_Model_PictureFilter $pictureFilter

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

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

    die Eingegebenen Daten sehen.

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

  • chvonrohr chvonrohr
    TYPO3-Anwärter
    0 x
    7 Beiträge
    1 Hilfreiche Beiträge
    04. 10. 2012, 08:44

    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:

    1. 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 wurgli
    Jedi-Meister
    0 x
    396 Beiträge
    0 Hilfreiche Beiträge
    08. 10. 2012, 16:24

    Schön langsam am Verzweifeln #angry#

    Ja im Form steht name="pictureFilter"

    Feldnamen sehen so aus

    1. <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

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

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

  • 1