SilverStripe - Paginierung basierend auf Dropdown-Auswahl erstellen

Ich arbeite daran, eine Paginierung für eine Seite auf einer SilverStripe-Site zu erstellen, auf der standardmäßig zunächst alle Artikel angezeigt werden. Der Benutzer kann jedoch auswählen, welche Artikel angezeigt werden sollen, indem er ein Jahr aus einem Dropdown-Steuerelement auswählt.

Hier ist die Vorlage für die Artikel. Im Moment habe ich Code, der beim ersten Laden oder erneuten Laden der Seite und beim Abrufen aller Artikel vom Server eine Paginierung hinzufügt:

<select id="SelectNewsYear">
    <option value="">Select a year</option>
    <% loop $GroupedNewsByDate.GroupedBy(PublishYear) %>
        <option value="$PublishYear">$PublishYear</option>
    <% end_loop %>
    <option value="all">Show all</option>
</select>
<br /><br />

<div class="RecentNews">
    <% loop $PaginatedReleases %>
       $ArticleDate.format("F j, Y"), <a href="$URLSegment">$H1</a><br />
    <% end_loop %>

    <% if $PaginatedReleases.MoreThanOnePage %>
        <% if $PaginatedReleases.NotFirstPage %>
            <a class="prev" href="$PaginatedReleases.PrevLink">Prev</a>
        <% end_if %>
        <% loop $PaginatedReleases.Pages %>
            <% if $CurrentBool %>
                $PageNum
            <% else %>
                <% if $Link %>
                    <a href="$Link">$PageNum</a>
                <% else %>
                    ...
                <% end_if %>
            <% end_if %>
        <% end_loop %>
        <% if $PaginatedReleases.NotLastPage %>
            <a class="next" href="$PaginatedReleases.NextLink">Next</a>
        <% end_if %>
    <% end_if %>
</div>

Die PaginatedReleases Funktion in Page.php:

//Returns a paginted list of news releases
public function PaginatedReleases(){
    $newslist = NewsReleaseArticlePage::get()->sort('ArticleDate', "DESC");
    return new PaginatedList($newslist, $this->getRequest());
}

Das Problem besteht nun darin, herauszufinden, wie die Paginierungsfunktion bei jeder Auswahl eines Jahres aus der Dropdown-Liste beibehalten werden kann. Anfangs habe ich mich nicht mit Paginierung befasst, da ich mich mehr mit der Funktionalität der Dropdown-Liste befasst habe. Dies ist der jQuery- und AJAX-Code, den ich zurzeit eingerichtet habe, der den Jahreswert aus der Dropdown-Liste abruft und an den Server an die entsprechende Funktion weiterleitet:

(function($) {
    $(document).ready(function() {

        var SelectNewsYear = $('#SelectNewsYear');

        var month = new Array();
        month[0] = "January";
        month[1] = "February";
        month[2] = "March";
        month[3] = "April";
        month[4] = "May";
        month[5] = "June";
        month[6] = "July";
        month[7] = "August";
        month[8] = "September";
        month[9] = "October";
        month[10] = "November";
        month[11] = "December";


        SelectNewsYear.change(function() {

            if (SelectNewsYear.val() != "" && SelectNewsYear.val() != null &&  SelectNewsYear.find('option:selected').attr('value') !="all") {
                sendYear();
            }
            else{
                showAll();
            }
        });

        //get all articles by the year selected
        function sendYear(){
            var year = SelectNewsYear.find('option:selected').attr('value');
            $.ajax({
                type: "POST",
                url: "/home/getNewsByYear/"+year,
                dataType: "json"
            }).done(function (response) {
                var list = '';
                var newsSection = $('.RecentNewsByYear');

                for (var i=0;i<response.length;i++){
                    var newsDate = new Date(response[i].date);
                    var monthFullName = month[newsDate.getUTCMonth()];

                    list += monthFullName + " " + newsDate.getUTCDate() +", " +newsDate.getFullYear()  + ', ' + '<a href="' + response[i].article + '"target="_blank">' + response[i].title +"</a> <br />";
                }
                newsSection.empty();
                newsSection.append(list);
            });
        }

    });
}(jQuery));

$ = jQuery.noConflict();

Und die Funktion getNewsByYear von Page.php:

//Get all recent news by year based on selected year from dropdown
    public function getNewsByYear(){
        //Get the year selected by the dropdown
        $newsReleaseYear = $this->getRequest()->param('ID');

        //Group together all news that are associated with that selected year
        $newsReleases = NewsReleaseArticlePage::get();

        $return = array();

        //put the news releases into the array that match the selected year
        foreach($newsReleases as $newsRelease){
            $newsDate = date("Y", strtotime($newsRelease->ArticleDate));

            if($newsDate == $newsReleaseYear){
                $return[] = array(
                    'title' => $newsRelease->H1,
                    'date' => $newsRelease->ArticleDate,
                    'article' => $newsRelease->URLSegment
                );
            }
        }

        return json_encode($return);
    }

Die getNewsByYear-Funktion funktioniert wie sie ist, aber ich bin nicht sicher, wie ich die SilverStripe PaginationList-Funktion hier einbauen soll. Ich frage mich, ob es eine Möglichkeit gibt, die ausgewählten Artikel zurückzugeben, ohne sich auf json-codierte Daten zu verlasse

Antworten auf die Frage(2)

Ihre Antwort auf die Frage