Помогите с зависимыми опциями

Тема в разделе "JavaScript", создана пользователем Absolute, 27 авг 2012.

Модераторы: ZiX
  1. Absolute

    Absolute Крокодил ;)

    Регистр.:
    9 авг 2009
    Сообщения:
    340
    Симпатии:
    162
    Допустим, есть 2 селекта:
    HTML:
    <p>
    <label for="group_2">Color :</label>
    <select name="group_2" id="group_2" onchange="javascript:findCombination();$('#wrapResetImages').show('slow');;">
    <option value="14" selected="selected" title="Black">Black</option>
    <option value="6" title="Green">Green</option>
    <option value="7" title="Orange">Orange</option>
    </select>
    </p>
                                                    <p>
    <label for="group_1">Disk space :</label>
    <select name="group_1" id="group_1" onchange="javascript:findCombination();$('#wrapResetImages').show('slow');;">
    <option value="15" title="8Go">8Go</option>
    <option value="16" selected="selected" title="16Go">16Go</option>
    </select>
                </p>
    При выборе Green (value="6") задача скрыть от глаз пользователя 8Go (value="15) и оставить доступным только 16Go ( value="16" )

    Возможные комбинации перечисляются в коде:
    Код:
    <script type="text/javascript">
    // <![CDATA[
     
        // Combinations
                addCombination(31, new Array('14','16'), 50, 41.80602, 0, 37, '', 0.00, 1);
                addCombination(32, new Array('14','15'), 50, 0, 0, 37, '', 0.00, 1);
                addCombination(39, new Array('6','16'), 50, 41.80602, 0, 39, '', 0.00, 1);
                addCombination(33, new Array('7','16'), 50, 41.80602, 0, 40, '', 0.00, 1);
                addCombination(34, new Array('7','15'), 50, 0, 0, 40, '', 0.00, 1);
            // Colors
                    //]]>
    </script>
    Соответственно в нём не хватает одной комбинации:
    addCombination(39, new Array('6','15'), 50, 41.80602, 0, 39, '', 0.00, 1);
    другими словами тут:
    addCombination(39, new Array('Green','8Go'), 50, 41.80602, 0, 39, '', 0.00, 1);

    Подскажите, пожалуйста...
    PS: это PrestaShop 1.4.9
     
  2. dev99

    dev99 Постоялец

    Регистр.:
    2 июл 2007
    Сообщения:
    82
    Симпатии:
    57
    А где хранятся эти Combinations ?
    Если предположить, что в некотором массиве arrayCombinations, то код будет:
    Код:
    var arrayCombination=new Array(
      new Array('14','16'),
      new Array('14','15'),
      new Array('6','16'),
      new Array('7','16'),
      new Array('7','15')
    );
    $(function(){
      $('#group_2').change(function() {
        var color = $(this).val();
        $('#group_1').children().attr('disabled','disabled');
        $.each(arrayCombination,function(key,array){
          if (color==array[0])
            $('#group_1 option[value="'+array[1]+'"]').removeAttr('disabled');
        });
      });
    });
    Только <option> нельзя скрыть обычнам способом (display:none), но можно поставить атрибут disabled!
     
    Absolute нравится это.
  3. Absolute

    Absolute Крокодил ;)

    Регистр.:
    9 авг 2009
    Сообщения:
    340
    Симпатии:
    162
    Спасибо. Ваш код работает для данного конкретного товара.

    Вот только как его приспособить для всего движка, если селектов может быть n количество и option в каждом селекте так же n количество? Тут PHP в перемешку с JS я запутался совсем...
    В общем
    addCombination(31, new Array('14','16'), 50, 41.80602, 0, 37, '', 0.00, 1);
    Генерируется так:

    Код:
        var arrayCombination=new Array(
        {foreach from=$combinations key=idCombination item=combination}
            addCombination({$idCombination|intval}, new Array({$combination.list}), {$combination.quantity}, {$combination.price}, {$combination.ecotax}, {$combination.id_image}, '{$combination.reference|addslashes}', {$combination.unit_impact}, {$combination.minimal_quantity});
        {/foreach}
    var arrayCombination=new Array(
    new Array('14','16'),
    new Array('14','15'),
    new Array('6','16'),
    new Array('7','16'),
    new Array('7','15')
    );
    удалось сгенерировать дублировав код выше и исбавившись от лишних переменных вот так:
    Код:
    var arrayCombination=new Array(    
    {foreach from=$combinations key=idCombination item=combination}
            new Array({$combination.list}),
        {/foreach} );
    Option и select создается так:

    Код:
    {foreach from=$groups key=id_attribute_group item=group}
                {if $group.attributes|@count}
                <p>
                    <label for="group_{$id_attribute_group|intval}">{$group.name|escape:'htmlall':'UTF-8'} :</label>
                    {assign var="groupName" value="group_$id_attribute_group"}
                    <select name="{$groupName}" id="group_{$id_attribute_group|intval}" onchange="javascript:findCombination();{if $colors|@count > 0}$('#wrapResetImages').show('slow');{/if};">
                        {foreach from=$group.attributes key=id_attribute item=group_attribute}
                            <option value="{$id_attribute|intval}"{if (isset($smarty.get.$groupName) && $smarty.get.$groupName|intval == $id_attribute) || $group.default == $id_attribute} selected="selected"{/if} title="{$group_attribute|escape:'htmlall':'UTF-8'}">{$group_attribute|escape:'htmlall':'UTF-8'}</option>
                        {/foreach}
                    </select>
                </p>
                {/if}
                {/foreach}
    Как быть с
    Код:
    $(function(){
      $('#group_2').change(function() {
        var color = $(this).val();
        $('#group_1').children().attr('disabled','disabled');
        $.each(arrayCombination,function(key,array){
          if (color==array[0])
            $('#group_1 option[value="'+array[1]+'"]').removeAttr('disabled');
        });
      });
    });
    ...??
    И как быть если селектов будет n количество?
     
  4. dev99

    dev99 Постоялец

    Регистр.:
    2 июл 2007
    Сообщения:
    82
    Симпатии:
    57
    А точно селекторов может быть больше 2 ? Тогда как контролировать, которые опции скрывать в других селекторах - по первому ?
    В общем, посмотрю исходник Престы...
     
  5. Absolute

    Absolute Крокодил ;)

    Регистр.:
    9 авг 2009
    Сообщения:
    340
    Симпатии:
    162
    Да может быть селектов несколько. Я смотрел на оф.форуме - Американцы тоже голову ломают, пока так ничего и не придумали.
    Контролировать по отсутствию комбинации
    напримере из моего верхнего поста, отсутствующая комбинация вот:
    Код:
    addCombination($idCombination|intval, new Array('6','15'), 50, 41.80602, 0, 39, '', 0.00, 1);
    Можно ли её вычислить средствами JavaScript, опираясь на то что комбинация имеет место быть, исходя из optoin, но $idCombination для неё не записана в БД?

    Так же будут и отвутствовать комбинации и для трёх селекторов... для трёх например так будет выглядеть отсутствующая:
    Код:
    addCombination($idCombination|intval, new Array('6','15',32), 50, 41.80602, 0, 39, '', 0.00, 1);
    32- соответствующий option в третьей комбинации

    Вот здесь вот переключайте radio в Disk space - как они это сделали? Ещё пример - тут radio вместе с select, хотя option'ы в нём в disabled не ставятся.

    По дефолту в престе сделано так, что если выбираешь option'ы, комбинация которых не записана, то проверяется в БД $idCombination и если эта переменная возвращает пустое значение, то всплывает сообщение, что данная комплектация товара отсутствует и кнопка в корзину исчезает.
    Эту проверку производит /themes/prestashop/js/product.js:
    Код:
    //global variables
    var combinations = new Array();
    var selectedCombination = new Array();
    var globalQuantity = new Number;
    var colors = new Array();
     
    //check if a function exists
    function function_exists(function_name)
    {
        if (typeof function_name == 'string')
            return (typeof window[function_name] == 'function');
        return (function_name instanceof Function);
    }
     
    //execute oosHook js code
    function oosHookJsCode()
    {
        for (var i = 0; i < oosHookJsCodeFunctions.length; i++)
        {
            if (function_exists(oosHookJsCodeFunctions[i]))
                setTimeout(oosHookJsCodeFunctions[i]+'()', 0);
        }
    }
     
    //add a combination of attributes in the global JS sytem
    function addCombination(idCombination, arrayOfIdAttributes, quantity, price, ecotax, id_image, reference, unit_price, minimal_quantity)
    {
        globalQuantity += quantity;
     
        var combination = new Array();
        combination['idCombination'] = idCombination;
        combination['quantity'] = quantity;
        combination['idsAttributes'] = arrayOfIdAttributes;
        combination['price'] = price;
        combination['ecotax'] = ecotax;
        combination['image'] = id_image;
        combination['reference'] = reference;
        combination['unit_price'] = unit_price;
        combination['minimal_quantity'] = minimal_quantity;
        combinations.push(combination);
     
    }
     
    // search the combinations' case of attributes and update displaying of availability, prices, ecotax, and image
    function findCombination(firstTime)
    {
        $('#minimal_quantity_wanted_p').fadeOut();
        $('#quantity_wanted').val(1);
        //create a temporary 'choice' array containing the choices of the customer
        var choice = new Array();
        $('div#attributes select').each(function(){
            choice.push($(this).val());
        });
     
        //testing every combination to find the conbination's attributes' case of the user
        for (var combination = 0; combination < combinations.length; ++combination)
        {
            //verify if this combinaison is the same that the user's choice
            var combinationMatchForm = true;
            $.each(combinations[combination]['idsAttributes'], function(key, value)
            {
                if (!in_array(value, choice))
                {
                    combinationMatchForm = false;
                }
            })
     
            if (combinationMatchForm)
            {
                if (combinations[combination]['minimal_quantity'] > 1)
                {
                    $('#minimal_quantity_label').html(combinations[combination]['minimal_quantity']);
                    $('#minimal_quantity_wanted_p').fadeIn();
                    $('#quantity_wanted').val(combinations[combination]['minimal_quantity']);
                    $('#quantity_wanted').bind('keyup', function() {checkMinimalQuantity(combinations[combination]['minimal_quantity'])});
                }
                //combination of the user has been found in our specifications of combinations (created in back office)
                selectedCombination['unavailable'] = false;
                selectedCombination['reference'] = combinations[combination]['reference'];
                $('#idCombination').val(combinations[combination]['idCombination']);
     
                $('#ipa_customization').val(combinations[combination]['idCombination']);
                //get the data of product with these attributes
                quantityAvailable = combinations[combination]['quantity'];
                selectedCombination['price'] = combinations[combination]['price'];
                selectedCombination['unit_price'] = combinations[combination]['unit_price'];
                if (combinations[combination]['ecotax'])
                    selectedCombination['ecotax'] = combinations[combination]['ecotax'];
                else
                    selectedCombination['ecotax'] = default_eco_tax;
     
                //show the large image in relation to the selected combination
                if (combinations[combination]['image'] && combinations[combination]['image'] != -1)
                    displayImage( $('#thumb_'+combinations[combination]['image']).parent() );
     
                //update the display
                updateDisplay();
     
                if(typeof(firstTime) != 'undefined' && firstTime && ipa_default != selectedCombination['idCombination'])
                    refreshProductImages(0);
                else
                    refreshProductImages(combinations[combination]['idCombination']);
                //leave the function because combination has been found
                return;
            }
        }
        //this combination doesn't exist (not created in back office)
        selectedCombination['unavailable'] = true;
        updateDisplay();
    }
     
    function updateColorSelect(id_attribute)
    {
        if (id_attribute == 0)
        {
            refreshProductImages(0);
            return ;
        }
        // Visual effect
        $('#color_'+id_attribute).fadeTo('fast', 1, function(){    $(this).fadeTo('slow', 0, function(){ $(this).fadeTo('slow', 1, function(){}); }); });
        // Attribute selection
        $('#group_'+id_color_default+' option[value='+id_attribute+']').attr('selected', 'selected');
        $('#group_'+id_color_default+' option[value!='+id_attribute+']').removeAttr('selected');
        findCombination();
    }
     
    //update display of the availability of the product AND the prices of the product
    function updateDisplay()
    {
        if (!selectedCombination['unavailable'] && quantityAvailable > 0 && productAvailableForOrder == 1)
        {
            //show the choice of quantities
            $('#quantity_wanted_p:hidden').show('slow');
     
            //show the "add to cart" button ONLY if it was hidden
            $('#add_to_cart:hidden').fadeIn(600);
     
            //hide the hook out of stock
            $('#oosHook').hide();
     
            //availability value management
            if (availableNowValue != '')
            {
                //update the availability statut of the product
                $('#availability_value').removeClass('warning_inline');
                $('#availability_value').text(availableNowValue);
                $('#availability_statut:hidden').show();
            }
            else
            {
                //hide the availability value
                $('#availability_statut:visible').hide();
            }
     
            //'last quantities' message management
            if (!allowBuyWhenOutOfStock)
            {
                if (quantityAvailable <= maxQuantityToAllowDisplayOfLastQuantityMessage)
                    $('#last_quantities').show('slow');
                else
                    $('#last_quantities').hide('slow');
            }
     
            if (quantitiesDisplayAllowed)
            {
                $('#pQuantityAvailable:hidden').show('slow');
                $('#quantityAvailable').text(quantityAvailable);
     
                if (quantityAvailable < 2) // we have 1 or less product in stock and need to show "item" instead of "items"
                {
                    $('#quantityAvailableTxt').show();
                    $('#quantityAvailableTxtMultiple').hide();
                }
                else
                {
                    $('#quantityAvailableTxt').hide();
                    $('#quantityAvailableTxtMultiple').show();
                }
            }
        }
        else
        {
            //show the hook out of stock
            if (productAvailableForOrder == 1)
            {
                $('#oosHook').show();
                if ($('#oosHook').length > 0 && function_exists('oosHookJsCode'))
                    oosHookJsCode();
            }
     
            //hide 'last quantities' message if it was previously visible
            $('#last_quantities:visible').hide('slow');
     
            //hide the quantity of pieces if it was previously visible
            $('#pQuantityAvailable:visible').hide('slow');
     
            //hide the choice of quantities
            if (!allowBuyWhenOutOfStock)
                $('#quantity_wanted_p:visible').hide('slow');
     
            //display that the product is unavailable with theses attributes
            if (!selectedCombination['unavailable'])
                $('#availability_value').text(doesntExistNoMore + (globalQuantity > 0 ? ' ' + doesntExistNoMoreBut : '')).addClass('warning_inline');
            else
            {
                $('#availability_value').text(doesntExist).addClass('warning_inline');
                $('#oosHook').hide();
            }
            $('#availability_statut:hidden').show();
     
     
            //show the 'add to cart' button ONLY IF it's possible to buy when out of stock AND if it was previously invisible
            if (allowBuyWhenOutOfStock && !selectedCombination['unavailable'] && productAvailableForOrder == 1)
            {
                $('#add_to_cart:hidden').fadeIn(600);
     
                if (availableLaterValue != '')
                {
                    $('#availability_value').text(availableLaterValue);
                    $('p#availability_statut:hidden').show('slow');
                }
                else
                    $('p#availability_statut:visible').hide('slow');
            }
            else
            {
                $('#add_to_cart:visible').fadeOut(600);
                $('p#availability_statut:hidden').show('slow');
            }
     
            if (productAvailableForOrder == 0)
                $('p#availability_statut:visible').hide();
        }
     
        if (selectedCombination['reference'] || productReference)
        {
            if (selectedCombination['reference'])
                $('#product_reference span').text(selectedCombination['reference']);
            else if (productReference)
                $('#product_reference span').text(productReference);
            $('#product_reference:hidden').show('slow');
        }
        else
            $('#product_reference:visible').hide('slow');
     
        //update display of the the prices in relation to tax, discount, ecotax, and currency criteria
        if (!selectedCombination['unavailable'] && productShowPrice == 1)
        {
            // retrieve price without group_reduction in order to compute the group reduction after
            // the specific price discount (done in the JS in order to keep backward compatibility)
            if (!displayPrice && !noTaxForThisProduct)
            {
                var priceTaxExclWithoutGroupReduction = ps_round(productPriceTaxExcluded, 6) * (1 / group_reduction);
            } else {
                var priceTaxExclWithoutGroupReduction = ps_round(productPriceTaxExcluded, 6) * (1 / group_reduction);
            }
            var combination_add_price = selectedCombination['price'] * group_reduction;
     
            var tax = (taxRate / 100) + 1;
            var taxExclPrice = (specific_price ? (specific_currency ? specific_price : specific_price * currencyRate) : priceTaxExclWithoutGroupReduction) + selectedCombination['price'] * currencyRate;
     
     
            if (specific_price)
                var productPriceWithoutReduction = priceTaxExclWithoutGroupReduction + selectedCombination['price'] * currencyRate;
     
            if (!displayPrice && !noTaxForThisProduct)
            {
                var productPrice = taxExclPrice * tax;
                if (specific_price)
                    productPriceWithoutReduction = ps_round(productPriceWithoutReduction * tax, 2);
            }
            else
            {
                var productPrice = ps_round(taxExclPrice, 2);
                if (specific_price)
                    productPriceWithoutReduction = ps_round(productPriceWithoutReduction, 2);
            }
     
            var reduction = 0;
            if (reduction_price || reduction_percent)
            {
                reduction = productPrice * (parseFloat(reduction_percent) / 100) + reduction_price;
                if (reduction_price && (displayPrice || noTaxForThisProduct))
                reduction = ps_round(reduction / tax, 6);
            }
     
            if (!specific_price)
                productPriceWithoutReduction = productPrice * group_reduction;
     
     
            productPrice -= reduction;
            var tmp = productPrice * group_reduction;
            productPrice = ps_round(productPrice * group_reduction, 2);
     
            var ecotaxAmount = !displayPrice ? ps_round(selectedCombination['ecotax'] * (1 + ecotaxTax_rate / 100), 2) : selectedCombination['ecotax'];
            productPrice += ecotaxAmount;
            productPriceWithoutReduction += ecotaxAmount;
     
            if (productPrice > 0)
                $('#our_price_display').text(formatCurrency(productPrice, currencyFormat, currencySign, currencyBlank));
            else
                $('#our_price_display').text(formatCurrency(0, currencyFormat, currencySign, currencyBlank));
     
            $('#old_price_display').text(formatCurrency(productPriceWithoutReduction, currencyFormat, currencySign, currencyBlank));
     
            /* Special feature: "Display product price tax excluded on product page" */
            if (!noTaxForThisProduct)
                var productPricePretaxed = productPrice / tax;
            else
                var productPricePretaxed = productPrice;
            $('#pretaxe_price_display').text(formatCurrency(productPricePretaxed, currencyFormat, currencySign, currencyBlank));
            /* Unit price */
            productUnitPriceRatio = parseFloat(productUnitPriceRatio);
            if (productUnitPriceRatio > 0 )
            {
                newUnitPrice = (productPrice / parseFloat(productUnitPriceRatio)) + selectedCombination['unit_price'];
                $('#unit_price_display').text(formatCurrency(newUnitPrice, currencyFormat, currencySign, currencyBlank));
            }
     
            /* Ecotax */
            var ecotaxAmount = !displayPrice ? ps_round(selectedCombination['ecotax'] * (1 + ecotaxTax_rate / 100), 2) : selectedCombination['ecotax'];
            $('#ecotax_price_display').text(formatCurrency(ecotaxAmount, currencyFormat, currencySign, currencyBlank));
        }
    }
     
    //update display of the large image
    function displayImage(domAAroundImgThumb)
    {
        if (domAAroundImgThumb.attr('href'))
        {
            var newSrc = domAAroundImgThumb.attr('href').replace('thickbox','large');
            if ($('#bigpic').attr('src') != newSrc)
            {
                $('#bigpic').fadeOut('fast', function(){
                    $(this).attr('src', newSrc).show();
                    if (typeof(jqZoomEnabled) != 'undefined' && jqZoomEnabled)
                        $(this).attr('alt', domAAroundImgThumb.attr('href'));
                });
            }
            $('#views_block li a').removeClass('shown');
            $(domAAroundImgThumb).addClass('shown');
        }
    }
     
    // Serialscroll exclude option bug ?
    function serialScrollFixLock(event, targeted, scrolled, items, position)
    {
        serialScrollNbImages = $('#thumbs_list li:visible').length;
        serialScrollNbImagesDisplayed = 3;
     
        var leftArrow = position == 0 ? true : false;
        var rightArrow = position + serialScrollNbImagesDisplayed >= serialScrollNbImages ? true : false;
     
        $('a#view_scroll_left').css('cursor', leftArrow ? 'default' : 'pointer').css('display', leftArrow ? 'none' : 'block').fadeTo(0, leftArrow ? 0 : 1);
        $('a#view_scroll_right').css('cursor', rightArrow ? 'default' : 'pointer').fadeTo(0, rightArrow ? 0 : 1).css('display', rightArrow ? 'none' : 'block');
        return true;
    }
     
    // Change the current product images regarding the combination selected
    function refreshProductImages(id_product_attribute)
    {
        $('#thumbs_list_frame').scrollTo('li:eq(0)', 700, {axis:'x'});
        $('#thumbs_list li').hide();
        id_product_attribute = parseInt(id_product_attribute);
     
        if (typeof(combinationImages) != 'undefined' && typeof(combinationImages[id_product_attribute]) != 'undefined')
        {
            for (var i = 0; i < combinationImages[id_product_attribute].length; i++)
                $('#thumbnail_' + parseInt(combinationImages[id_product_attribute][i])).show();
        }
        if (i > 0)
        {
            var thumb_width = $('#thumbs_list_frame >li').width()+parseInt($('#thumbs_list_frame >li').css('marginRight'));
            $('#thumbs_list_frame').width((parseInt((thumb_width)* i) + 3) + 'px'); //  Bug IE6, needs 3 pixels more ?
        }
        else
        {
            $('#thumbnail_' + idDefaultImage).show();
            displayImage($('#thumbnail_'+ idDefaultImage +' a'));
        }
        $('#thumbs_list').trigger('goto', 0);
        serialScrollFixLock('', '', '', '', 0);// SerialScroll Bug on goto 0 ?
    }
     
    //To do after loading HTML
    $(document).ready(function()
    {
        // trigger click on the product attribute combination
        getCombinationById($('#ipa_customization').val());
     
        //init the serialScroll for thumbs
        $('#thumbs_list').serialScroll({
            items:'li:visible',
            prev:'a#view_scroll_left',
            next:'a#view_scroll_right',
            axis:'x',
            offset:0,
            start:0,
            stop:true,
            onBefore:serialScrollFixLock,
            duration:700,
            step: 2,
            lazy: true,
            lock: false,
            force:false,
            cycle:false
        });
     
        $('#thumbs_list').trigger('goto', 1);// SerialScroll Bug on goto 0 ?
        $('#thumbs_list').trigger('goto', 0);
     
        //hover 'other views' images management
        $('#views_block li a').hover(
            function(){displayImage($(this));},
            function(){}
        );
     
        //set jqZoom parameters if needed
        if (typeof(jqZoomEnabled) != 'undefined' && jqZoomEnabled)
        {
            $('img.jqzoom').jqueryzoom({
                xzoom: 200, //zooming div default width(default width value is 200)
                yzoom: 200, //zooming div default width(default height value is 200)
                offset: 21 //zooming div default offset(default offset value is 10)
                //position: "right" //zooming div position(default position value is "right")
            });
        }
     
        //add a link on the span 'view full size' and on the big image
        $('span#view_full_size, div#image-block img').click(function(){
            $('#views_block li a.shown').click();
        });
     
        //catch the click on the "more infos" button at the top of the page
        $('div#short_description_block p a.button').click(function(){
            $('#more_info_tab_more_info').click();
            $.scrollTo( '#more_info_tabs', 1200 );
        });
     
        // Hide the customization submit button and display some message
        $('p#customizedDatas input').click(function() {
            $('p#customizedDatas input').hide();
            $('#ajax-loader').fadeIn();
            $('p#customizedDatas').append(uploading_in_progress);
        });
     
        //init the price in relation of the selected attributes
        if (typeof productHasAttributes != 'undefined' && productHasAttributes)
            findCombination(true);
        else if (typeof productHasAttributes != 'undefined' && !productHasAttributes)
            refreshProductImages(0);
       
        if (typeof productHasAttributes != 'undefined' && !productHasAttributes && productAvailableForOrder == 1 && !quantityAvailable)
        {
            $('#oosHook').show();
            if ($('#oosHook').length > 0 && function_exists('oosHookJsCode'))
                oosHookJsCode();
        }
     
        $('a#resetImages').click(function() {
            updateColorSelect(0);
        });
     
        $('.thickbox').fancybox({
            'hideOnContentClick': true,
            'transitionIn'    : 'elastic',
            'transitionOut'    : 'elastic'
        });
    });
     
    function saveCustomization()
    {
        $('#quantityBackup').val($('#quantity_wanted').val());
        customAction = $('#customizationForm').attr('action');
        $('body select[id^="group_"]').each(function() {
            customAction = customAction.replace(new RegExp(this.id + '=\\d+'), this.id +'='+this.value);
        });
        $('#customizationForm').attr('action', customAction);
        $('#customizationForm').submit();
    }
     
    function submitPublishProduct(url, redirect)
    {
        var id_product = $('#admin-action-product-id').val();
     
        $.ajaxSetup({async: false});
        $.post(url+'/ajax.php', { submitPublishProduct: '1', id_product: id_product, status: 1, redirect: redirect },
            function(data)
            {
                if (data.indexOf('error') === -1)
                    document.location.href = data;
            }
        );
     
        return true;
    }
     
    function checkMinimalQuantity(minimal_quantity)
    {
        if ($('#quantity_wanted').val() < minimal_quantity)
        {
            $('#quantity_wanted').css('border', '1px solid red');
            $('#minimal_quantity_wanted_p').css('color', 'red');
        }
        else
        {
            $('#quantity_wanted').css('border', '1px solid #BDC2C9');
            $('#minimal_quantity_wanted_p').css('color', '#374853');
        }
    }
     
    function getCombinationById(id_combination)
    {
        passed = false;
        $.each(combinations, function(key, value)
        {
            if (value['idCombination'] == id_combination)
            {
                passed = true;
                selectedCombination = value;
                $.each(value['idsAttributes'], function(key, value){
                    $('#attributes select option[value='+value+']').attr('selected','selected');
                })
            }
        })
        if (passed)
        {
            refreshProductImages(id_combination);
            $('#wrapResetImages').show('slow');
        }
    }
     
  6. dev99

    dev99 Постоялец

    Регистр.:
    2 июл 2007
    Сообщения:
    82
    Симпатии:
    57
    Мой предыдущий вопрос был немного о другом...

    Посмотрим на примере http://demo-store.prestashop.com/en/electronics/30-ipad.html
    Есть 3 селектора:
    1) Color = White, Black
    2) Model = 16Gb, 32Gb, 64Gb
    3) Options = WiFi, WiFi+3G

    Предположим, не существует комбинации:
    White - 64Gb - WiFi+3G

    То, при выборе второго селектора в положение 64Gb - какой селектор ставить в disabled?
    По и идее, надо скрыть WiFi+3G?

    А если сначала выбираем, WiFi+3G?
    Скрываем 64Gb или White?
     
    Absolute нравится это.
  7. Absolute

    Absolute Крокодил ;)

    Регистр.:
    9 авг 2009
    Сообщения:
    340
    Симпатии:
    162
    Не то и не другое скрывать не надо т.к. остаются вероятные комбинации... Если после того как выбрали White, мы выбрали 64Gb, то WiFi+3G - нужно скрыть ...и наоборот
     
  8. dev99

    dev99 Постоялец

    Регистр.:
    2 июл 2007
    Сообщения:
    82
    Симпатии:
    57
    По-умолчанию White выбрано! Вообще, по-умолчанию в каждом селекторе выбрана первая опция!

    Чисто гипотетически, может так быть, что первая же комбинация может отсутствовать! (Например, если б небыло комбинации White - 16Gb - WiFi)
     
    Absolute нравится это.
  9. Absolute

    Absolute Крокодил ;)

    Регистр.:
    9 авг 2009
    Сообщения:
    340
    Симпатии:
    162
    Если в престе создана какая-либо комбинация, то считается, что она есть и ставится какая именно будет по умолчанию из админки. Поэтому комбинация загружаемая по умолчанию отсутствовать не может.
    Если у нас стоит White по умолчание в первом селекторе, то все option в остальных селкторах будут включены (при отсутствующей White - 64Gb - WiFi+3G) , но если мы выбрали WiFi+3G, то 64Gb - disabled, а если сначала выбрали 64Gb, то WiFi+3G - disabled.
     
  10. dev99

    dev99 Постоялец

    Регистр.:
    2 июл 2007
    Сообщения:
    82
    Симпатии:
    57
    Ok, тогда код будет следующим:
    Код:
    $(function(){
     
      var groupIds=new Array();
      $('select[id^="group_"]').each(function(){
        groupIds.push(this.id);
      });
      var allCombinations=new Array();
      $.each(combinations,function(key,combination){
        allCombinations.push(combination['idsAttributes']);
      });
     
      $('select[id^="group_"]').change(function(){checkCombination()});
      checkCombination();
     
      function checkCombination()
      {
        $('select[id^="group_"] option').removeAttr('disabled');
        $.each(groupIds,function(key,groupId){
          var this_select=$('select[id='+groupId+']');
          this_select.children('option').each(function(){
            if(this_select.val()!=this.value){
              var combination=new Array();
              combination[key]=this.value;
              $.each(groupIds,function(key2,groupId2){
                if(key!=key2){
                  combination[key2]=$('select[id='+groupId2+']').val();
                }
              });
              var position=-1;
              $.each(allCombinations,function(key1,theCombination){
                if(position==-1){
                  position=key1;
                  $.each(theCombination,function(key2,value){
                    if(combination[key2]!=value)position=-1;
                  });
                }
              });
              if(position<0)
              {
                this_select.children('option[value='+this.value+']').attr('disabled','disabled');
              }
            }
          });
        });
      }
     
    });

    -- это не надо делать... я посмотрел - все комбинации добаляются функцией addCombination в массиве combinations (с другими данными), я их скопировал для дальнейшего удобства сравнения в массив allCombinations.
     
    voulge и Absolute нравится это.