Magento 2 Seçeneğe göre özel sıralama nasıl eklenir


22

created_atÜrün listesini en son ürüne göre sıralamak için özelliğe dayalı ek bir filtre eklemem gerekiyor . Aşağıdaki dosyayı kullanarak anlamaya çalıştım

app/design/frontend/Vendor/ThemeName/Magento_Catalog/templates/product/list/toolbar/sorter.phtml  

ancak varlık kimliğimizi nasıl ekleyebiliriz getAvailableOrders()?

Yanıtlar:


23

created_atYönetici-> mağazalar -> (öznitelik) ürününde olmadığı gibi bir öznitelik kullanmak istiyorsanız , admin'de tanımlanan öznitelikler ayara Sorting in Product Listing = Yes/Nosahip olduğundan, şu iki dosyayla çalışmanız gerekir:

\vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php \vendor\magento\module-catalog\Model\Config.php

Gelen Toolbar.phpGördüğünüz

$this->_availableOrder = $this->_catalogConfig->getAttributeUsedForSortByArray();

o çağırır getAttributeUsedForSortByArray()dan Config.phpsıralama koleksiyonu listeleme mevcut özelliklerin olduğu döner dizisi.

Şimdi, created_atözniteliğinizi buraya eklemeniz gerekiyor. Nasıl? Bir eklenti ile yaptım

/**
 * Add sort order option created_at to frontend
 */
public function afterGetAttributeUsedForSortByArray(
    \Magento\Catalog\Model\Config $catalogConfig,
    $options
) {
    $options['created_at'] = __('New');
    return $options;
}

Sen takılı created_atşimdi bunu kullanmak için özel koleksiyonu oluşturmak için tek sahip, sıralama için kullanılabilir özniteliklerde. Burada benimkini geçersiz kılmayı ve geçersiz kılmayı seçiyorum\vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.phpToolbar.phpsetCollection()

/**
 * Set collection to pager
 *
 * @param \Magento\Framework\Data\Collection $collection
 * @return $this
 */
 public function setCollection($collection) {
    $this->_collection = $collection;
    $this->_collection->setCurPage($this->getCurrentPage());

    // we need to set pagination only if passed value integer and more that 0
    $limit = (int)$this->getLimit();
    if ($limit) {
        $this->_collection->setPageSize($limit);
    }

    // switch between sort order options
    if ($this->getCurrentOrder()) {
        // create custom query for created_at option
        switch ($this->getCurrentOrder()) {
            case 'created_at':
                if ($this->getCurrentDirection() == 'desc') {
                    $this->_collection
                        ->getSelect()
                        ->order('e.created_at DESC');
                } elseif ($this->getCurrentDirection() == 'asc') {
                    $this->_collection
                        ->getSelect()
                        ->order('e.created_at ASC');           
                }
                break;
            default:
                $this->_collection->setOrder($this->getCurrentOrder(), $this->getCurrentDirection());
                break;
        }
    }

    // echo '<pre>';
    // var_dump($this->getCurrentOrder());
    // var_dump((string) $this->_collection->getSelect());
    // die;

    return $this;        
}

Hepsi bu, benim için bir cazibe gibi çalışıyor.


Herkes artan varsayılan istiyorsa, o zaman değiştirmek } elseif ( $this->getCurrentDirection() == 'asc' ) {için } else {.
thdoan

2
Ayrıca, bir eklenti kullanmak istemiyorsanız $block->addOrderToAvailableOrders('created_at', 'New'), sıralayıcı şablonunuzdaki yerleşik genel işlevi de kullanabilirsiniz .
thdoan

Özel ürün fiyatını sıralama çözümünüz olabilir mi? Lima
Dhaduk Mitesh

@DhadukMitesh emin, yukarıdaki kodu kullanabilir ve created_atözel fiyat özellik kodunuzla özellik kodunu değiştirebilirsiniz
LucScu

Özel bir fiyat özelliğim yok. Varsayılan fiyat sıralama ölçütü kullanıyorum. Sadece fiyatın sıralandığı çekirdek dosyada değişiklik yapıyorum. ve bir koleksiyon için özel fiyatımı ayarlamak istiyorum. ancak koleksiyonda özel fiyat ayarlayamıyorum.
Dhaduk Mitesh

19

Eklentileri kullanarak bunu başarabiliriz. Lütfen modülünüzde aşağıdaki dosyaları oluşturun.

Uygulamanın / kod / Paket / CustomToolbar / etc / di.xml

<type name="Magento\Catalog\Model\Config">
    <plugin name="Package_CustomToolbar::addCustomOptions" type="Package\CustomToolbar\Plugin\Model\Config" />
</type>
<type name="Magento\Catalog\Block\Product\ProductList\Toolbar">
    <plugin name="Package_CustomToolbar::addPriceDecendingFilterInToolbar" type="Package\CustomToolbar\Plugin\Product\ProductList\Toolbar" />
</type>

Uygulamanın / kod / Paket / CustomToolbar / Eklenti / Model / Config.php

namespace Package\CustomToolbar\Plugin\Model;
use Magento\Store\Model\StoreManagerInterface;
class Config
{
    protected $_storeManager;

public function __construct(
    StoreManagerInterface $storeManager
) {
    $this->_storeManager = $storeManager;

}

/**
 * Adding custom options and changing labels
 *
 * @param \Magento\Catalog\Model\Config $catalogConfig
 * @param [] $options
 * @return []
 */
public function afterGetAttributeUsedForSortByArray(\Magento\Catalog\Model\Config $catalogConfig, $options)
{
    $store = $this->_storeManager->getStore();
    $currencySymbol = $store->getCurrentCurrency()->getCurrencySymbol();

    //Remove specific default sorting options
    unset($options['position']);
    unset($options['name']);
    unset($options['price']);

    //Changing label
    $customOption['position'] = __('Relevance');

    //New sorting options
    $customOption['price_desc'] = __($currencySymbol.' (High to Low)');
    $customOption['price_asc'] = __($currencySymbol.' (Low to High)');

    //Merge default sorting options with custom options
    $options = array_merge($customOption, $options);

    return $options;
}
}

Uygulamanın / kod / Paket / CustomToolbar / Eklenti / Ürün / productlist / Toolbar.php

namespace Package\CustomToolbar\Plugin\Product\ProductList;
class Toolbar
{
    /**
     * Plugin
     *
     * @param \Magento\Catalog\Block\Product\ProductList\Toolbar $subject
     * @param \Closure $proceed
     * @param \Magento\Framework\Data\Collection $collection
     * @return \Magento\Catalog\Block\Product\ProductList\Toolbar
     */
    public function aroundSetCollection(
        \Magento\Catalog\Block\Product\ProductList\Toolbar $subject,
        \Closure $proceed,
        $collection
    ) {
        $currentOrder = $subject->getCurrentOrder();
        $result = $proceed($collection);

        if ($currentOrder) {
            if ($currentOrder == 'price_desc') {
                $subject->getCollection()->setOrder('price', 'desc');
            } elseif ($currentOrder == 'price_asc') {
                $subject->getCollection()->setOrder('price', 'asc');
            }
        }

        return $result;
    }
}

Bu, herhangi bir Magento sınıfını yeniden yazmadan benim için iyi çalışıyor.


Bu oluşturulan_at adres ve 2.1.9 için çalışmıyor - en azından benim için
dawhoo

SetCollection'ın nasıl çalıştığı hakkında ayrıntılı bilgi verir misiniz?
TheKitMurkit

undefined değişken $ koleksiyonu,
jafar pinjar

4

Yalnızca Şununla Oluştur özniteliğini kullanmak istiyorsanız , sıralama panelinde bu özniteliği yönetici panelinde etkinleştirebilirsiniz.

Misal:

<?php

namespace Vendor\Module\Setup;

use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\UpgradeDataInterface;

class UpgradeData implements UpgradeDataInterface
{
    protected $eavSetupFactory;

    /**
     * UpgradeData constructor.
     *
     * @param EavSetupFactory $eavSetupFactory
     */
    public function __construct(
        EavSetupFactory $eavSetupFactory
    ) {
        $this->eavSetupFactory = $eavSetupFactory;
    }

    /**
     * @param ModuleDataSetupInterface $setup
     * @param ModuleContextInterface $context
     */
    public function upgrade(
        ModuleDataSetupInterface $setup,
        ModuleContextInterface $context
    ) {
        /** @var EavSetup $eavSetup */
        $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);

        if (version_compare($context->getVersion(), '2.1.1', '<')) {
            try {
                $entityType = $eavSetup->getEntityTypeId('catalog_product');
                $label = 'Created At';
                $eavSetup->updateAttribute($entityType, 'created_at', 'frontend_label', $label, null);
                $eavSetup->updateAttribute($entityType, 'created_at', 'used_for_sort_by', 1, null);
            } catch (LocalizedException $e) {
            }
        }
    }
}

Bu kod Setup / UpgradeData.php dosyasından gelir , ancak bunun yerine InstallData.php dosyasını kullanmak daha iyi olur .


Bu kod dosya sistemine nereye eklenir?
YorkieMagento

1
Neden bir db alanını değiştirmek için özel bir modül oluşturmalı? en iyi yol olduğunu düşünmüyorum.
LucScu

2

Adım 1 : İlk olarak registration.php oluşturmanız gerekir

Satıcı adı: Arun

Modül adı: NewSorting

Satıcı / modulename / registration.php

<?php \Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE, 'Arun_NewSorting',
__DIR__
);?>

2. Adım : module.xml dosyasını oluşturursunuz

Satıcı / modulename / etc / module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Arun_NewSorting" setup_version="0.0.1">
        <sequence>
            <module name="Magento_Catalog"/>
        </sequence>
    </module>
</config>

3. Adım : Eklenti oluşturursunuz

Satıcı / modulename / etc / 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\Catalog\Model\Config">
        <plugin name="Arun_NewSorting::addCustomOptions" type="Arun\NewSorting\Plugin\Model\Config" />
    </type>
    <type name="Magento\Catalog\Block\Product\ProductList\Toolbar">
        <plugin name="Arun_NewSorting::addPriceDecendingFilterInToolbar" type="Arun\NewSorting\Plugin\Product\ProductList\Toolbar" />
    </type>
</config>

4.Adım : Daha sonra config.php dosyasını oluşturun

Satıcı / modulename / Eklenti / Model / Config.php

<?php
namespace Arun\NewSorting\Plugin\Model;

use Magento\Store\Model\StoreManagerInterface;

class Config  {


    protected $_storeManager;

    public function __construct(
        StoreManagerInterface $storeManager
    ) {
        $this->_storeManager = $storeManager;
    }


    public function afterGetAttributeUsedForSortByArray(\Magento\Catalog\Model\Config $catalogConfig, $options)
    {
        $store = $this->_storeManager->getStore();
        $currencySymbol = $store->getCurrentCurrency()->getCurrencySymbol();

        // Remove specific default sorting options
        $default_options = [];
        $default_options['name'] = $options['name'];

        unset($options['position']);
        unset($options['name']);
        unset($options['price']);

        //Changing label
        $customOption['position'] = __( 'Relevance' );

        //New sorting options
        $customOption['created_at'] = __( ' New' );


        $customOption['name'] = $default_options['name'];

        //Merge default sorting options with custom options
        $options = array_merge($customOption, $options);

        return $options;
    }
}

Adım 5 : Toolbar.php dosyasını geçersiz kılın ***

Satıcı / modulename / Eklenti / Ürün / productlist / Toolbar.php

<?php
namespace Arun\NewSorting\Plugin\Product\ProductList;

class Toolbar
{

    public function aroundSetCollection(
        \Magento\Catalog\Block\Product\ProductList\Toolbar $subject,
        \Closure $proceed,
        $collection
    ) {
        $currentOrder = $subject->getCurrentOrder();
        $result = $proceed($collection);

        if ($currentOrder) {
            if ($currentOrder == 'created_at') {
                $subject->getCollection()->setOrder('created_at', 'desc');
            } 
        }

        return $result;
    }
}

mükemmel çalışıyor


Bu dosyaları güncelledikten sonra CLI'de çalıştırılacak herhangi bir komut lütfen?
YorkieMagento

CLI kurulum yükseltmesi, statik içerik dağıtımı, önbellek temizliği, reindex'i çalıştırmanız gerekiyor
Arunprabakaran M

Teşekkürler MSA ama yükseltme komutunu çalıştırdığımda 'güncellenecek bir şey yok' yazıyor. 2.2.5 Kullanımı. Yukarıdakilerin tümü kopyalandı ... ancak Registration.php dosyasında ne olduğunu ve nerede bulunacağını merak ettiniz mi?
YorkieMagento

Registration.php dosyasının içerik yolunu güncelledim: Satıcı / Modülename / registration.php
Arunprabakaran M

Modül tam olarak yukarıdaki gibi eklendi ve 'yeni' seçeneği ön uçta görünüyor. Beklendiği gibi 'pozisyon' seçeneğinin yerini almış gibi görünüyor mu? Bu varsayılan seçeneği yapmak istediğim için yönetici panelindeki katalogda seçeneği göremiyorum ... Teşekkürler.
YorkieMagento

1

Yazma kodlarına gerek yok

  1. Bul created_atDB tablosundaki ürün özelliğini eav_attribute, kendi sütun ayarlamak frontend_labeliçin Created At(varsayılan null).

  2. Bul created_atDB tablosundaki ürün özelliğini catalog_eav_attribute, kendi sütun ayarlamak used_for_sort_byiçin 1(varsayılan 0'dır).

  3. Site önbelleğini temizleyin ve çalışıyor.

Örnek: tabloyu mysql ile değiştir

# Get the attribute_id of 'created_at'
select attribute_id from eav_attribute where attribute_code = 'created_at' and entity_type_id=4;

# Set frontend_label
update eav_attribute set frontend_label = 'Created At' where attribute_id=112;

# Set used_for_sort_by
update catalog_eav_attribute set used_for_sort_by = 1 where attribute_id=112;

Özellikle çekirdek veriler varsa, db değerlerini doğrudan değiştirmezdim.
LucScu

@LucScu Bu başka bir kolay yol. Farketmeyen iki DB alanını değiştirdi. İşlevleri geçersiz kılmak için kodları da kullanabilirsiniz, ancak kapsam işlevi sürüm yükseltmesinde değiştirilir ve özel kodlarınızı güncellemeniz gerekir. Her iki yöntemin de avantajları ve dezavantajları vardır. Basit bir işlev için özel kodları kullanmak biraz aşırıya kaçma.
Key Shang

@SagarParikhSGR Ben kullandım ve çalışıyor. Doğru kullanmaya dikkat edin attribute_id.
Key Shang

@KeyShang benim kötü, mükemmel çalışıyor, upvoted :)
Sagar Parikh SGR
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.