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?

PierreGriffon
fonte

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.

raumatbel
fonte
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.

Rian
fonte
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

Stefan
fonte