Infinite Scrolling / Pagination / Artikellistung / Seite 2, 3, usw. funktioniert nicht. Zeigt nur eine 1

Hallo

Nach Update auf 5.7.16 funktioniert die Pagination bzw. das Infinite Scrolling nicht mehr.
Wird Seite 2, 3, 4, usw. aufgerufen, dann wird statt des Artikel-Listing nur eine 1 angezeigt.

Hat jemand eine Idee, woran das liegen könnte.
Cache geleert, Theme kompiliert …
Produktion- in Bearbeitungsmodus …
Bringt alles nichts.

Danke

Tom

Das Infinite Scrolling wird mit JavaScript gesteuert. Wird nun JavaScript durch einen Fehler nicht korrekt ausgeführt, dann hängt auch dieses Scrolling.

Idee?

Vielleicht mal mit F12 die Entwicklerkonsole vom Browser aufrufen und schauen ob dort Fehler beim JavaScript stehen. Falls nichts, könnte es ggf. auch am Theme liegen. Dann zum Test mal auf das originale Shopware Theme umstellen und schauen ob es dann funktioniert.

Der Effekt tritt bei uns seit Update auf 5.7.16 ebenfalls auf. Bei Klick auf eine andere Seite in der Listenansicht, Nutzung der Filter oder der Sortierung, werden als Liste und als Paginierung nur eine „1“ angezeigt.
Wird die Seite anschließend neu geladen (die URL hat sich durch den vorherigen Klick bereits geändert) wird der gewünschte Inhalt angezeigt.
Der Effekt tritt ebenfalls auf, wenn anstelle des individuellen Themes das Standard-Responsive-Theme verwendet wird. Dann werden die 1en allerdings dem Inhalt hinzugefügt.

Bei uns war die Methode setSearchResultResponse() (in engine/Shopware/Controllers/Widgets/Listing.php in Zeile 321) der Übeltäter. Ich habe sie durch die alte Methode ersetzt und die beiden davon benutzten Methoden fetchListing() und fetchPagination() ebenfalls wieder ergänzt. Damit läuft es.

    private function setSearchResultResponse(ProductSearchResult $result)
    {
        $body = [
            'totalCount' => $result->getTotalCount(),
        ];

        if ($this->Request()->getParam('loadFacets')) {
            $body['facets'] = array_values($result->getFacets());
        }
        if ($this->Request()->getParam('loadProducts')) {
            $body['listing'] = $this->fetchListing($result);
            $body['pagination'] = $this->fetchPagination($result);
        }
        $this->View()->assign($body);

        $this->Response()->headers->set('Shopware-Listing-Total', (string) $result->getTotalCount());
    }
    /**
     * @return string
     */
    private function fetchListing(ProductSearchResult $result)
    {
        $categoryId = (int) $this->Request()->getParam('sCategory');

        if ($this->Request()->has('productBoxLayout')) {
            $boxLayout = $this->Request()->get('productBoxLayout');
        } else {
            $boxLayout = $this->get(Shopware_Components_Config::class)->get('searchProductBoxLayout');
            if ($categoryId) {
                $boxLayout = Shopware()->Modules()->Categories()->getProductBoxLayout($categoryId);
            }
        }

        $products = $this->convertProductsResult($result, $categoryId);

        $this->loadThemeConfig();

        $this->View()->assign([
            'sArticles' => $products,
            'pageIndex' => (int) $this->Request()->getParam('sPage'),
            'productBoxLayout' => $boxLayout,
            'sCategoryCurrent' => $categoryId,
            'sCategoryContent' => Shopware()->Modules()->Categories()->sGetCategoryContent($categoryId),
        ]);

        $this->get('events')->notify('Shopware_Controllers_Widgets_Listing_fetchListing_preFetch', [
            'result' => $result,
            'subject' => $this,
        ]);

        return $this->View()->fetch('frontend/listing/listing_ajax.tpl');
    }

    /**
     * @return string
     */
    private function fetchPagination(ProductSearchResult $result)
    {
        $sPerPage = (int) $this->Request()->getParam('sPerPage');

        if ($sPerPage <= 0) {
            $sPerPage = 1;
        }

        $this->View()->assign([
            'sPage' => (int) $this->Request()->getParam('sPage'),
            'pages' => ceil($result->getTotalCount() / $sPerPage),
            'baseUrl' => $this->Request()->getBaseUrl() . $this->Request()->getPathInfo(),
            'pageSizes' => explode('|', $this->container->get(\Shopware_Components_Config::class)->get('numberArticlesToShow')),
            'shortParameters' => $this->container->get(QueryAliasMapper::class)->getQueryAliases(),
            'limit' => $sPerPage,
        ]);

        $this->get('events')->notify('Shopware_Controllers_Widgets_Listing_fetchPagination_preFetch', [
            'result' => $result,
            'subject' => $this,
        ]);

        return $this->View()->fetch('frontend/listing/actions/action-pagination.tpl');
    }
2 „Gefällt mir“

tausend dank.
das war tatsächlich das problem.
darf ich fragen, wie du darauf gekommen bist?

gruß
tom

Hallo Tom,
schön das ich dir helfen konnte.
Ich habe mir angeschaut, welche Dateien im 5.7.16er-Update enthalten waren, diese auf Dateien eingeschränkt, die sich mit der Artikelliste bzw. den Filtern beschäftigen und darin nach Methoden gesucht, die für die Suche oder Listendarstellung zuständig sind. Dann habe ich die mit der gleichen Methode aus dem Backup verglichen und einfach mal ausgetauscht.
Gruß
LD

Bei mir warf es halt ´nen 500er mit „core.CRITICAL: Method fetchPagination does not exist“, was mich auch zu diesem Schritt veranlasste.

Steht irgendwo in den Changelogs, dass das jetzt anders gehandhabt werden soll?

Grüße
Andy

Hattet Ihr das beim Standard Theme oder bei einem eigenen? Frage nur rein aus Interesse, ob damit bei einem Update gerechnet werden muss.

Bei mir das selbe, auch bei 5.7.17
Danke für den Fix, wird das auch mal offiziell behoben ?

Die Lösung ist leider semi, denn direkt am Core etwas zu ändern ist mit dem nächsten Update wieder hinfällig. Natürlich besser, als das es gar nicht funzt, hier muss Shopware dringend nachbessern. Nicht verständlich, dass so eine Funktionsänderung an so einer elementaren und out-of-the-box Stelle überhaupt nicht ausreichend getestet wurde.
Ticket bei SW erstellt: Shopware Issuetracker

Update: Problem war nicht SW, sondern eine modifizierte Variante der View THEME/widgets/listing/listing_count.tpl. Hier wurde $listing und $pagination direkt zurückgegeben, was durch das true aus der oben genannten Funktion jeweils eine 1 macht

Danke. Leider bis heute von Shopware nicht behoben und dabei nicht unerheblich so ein Bug …