Magento2 - প্রোগ্রামগতভাবে পণ্য বৈশিষ্ট্য বিকল্পগুলি যুক্ত করুন


32

এম 2-তে প্রোডাক্ট অ্যাট্রিবিউট বিকল্পটি প্রোগ্রামগতভাবে যুক্ত করার সঠিক (অফিসিয়াল) উপায় কী? যেমন manufacturerপণ্য বৈশিষ্ট্যের জন্য। স্পষ্টতই বিদ্যমান বিকল্পটি "অ্যাডমিন" শিরোনাম মানের সাথে মিলবে।

উত্তর:


55

অ্যাট্রিবিউট অপশনগুলি পরিচালনা করার জন্য আমি যে পদ্ধতির সাথে এসেছি তা এখানে। সহায়ক শ্রেণি:

<?php
namespace My\Module\Helper;

class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    /**
     * @var \Magento\Catalog\Api\ProductAttributeRepositoryInterface
     */
    protected $attributeRepository;

    /**
     * @var array
     */
    protected $attributeValues;

    /**
     * @var \Magento\Eav\Model\Entity\Attribute\Source\TableFactory
     */
    protected $tableFactory;

    /**
     * @var \Magento\Eav\Api\AttributeOptionManagementInterface
     */
    protected $attributeOptionManagement;

    /**
     * @var \Magento\Eav\Api\Data\AttributeOptionLabelInterfaceFactory
     */
    protected $optionLabelFactory;

    /**
     * @var \Magento\Eav\Api\Data\AttributeOptionInterfaceFactory
     */
    protected $optionFactory;

    /**
     * Data constructor.
     *
     * @param \Magento\Framework\App\Helper\Context $context
     * @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository
     * @param \Magento\Eav\Model\Entity\Attribute\Source\TableFactory $tableFactory
     * @param \Magento\Eav\Api\AttributeOptionManagementInterface $attributeOptionManagement
     * @param \Magento\Eav\Api\Data\AttributeOptionLabelInterfaceFactory $optionLabelFactory
     * @param \Magento\Eav\Api\Data\AttributeOptionInterfaceFactory $optionFactory
     */
    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository,
        \Magento\Eav\Model\Entity\Attribute\Source\TableFactory $tableFactory,
        \Magento\Eav\Api\AttributeOptionManagementInterface $attributeOptionManagement,
        \Magento\Eav\Api\Data\AttributeOptionLabelInterfaceFactory $optionLabelFactory,
        \Magento\Eav\Api\Data\AttributeOptionInterfaceFactory $optionFactory
    ) {
        parent::__construct($context);

        $this->attributeRepository = $attributeRepository;
        $this->tableFactory = $tableFactory;
        $this->attributeOptionManagement = $attributeOptionManagement;
        $this->optionLabelFactory = $optionLabelFactory;
        $this->optionFactory = $optionFactory;
    }

    /**
     * Get attribute by code.
     *
     * @param string $attributeCode
     * @return \Magento\Catalog\Api\Data\ProductAttributeInterface
     */
    public function getAttribute($attributeCode)
    {
        return $this->attributeRepository->get($attributeCode);
    }

    /**
     * Find or create a matching attribute option
     *
     * @param string $attributeCode Attribute the option should exist in
     * @param string $label Label to find or add
     * @return int
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    public function createOrGetId($attributeCode, $label)
    {
        if (strlen($label) < 1) {
            throw new \Magento\Framework\Exception\LocalizedException(
                __('Label for %1 must not be empty.', $attributeCode)
            );
        }

        // Does it already exist?
        $optionId = $this->getOptionId($attributeCode, $label);

        if (!$optionId) {
            // If no, add it.

            /** @var \Magento\Eav\Model\Entity\Attribute\OptionLabel $optionLabel */
            $optionLabel = $this->optionLabelFactory->create();
            $optionLabel->setStoreId(0);
            $optionLabel->setLabel($label);

            $option = $this->optionFactory->create();
            $option->setLabel($optionLabel);
            $option->setStoreLabels([$optionLabel]);
            $option->setSortOrder(0);
            $option->setIsDefault(false);

            $this->attributeOptionManagement->add(
                \Magento\Catalog\Model\Product::ENTITY,
                $this->getAttribute($attributeCode)->getAttributeId(),
                $option
            );

            // Get the inserted ID. Should be returned from the installer, but it isn't.
            $optionId = $this->getOptionId($attributeCode, $label, true);
        }

        return $optionId;
    }

    /**
     * Find the ID of an option matching $label, if any.
     *
     * @param string $attributeCode Attribute code
     * @param string $label Label to find
     * @param bool $force If true, will fetch the options even if they're already cached.
     * @return int|false
     */
    public function getOptionId($attributeCode, $label, $force = false)
    {
        /** @var \Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute */
        $attribute = $this->getAttribute($attributeCode);

        // Build option array if necessary
        if ($force === true || !isset($this->attributeValues[ $attribute->getAttributeId() ])) {
            $this->attributeValues[ $attribute->getAttributeId() ] = [];

            // We have to generate a new sourceModel instance each time through to prevent it from
            // referencing its _options cache. No other way to get it to pick up newly-added values.

            /** @var \Magento\Eav\Model\Entity\Attribute\Source\Table $sourceModel */
            $sourceModel = $this->tableFactory->create();
            $sourceModel->setAttribute($attribute);

            foreach ($sourceModel->getAllOptions() as $option) {
                $this->attributeValues[ $attribute->getAttributeId() ][ $option['label'] ] = $option['value'];
            }
        }

        // Return option ID if exists
        if (isset($this->attributeValues[ $attribute->getAttributeId() ][ $label ])) {
            return $this->attributeValues[ $attribute->getAttributeId() ][ $label ];
        }

        // Return false if does not exist
        return false;
    }
}

তারপরে, হয় একই ক্লাসে বা এটি নির্ভরতা ইনজেকশনের মাধ্যমে অন্তর্ভুক্ত করুন, আপনি কল করে আপনার বিকল্প আইডি যুক্ত করতে বা পেতে পারেন createOrGetId($attributeCode, $label)

উদাহরণস্বরূপ, আপনি যদি ইনজেক্ট My\Module\Helper\Dataকরেন $this->moduleHelperতবে আপনি কল করতে পারেন:

$manufacturerId = $this->moduleHelper->createOrGetId('manufacturer', 'ABC Corp');

'এবিসি কর্পস' যদি বিদ্যমান প্রস্তুতকারক হয় তবে এটি আইডিটি টানবে। যদি তা না হয় তবে এটি এতে যুক্ত হবে।

আপডেট হয়েছে 2016-09-09: পের রুড এন।, মূল সমাধানটি ক্যাটালগসেটআপ ব্যবহার করেছে, যার ফলস্বরূপ বাগটি ম্যাজেন্টো ২.১-এ শুরু হয়েছিল। এই সংশোধিত সমাধানটি সেই মডেলটিকে বাইপাস করে, বিকল্প তৈরি করে এবং স্পষ্টভাবে লেবেল তৈরি করে। এটি 2.0+ এ কাজ করা উচিত।


3
এটি যতটা সরকারী আপনি পেতে চলেছেন। সমস্ত অনুসন্ধান এবং বিকল্প সংযোজন মূল ম্যাগেন্টো দিয়ে যায়। আমার ক্লাসটি সেই মূল পদ্ধতিগুলির জন্য কেবল একটি মোড়ক যা তাদের ব্যবহার সহজ করে তোলে।
রায়ান হোয়ের

1
হাই রায়ান, আপনার বিকল্পটিতে মানটি সেট করা উচিত নয়, এটি অভ্যন্তরীণ আইডি ম্যাজেন্টো ব্যবহার করে এবং আমি হার্ড উপায়টি খুঁজে পেয়েছি যে আপনি যদি '123 এবিসি কর্পস' এর মতো একটি শীর্ষস্থানীয় সংখ্যার সাথে একটি স্ট্রিং মানকে মান দেয় তবে এটি হয় বাস্তবায়নের কারণে কিছু গুরুতর সমস্যা Magento\Eav\Model\ResourceModel\Entity\Attribute::_processAttributeOptions। নিজের জন্য দেখুন, আপনি যদি $option->setValue($label);আপনার কোড থেকে বিবৃতিটি সরিয়ে দেন তবে এটি বিকল্পটি সংরক্ষণ করবে, আপনি যখন এটি আনবেন তখন ম্যাজেন্টো eav_attribute_optionটেবিলের একটি স্বয়ংক্রিয়-বৃদ্ধি থেকে মানটি ফিরিয়ে দেবে return
কুইকশিফটিন

2
যদি আমি এটি একটি ফোরচ ফাংশনে যুক্ত করি তবে দ্বিতীয় পুনরাবৃত্তিতে আমি ত্রুটিটি পেয়ে যাব "ম্যাজেন্টো \ ইভ \ মডেল \ সত্তা \ বৈশিষ্ট্য \ অপশনম্যানেজমেন্ট :: সেটঅপশনভ্যালু () অবশ্যই স্ট্রিংয়ের, বস্তুর প্রদত্ত"
জেললে

1
হ্যাঁ এই কোডটি কাজ করছে না
সৌরভ

2
@ জেললেজ যদি আপনি আনকড টাইপ ইস্যুটি পেতে থাকেন: আর্গুমেন্ট 3 ম্যাজেন্টো \ ইভ \ মডেল \ সত্তা \ অ্যাট্রিবিউট \ অপশনম্যানেজমেন্ট :: সেটঅপশনভ্যালু () টাইপের স্ট্রিংয়ের হতে হবে, ফোরচ ফাংশনে প্রদত্ত অবজেক্টটি তারপরে পরিবর্তন $ অপশন-> সেটলেবেল ( $ optionLabel); to $ বিকল্প-> setLabel ($ লেবেল); লাইনে 102
নাদিম0035

11

ম্যাজেন্টো ২.১.৩ এ পরীক্ষা করা হয়েছে।

বিকল্পগুলির সাথে কীভাবে অ্যাট্রিবিউট তৈরি করা যায় তা কোনও কার্যক্ষম উপায় খুঁজে পেলাম না। সুতরাং প্রথমদিকে আমাদের একটি বৈশিষ্ট্য তৈরি করতে হবে এবং তারপরে বিকল্পগুলি যুক্ত করতে হবে।

নিম্নলিখিত শ্রেণীর ইনজেকশন \ ম্যাজেন্টো \ ইভা \ সেটআপ \ ইভসেটআপফ্যাক্টরি

 $setup->startSetup();

 /** @var \Magento\Eav\Setup\EavSetup $eavSetup */
 $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);

নতুন বৈশিষ্ট্য তৈরি করুন:

$eavSetup->addAttribute(
    'catalog_product',
    $attributeCode,
    [
        'type' => 'varchar',
        'input' => 'select',
        'required' => false,
        ...
    ],
);

কাস্টম বিকল্পগুলি যুক্ত করুন।

ফাংশন addAttributeকোনও কার্যকর ব্যবহার করে না যা ভবিষ্যতে ব্যবহার করা যায় be সুতরাং অ্যাট্রিবিউট তৈরির পরে আমাদের নিজের দ্বারা অ্যাট্রিবিউট অবজেক্টটি পুনরুদ্ধার করতে হবে। !!! গুরুত্বপূর্ণ আমাদের এটির প্রয়োজন কারণ ফাংশনটি কেবলমাত্র প্রত্যাশা করে attribute_idতবে এর সাথে কাজ করতে চায় না attribute_code

attribute_idসেক্ষেত্রে আমাদের ক্রিয়াকলাপটির ক্রিয়াকলাপের জন্য এটি পেতে এবং এটি পাস করতে হবে।

$attributeId = $eavSetup->getAttributeId('catalog_product', 'attribute_code');

তারপরে ম্যাজেন্টো যেমনভাবে প্রত্যাশা করে আমাদের বিকল্পগুলি অ্যারে তৈরি করতে হবে:

$options = [
        'values' => [
        'sort_order1' => 'title1',
        'sort_order2' => 'title2',
        'sort_order3' => 'title3',
    ],
    'attribute_id' => 'some_id',
];

উদাহরণ স্বরূপ:

$options = [
        'values' => [
        '1' => 'Red',
        '2' => 'Yellow',
        '3' => 'Green',
    ],
    'attribute_id' => '32',
];

এবং এটি কাজ করতে পাস:

$eavSetup->addAttributeOption($options);

অ্যাডট্রিবিউটের তৃতীয় প্যারাম অ্যারে প্যারামিটার ['বিকল্প'] নিতে পারে
ডিওয়িলস

10

ম্যাজেন্টো \ ইভ \ সেটআপ \ ইভিসেটআপফ্যাক্টরি বা এমনকি \ ম্যাজেন্টো \ ক্যাটালগ \ সেটআপ \ বিভাগসেটআপফ্যাক্টরি শ্রেণীর সাহায্যে নিম্নলিখিত সমস্যার কারণ হতে পারে: https://github.com/magento/magento2/issues/4896

আপনার যে ক্লাসগুলি ব্যবহার করা উচিত:

protected $_logger;

protected $_attributeRepository;

protected $_attributeOptionManagement;

protected $_option;

protected $_attributeOptionLabel;

 public function __construct(
    \Psr\Log\LoggerInterface $logger,
    \Magento\Eav\Model\AttributeRepository $attributeRepository,
    \Magento\Eav\Api\AttributeOptionManagementInterface $attributeOptionManagement,
    \Magento\Eav\Api\Data\AttributeOptionLabelInterface $attributeOptionLabel,
    \Magento\Eav\Model\Entity\Attribute\Option $option
  ){
    $this->_logger = $logger;
    $this->_attributeRepository = $attributeRepository;
    $this->_attributeOptionManagement = $attributeOptionManagement;
    $this->_option = $option;
    $this->_attributeOptionLabel = $attributeOptionLabel;
 }

তারপরে আপনার ফাংশনে এটির মতো কিছু করুন:

 $attribute_id = $this->_attributeRepository->get('catalog_product', 'your_attribute')->getAttributeId();
$options = $this->_attributeOptionManagement->getItems('catalog_product', $attribute_id);
/* if attribute option already exists, remove it */
foreach($options as $option) {
  if ($option->getLabel() == $oldname) {
    $this->_attributeOptionManagement->delete('catalog_product', $attribute_id, $option->getValue());
  }
}

/* new attribute option */
  $this->_option->setValue($name);
  $this->_attributeOptionLabel->setStoreId(0);
  $this->_attributeOptionLabel->setLabel($name);
  $this->_option->setLabel($this->_attributeOptionLabel);
  $this->_option->setStoreLabels([$this->_attributeOptionLabel]);
  $this->_option->setSortOrder(0);
  $this->_option->setIsDefault(false);
  $this->_attributeOptionManagement->add('catalog_product', $attribute_id, $this->_option);

1
ধন্যবাদ, আপনি ঠিক বলেছেন। আমি আমার উত্তর অনুসারে আপডেট করেছি। নোট করুন $attributeOptionLabelএবং $optionওআরএম ক্লাস; আপনি সরাসরি তাদের ইনজেকশন করা উচিত নয়। যথাযথ পদ্ধতির হ'ল তাদের কারখানার ক্লাসটি ইনজেকশন করা, তারপরে প্রয়োজন মতো একটি ইভেন্ট তৈরি করা। এছাড়াও নোট করুন যে আপনি এপিআই ডেটা ইন্টারফেসগুলি ধারাবাহিকভাবে ব্যবহার করছেন না।
রায়ান হোয়ের

3
হাই @ রুড, রায়ের উত্তর সম্পর্কে আমার মন্তব্য দেখুন। আপনি টেবিলে $option->setValue()অভ্যন্তরীণ ম্যাজেন্টো option_idক্ষেত্রের জন্য যেমন কল করতে চান না eav_attribute_option
কুইকশিফটিন

ধন্যবাদ. এটাই আমি খুঁজে পেয়েছি। সেই অনুসারে আমার উত্তরটি সম্পাদনা করবে।
রুড এন।

0

ম্যাজেন্টো ২.৩.৩ এর জন্য আমি খুঁজে পেয়েছি যে আপনি ম্যাজেন্টো ডেভটিম পদ্ধতির গ্রহণ করতে পারেন।

  • প্যাচ যোগ করুন
bin/magento setup:db-declaration:generate-patch Vendor_Module PatchName
  • নির্মাণকারীতে বিভাগসেটআপফ্যাক্টরি যুক্ত করুন
public function __construct(
        ModuleDataSetupInterface $moduleDataSetup,
        Factory $configFactory
        CategorySetupFactory $categorySetupFactory
    ) {
        $this->moduleDataSetup = $moduleDataSetup;
        $this->configFactory = $configFactory;
        $this->categorySetupFactory = $categorySetupFactory;
}
  • প্রয়োগ () ফাংশনে বৈশিষ্ট্য যুক্ত করুন

    public function apply()
    {
        $categorySetup = $this->categorySetupFactory->create(['setup' => $this->moduleDataSetup]);
    
        $categorySetup->addAttribute(
            \Magento\Catalog\Model\Product::ENTITY,
            'custom_layout',
            [
                'type' => 'varchar',
                'label' => 'New Layout',
                'input' => 'select',
                'source' => \Magento\Catalog\Model\Product\Attribute\Source\Layout::class,
                'required' => false,
                'sort_order' => 50,
                'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE,
                'group' => 'Schedule Design Update',
                'is_used_in_grid' => true,
                'is_visible_in_grid' => false,
                'is_filterable_in_grid' => false
            ]
        );
    }

আহহম আমি কেবল এটি জানতে পারি যে আমি এই প্রশ্নের উত্তরটি বিভিন্ন প্রশ্নের সাথে যুক্ত করতে চেয়েছি। আমি কেবল এটি এখানে বাস করব এবং সেখানে এই উত্তরের রেফারেন্স যুক্ত করব। আমি আশা করি এটি ঠিক আছে। এই partiaclly পাশাপাশি এই প্রশ্নের জন্য উত্তর :)
embed0

-4

এটি কোনও উত্তর নয়। শুধু একটি workaround।

এটি ধরে নেওয়া হয় যে ব্রাউজারটি ব্যবহার করে আপনার ম্যাগেন্টো ব্যাকএন্ডে অ্যাক্সেস রয়েছে এবং আপনি সম্পাদনা বিশিষ্ট পৃষ্ঠায় রয়েছেন (ইউআরএল দেখতে অ্যাডমিন / ক্যাটালগ / প্রোডাক্ট_ট্রিবিউট / সম্পাদনা / বৈশিষ্ট্য_আইডি / এক্সএক্সএক্স / কী হিসাবে দেখায় ..)

ব্রাউজার কনসোল (Ctrl + Shift Chrome- এ + + জে) এ যান এবং নিচের কোডটি পেস্ট করুন অ্যারে mimim পরিবর্তন করার পর

$jq=new jQuery.noConflict();
var mimim=["xxx","yyy","VALUES TO BE ADDED"];
$jq.each(mimim,function(a,b){
$jq("#add_new_option_button").click();
$jq("#manage-options-panel tbody tr:last-child td:nth-child(3) input").val(b);
});

- ম্যাজেন্টো ২.২.২ এ পরীক্ষা করা হয়েছে

বিস্তারিত নিবন্ধ - https://tutes.in/how-to-manage-magento-2-product-attribute-values-options-used-console/


1
এটি একটি ভয়াবহ দীর্ঘমেয়াদী সমাধান। আপনি নির্ভরযোগ্যভাবে সেই নির্বাচকদের একই থাকার আশা করতে পারবেন না। এটি সর্বোত্তমভাবে কাজ করা, যদি এটি বাস্তবে প্রত্যাশার সাথে কাজ করে।
ডোমডামব্রোগিয়া

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