मैं उत्पाद स्तर में कस्टम विकल्प मान के लिए डिफ़ॉल्ट विकल्प सेट करना चाहता हूं।
कृपया इसे सुलझाने के लिए मेरी मदद करें।
मैं उत्पाद स्तर में कस्टम विकल्प मान के लिए डिफ़ॉल्ट विकल्प सेट करना चाहता हूं।
कृपया इसे सुलझाने के लिए मेरी मदद करें।
जवाबों:
मुझे यकीन नहीं है कि आप इसे व्यवस्थापक के माध्यम से कर सकते हैं। मैंने अभी-अभी एक काम किया है जहाँ मैंने यह सुनिश्चित किया है कि मेरे सभी "डिफ़ॉल्ट विकल्प" व्यवस्थापक के भीतर पहला विकल्प हैं, फिर नीचे मेरे स्टोर के लिए 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: कॉन्फ़िगर करने योग्य विकल्पों में डिफ़ॉल्ट विकल्प कैसे सेट करें?
मुझे लगता है कि आप जो हासिल करना चाहते हैं वह कुछ इस तरह है?
मैंने कार्यान्वित किया कि ड्रॉपडाउन फ़ील्ड के लिए, रेडियोबुटन के साथ समान होना चाहिए।
catalog_product_option_type_value
।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;
}
}
और अंत में आपको 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]
);
उम्मीद है की वो मदद करदे!
$defaultAttribute
विकल्प के लिए अतिरिक्त विशेषताओं के रूप में जोड़कर पूर्वनिर्मित मूल्यों (buy_request, ...) के साथ विरोध किया जाएगा। उदाहरण के लिए, कार्ट आइटम को संपादित करते समय, ग्राहक द्वारा चुना गया मूल्य और "is_default" मूल्य दोनों selected="selected"
को कोड के रूप में चिह्नित किया जाएगा ।
@TrytoFly आपके समाधान के लिए धन्यवाद। मैंने आपके कोड के साथ प्रयास किया है और मैं "डिफ़ॉल्ट" विकल्प प्रदर्शित करने में सक्षम हूं, लेकिन कस्टम मान प्रदर्शित नहीं कर रहे हैं। कृपया मुझे समस्या को ठीक करने में मदद करें। कृपया चित्र खोजें
$result = $meta;
अपने afterModifyMeta () विधि की शुरुआत में सेट करना होगा । या फिर आप केवल डिफ़ॉल्ट विकल्प को इसमें जोड़ने के बजाय अपने रिटर्न मान को अधिलेखित कर देंगे।
@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;
}
}
आप फ़ोलोइंग कोड फ़ंक्शन की तरह 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();
}
}
}
यहाँ सबसे साफ तरीका है जो मुझे अनुकूलन योग्य विकल्पों के लिए एक डिफ़ॉल्ट मूल्य निर्धारित करने के लिए मिला है :
(@TrytoFly जवाब पर आधारित)
नोट : मुझे लगता है कि आप पहले से ही बनाए गए मॉड्यूल पर काम करेंगे जिसे मैं कॉल करूंगा Vendor_Module
।
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'
]
);
}
}
}
नोट : अपने मॉड्यूल के अनुसार संस्करण को बदलना न भूलें
एप्लिकेशन / कोड / विक्रेता / मॉड्यूल / 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+ देखें
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;
}
}
}
अपने 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