Export-Funktion im Controller: Bei Änderungen des Suchfilters wird Datei erneut herunter geladen

  • Guten Abend zusammen,


    so, ich bewege mich stark auf die erste Beta meiner Komponente zu und habe heute schon (auch dank @Re:Later s Hilfe) einige Fortschritte gemacht.


    In meiner Komponente ist es nun möglich, Datensätze nach Datum zu filtern und diese zu exportieren.


    Die Exportfunktion bilde ich durch die Toolbar ab:


    Code
    if (isset($this->items[0]->state)) {    JToolBarHelper::custom('items.exportcsv', 'download', '', 'COM_BESTIA_EXPORT', true);}


    Im Controller existiert folgende Methode:


    Code
    /** * exportcsv function. *  * @access public * @return void */public function exportcsv(){    $jinput                 =             JFactory::getApplication()->input;    $ids                     =             $jinput->get('cid', '', 'array');    $modelitems                =            $this->getModel();    $array                    =            array();    foreach($ids as $id)    {        $item                            =    $modelitems->getItem($id);                $array[$item->id]['itemid']        =    $item->itemid;        $array[$item->id]['state']        =    $item->state;                    $array[$item->id]['creationdate']=    $item->creationdate;                }    $csv                            =        ArrayHelper::exportArrayToCSV($array, "item-report");    $this->setRedirect('index.php?option=com_bestia&view=items', false);          }


    Diese wird auch ganz wunderbar angesteuert und der Export funktioniert durch meinen kleinen Helper auch ganz wunderbar




    Jetzt habe ich aber ein letztes Problem: Wenn ich nach einem Export in der Searchbar z.B. den zu filternden Status ändere, dann wird der Export erneut vorgenommen - ohne dass ich auf einen entsprechenden Button klicken würde.


    Ich vermute, dass dies mit dem "exit();" in der exportArrayToCSV zusammen hängt. Das Exit ist aber notwenig, da der Download sonst nicht funktioniert.


    Habt ihr da ggf. Ansätze, wie ich das lösen könnte?

  • Hallo,


    ich melde mich mit einem kleinen Update.


    Dank @SniperSister s Hilfe in der Joomla-Facebook-Gruppe ist die Ursache jetzt wirklich deutlich.


    Der Abbruch durch exit; verhindert das Neuladen der Seite nach dem Download. Das Neuladen würde den Task allerdings zurück setzen, was nun also nicht geschieht.


    Es bleibt also zu versuchen, im Controller selbst den Task zurück zu setzen.


    Der Task wird im Hidden-Field in der jeweiligen View abgelegt - bisher bin ich leider noch nicht darauf gekommen, wie ich im Controller das Element der View beeinflussen kann, denn der Controller kennt scheinbar kein jQuery.



    Das Hidden field

    Code
    <input type="hidden" name="task" value="" />


    Ein JS-Ansatz, der jedoch mangels jQuery-Unterstützung im Controller nicht funktioniert:

    Code
    <script>
    function display() {
    document.getElementById("task").value = "";
    }
    </script>



    Vielleicht hat hier jemand noch Ideen?

  • Hallo und vielen Dank für Deine Mühen.


    Dies habe ich nun im Layout getan - nun lasse ich im Controller (in der Export-Funktion) folgendes machen:



    Der Fehler besteht allerdings leider weiterhin.

  • Das hatte mich nämlich gewundert - ich hatte es so verstanden, dass genau das getan werden soll ;)


    Ich habe das nun einmal in die View eingebaut:

    Code
    JHtml::_('jquery.framework');
    $document     = JFactory::getDocument();
    $document->addScriptDeclaration('jQuery(document).ready(function() {
                                        console.log( "ready!" );
                                    })');


    Ich würde dann gerne das console.log(...), wenn es funktioniert durch die eigentliche Aufgabe ersetzen.


    Leider erhalte ich aber derzeit noch folgenden Fehler:


    Zitat

    TypeError: jQuery(document).ready is not a function. (In 'jQuery(document).ready(function() {
    console.log( "ready!" );
    })', 'jQuery(document).ready' is an instance of m)


    Und mit diesem Fehler lässt sich die Searchbar nicht mehr nutzen - ein Klick auf "Suchwerkzeuge" bleibt ohne Effekt.

    Einmal editiert, zuletzt von ehrenwert ()

  • So, ich habe nun folgendes:


    Code
    JHtml::_('jquery.framework');
    
    
    // Import CSS
    $document     = JFactory::getDocument();
    $document->addScriptDeclaration('
                                    jQuery(document).ready(function () {
                                        jQuery("#task").val("")
                                    });     
                                    ');


    Leider führt das auch nicht zum Überschreiben des Tasks - auch wenn zumindest keine Fehler mehr in der Konsole landen.

  • Hm, okay. Du merkst: JS ist nicht mein Thema.


    Bisher wird bei einer Änderung an einem Filter-Feld ein Form-Submit ausgeführt. Wie also kann ich das einbinden?

  • Okay, das heißt die onChange-Funktion bezieht sich auf die Elemente der Filter-Bar?


    Wenn in der Searchbar 3 Filter (Status, Suchtext, Ordering) vorhanden sind muss ich 3x den og Teil ausführen?

  • So, es ist Zeit für einen kleinen Trommelwirbel :)


    Dank freundlicher Unterstützung konnte ich die restlichen Kleinigkeiten völlig ohne jQuery-Kenntnisse einbinden (scheint im Grunde aber gar nicht so schwierig zu sein - ich habe wohl unterschätzt, wie sehr jQuery JS vereinfacht).


    Folgendermaßen funktioniert es nun perfekt:


    Code
    $document->addScriptDeclaration('
                                    jQuery(document).ready(function(){
                                        jQuery("select").change(function(){
                                            jQuery("#task").val("");
                                        });
                                    });
                                    ');


    Vielleicht hilft das ja später auch einmal jemandem weiter.



    Beste Grüße :)