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

Absolute

Крокодил ;)
Регистрация
9 Авг 2009
Сообщения
581
Реакции
456
Допустим, есть 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
 
А где хранятся эти 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!
 
А где хранятся эти 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!
Спасибо. Ваш код работает для данного конкретного товара.

Вот только как его приспособить для всего движка, если селектов может быть 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 количество?
 
А точно селекторов может быть больше 2 ? Тогда как контролировать, которые опции скрывать в других селекторах - по первому ?
В общем, посмотрю исходник Престы...
 
А точно селекторов может быть больше 2 ?
В общем, посмотрю исходник Престы...
Да может быть селектов несколько. Я смотрел на оф.форуме - Американцы тоже голову ломают, пока так ничего и не придумали.
Контролировать по отсутствию комбинации
напримере из моего верхнего поста, отсутствующая комбинация вот:
Код:
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');
    }
}
 
Мой предыдущий вопрос был немного о другом...

Посмотрим на примере Для просмотра ссылки Войди или Зарегистрируйся
Есть 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?
 
Мой предыдущий вопрос был немного о другом...

Посмотрим на примере Для просмотра ссылки Войди или Зарегистрируйся
Есть 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?
Не то и не другое скрывать не надо т.к. остаются вероятные комбинации... Если после того как выбрали White, мы выбрали 64Gb, то WiFi+3G - нужно скрыть ...и наоборот
 
Не то и не другое скрывать не надо т.к. остаются вероятные комбинации... Если после того как выбрали White, мы выбрали 64Gb, то WiFi+3G - нужно скрыть ...и наоборот
По-умолчанию White выбрано! Вообще, по-умолчанию в каждом селекторе выбрана первая опция!

Чисто гипотетически, может так быть, что первая же комбинация может отсутствовать! (Например, если б небыло комбинации White - 16Gb - WiFi)
 
По-умолчанию White выбрано! Вообще, по-умолчанию в каждом селекторе выбрана первая опция!

Чисто гипотетически, может так быть, что первая же комбинация может отсутствовать! (Например, если б небыло комбинации White - 16Gb - WiFi)
Если в престе создана какая-либо комбинация, то считается, что она есть и ставится какая именно будет по умолчанию из админки. Поэтому комбинация загружаемая по умолчанию отсутствовать не может.
Если у нас стоит White по умолчание в первом селекторе, то все option в остальных селкторах будут включены (при отсутствующей White - 64Gb - WiFi+3G) , но если мы выбрали WiFi+3G, то 64Gb - disabled, а если сначала выбрали 64Gb, то WiFi+3G - disabled.
 
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');
          }
        }
      });
    });
  }
 
});


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} );
-- это не надо делать... я посмотрел - все комбинации добаляются функцией addCombination в массиве combinations (с другими данными), я их скопировал для дальнейшего удобства сравнения в массив allCombinations.
 
Назад
Сверху