অ্যাডমিন কনফিগারেশন: নির্বাচিত বহুবিধ মানগুলির উপর নির্ভর করে ক্ষেত্র প্রদর্শন করুন


10

আমি নির্বাচিত মাল্টিলেসलेक्ट ইনপুটের ভিত্তিতে ক্ষেত্রগুলি প্রদর্শন করতে চাই ... নিম্নলিখিত কোডটি কেবলমাত্র কাজ করে, যদি একটি মাত্র মান নির্বাচন করা হয়। আমি যদি আরও নির্বাচন করি তবে একটি মান এটি কেবল একটি ক্ষেত্র দেখায় (উত্স মডেল থেকে প্রথম নির্বাচিত)

<enabled>
    <label>Enabled</label>
    ...
    <source_model>adminhtml/system_config_source_enabledisable</source_model>
</enabled>

<!-- this gives three options - shop, ebay, amazon -->
<channels>
    ...
    <frontend_type>multiselect</frontend_type>
    <source_model>module/system_config_source_channels</source_model>
    <depends>
        <enabled>1</enabled>
    </depends>
</channels>
<mail_template_shop>
    ...
    <depends>
        <enabled>1</enabled>
        <channels>shop</channels>
    </depends>
</mail_template_shop>
<mail_template_ebay>
    ...
    <depends>
        <enabled>1</enabled>
        <channels>ebay</channels>
    </depends>
</mail_template_ebay>

সম্পর্কিত কোড:

অ্যাপ্লিকেশন / কোড / কোর / পুরোনো যাদুকর / Adminhtml / ব্লক / উইজেট / ফরম / উপাদান / Dependence.php

/**
 * Add misc configuration options to the javascript dependencies controller
 *
 * @param array $options
 * @return Mage_Adminhtml_Block_Widget_Form_Element_Dependence
 */
public function addConfigOptions(array $options)
{
    $this->_configOptions = array_merge($this->_configOptions, $options);
    return $this;
}

/**
 * HTML output getter
 * @return string
 */
protected function _toHtml()
{
    if (!$this->_depends) {
        return '';
    }
    return '<script type="text/javascript"> new FormElementDependenceController('
        . $this->_getDependsJson()
        . ($this->_configOptions ? ', ' . Mage::helper('core')->jsonEncode($this->_configOptions) : '')
        . '); </script>';
}

/**
 * Field dependences JSON map generator
 * @return string
 */
protected function _getDependsJson()
{
    $result = array();
    foreach ($this->_depends as $to => $row) {
        foreach ($row as $from => $value) {
            $result[$this->_fields[$to]][$this->_fields[$from]] = $value;
        }
    }
    return Mage::helper('core')->jsonEncode($result);
}

JS / পুরোনো যাদুকর / adminhtml / form.js

/**
 * Observer that watches for dependent form elements
 * If an element depends on 1 or more of other elements, it should show up only when all of them gain specified values
 */
FormElementDependenceController = Class.create();
FormElementDependenceController.prototype = {
    /**
     * Structure of elements: {
     *     'id_of_dependent_element' : {
     *         'id_of_master_element_1' : 'reference_value',
     *         'id_of_master_element_2' : 'reference_value'
     *         'id_of_master_element_3' : ['reference_value1', 'reference_value2']
     *         ...
     *     }
     * }
     * @param object elementsMap
     * @param object config
     */
    initialize : function (elementsMap, config)
    {
        if (config) {
            this._config = config;
        }
        for (var idTo in elementsMap) {
            for (var idFrom in elementsMap[idTo]) {
                if ($(idFrom)) {
                    Event.observe($(idFrom), 'change', this.trackChange.bindAsEventListener(this, idTo, elementsMap[idTo]));
                    this.trackChange(null, idTo, elementsMap[idTo]);
                } else {
                    this.trackChange(null, idTo, elementsMap[idTo]);
                }
            }
        }
    },

    /**
     * Misc. config options
     * Keys are underscored intentionally
     */
    _config : {
        levels_up : 1 // how many levels up to travel when toggling element
    },

    /**
     * Define whether target element should be toggled and show/hide its row
     *
     * @param object e - event
     * @param string idTo - id of target element
     * @param valuesFrom - ids of master elements and reference values
     * @return
     */
    trackChange : function(e, idTo, valuesFrom)
    {
        if (!$(idTo)) {
            return;
        }

        // define whether the target should show up
        var shouldShowUp = true;
        for (var idFrom in valuesFrom) {
            var from = $(idFrom);
            if (valuesFrom[idFrom] instanceof Array) {
                if (!from || valuesFrom[idFrom].indexOf(from.value) == -1) {
                    shouldShowUp = false;
                }
            } else {
                if (!from || from.value != valuesFrom[idFrom]) {
                    shouldShowUp = false;
                }
            }
        }

        // toggle target row
        if (shouldShowUp) {
            var currentConfig = this._config;
            $(idTo).up(this._config.levels_up).select('input', 'select', 'td').each(function (item) {
                // don't touch hidden inputs (and Use Default inputs too), bc they may have custom logic
                if ((!item.type || item.type != 'hidden') && !($(item.id+'_inherit') && $(item.id+'_inherit').checked)
                    && !(currentConfig.can_edit_price != undefined && !currentConfig.can_edit_price)) {
                    item.disabled = false;
                }
            });
            $(idTo).up(this._config.levels_up).show();
        } else {
            $(idTo).up(this._config.levels_up).select('input', 'select', 'td').each(function (item){
                // don't touch hidden inputs (and Use Default inputs too), bc they may have custom logic
                if ((!item.type || item.type != 'hidden') && !($(item.id+'_inherit') && $(item.id+'_inherit').checked)) {
                    item.disabled = true;
                }
            });
            $(idTo).up(this._config.levels_up).hide();
        }
    }
};

1
হাই @ এসভি 3 এন, আমরা আপনাকে দেখতে পাচ্ছি না, সবকিছু ঠিক আছে?
পিনকি

ঠিক আছে @ এসভি 3 এন শীঘ্রই, শীঘ্রই দেখা হবে;)
পিনক

উত্তর:


12

ইস্যু করার কারণ

আপনি যে সমস্যাটির মুখোমুখি হচ্ছেন তা মাল্টিলেসট বৈশিষ্ট্যের মান পাওয়ার জন্য জাভাস্ক্রিপ্ট কার্যকারিতার সাথে সম্পর্কিত।

ম্যাজেন্টোর নির্ভরযোগ্য ক্ষেত্রগুলি জাভাস্ক্রিপ্টের উপর ভিত্তি করে। তারা নীচের মতো সমস্ত ক্ষেত্র এবং নির্ভরযোগ্য ক্ষেত্রের মান সহ একটি JSON তৈরি করে।

array (size=2)
  'brandlogo_general_pushonhover' => 
    array (size=2)
      'brandlogo_general_brandlogoenabled' => string '1' (length=1)
      'brandlogo_general_enableautoslide' => string '4' (length=1)
  'brandlogo_general_pager' => 
    array (size=2)
      'brandlogo_general_brandlogoenabled' => string '1' (length=1)
      'brandlogo_general_enableautoslide' => string '10' (length=4)

আপনি যখন মাল্টিলেক্ট বৈশিষ্ট্য থেকে কোনও বিকল্প নির্বাচন করেন, এটি কেবলমাত্র প্রথম নির্বাচিত মান প্রদান করে।

document.getElementById('demoSel').onchange = function(e) {
    alert(document.getElementById('demoSel').value);
}

এই কোলাহলটি পরীক্ষা করে দেখুন

এমনকি যদি আপনি একাধিক বিকল্প নির্বাচন করেন তবে আপনি সর্বদা প্রথম নির্বাচিত বিকল্পের মান পাবেন।

ইস্যু সমাধান

আপনি যা চান তা অর্জন করতে আপনার জেএস ফাইল ফর্ম.জেএস আপডেট করতে হবে।

প্রথমে আপনাকে একটি নতুন ফাংশন যুক্ত করতে হবে যা আপনাকে কেবলমাত্র একক মানের পরিবর্তে একটি মাল্টিসাইলেকের সমস্ত নির্বাচিত মানগুলি পেতে দেবে।

আপনার form.js এ একটি নতুন ফাংশন যুক্ত করুন

getSelectValues : function(select) {
    var result = [];
    var options = select && select.options;
    var opt;
    for (var i=0, iLen=options.length; i<iLen; i++) {
        opt = options[i];
        if (opt.selected) {
            result.push(opt.value);
        }
    }
    return result;
}

trackChangeএকই ফাইলে আপনার ফাংশনটি পরীক্ষা করতে এখন এই মানগুলি ব্যবহার করুন। কোডের নীচে প্রতিস্থাপন করুন

for (var idFrom in valuesFrom) {
    var from = $(idFrom);
    if (valuesFrom[idFrom] instanceof Array) {
        if (!from || valuesFrom[idFrom].indexOf(from.value) == -1) {
            shouldShowUp = false;
        }
    } else {
        if (!from || from.value != valuesFrom[idFrom]) {
            shouldShowUp = false;
        }
    }
}

এই কোড সহ

for (var idFrom in valuesFrom) {
    var from = $(idFrom);
    if (from.tagName === 'SELECT' && from.className.indexOf('multiselect') > -1) {
        var elementValues = this.getSelectValues(from);
        if (!from || elementValues.indexOf(valuesFrom[idFrom]) <= -1) {
            shouldShowUp = false;
        }
     } else {
        if (valuesFrom[idFrom] instanceof Array) {
            if (!from || valuesFrom[idFrom].indexOf(from.value) == -1) {
                shouldShowUp = false;
            }
        } else {
            if (!from || from.value != valuesFrom[idFrom]) {
                shouldShowUp = false;
            }
        }
    }
}

এবং এটি আপনার জন্য কাজ করা উচিত।


ধন্যবাদ। এটি এটি ব্যাখ্যা করে তবে এটি সমাধান করে না। চেক করা হয়েছে js/adminhtml/form.js, তবে এখনও কোনও সমাধান খুঁজে পেল না ...
এসভি

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