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.php খনি সঙ্গে Toolbar.phpএবং ওভাররাইডsetCollection()

/**
 * 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 {
thordan

2
এছাড়াও, আপনি যদি কোনও প্লাগইন ব্যবহার করতে না চান, আপনি $block->addOrderToAvailableOrders('created_at', 'New')নিজের বাছাইযুক্ত টেম্পলেটে বিল্ট-ইন পাবলিক ফাংশনটিও ব্যবহার করতে পারেন ।
thdoan

কাস্টম পণ্যের দাম বাছাইয়ের সমাধান কি আপনার থাকতে পারে? @ লুকা
ধদুক মিতেশ

@ Duদুকমিতেশ নিশ্চিত, আপনি কেবলমাত্র উপরের কোডটি ব্যবহার করতে পারেন এবং created_atআপনার কাস্টম প্রাইস অ্যাট্রিবিউট কোডের সাথে অ্যাট্রিবিউট কোডটি পরিবর্তন করতে পারবেন
লুস্ক্কু

আমার কোনও কাস্টম মূল্য বৈশিষ্ট্য নেই। আমি এর দ্বারা ডিফল্ট মূল্য সাজানো ব্যবহার করি। আমি কেবল মূল ফাইলটিতে পরিবর্তন করি যেখানে দাম বাছাই করা হয়। এবং আমি একটি সংগ্রহের জন্য আমার কাস্টম মূল্য সেট করতে চাই। তবে সংগ্রহের ক্ষেত্রে আমি কাস্টম মূল্য নির্ধারণ করতে পারি না।
duদুক মিতেশ

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

এটি কোনও ম্যাজেন্টো ক্লাস পুনরায় না লিখেই আমার পক্ষে ভাল কাজ করছে।


এটি তৈরি করা_আটাকে সম্বোধন করে না এবং ২.১.৯ এর জন্য কাজ করছে না - আমার পক্ষে কমপক্ষে
dawhoo

আপনি কীভাবে চারপাশে সেটকলিকেশন কাজ করে তা বিস্তারিত বলতে পারেন?
TheKitMurkit

অপরিবর্তিত পরিবর্তনশীল $ সংগ্রহ,
জাফর পিনজার

4

আপনি যদি কেবল তৈরি করুন এ্যাট্রিবিউটটি ব্যবহার করতে চান তবে আপনি এই বৈশিষ্ট্যটিকে বাছাইকরণ বিকল্পগুলিতে অ্যাডমিন প্যানেলে সক্রিয় করতে পারেন।

উদাহরণ:

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

এই কোডটি সেটআপ / আপগ্রেডডাটা.এফপি থেকে এসেছে তবে এর পরিবর্তে ইনস্টলডেটা.এফপি ব্যবহার করা ভাল ।


এই কোডটি ফাইল সিস্টেমে কোথায় যুক্ত করা হয়েছে?
ইয়র্কিমেইজেন্টো

1
কেন একটি ডিবি ক্ষেত্র পরিবর্তন করতে একটি কাস্টম মডিউল তৈরি করবেন? আমি সেরা উপায় মনে করি না।
লুস্ক্কু

2

পদক্ষেপ 1 : প্রথমে আপনার নিবন্ধকরণ.এফপি তৈরি করা উচিত

বিক্রেতার নাম: অরুণ

মডিউলটির নাম: নিউসোর্টিং

বিক্রেতা / moduleName / registration.php

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

পদক্ষেপ 2 : আপনি মডিউল.এক্সএমএল তৈরি করেন

বিক্রেতা / 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;
    }
}

এটা পুরোপুরি কাজ


এই ফাইলগুলি আপডেট করার পরে কোন কমান্ড সিএলআইতে চালিত হবে?
ইয়র্কিমেইজেন্টো

সিএলআই সেটআপ আপগ্রেড, স্ট্যাটিক-বিষয়বস্তু মোতায়েন, ক্যাশে পরিষ্কার, পুনর্নির্দেশের নিম্নলিখিতটি চালানো দরকার
অরুণপ্রকাশন এম

ধন্যবাদ এমএসএ কিন্তু আমি যখন আপগ্রেড কমান্ডটি চালাচ্ছি তখন এটি বলে যে 'আপডেট করার মতো কিছুই নেই'। 2.2.5 ব্যবহার করে। উপরের সমস্তটি অনুলিপি করেছেন ... তবে আপনি যে রেজিস্ট্রেশন.এফপি ফাইলের উল্লেখ করেছেন তাতে কী আছে এবং কোথায় এটি চিহ্নিত করবেন তা অবাক করে দিয়েছিলেন?
ইয়র্কিমেজেন্টো

আমি রেজিস্ট্রেশন.এফপি ফাইল ফাইলের বিষয়বস্তুর পথ আপডেট করেছি: বিক্রেতা / মডিউলনাম / নিবন্ধকরণ.এফপি
অরুণপ্রবাকরণ এম

উপরের মতো ঠিক মডিউল যুক্ত করা হয়েছে এবং 'নতুন' বিকল্পটি সম্মুখ প্রান্তে দেখায়। মনে হচ্ছে 'পজিশন' বিকল্পটি কি প্রত্যাশিত? আমি অ্যাডমিন প্যানেলে ক্যাটালগের বিকল্পটি দেখতে পাচ্ছি না, কারণ আমি এই ডিফল্ট বিকল্পটি করতে চাই ... ধন্যবাদ you
ইয়র্কিমেজেন্টো

1

উপায় কোড লেখার প্রয়োজন নেই

  1. এই created_atডিবি টেবিলে পণ্য বৈশিষ্ট্য eav_attribute, তার কলামের সেট frontend_labelকরার Created At(ডিফল্ট নাল যায়)।

  2. এই created_atডিবি টেবিলে পণ্য বৈশিষ্ট্য 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;

আমি সরাসরি ডিবি মান পরিবর্তন করব না, বিশেষত যদি এটি মূল ডেটা থাকে।
লুস্ক্কু

@ লুক্স্কু এটি অন্য একটি সহজ উপায়। এটি দুটি ডিবি ক্ষেত্রে পরিবর্তন করে যা কিছু বিবেচ্য নয়। আপনি ক্রিয়াকলাপকে ওভাররাইড করার জন্য কোডগুলিও ব্যবহার করতে পারেন তবে আচ্ছাদিত ফাংশনটি সংস্করণ আপগ্রেসে পরিবর্তন হবে এবং আপনাকে আপনার কাস্টম কোডগুলি আপডেট করতে হবে। উভয় পদ্ধতির সুবিধা এবং অসুবিধা রয়েছে। কোনও সাধারণ ক্রিয়াকলাপের জন্য কাস্টম কোডগুলি ব্যবহার করা কিছুটা ওভারকিল।
কী শ্যাং

@ সাগরপরিখ এসজিআর আমি এটি ব্যবহার করেছি এবং এটি কাজ করছে। সঠিক ব্যবহারের দিকে মনোযোগ দিন attribute_id
কী শ্যাং

@ কী শ্যাং আমার খারাপ, এটি পুরোপুরি কাজ করছে, উজ্জীবিত হয়েছে :)
সাগর পরীখ এসজিআর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.