Magento 2 - Produktlisten-Widget-Produktbestellung katalogisieren

8

Auf der Homepage meiner Magento-Website wird eine Produktliste angezeigt . Diese Produktliste wurde mit der catalog product list widgetKonfiguration erstellt, um die Produkte anzuzeigen, die sich in der Homepage- Kategorie befinden. Produkte in dieser Kategorie haben eine Positionsnummer. Produkte werden in einer scheinbar preisbestellten Liste angezeigt. Wie kann ich das Widget dazu bringen, die Liste der geordneten Positionen anzuzeigen?

PierreGriffon
quelle

Antworten:

3

Wenn Sie in der Widget-Produktliste nach Position sortieren möchten, müssen Sie den nächsten Schritt ausführen.

Namespace / CustomWidgets / etc / frontend / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\CatalogWidget\Block\Product\ProductsList">
        <plugin name="custom_widgets_product_list" type="Namespace\CustomWidgets\Plugin\Block\Product\ProductsListPlugin"/>
    </type>
</config>

Namespace / CustomWidgets / Plugin / Block / Product / ProductsListPlugin.php

<?php    
namespace Namespace\CustomWidgets\Plugin\Block\Product;

use Magento\Catalog\Model\ResourceModel\Product\Collection;
use Magento\CatalogWidget\Block\Product\ProductsList;

/**
 * Class ProductsListPlugin
 */
class ProductsListPlugin
{

    /**
     * @param ProductsList $subject
     * @param Collection $result
     * @return Collection
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function afterCreateCollection(ProductsList $subject, Collection $result)
    {
        $result->getSelect()->order('cat_index_position asc');

        return $result;
    }
}

Diese Reihenfolge richtet sich immer nach der Position der Stammkategorie. Wenn Sie nach einer bestimmten Kategorie sortieren möchten, müssen Sie dafür ein neues benutzerdefiniertes Widget erstellen.

raumatbel
quelle
Diese Antwort hat mir geholfen, danke. Ich habe $ result-> setOrder ('created_at', 'DESC') verwendet. stattdessen.
Paul
1

Richtig, so alte Frage, aber relevant für mich. Leider gab es keine Antwort, also musste ich sie selbst reparieren und herausfinden, dass ich die Frage beantworten werde, während ich dabei bin.

Ich werde die Arbeit hier dokumentieren, aber das gesamte Modul ist unter https://github.com/rianorie/magento2-sortcatalogwidget verfügbar .

Zuerst habe ich mich im Katalogwidget-Modul in Magento umgesehen und gefunden \Magento\CatalogWidget\Block\Product\ProductsList::createCollection. Dies bestätigt, dass keine Sortierfunktion verfügbar ist. Also kommt ein Plugin:

class AfterCreateCollection
{
    public function aftercreateCollection($subject, $result)
    {
        /**
         * @var \Magento\Catalog\Model\ResourceModel\Product\Collection $result
         * @var \Magento\CatalogWidget\Block\Product\ProductsList $subject
         */

        // if there's a sort_by attribute defined, add a sort to the collection
        if ($subject->hasData('sort_by')) {

            // if there's a direction given, check and use that otherwise  use the default
            $direction = strtoupper($subject->getData('sort_direction'));
            if (!in_array($direction, [Select::SQL_DESC, Select::SQL_ASC])) {
                $direction = Select::SQL_DESC;
            }

            $result->setOrder($subject->getData('sort_by'), $direction);
        }

        return $result;
    }
}

Dies ist ein guter Anfang, aber der Administrator erlaubt es nicht, Attribute ganz einfach manuell zu einer Widget-Definition hinzuzufügen. Also fügen wir auch dafür eine Definition hinzu.

In etc/widget.xmlwir tun:

<?xml version="1.0" encoding="UTF-8"?>
<widgets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Widget:etc/widget.xsd">
    <widget id="products_list">
        <parameters>
            <parameter name="sort_by" xsi:type="text" required="false" visible="true">
                <label translate="true">Attribute to sort the products by</label>
            </parameter>
            <parameter name="sort_direction" xsi:type="select" visible="true" required="false"
                       source_model="Elastomatic\SortCatalogWidget\Model\Config\Source\Direction">
                <label translate="true">Sort direction</label>
            </parameter>
        </parameters>
    </widget>
</widgets>

Aaand voila! Das Sortieren für das Katalog-Widget ist jetzt möglich. Ich könnte irgendwann eine Dropdown-Liste für das Produktattributfeld anstelle der frei eingegebenen Eingabe im Modul hinzufügen, aber dies dient vorerst meinem Zweck.

Rian
quelle
Da das Magento-Widget für Kataloglistenprodukte das Sortieren nach Position nicht unterstützt, habe ich das oben genannte Modul installiert, aber die Produkte werden nicht nach Positionsreihenfolge aufgelistet. Bitte leiten Sie mich, wie Sie diese Arbeit gemacht haben.
Siva
Die Anzeige der Produkte hängt jedoch vom Produkt-ID-Wert anstelle der Position ab.
Siva
1

Hier ist eine Lösung, wenn Rians Antwort für Sie nicht funktioniert:

Ersetzen Sie die Leitung

$result->setOrder($subject->getData('sort_by'), $direction);

mit

$result->getSelect()->reset(\Zend_Db_Select::ORDER);
$result->addAttributeToSort($subject->getData('sort_by'), $direction);

und das Modul sollte wie erwartet funktionieren.

Das aktualisierte Magento 2-Modul ist hier verfügbar: https://github.com/Bitpolar-Tech/module-sort-catalog-widget

Stefan
quelle