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.xml
wir 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.