Magento 2 - catálogo de produtos da lista widget produto ordem


8

A página inicial do meu site magento está mostrando uma lista de produtos . Esta lista de produtos foi criada com o catalog product list widgetconfigurado para mostrar os produtos que estão na categoria da página inicial . Os produtos desta categoria têm um número de posição. Os produtos são exibidos no que parece ser a lista de pedidos de preços. Como faço para que o widget exiba a lista de pedidos da posição?

Respostas:


3

Se você deseja ordenar por posição na lista de produtos do widget, faça o seguinte.

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;
    }
}

Essa ordem é sempre pela posição da categoria raiz. Se você deseja fazer o pedido por uma categoria específica, deve criar um novo widget personalizado para isso.


Esta resposta me ajudou, obrigado. Eu usei $ result-> setOrder ('created_at', 'DESC'); em vez de.
— 9139 paul paul

1

Certo, pergunta tão antiga, mas relevante para mim. Infelizmente, não havia uma resposta, então eu tive que corrigi-lo pessoalmente e acho que vou responder à pergunta enquanto estou nisso.

Documentarei o trabalho aqui, mas o módulo inteiro está disponível em https://github.com/rianorie/magento2-sortcatalogwidget .

Primeiramente, eu procurei no módulo catalogwidget no Magento e encontrei \Magento\CatalogWidget\Block\Product\ProductsList::createCollection. O que confirma que não há funcionalidade de classificação disponível. Então, vem um plug-in:

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;
    }
}

Este é um bom começo, mas o administrador não permite adicionar atributos manualmente a uma definição de widget com muita facilidade. Então, adicionamos uma definição para isso também.

Em etc/widget.xmlnós fazemos:

<?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! A classificação para o widget de catálogo agora é possível. Eu posso adicionar um menu suspenso para o campo de atributo do produto em vez da entrada de digitação livre no módulo em algum momento, mas isso serve ao meu propósito no momento.


Como o widget de produtos da lista de catálogos Magento não suporta Classificar por posição, instalei o módulo acima mencionado, mas ainda assim, os produtos não estão listados por ordem de posição. Por favor, me guie como você fez isso funcionar.
— Siva

Ainda assim, os produtos exibidos dependem do valor da ID do produto em vez da posição.
— Siva

1

Aqui está uma solução se a resposta de Rian não funcionar para você:

Substitua a linha

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

com

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

e o módulo deve funcionar conforme o esperado.

O módulo Magento 2 atualizado está disponível aqui: https://github.com/Bitpolar-Tech/module-sort-catalog-widget

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.