Magento2 में कस्टम विकल्प में डिफ़ॉल्ट मान कैसे सेट करें


9

मैं उत्पाद स्तर में कस्टम विकल्प मान के लिए डिफ़ॉल्ट विकल्प सेट करना चाहता हूं।

Magento 2 में ऐसा कैसे करें? यहां छवि विवरण दर्ज करें

कृपया इसे सुलझाने के लिए मेरी मदद करें।


कृपया अधिक विवरण के साथ अपने प्रश्न की व्याख्या करें।
शेषगिरि अंवकार

ऐसा लगता है कि आप अपने इनपुट क्षेत्र में कुछ डिफ़ॉल्ट पाठ रखने के लिए कह रहे हैं।
दिनेश यादव

मेरे प्रश्न में मेरे पास 2 विकल्प हैं I मैं एक विकल्प सेट करना चाहता हूं जो कि फ्रंटएंड पर चयनित डिफ़ॉल्ट हो।
रजत कर

इसे कैसे लागू किया जाए? मैं डिफ़ॉल्ट मान जोड़ना चाहता हूं?
माही एम

जवाबों:


2

मुझे यकीन नहीं है कि आप इसे व्यवस्थापक के माध्यम से कर सकते हैं। मैंने अभी-अभी एक काम किया है जहाँ मैंने यह सुनिश्चित किया है कि मेरे सभी "डिफ़ॉल्ट विकल्प" व्यवस्थापक के भीतर पहला विकल्प हैं, फिर नीचे मेरे स्टोर के लिए js में जोड़ा।

<script>
require(['jquery', 'jquery/ui'], function($){ 
  $('.product-add-form .field select').each(function(i, obj) {
    $(obj).find('option:eq(1)').prop('selected', true);
  });
});
</script>

यह कस्टम विकल्पों के लिए काम करता है क्योंकि वे सभी पृष्ठ लोड पर प्रदान किए जाते हैं। कोड सभी कस्टम विकल्पों के माध्यम से लूप करता है और दूसरा विकल्प सेट करता है क्योंकि पहले "कृपया चयन करें" था।

हालांकि मुझे कॉन्फ़िगर करने योग्य उत्पादों के साथ थोड़ी अधिक कठिनाई हुई क्योंकि पृष्ठ लोड होने के बाद विकल्प सभी लोड किए गए थे, लेकिन ऐसा करने के लिए आप यहां मेरा प्रश्न देख सकते हैं: Magento 2: कॉन्फ़िगर करने योग्य विकल्पों में डिफ़ॉल्ट विकल्प कैसे सेट करें?



1

मुझे लगता है कि आप जो हासिल करना चाहते हैं वह कुछ इस तरह है?

यहां छवि विवरण दर्ज करें

मैंने कार्यान्वित किया कि ड्रॉपडाउन फ़ील्ड के लिए, रेडियोबुटन के साथ समान होना चाहिए।

  1. तालिका में डिफ़ॉल्ट विकल्प (is_default या जो भी) के लिए एक कॉलम जोड़ें catalog_product_option_type_value
  2. एक प्लगइन जोड़ें जो संशोधित करता है Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\CustomOptions

उदाहरण:

विक्रेता / मॉड्यूल / etc / adminhtml / di.xml

<?xml version="1.0"?>
<config>
  <type name="Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\CustomOptions">
    <plugin name="CustomOptionsUiPlugin" type="Vendor\Module\Plugin\CustomOptionsUiPlugin" sortOrder="1"/>
  </type>
</config>

विक्रेता \ मॉड्यूल \ प्लगइन \ CustomOptionsUiPlugin.php

namespace Vendor\Module\Plugin;

class CustomOptionsUiPlugin
{

...

    public function afterModifyMeta(\Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\CustomOptions $subject,$meta)
    {

        $result = $meta;

        $result['custom_options']['children']['options']['children']['record']['children']["container_option"]['children']['values']['children']['record']['children']['is_default'] = [
            'arguments' => [
                'data' => [
                    'config' => [
                        'label' => __('Default'),
                        'componentType' => 'field',
                        'formElement' => 'checkbox',
                        'dataScope' => 'is_default',
                        'dataType' => 'number',
                        'additionalClasses' => 'admin__field-small',
                        'sortOrder' => 55,
                        'value' => '0',
                        'valueMap' => [
                            'true' => '1',
                            'false' => '0'
                        ]
                    ]
                ]
            ]
        ];

        return $result;

    }

}
  1. और अंत में आपको Magento\Catalog\Block\Product\View\Options\Type\Select.phpकुछ इस तरह से फाइल को ओवरराइट करना होगा

    $defaultAttribute = array();
    
    if($_value->getData('is_default') == true){
        $defaultAttribute = ['selected' => 'selected','default' => 'default'];
    }
    
    $select->addOption(
        $_value->getOptionTypeId(),
        $_value->getTitle() . ' ' . strip_tags($priceStr) . '',
        ['price' => $this->pricingHelper->currencyByStore($_value->getPrice(true), $store, false),$defaultAttribute]
    );

    उम्मीद है की वो मदद करदे!


आपके समाधान के लिए धन्यवाद। मैंने आपके कोड के साथ प्रयास किया है और मैं "डिफ़ॉल्ट" विकल्प प्रदर्शित करने में सक्षम हूं, लेकिन कस्टम मान प्रदर्शित नहीं कर रहे हैं। कृपया मुझे समस्या को ठीक करने में मदद करें।
उमरफारूक गैलिबवाले

@TrytoFly $defaultAttributeविकल्प के लिए अतिरिक्त विशेषताओं के रूप में जोड़कर पूर्वनिर्मित मूल्यों (buy_request, ...) के साथ विरोध किया जाएगा। उदाहरण के लिए, कार्ट आइटम को संपादित करते समय, ग्राहक द्वारा चुना गया मूल्य और "is_default" मूल्य दोनों selected="selected"को कोड के रूप में चिह्नित किया जाएगा ।
क्लैडियस

0

@TrytoFly आपके समाधान के लिए धन्यवाद। मैंने आपके कोड के साथ प्रयास किया है और मैं "डिफ़ॉल्ट" विकल्प प्रदर्शित करने में सक्षम हूं, लेकिन कस्टम मान प्रदर्शित नहीं कर रहे हैं। कृपया मुझे समस्या को ठीक करने में मदद करें। कृपया चित्र खोजें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


स्क्रीनशॉट से, मुझे लगता है कि आपको $result = $meta;अपने afterModifyMeta () विधि की शुरुआत में सेट करना होगा । या फिर आप केवल डिफ़ॉल्ट विकल्प को इसमें जोड़ने के बजाय अपने रिटर्न मान को अधिलेखित कर देंगे।
TrytoFly

0

@TrytoFly यह वही है जो मेरे लिए काम किया है।

<?php
namespace Sigma\DefaultCustomOptions\Plugin;

class CustomOptionsUiPlugin
{
       public function afterModifyMeta(
    \Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\CustomOptions $subject,
    $result
) {

    $subject;
    $result['custom_options']['children']['options']['children']['record']['children']["container_option"]
    ['children']['values']['children']['record']['children'] =array_replace_recursive(
        $result['custom_options']['children']['options']['children']['record']['children']
        ["container_option"]['children']['values']['children']['record']['children'],
        [
            'is_default' => [
                'arguments' => [
                    'data' => [
                        'config' => [
                            'label' => __('Default'),
                            'componentType' => 'field',
                            'formElement' => 'checkbox',
                            'dataScope' => 'is_default',
                            'dataType' => 'number',
                            'sortOrder' => 70,
                            'value' => '0',
                            'valueMap' => [
                                'true' => '1',
                                'false' => '0'
                            ]
                        ]
                    ]
                ]
            ]
        ]
    );
    return $result;
    }
}

क्या आप कृपया यहाँ पूरा कोड लिख सकते हैं? इसके द्वारा मैं व्यवस्थापक में कस्टम विकल्प के साथ चेकबॉक्स प्रदर्शित करने में सक्षम हूं, लेकिन जब मैं उत्पाद को बचाने जा रहा हूं तो चयनित विकल्प सहेज नहीं रहा है। और सामने की तरफ चयनित डिफ़ॉल्ट को कैसे प्रदर्शित करें?
Magecode

0

आप फ़ोलोइंग कोड फ़ंक्शन की तरह Select.php फ़ाइल को ओवरराइड कर सकते हैं:

class AroundOptionValuesHtml extends \Magento\Catalog\Block\Product\View\Options\Type\Select
{

    public function getValuesHtml()
    {
        $_option = $this->getOption();
        $configValue = $this->getProduct()->getPreconfiguredValues()->getData('options/' . $_option->getId());
        $store = $this->getProduct()->getStore();

        $this->setSkipJsReloadPrice(1);
        // Remove inline prototype onclick and onchange events

        if ($_option->getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_DROP_DOWN ||
            $_option->getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_MULTIPLE
        ) {
            $require = $_option->getIsRequire() ? ' required' : '';
            $extraParams = '';
            $select = $this->getLayout()->createBlock(
                \Magento\Framework\View\Element\Html\Select::class
            )->setData(
                [
                    'id' => 'select_' . $_option->getId(),
                    'class' => $require . ' product-custom-option admin__control-select'
                ]
            );
            if ($_option->getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_DROP_DOWN) {
                $select->setName('options[' . $_option->getId() . ']')->addOption('', __('-- Please Select --'));
            } else {
                $select->setName('options[' . $_option->getId() . '][]');
                $select->setClass('multiselect admin__control-multiselect' . $require . ' product-custom-option');
            }
            foreach ($_option->getValues() as $_value) {
                $priceStr = $this->_formatPrice(
                    [
                        'is_percent' => $_value->getPriceType() == 'percent',
                        'pricing_value' => $_value->getPrice($_value->getPriceType() == 'percent'),
                    ],
                    false
                );

                // custom code   
                $defaultAttribute = array();
                if($_value->getData('is_default') == true){
                    $defaultAttribute = ['selected' => 'selected'];
                }

                // custom code

                $select->addOption(
                    $_value->getOptionTypeId(),
                    $_value->getTitle() . ' ' . strip_tags($priceStr) . '',
                    ['price' => $this->pricingHelper->currencyByStore($_value->getPrice(true), $store, false),$defaultAttribute]
                );
            }

            // custom code added 

            if ($_option->getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_MULTIPLE) {
                $extraParams = ' multiple="multiple"';
            }
            if (!$this->getSkipJsReloadPrice()) {
                $extraParams .= ' onchange="opConfig.reloadPrice()"';
            }
            $extraParams .= ' data-selector="' . $select->getName() . '"';
            $select->setExtraParams($extraParams);

            if ($configValue) {
                $select->setValue($configValue);
            }

            return $select->getHtml();

        }


    }

}

0

यहाँ सबसे साफ तरीका है जो मुझे अनुकूलन योग्य विकल्पों के लिए एक डिफ़ॉल्ट मूल्य निर्धारित करने के लिए मिला है :

(@TrytoFly जवाब पर आधारित)

नोट : मुझे लगता है कि आप पहले से ही बनाए गए मॉड्यूल पर काम करेंगे जिसे मैं कॉल करूंगा Vendor_Module

1. तालिका में is_defaultकॉलम जोड़ेंcatalog_product_option_type_value

एप्लिकेशन / कोड / विक्रेता / मॉड्यूल / सेटअप / UpgradeSchema.php

<?php
namespace Vendor\Module\Setup;

use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;

/**
 * @codeCoverageIgnore
 */
class UpgradeSchema implements UpgradeSchemaInterface
{
    /**
     * {@inheritdoc}
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        if (version_compare($context->getVersion(), '2.0.1') < 0) {
            $setup->getConnection()->addColumn(
                $setup->getTable('catalog_product_option_type_value'),
                'is_default',
                [
                    'type' => \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
                    'length' => 1,
                    'unsigned' => true,
                    'nullable' => false,
                    'default' => '0',
                    'comment' => 'Defines if Is Default'
                ]
            );
        }
    }
}

नोट : अपने मॉड्यूल के अनुसार संस्करण को बदलना न भूलें

2. बैक ऑफिस में चेकबॉक्स तत्व को जोड़ने के लिए एक प्लगइन को परिभाषित और बनाएं

एप्लिकेशन / कोड / विक्रेता / मॉड्यूल / etc / adminhtml / 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\Ui\DataProvider\Product\Form\Modifier\CustomOptions">
        <plugin name="vendor_module_custom_options_ui_plugin"
                type="Vendor\Module\Plugin\CustomOptionsUiPlugin" />
    </type>
</config>

एप्लिकेशन / कोड / विक्रेता / मॉड्यूल / प्लगइन / CustomOptionsUiPlugin.php

<?php
namespace Vendor\Module\Plugin;

use Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\CustomOptions;
use Magento\Ui\Component\Form\Field;
use Magento\Ui\Component\Form\Element\Checkbox;
use Magento\Ui\Component\Form\Element\DataType\Number;

/**
 * Data provider for "Customizable Options" panel
 */
class CustomOptionsUiPlugin
{
    /**
     * Field values
     */
    const FIELD_IS_DEFAULT = 'is_default';

    /**
     * @param \Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\CustomOptions $subject
     * @param bool $meta
     * @return bool
     */
    public function afterModifyMeta(CustomOptions $subject, $meta) {

        $result = $meta;

        $result[CustomOptions::GROUP_CUSTOM_OPTIONS_NAME]['children']
        [CustomOptions::GRID_OPTIONS_NAME]['children']['record']['children']
        [CustomOptions::CONTAINER_OPTION]['children']
        [CustomOptions::GRID_TYPE_SELECT_NAME]['children']['record']['children']
        [static::FIELD_IS_DEFAULT] = $this->getIsDefaultFieldConfig(70);

        return $result;

    }

    /**
     * Get config for checkbox field used for default values
     *
     * @param int $sortOrder
     * @return array
     */
    protected function getIsDefaultFieldConfig($sortOrder)
    {
        return [
            'arguments' => [
                'data' => [
                    'config' =>[
                        'label' => __('Default'),
                        'componentType' => Field::NAME,
                        'formElement' => Checkbox::NAME,
                        'dataScope' => static::FIELD_IS_DEFAULT,
                        'dataType' => Number::NAME,
                        'additionalClasses' => 'admin__field-small',
                        'sortOrder' => $sortOrder,
                        'value' => '0',
                        'valueMap' => [
                            'true' => '1',
                            'false' => '0'
                        ]
                    ],
                ],
            ],
        ];
    }
}

नोट : यहाँ हम घटक के Magento\Ui\Component\Form\Element\Checkboxबजाय इसका उपयोग करते Magento\Ui\Component\Form\Element\Radioहैं क्योंकि ऐसा लगता है कि Magento ने कभी भी इसे अपने Form Elements में परिभाषित नहीं किया है।

vendor\magento\module-ui\view\base\ui_component\etc\definition.xmlलाइन 112+ देखें

3. Magento\Catalog\Block\Product\View\Options\Type\Selectउस तत्व की जांच करने के लिए अधिलेखित करें जिसे "डिफ़ॉल्ट तत्व" चुना गया है।

एप्लिकेशन / कोड / विक्रेता / मॉड्यूल / etc / adminhtml / 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">
    <preference for="Magento\Catalog\Block\Product\View\Options\Type\Select"
                type="Vendor\Module\Block\Rewrite\Catalog\Product\View\Options\Type\Select" />
</config>

एप्लिकेशन / कोड / विक्रेता / मॉड्यूल / ब्लॉक / पुनर्लेखन / सूची / उत्पाद / देखें / विकल्प / प्रकार / Select.php

<?php
namespace Vendor\Module\Block\Rewrite\Catalog\Product\View\Options\Type;

/**
 * Product options text type block
 */
class Select extends \Magento\Catalog\Block\Product\View\Options\Type\Select
{
    /**
     * Return html for control element
     *
     * @return string
     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
     * @SuppressWarnings(PHPMD.NPathComplexity)
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function getValuesHtml()
    {
        $_option = $this->getOption();
        $configValue = $this->getProduct()->getPreconfiguredValues()->getData('options/' . $_option->getId());
        $store = $this->getProduct()->getStore();

        $this->setSkipJsReloadPrice(1);
        // Remove inline prototype onclick and onchange events

        if ($_option->getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_DROP_DOWN ||
            $_option->getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_MULTIPLE
        ) {
            $require = $_option->getIsRequire() ? ' required' : '';
            $extraParams = '';
            $select = $this->getLayout()->createBlock(
                \Magento\Framework\View\Element\Html\Select::class
            )->setData(
                [
                    'id' => 'select_' . $_option->getId(),
                    'class' => $require . ' product-custom-option admin__control-select'
                ]
            );
            if ($_option->getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_DROP_DOWN) {
                $select->setName('options[' . $_option->getId() . ']')->addOption('', __('-- Please Select --'));
            } else {
                $select->setName('options[' . $_option->getId() . '][]');
                $select->setClass('multiselect admin__control-multiselect' . $require . ' product-custom-option');
            }
            foreach ($_option->getValues() as $_value) {
                $priceStr = $this->_formatPrice(
                    [
                        'is_percent' => $_value->getPriceType() == 'percent',
                        'pricing_value' => $_value->getPrice($_value->getPriceType() == 'percent'),
                    ],
                    false
                );

                if($_value->getData('is_default') == true && !$configValue){
                    $configValue = $_value->getOptionTypeId();
                }
                $select->addOption(
                    $_value->getOptionTypeId(),
                    $_value->getTitle() . ' ' . strip_tags($priceStr) . '',
                    ['price' => $this->pricingHelper->currencyByStore($_value->getPrice(true), $store, false)]
                );
            }
            if ($_option->getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_MULTIPLE) {
                $extraParams = ' multiple="multiple"';
            }
            if (!$this->getSkipJsReloadPrice()) {
                $extraParams .= ' onchange="opConfig.reloadPrice()"';
            }
            $extraParams .= ' data-selector="' . $select->getName() . '"';
            $select->setExtraParams($extraParams);

            if ($configValue) {
                $select->setValue($configValue);
            }

            return $select->getHtml();
        }

        if ($_option->getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_RADIO ||
            $_option->getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_CHECKBOX
        ) {
            $selectHtml = '<div class="options-list nested" id="options-' . $_option->getId() . '-list">';
            $require = $_option->getIsRequire() ? ' required' : '';
            $arraySign = '';
            switch ($_option->getType()) {
                case \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_RADIO:
                    $type = 'radio';
                    $class = 'radio admin__control-radio';
                    if (!$_option->getIsRequire()) {
                        $selectHtml .= '<div class="field choice admin__field admin__field-option">' .
                            '<input type="radio" id="options_' .
                            $_option->getId() .
                            '" class="' .
                            $class .
                            ' product-custom-option" name="options[' .
                            $_option->getId() .
                            ']"' .
                            ' data-selector="options[' . $_option->getId() . ']"' .
                            ($this->getSkipJsReloadPrice() ? '' : ' onclick="opConfig.reloadPrice()"') .
                            ' value="" checked="checked" /><label class="label admin__field-label" for="options_' .
                            $_option->getId() .
                            '"><span>' .
                            __('None') . '</span></label></div>';
                    }
                    break;
                case \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_CHECKBOX:
                    $type = 'checkbox';
                    $class = 'checkbox admin__control-checkbox';
                    $arraySign = '[]';
                    break;
            }
            $count = 1;
            foreach ($_option->getValues() as $_value) {
                $count++;

                $priceStr = $this->_formatPrice(
                    [
                        'is_percent' => $_value->getPriceType() == 'percent',
                        'pricing_value' => $_value->getPrice($_value->getPriceType() == 'percent'),
                    ]
                );

                $htmlValue = $_value->getOptionTypeId();
                if ($arraySign) {
                    $checked = is_array($configValue) && in_array($htmlValue, $configValue) ? 'checked' : '';
                } else {
                    $checked = $configValue == $htmlValue ? 'checked' : '';
                }

                $dataSelector = 'options[' . $_option->getId() . ']';
                if ($arraySign) {
                    $dataSelector .= '[' . $htmlValue . ']';
                }

                $selectHtml .= '<div class="field choice admin__field admin__field-option' .
                    $require .
                    '">' .
                    '<input type="' .
                    $type .
                    '" class="' .
                    $class .
                    ' ' .
                    $require .
                    ' product-custom-option"' .
                    ($this->getSkipJsReloadPrice() ? '' : ' onclick="opConfig.reloadPrice()"') .
                    ' name="options[' .
                    $_option->getId() .
                    ']' .
                    $arraySign .
                    '" id="options_' .
                    $_option->getId() .
                    '_' .
                    $count .
                    '" value="' .
                    $htmlValue .
                    '" ' .
                    $checked .
                    ' data-selector="' . $dataSelector . '"' .
                    ' price="' .
                    $this->pricingHelper->currencyByStore($_value->getPrice(true), $store, false) .
                    '" />' .
                    '<label class="label admin__field-label" for="options_' .
                    $_option->getId() .
                    '_' .
                    $count .
                    '"><span>' .
                    $_value->getTitle() .
                    '</span> ' .
                    $priceStr .
                    '</label>';
                $selectHtml .= '</div>';
            }
            $selectHtml .= '</div>';

            return $selectHtml;
        }
    }
}

4. अपने मॉड्यूल संस्करण को अपग्रेड करें और डेटाबेस को अपडेट करें

अपने setup_versionमें अपग्रेड करेंapp/code/Vendor/Module/etc/module.xml

अपने versionमें अपडेट करेंapp/code/Vendor/Module/composer.json

निम्नलिखित आदेश चलाएँ:

php bin/magento cache:clean
php bin/magento setup:upgrade
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.