Magento 2 विकल्प के अनुसार कस्टम प्रकार कैसे जोड़ें


22

मुझे created_atनवीनतम उत्पाद द्वारा उत्पाद सूची को सॉर्ट करने के लिए विशेषता के आधार पर एक अतिरिक्त फ़िल्टर जोड़ने की आवश्यकता है । मैंने नीचे फ़ाइल का उपयोग करके यह जानने की कोशिश की

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

लेकिन हमारी इकाई आईडी को कैसे जोड़ सकते हैं getAvailableOrders()?

जवाबों:


23

यदि आप किसी विशेषता का उपयोग करना चाहते हैं जैसे created_atकि यह व्यवस्थापन में नहीं है-> स्टोर -> (विशेषता) उत्पाद, क्योंकि व्यवस्थापन में परिभाषित विशेषताओं की सेटिंग है Sorting in Product Listing = Yes/No, तो आपको इन दो फ़ाइलों के साथ काम करना होगा:

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

में Toolbar.phpआप देख सकते हैं

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

यह सूची संग्रह को सॉर्ट करने के लिए उपलब्ध विशेषताओं के उस रिटर्न सरणी getAttributeUsedForSortByArray()से कॉल करता है Config.php

अब, आपको अपनी created_atविशेषता को यहां जोड़ना होगा । कैसे? मैंने इसे एक प्लगइन के साथ किया

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

आप created_atसॉर्ट करने के लिए उपलब्ध विशेषताओं में सम्मिलित हैं, अब आपको इसका उपयोग करने के लिए केवल अपने कस्टम संग्रह का निर्माण करना है। यहां मैं खदान और ओवरराइड के साथ ओवरराइड करने का विकल्प चुनता हूं\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;        
}

मेरे लिए यह सब एक आकर्षण की तरह काम करता है।


यदि किसी को आरोही करने के लिए डिफ़ॉल्ट करना है, तो बदल } elseif ( $this->getCurrentDirection() == 'asc' ) {दें } else {
2

2
इसके अलावा, यदि आप एक प्लगइन का उपयोग नहीं करना चाहते हैं, तो आप $block->addOrderToAvailableOrders('created_at', 'New')अपने सॉर्टर टेम्पलेट में अंतर्निहित सार्वजनिक फ़ंक्शन का भी उपयोग कर सकते हैं ।
thdoan

क्या आपके पास कस्टम उत्पाद मूल्य को सॉर्ट करने के लिए समाधान हो सकता है? @ लका
धडुक मितेश

@DhadukMitesh यकीन है, आप बस उपरोक्त कोड का उपयोग कर सकते हैं और created_atअपने कस्टम मूल्य विशेषता कोड के साथ विशेषता कोड बदल सकते हैं
LucScu

मेरे पास कोई कस्टम मूल्य विशेषता नहीं है। मैं डिफ़ॉल्ट मूल्य प्रकार का उपयोग करता हूं। मैं केवल कोर फाइल में बदलाव करता हूं जहां कीमत छँट रही है। और मैं एक संग्रह के लिए अपना कस्टम मूल्य निर्धारित करना चाहता हूं। लेकिन मैं संग्रह में कस्टम मूल्य निर्धारित नहीं कर सकता।
धड़क मितेश

19

हम इसे प्लगइन्स का उपयोग करके प्राप्त कर सकते हैं। कृपया अपने मॉड्यूल में निम्नलिखित फाइलें बनाएं।

एप्लिकेशन / कोड / पैकेज / 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>

एप्लिकेशन / कोड / पैकेज / CustomToolbar / प्लगइन / मॉडल / 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;
}
}

एप्लिकेशन / कोड / पैकेज / CustomToolbar / प्लगइन / उत्पाद / 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;
    }
}

यह मेरे लिए किसी भी Magento वर्ग को फिर से लिखने के बिना ठीक काम कर रहा है।


यह मेरे लिए कम से कम
dawhoo

क्या आप इस बारे में विस्तार से बता सकते हैं कि आसपास के कार्य कैसे काम करते हैं?
TheKitMurkit

अपरिभाषित चर $ संग्रह,
जफ़र पिंजर

4

यदि आप केवल Create At विशेषता का उपयोग करना चाहते हैं , तो आप इस विशेषता को व्यवस्थापक पैनल में सॉर्टिंग विकल्पों में सक्रिय कर सकते हैं।

उदाहरण:

<?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) {
            }
        }
    }
}

यह कोड Setup / UpgradData.php से , लेकिन इसके बजाय InstallData.php का उपयोग करना बेहतर होगा ।


यह कोड फ़ाइल सिस्टम में कहाँ जोड़ा गया है?
यॉर्कमीगो

1
Db फ़ील्ड को बदलने के लिए एक कस्टम मॉड्यूल क्यों बनाया जाता है? मुझे नहीं लगता कि सबसे अच्छा तरीका है।
लुकस्कू

2

चरण 1 : सबसे पहले आपको Registration.php बनाना चाहिए

वेंडर का नाम: अरुण

मॉड्यूल का नाम: NewSorting

विक्रेता / Modulename / registration.php

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

चरण 2 : आप मॉड्यूल बनाते हैं। xml

विक्रेता / 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 : आप प्लगइन बनाते हैं

विक्रेता / 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 : फिर config.php बनाएं

विक्रेता / Modulename / प्लगइन / मॉडल / 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;
    }
}

चरण 5 : टूलबार को ओवरराइड करें। *** ***

विक्रेता / Modulename / प्लगइन / उत्पाद / 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;
    }
}

यह पूरी तरह से काम है


कृपया इन फ़ाइलों को अद्यतन करने के बाद CLI में चलने वाली कोई भी कमांड?
यॉर्कियोगेंटो

CLI सेटअप अपग्रेड, स्टैटिक-कंटेंट तैनाती, कैशे क्लीन,
रिइंडेक्स

धन्यवाद एमएसए, लेकिन जब मैं अपग्रेड कमांड चलाता हूं तो यह कहता है कि 'अपडेट करने के लिए कुछ नहीं'। 2.2.5 का उपयोग करना। उपरोक्त सभी की प्रतिलिपि बनाई गई ... लेकिन आश्चर्य है कि आपके पास Registration.php फ़ाइल में क्या है और इसका पता कहाँ लगाएं?
यॉर्किगो

मैंने Registration.php फ़ाइल सामग्री पथ को अद्यतन किया: विक्रेता / मोडुलनेम / पंजीकरण
.php

जोड़ा गया मॉड्यूल बिल्कुल ऊपर और सामने के छोर पर 'नया' विकल्प दिखाता है। ऐसा लगता है कि 'स्थिति' विकल्प बदल गया है जो अपेक्षित है? मैं व्यवस्थापक पैनल में कैटलॉग में विकल्प नहीं देख सकता, क्योंकि मैं यह डिफ़ॉल्ट विकल्प बनाना चाहता हूं ... धन्यवाद।
यॉर्किगो

1

जिस तरह से लिखने के कोड की जरूरत नहीं है

  1. created_atDB तालिका में उत्पाद की विशेषता का पता लगाएं eav_attribute, इसके कॉलम frontend_labelको Created At(डिफ़ॉल्ट अशक्त है) सेट करें ।

  2. created_atDB तालिका में उत्पाद की विशेषता का पता लगाएं catalog_eav_attribute, इसके कॉलम used_for_sort_byको 1(डिफ़ॉल्ट 0 है) सेट करें ।

  3. स्वच्छ साइट कैश और यह काम कर रहा है।

उदाहरण: mysql द्वारा परिवर्तन तालिका

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

मैं सीधे db मान नहीं बदलूंगा, खासकर अगर यह कोर डेटा है।
लुकस्क्यू

@LucScu यह एक और आसान तरीका है। यह दो DB क्षेत्र है कि कोई फर्क नहीं पड़ता बदल दिया है। आप फ़ंक्शन को ओवरराइड करने के लिए भी कोड का उपयोग कर सकते हैं, लेकिन कवर किए गए फ़ंक्शन को संस्करण उन्नयन में बदल दिया जाएगा, और आपको अपने कस्टम कोड को अपडेट करना होगा। दोनों तरीकों के फायदे और नुकसान हैं। एक साधारण फ़ंक्शन के लिए कस्टम कोड का उपयोग करना ओवरकिल का एक सा है।
कुंजी शांग

@ सागरपारीख एसजीआर मैंने इसका इस्तेमाल किया और यह काम कर रहा है। सही का उपयोग करने पर ध्यान दें attribute_id
कुंजी शांग

@KeyShang मेरा बुरा, पूरी तरह से काम कर रहा है, ऊपर उठाया :)
सागर पारिख SGR
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.