Magento 2 - danh mục sản phẩm danh mục phụ tùng sản phẩm


8

Trang chủ của trang web magento của tôi đang hiển thị một danh sách sản phẩm . Danh sách sản phẩm này được tạo với catalog product list widgetcấu hình để hiển thị các sản phẩm trong danh mục trang chủ . Sản phẩm trong danh mục này có một số vị trí. Sản phẩm được hiển thị trong những gì có vẻ là danh sách đặt hàng giá. Làm cách nào để có được widget để hiển thị danh sách theo thứ tự?

Câu trả lời:


3

Nếu bạn muốn đặt hàng theo vị trí trong danh sách sản phẩm widget, bạn phải làm tiếp theo.

Không gian tên / 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>

Không gian tên / CustomWidgets / Plugin / Chặn / Sản phẩm / Sản phẩmListPlugin.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;
    }
}

Thứ tự này luôn luôn theo vị trí của thể loại gốc. Nếu bạn muốn đặt hàng theo một danh mục cụ thể, bạn phải tạo một tiện ích tùy chỉnh mới cho điều đó.


Câu trả lời này đã giúp tôi, cảm ơn. Tôi đã sử dụng $ result-> setOrder ('created_at', 'DESC'); thay thế.
paul

1

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.xmlchú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ờ.


Vì tiện ích danh sách sản phẩm danh mục Magento không hỗ trợ Sắp xếp theo vị trí, tôi đã cài đặt mô-đun nói trên nhưng vẫn không có sản phẩm nào được liệt kê theo thứ tự vị trí. Xin hướng dẫn cho tôi làm thế nào bạn thực hiện công việc này.
Siva

Tuy nhiên, các sản phẩm đang hiển thị tùy thuộc vào giá trị ID sản phẩm thay vì vị trí.
Siva

1

Đây là một giải pháp nếu câu trả lời của Rian không phù hợp với bạn:

Thay thế dòng

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

với

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

và các mô-đun nên làm việc như mong đợi.

Mô-đun Magento 2 được cập nhật có sẵn tại đây: https://github.com/Bitpolar-Tech/module-sort-catalog-widget

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.