paginate behält die Suchanfrag nicht beim blättern!?

  • mimaxx mimaxx
    Jedi-Ritter
    0 x
    144 Beiträge
    1 Hilfreiche Beiträge
    02. 08. 2012, 11:40

    Hallo,

    habe es endlich geschafft eine kleine Suche zu bauen die funktioniert auch soweit. Nur nutze ich auch das paginate widget. Nach der Suchanfrage werden die Ergebnisse richtig angezeigt auch die Anzahl bei count sobald ich aber auf die nächste Seite klicke ist der Filter weg und beim count stehen wieder alle.

    Dies ist meine Suche

    1. public function findDemand(Tx_MyArtikel_Domain_Model_Demand $demand = NULL) {
    2. $query = $this->createQuery();
    3.  
    4. if($demand !== NULL){
    5. $search = $demand->getSearchWord();
    6. }
    7. else {$search = '';}
    8.  
    9. return $query->matching(
    10. $query->like('sorte', '%'.$search.'%')
    11. )
    12. ->execute();
    13. }

    und dies mein Template

    1. <!--...-->
    2.  
    3. <f:section name="main">
    4. <f:form method="post" action="list" name="demand" object="{demand}">
    5. <tr>
    6. <td valign="top" >Search:<f:form.textfield id="searchWord" property="searchWord" size="10" value="{demand.searchWord}"/></td>
    7. <td><f:form.submit value="Suche" /></td>
    8. </tr>
    9. </f:form>
    10. </table>
    11.  
    12. <f:flashMessages />
    13.  
    14.  
    15. <f:widget.paginate objects="{artikels}" as="paginateArtikels" configuration="{itemsPerPage: 20, forcedNumberOfLinks:0}">
    16. <f:for each="{paginateArtikels}" as="artikel" iteration="objIteration">
    17.  
    18. <!--...-->

    Dies ist der Controller der listAction

    1. public function listAction(Tx_MyArtikel_Domain_Model_Demand $demand = NULL) {
    2. $this->view->assign('artikels', $this->artikelRepository->findDemand($demand));
    3. }

    Gruss
    mimaxx

  • Hilfreichster Beitrag

  • hkuesters hkuesters
    TYPO3-Anwärter
    1 x
    5 Beiträge
    1 Hilfreiche Beiträge
    24. 09. 2012, 10:00 - Hilfreichster Beitrag

    Hallo zusammen!

    Hat leider länger keine Zeit, da noch mal ranzugehen.
    Besten Dank mimaxx für Deine detaillierte Darstellung. Ich will nun einen offenen Punkt aufgreifen und ergänzen. Nämlich:
    Wie integriere ich den Fluid-Paginator in die eigene Extension, damit er aus dem Core rauskommt und Anpassungen update-sicher sind?!

    Dazu kopiere ich die Original-Paginator-Dateien und baue die Kopien in meine Extension als eigenen ViewHelper ein, um sie dann dort ändern zu können.

    Folgende drei Dateien aus Fluid sind betroffen:
    1. ...sysext\fluid\Classes\ViewHelpers\Widget\PaginateViewHelper.php
    2. ...sysext\fluid\Classes\ViewHelpers\Widget\Controller\PaginateController.php
    3. ...sysext\fluid\Resources\Private\Template\ViewHelpers\Widget\Paginate\Index.html

    Um Verwechslungen zu vermeiden, habe ich den ViewHelper bei mir umbenannt in "Seitenzaehler"
    Neue Speicherorte sind dann:
    zu 1: ... ext\myextension\Classes\ViewHelpers\Widget\SeitenzaehlerViewHelper.php
    zu 2: ... ext\myextension\Classes\ViewHelpers\Widget\Controller\SeitenzaehlerController.php
    zu 3: ... ext\myextension\Resources\Private\Templates\ViewHelpers\Widget\Seitenzaehler\Index.html

    Im nächsten Schritt müssen die Dateien 1 und 2 angepasst werden:
    In Datei 1 "SeitenzaehlerViewHelper.php" sind folgende Änderungen erforderlich:
    Zu einen muss der Klassenname angepasst werden.
    Neu heißt er dann in Zeile 51:

    1. class Tx_MyExtension_ViewHelpers_Widget_SeitenzaehlerViewHelper extends Tx_Fluid_Core_Widget_AbstractWidgetViewHelper
    .
    Desweiteren muss der Bezug zum Controller angepasst werden in Zeile 64:
    Neu heißt er dann in Zeile 64:
    1. public function injectController(Tx_MyExtension_ViewHelpers_Widget_Controller_SeitenzaehlerController $controller) {

    Achtung: Auch in den Kommentaren Zeilen 56 und 61 ist diese Anpassung notwendig!

    In Datei 2 "SeitenzaehlerController.php" muss ebenfalls der Klassenname angepasst werden:
    Neu also:

    1. class Tx_MyExtension_ViewHelpers_Widget_Controller_SeitenzaehlerController extends Tx_Fluid_Core_Widget_AbstractWidgetController {...

    In Datei 3 sind zunächst keine Änderungen erforderlich!

    Im nächsten Schritt muss ich nun in meiner Extension den neuen ViewHelper einbinden:
    Dazu deklariere ich zunächst den Namespace durch: {namespace ns=Tx_MyExtension_ViewHelpers}

    Und dann kann ich die bisherige Art, den Paginator aufzurufen, austauschen. Aus dem bisherigen
    ALT: [b]f:widget.paginate [/b]
    wird nun
    NEU: [b]sk:widget.seitenzaehler[/b]

    Von da aus habe ich nun die Möglichkeit, den Paginator für meine Extension anzupassen, wie mimaxx das hier ja gut beschrieben hat!


  • robsch robsch
    T3PO
    0 x
    22 Beiträge
    0 Hilfreiche Beiträge
    03. 08. 2012, 08:47

    Nur so eine Idee - ohne viel Nachdenken und ohne mir deinen Code genau angeschaut zu haben - weiß nicht ob das damit zusammenhängen kann:

    Ist es möglich, dass deine listAction in der ext_localconf.php bei den non-cacheable actions eingetragen ist? Könnte mir vorstellen, dass es dann vielleicht nicht klappt.

    Gruß,
    Robert

  • mimaxx mimaxx
    Jedi-Ritter
    0 x
    144 Beiträge
    1 Hilfreiche Beiträge
    03. 08. 2012, 09:29

    Hi,

    danke für deine Antwort. Leider hat es daran nicht gelegen. Habe auch nach den Cache Einstellungen der Seite geschaut und alles einmal probiert. Leider auch ohne Erfolg.

    Aber grundsätzlich müsste es funktionieren oder? Da ich beim suchen schon über viel Unmut und merkwürdiges Verhalten der paginate gestoßen bin.

    Gruß
    mimaxx

  • robsch robsch
    T3PO
    0 x
    22 Beiträge
    0 Hilfreiche Beiträge
    03. 08. 2012, 09:59

    Kann jetzt leider auch nicht viel helfen. Aber ich würde an deiner Stelle mal alles rauswerfen (die Form) und alles so standardmäßig wie möglich machen, schauen, ob es dann geht und dann sukzessive wieder die Sachen hinzufügen, bis auf das Problem stößt.

    Aber wenn du das Problem gefunden hast, dann poste es!

  • hkuesters hkuesters
    TYPO3-Anwärter
    0 x
    5 Beiträge
    1 Hilfreiche Beiträge
    05. 08. 2012, 08:29

    Das Problem ist komplizierter - die vom Paginator erzeugten Links haben keinen Bezug zum Search-Ergebnis. Es werden also auf einer Seite zwei Bereiche separat behandelt: Das eine ist die Suche bzw. die Eingabe der Suchkriterien, das andere ist das Paginator-Widget.

    Suchergebnisse lassen sich so nicht paginieren, da der Suchstring natürlich keine Property der Objekte ist, sondern über einen Parameter der jeweiligen Controller-Action verarbeitet wird.

    Meines Wissens ist das über eine Konfiguration nicht lösbar, allerdings ist dieses Thema in folgendem Thread ausführlich diskutiert worden: [url=http://lists.typo3.org/pipermail/typo3-project-typo3v4mvc/2011-October/010500.html]http://lists.typo3.org/pipermail/typo3-project-typo3v4mvc/2011-October/010500.html[/url] Dort ist auch eine Lösung beschrieben, die allerdings ein wenig an Programmierarbeit erfordert.

    Der Lösungsansatz besteht darin, dass ich dem Template des Paginator-Widgets einen zusätzlichen Parameter mitgebe, der das Suchergebnis einbindet. Aus Zeile 17 des Template z.B.
    <f:widget.link arguments="{currentPage: pagination.previousPage}">previous</f:widget.link>
    wird
    <f:widget.link arguments="{currentPage: pagination.previousPage}" actionArguments="{filter}"><</f:widget.link>
    Anzupassen sind natürlich sämtliche Stellen, in denen im Template Links generiert werden.

    Dieser Ansatz hat zwei Nachteile: Zum einen schraub ich am Core-System und verliere damit die Upgrade-Fähigkeit; zum anderen wirkt sich die Änderung des Templates natürlich an allen Stellen aus, an denen ich das Template nutze. Sobald ich also das Paginator-Widget mehrfach nutze, ist das so nicht ohne weiteres lösbar.

    Ciao
    Hubert

  • mimaxx mimaxx
    Jedi-Ritter
    0 x
    144 Beiträge
    1 Hilfreiche Beiträge
    08. 08. 2012, 15:43

    Hi,

    danke für die Antworten gut zu wissen dass paginate das nicht kann. Ist zwar nicht schön aber ich suche mich auch nicht mehr dusselig.

    Jetzt habe ich aber noch ein paar kleine Fragen wenn ich ein weiteres Argument hinzufüge zB wie bei dir actionArguments="{filter} oder in dem anderen Beispiel filter=, wo muss ich diesen dann noch registrieren. Es kommt der Fehler: "Argument "actionArguments" was not registered"

    Dann habe ich noch eine Frage zu der Widget Einbindung habe inzwischen bei vielen Extensions gesehen dass sie die ViewHelpers zb paginate in die eigene Extension kopiert haben. Extbase findet das ganze ja über den Pfad. Dann habe ich noch die classen angepasst im controller und in der viewHelper aber wenn ich dann das Template zum testen anpasse funktioniert es nicht. Muss ich das noch irgendwo registrieren?

    1. class Tx_MyExt_ViewHelpers_Widget_Controller_PaginateController extends Tx_Fluid_Core_Widget_AbstractWidgetController {

    1. class Tx_MyExt_ViewHelpers_Widget_PaginateViewHelper extends Tx_Fluid_Core_Widget_AbstractWidgetViewHelper {

    Gruß
    mimaxx

  • hkuesters hkuesters
    TYPO3-Anwärter
    0 x
    5 Beiträge
    1 Hilfreiche Beiträge
    08. 08. 2012, 18:45

    Hallo!

    Du musst natürlich Deine Arguments auch registrieren.

    Dafür verwendest Du initializeArguments() nach folgendem Muster:
    $this->registerArgument($name, $dataType, $description, $isRequired, $defaultValue=NULL)

    Genauere Infos findest Du unter
    [url=http://books.google.de/books?id=qihZuW_rk5oC&pg=PA204&lpg=PA204&dq=typo3+initializeArguments()&source=bl&ots=SM2PFF0DLX&sig=TQHcrgWDfbsM-iMG4fmXjkHR71c&hl=de&sa=X&ei=q5YiUKbSMsvbsgbd5YEQ&ved=0CFAQ6AEwAA]http://books.google.de/books?id=qihZuW_rk5oC&pg=PA204&lpg=PA204&dq=typo3+initializeArguments()&source=bl&ots=SM2PFF0DLX&sig=TQHcrgWDfbsM-iMG4fmXjkHR71c&hl=de&sa=X&ei=q5YiUKbSMsvbsgbd5YEQ&ved=0CFAQ6AEwAA[/url]

    Ciao
    Hubert

  • mimaxx mimaxx
    Jedi-Ritter
    0 x
    144 Beiträge
    1 Hilfreiche Beiträge
    09. 08. 2012, 14:52

    Hi,

    nochmals vielen Dank das hat mich schon ein ganzes Stück nach vorne gebracht. Kann jetzt aus dem PaginateController eine Variable an den LinkViewHelper übergeben und der Wert steht dann auch in den Links (actionArguments). Jetzt habe ich nur noch Probleme mit dem Übergeben und Annehmen von Variablen.

    Die actionArguments konnte ich im LinkViewHelper so entgegennehmen

    1. $arguments['actionArguments'] = $this->arguments['actionArguments'];

    Aber wie bekomme ich die Variablen aus der URL wieder in die listAction? Oder habe ich jetzt einen Denkfehler?

    Bzw. wie bekomme ich die Filterwerte der paginate
    <f:widget.paginate objects="{artikels}" as="paginateArtikels" filter="{searchFilter: searchFilter}" configuration="{itemsPerPage: 20, forcedNumberOfLinks:0}" >

    eingelesen? $this->arguments['filter'] klappt nicht!

    Gruß
    mimaxx

  • mimaxx mimaxx
    Jedi-Ritter
    0 x
    144 Beiträge
    1 Hilfreiche Beiträge
    10. 08. 2012, 12:53

    So, Problem eins ist gelöst die Daten im PaginateController hole ich mir mit

    1. $this->widgetConfiguration['filter']

    Jetzt bleibt noch die letzte Frage wie bekomme ich die Daten wieder in die listAction? Der Link sieht jetzt so aus (zur besseren Lesbarkeit untereinander) nehme an ich muss irgendwie das [@widget_0] wegbekommen, aber wie?

    1. index.php?id=6
    2. &tx_myext_list[action]=list
    3. &tx_myext_list[controller]=Artikel
    4. &tx_myext_list[@widget_0][currentPage]=2
    5. &tx_myext_list[@widget_0][actionArguments][search1]=testwert
    6. &tx_myext_list[@widget_0][actionArguments][search2]=testwert2
    7. &cHash=1e32d0d96ae439f56ef1df674dbe1eb4

  • hkuesters hkuesters
    TYPO3-Anwärter
    0 x
    5 Beiträge
    1 Hilfreiche Beiträge
    15. 08. 2012, 09:40

    Hallo mimaxx!

    Ich muss gestehen, dass ich noch nicht so ganz verstehe, wo Du da hängen bleibst.

    Also grundsätzlich stell ich mir das so ähnlich vor:
    /**
    *
    * @param array $searchFilter filter from list action
    * @param string $sorting sorting from list action
    */
    public function listAction($searchFilter = array(), $sorting = ''){

    Andererseits verstehe ich auch nicht so ganz, wie das "[@widget_0]" in Deinem Code überhaupt zustande kommt. Ich glaube, Du müsstest den Code mal etwas umfangreicher posten oder auch direkt schicken. So kann ich das nicht nachvollziehen.
    Wenn Du willst, schau ich mir das gerne genauer an, aber dann am besten den kompletten Code.
    Oder bist Du inzwischen weiter?

    Grüße
    Hubert