Items: Nur Beiträge anzeigen, deren Erstellungsdatum zwischen DD-MM-JJJJ und DD-MM-JJJJ liegen

  • Hallo zusammen,


    ich würde gerne meine Such- und Sortierleiste etwas anpassen. Es sollen nur Einträge zwischen zwei Zeiträumen in der Liste bestehen bleiben.


    Ich arbeite hier mit


    Code
    JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));


    Ich kann mit Hilfe einer XML-Definition hier z.B. nach Kategorien sortieren etc. - aber es wäre halt besonders schön, wenn das für einen Zeitraum möglich wäre.


    Irgendwelche Ideen oder Beispiele? Gerne lese ich mir das auch an, nur ist mir keine Komponente bekannt, die das so macht.

  • Hallo und vielen Dank für die Information.


    Nun muss ich aber einmal nachbohren: Wir sprechen von einem Modul (FE oder BE?) mit diesem Namen? In meiner aktuellen Joomla-Version finde ich kein solches Modul.


    Habe ich Dich da missverstanden?

  • So, ich habe nun einen Ansatz, der bereits funktioniert.


    In der Filter-XML-Beschreibung:


    Code
    <field     name        =    "creationdate_from"                 type        =    "calendar"                 label        =    "test"                 format        =    "%d.%m.%Y"                 filter        =    "user_utc"                                                               onchange    =    "this.form.submit();"/>        <field     name        =    "creationdate_to"                 type        =    "calendar"                 label        =    "Test"                 format        =    "%d.%m.%Y"                 filter        =    "user_utc"                                                            onchange    =    "this.form.submit();"/>


    Im Model habe ich dann noch die populateState-Methode erweitert:


    Code
    /**     * populateState function.     *      * @access protected     * @param mixed $ordering (default: null)     * @param mixed $direction (default: null)     * @return void     */    protected function populateState($ordering = null, $direction = null)     {...        $creationdatefrom = $this->getUserStateFromRequest($this->context . '.filter.creationdate_from', 'filter_creationdate_from', '');        $this->setState('filter.creationdate_from', $creationdatefrom);                          $creationdateto = $this->getUserStateFromRequest($this->context . '.filter.creationdate_to', 'filter_creationdate_to', '');        $this->setState('filter.creationdate_to', $creationdateto); ...}


    In letztendlich in der getListQuery-Methode wird der ganze Spaß verarbeitet:




    Nun bleiben 2 Probleme:


    1. Der Filter funktioniert zwar, aber die Filter-Form bleibt nicht "vorausgewählt", wie es der Fall wäre, wenn ich z.B. nach Status sortiere (wenn ein Status angegeben wird, so bleibt ja nach dem Refresh die Detail-Spalte "offen" - ich habe das mal visualisiert)



    2. Wenn Blödsinn in das Datumsfeld eingegeben wird, wird dies nicht korrekt gefiltert - gibt es da eine Validierungs-Methode?

  • Hallo @christine2,


    vielen Dank - da stand ich tatsächlich auf dem Schlauch. Ich habe mir das angeschaut, hier wird das innerhalb des Modules im Helper abgebildet (groupByDate). Das ist von der Wirkung zwar ähnlich wie das, was ich möchte, aber anders aufgebaut.


    Wie oben schon beschrieben, funktioniert es mit der o.g. Lösung schon - nur das "offen halten" der Suchleiste klappt noch nicht :(

  • Leider reagiert das Core-Javascript (jquery.searchtools.js) nur auf list-Felder bzw. auf OPTIONs in Filterfeldern mit selected-Attribut. Wenn eines gefunden wird, bleiben Filter eingeblendet. Zeile 3 folgender Code


    Ein Workaround bzw. Ansatz.
    Mein Feld in der filter_xyz.xml

    Code
    <field name="blah" type="text" label="BLAH" />


    zeigt mir ein Textfeld in den Filtern an.


    Im Model im constructor muss ich das Feld hinzufügen

    Code
    $config['filter_fields'] = array(...'blah');


    In populateState

    Code
    $blah = $this->getUserStateFromRequest($this->context . '.filter.blah', 'filter_blah');        $this->setState('filter.blah', $blah);


    Im JLayout /layouts/joomla/searchtools/default.php für das du ja in deiner Komponente einen Override anlegen darfst, hast du Zugriff auf das Array

    Code
    $activeFilters = $displayData['view']->activeFilters;


    Bsp. Mein Textfeld enthält "aaaaaa" + 2 weitere Filter.

    Code
    Array ([published] => 1[category_id] => 14[blah] => aaaaaa)


    Und jetzt denke ich mir, wenn du den SCRIPT-Block Zeile 52-58 des Codes dieser Seite


    http://www.ghsvs.de/programmie…uge-filter-immer-sichtbar


    in deinen Override analog einsetzt und mit einem PHP umgibst

    PHP
    <?php if ( array_key_exists('blah', $activeFilters) ){ ?>
    <script>
    ...
    </script>
    <?php } ?>


    dass das klappen könnte. Reine Theorie bisher ;)

  • Sooooo, ich habe nun von der angesprochenen Lösung doch Abstand genommen, weil die Felder beim Klick auf "Zurücksetzen" nicht zurückgesetzt wurden.


    Ich habe nun ein Custom Field in meine XML eingefügt:


    Code
    addfieldpath=        "/administrator/components/com_bestia/models/fields


    Dort habe ich ein Custom Field definiert



    Nun habe ich zwar keine taggenaue Auswahlmöglichkeit, aber das musste ohnehin nicht unbedingt sein.


    Im Model selbst habe ich nun den Contructor angepasst und die Werte in populateState() geladen. Danach kann ich die angegebenen Werte in getListQuery verarbeiten.


    Nun bleibt die Searchbar offen und beim Klick auf "Zurücksetzen" werden die Dateselect-Felder auch zurück gesetzt.


    Vielleicht hilft dies ja auch dem einen oder anderen Nutzer, der vor einem ähnlichen Problem steht.