Phải, câu hỏi cũ nhưng có liên quan đến tôi. Đáng buồn thay, không có câu trả lời nên tôi phải tự sửa nó và tôi sẽ trả lời câu hỏi trong khi tôi đang ở đó.
Tôi sẽ ghi lại công việc ở đây, nhưng toàn bộ mô-đun có sẵn tại https://github.com/rianorie/magento2-sortcatalogwidget .
Đầu tiên, tôi tìm hiểu mô-đun catalogwidget ở Magento và tìm thấy \Magento\CatalogWidget\Block\Product\ProductsList::createCollection
. Mà xác nhận không có chức năng sắp xếp có sẵn. Vì vậy, đi kèm với một 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;
}
}
Đây là một khởi đầu tốt, nhưng quản trị viên không cho phép thêm các thuộc tính theo cách thủ công vào một định nghĩa widget rất dễ dàng. Vì vậy, chúng tôi thêm một định nghĩa cho điều đó là tốt.
Trong etc/widget.xml
chúng tôi làm:
<?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! Sắp xếp cho các widget danh mục bây giờ có thể. Tôi có thể thêm một danh sách thả xuống cho trường thuộc tính sản phẩm thay vì đầu vào gõ tự do trong mô-đun tại một số điểm, nhưng điều này phục vụ mục đích của tôi bây giờ.