Magento2'de özel seçenekte varsayılan değer nasıl ayarlanır


9

Varsayılan seçeneği ürün düzeyinde özel seçenekler değerine ayarlamak istiyorum.

Magento 2'de nasıl yapılır? resim açıklamasını buraya girin

Lütfen bu sorunu çözmeme yardımcı olun.


Lütfen sorunuzu daha fazla ayrıntıyla açıklayın.
Sheshgiri Anvekar

Görünüşe göre giriş alanınıza bazı varsayılan metinler yerleştirmek istiyorsunuz.
Dinesh Yadav

sorum 2 seçeneğim var m Bir seçeneği ön uçta varsayılan olarak seçmek istiyorum.
rajat kara

Bunu nasıl uygulayabilirim? varsayılan değer eklemek istiyorum?
Mahi M

Yanıtlar:


2

Bunu yönetici aracılığıyla yapabileceğinizden emin değilim. Ben sadece tüm "varsayılan seçenekler" admin içinde ilk seçenek olduğundan emin yaptı etrafında bir iş yaptım ve sonra benim mağaza için js için aşağıdaki ekledi.

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

Bu, tümü sayfa yüklemesinde oluşturulduğu için özel seçenekler için çalışır. Kod tüm özel seçeneklerde dolaşır ve 2. seçeneği ilk seçenek olarak "lütfen seçin" olarak ayarlar.

Ancak tüm sayfa yüklendikten sonra seçenekler yüklendiği gibi yapılandırılabilir ürünlerle biraz daha zorlandım, ancak bunu yapmak için sorumu burada görebilirsiniz: Magento 2: Yapılandırılabilir seçeneklerde varsayılan seçenek nasıl ayarlanır?



1

Bence elde etmek istediğin şey böyle bir şey mi?

resim açıklamasını buraya girin

Açılır alanlar için, radyo butonları ile aynı olması gerektiğini uyguladım.

  1. Tabloya varsayılan seçenek (is_default ya da whatever) için bir sütun ekleyin catalog_product_option_type_value.
  2. ChangeMeta yöntemini engelleyen bir eklenti ekleyin Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\CustomOptions.

Misal:

satıcı / modülü / 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>

Satıcı \ Modülü \ Eklenti \ 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. Ve son olarak dosyanın üzerine Magento\Catalog\Block\Product\View\Options\Type\Select.phpböyle bir şey yazmanız gerekiyor

    $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]
    );
    

    Umarım yardımcı olur!


Çözümünüz için teşekkürler. Kodunuzu denedim ve "Varsayılan" seçeneğini görüntüleyebiliyorum, ancak özel değerler görüntülenmiyor. Lütfen Sorunu çözmeme yardımcı olun.
Umarfarooq Galibwale

@ TrytoFly $defaultAttributeseçeneği için ekstra özellikler eklemek , önceden yapılandırılmış değerlerle (buy_request, ...) çakışacaktır. Örneğin, bir alışveriş sepeti öğesini düzenlerken, müşteri tarafından seçilen değer ve "is_default" değeri selected="selected"kodda olduğu gibi işaretlenir .
Cladiuss

0

@ TrytoFly Çözümünüz için teşekkürler. Kodunuzu denedim ve "Varsayılan" seçeneğini görüntüleyebiliyorum, ancak özel değerler görüntülenmiyor. Lütfen Sorunu düzeltmeme yardımcı olun.Lütfen resimleri bulun

resim açıklamasını buraya girin

resim açıklamasını buraya girin


Ekran görüntülerinden sanırım $result = $meta;afterModifyMeta () yönteminin başında ayarlamanız gerekiyor. Aksi takdirde, varsayılan seçeneği eklemek yerine dönüş değerinizin üzerine yazacaksınız.
TrytoFly

0

@TrytoFly Bu benim için işe yaradı.

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

Buraya tam kodu yazabilir misiniz? Bu şekilde, yönetici içinde özel seçenekli onay kutusunu görüntüleyebiliyorum, ancak ürünü kaydedeceğimde varsayılan seçili seçenek kaydedilmiyor. Ve ön tarafta seçilen varsayılan nasıl görüntülenir?
Magecode

0

Aşağıdaki kod işlevi gibi Select.php dosyasını geçersiz kılabilirsiniz:

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

Özelleştirilebilir seçenekler için varsayılan bir değer ayarlamak için bulduğum en temiz yol :

(@ TrytoFly yanıtına dayanarak)

Not : Önceden oluşturulmuş bir modül üzerinde çalışacağımı varsayacağım Vendor_Module.

Ekle 1. is_defaultsütun catalog_product_option_type_valuetabloda

Uygulamanın / kod / Satıcı / Modül / Kurulum / 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'
                ]
            );
        }
    }
}

Not : Sürümü modülünüze göre değiştirmeyi unutmayın

2. Arka ofiste onay kutusu öğesini eklemek için bir eklenti tanımlayın ve oluşturun

Uygulamanın / kod / Satıcı / Modül / 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>

Uygulamanın / kod / Satıcı / Modül / Eklenti / 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'
                        ]
                    ],
                ],
            ],
        ];
    }
}

Not : Burada bileşen Magento\Ui\Component\Form\Element\Checkboxyerine Magento\Ui\Component\Form\Element\RadioMagento'nun asla Form Öğelerinde tanımlanmadığı anlaşılıyor.

Bkz vendor\magento\module-ui\view\base\ui_component\etc\definition.xmlçizgi 112+

3. Magento\Catalog\Block\Product\View\Options\Type\Select"Varsayılan eleman" olarak seçilmiş elemanı kontrol etmek için üzerine yaz .

Uygulamanın / kod / Satıcı / Modül / 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>

Uygulamanın / kod / Satıcı / Modül / Blok / Rewrite / Katalog / Ürün / Görünüm / Seçenekler / Tür / 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. Modül sürümünüzü yükseltin ve veritabanını güncelleyin

Senin Yükseltme setup_versioninapp/code/Vendor/Module/etc/module.xml

Senin güncelleyin versionin app/code/Vendor/Module/composer.json

Aşağıdaki komutları çalıştırın:

php bin/magento cache:clean
php bin/magento setup:upgrade
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.