MultipleLinkPage Objekte reduzieren

  • Nabend zusammen,

    ich habe eine neue MyCarsPage (fiktiv) erstellt, welche von SortablePage erbt. Auf dieser Page sollen bspw. alle Autos angezeigt werden, die dieser eingeloggte Benutzer erstellt hat und es soll ebenfalls eine Pagination möglich sein.

    Ich gebe folgende Property in der Klasse mit an (und ich glaube, das ist schon das Problem - aber ohne geht auch nicht).

    Code
      public $objectListClassName = CarList::class;

    In der Methode readData() hole ich mir den ConditionBuilder und hole mir entsprechend die Objekte, die dem eingeloggten Benutzer zugehörig sind. Anschließend render ich das Array in's Template:

    Naja soweit sogut.. Im Template geh ich mit foreach über {$cars} und der Benutzer kriegt nur seine eigenen Autos angezeigt. Das Problem ist nun aber:

    Die Pagination im Template bezieht sich auf die Cars aller Mitglieder. Der Benutzer kriegt zwar nur seine Cars angezeigt, kriegt aber trotzdem 30 Pages angezeigt, weil die Cars der anderen Mitglieder auch gezählt werden.

    Hat jemand eine Ahnung wie ich das umgehe und wo mein Denkfehler liegt?

    Pagination im Template sieht wie folgt aus:

    Code
    {hascontent}
        <div class="paginationTop">
            {content}
                {pages print=true assign=pagesLinks controller='MyCars' link="pageNo=%d&sortField=$sortField&sortOrder=$sortOrder"}
            {/content}
        </div>
    {/hascontent}

    Besten Gruß und danke vorab,

    JAY

  • Hey,

    soweit ich das weiß, wird die pagination entsprechend des angegebenen objectListClassName generiert. Wenn du 20 Einträge in der entsprechenden Tabelle hast, wird die entsprechende pagination auch mit 20 Beiträgen berechnet.

    Versuche statt dem Auslesen in readData mal deine Conditions in die Funktion initObjectList() zu schreiben. In einem meiner Projekte sieht das in etwa so aus:

    PHP
        public function initObjectList() {
            parent::initObjectList();
    
            if($this->filterList > 0) {
                $this->objectList->sqlJoins = $this->objectList->sqlConditionJoins = "JOIN newsletter1_subscription subscription ON subscription.subscriberID = " . $this->objectList->getDatabaseTableAlias() . ".subscriberID";
                $this->objectList->getConditionBuilder()->add("subscription.listID = ?", [$this->filterList]);
            }
        }

    Hier wird einfach geschaut, ob ein Filter nach einer speziellen Liste aktiv ist. Und das funktioniert soweit auch so, wie es soll.

    //EDIT: Du brauchst dann nichts mehr ans Template selber übergeben. Das template erhält seine Objects aus dem, was er aus der entsprechenden Datenbank-Tabelle liest.

    Gruß

    ilou

  • Hey,

    ja, der Aufruf wird benötigt, damit ein Objekt der ObjectClassList erstellt wird. Du brauchst ja ein spezielles Objekt, auf dem du die Conditions erzeugen kannst und dieses wird durch den Aufruf von parent::initObjectList() erstellt. In Java würdest du ohne den Aufruf wohl eine NullPointerException bekommen, weil du auf einem Objekt, das nicht initialisiert wurde, versuchst, eine Methode aufzurufen.

    Display Spoiler

    Gibt es NPEs auch in PHP? Wahrscheinlich, oder? Ist so natürlich, was IntelliJ für einen generiert, oder wie wenig man auf solche Fehlermeldungen achtet, wie die genau heißen, dass man sowas gar nicht mitbekommt.

    EDIT: Nach kurzem nachdenken, natürlich gibt's auch in PHP sowas. Hatte ich natürlich auch schon.

    Ein kurzer Blick in den Code des WSC zeigt das auch:

    Gruß

    ilou

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!