Да, получилось, проблема была в следующем:
{* Многомерные комплектации *}
<span class="pname">{$product.offer_caption|default:'Комплектация'}</span>
{* Подгрузим у многомерных комплектаций фото к их вариантам *}
{$product->fillMultiOffersPhotos()}
{* Переберём доступные многомерные комплектации *}
<div class="multiOffers">
{foreach $product.multioffers.levels as $level}
{if !empty($level.values)}
<div class="title">{if $level.title}{$level.title}{else}{$level.prop_title}{/if}</div>
====> {if !$level.is_photo && !isset($level.values_photos)} {* Если отображать не как фото (выпадающим списком)*}
<select name="multioffers[{$level.prop_id}]" data-prop-title="{if $level.title}{$level.title}{else}{$level.prop_title}{/if}">
{foreach $level.values as $value}
<option value="{$value.val_str}">{$value.val_str}</option>
{/foreach}
</select>
{else} {* Как фото *}
<div class="multiOfferValues">
<input type="hidden" name="multioffers[{$level.prop_id}]" data-prop-title="{if $level.title}{$level.title}{else}{$level.prop_title}{/if}"/>
{foreach $level.values as $value}
{if isset($level.values_photos[$value.val_str])}
<a class="multiOfferValueBlock {if $value@first}sel{/if}" data-value="{$value.val_str}" data-image="{$level.values_photos[$value.val_str]->getUrl(310,310,'axy')}" data-is-dialog="1" title="{$value.val_str}"><img src="{$level.values_photos[$value.val_str]->getUrl(30,30,'axy')}"/></a>
{else}
<a class="multiOfferValueBlock likeString {if $value@first}sel{/if}" data-value="{$value.val_str}" data-is-dialog="1" title="{$value.val_str}">{$value.val_str}</a>
{/if}
{/foreach}
</div>
{/if}
{/if}
{/foreach}
</div>
{if $product->isOffersUse()}
{foreach from=$product.offers.items key=key item=offer name=offers}
<input value="{$key}" type="hidden" name="hidden_offers" class="hidden_offers" {if $smarty.foreach.offers.first}checked{/if} id="offer_{$key}" data-info='{$offer->getPropertiesJson()}' {if $check_quantity}data-num="{$offer.num}"{/if} data-change-cost='{ ".offerBarcode": "{$offer.barcode|default:$product.barcode}", ".myCost": "{$product->getCost(null, $key)}", ".lastPrice": "{$product->getOldCost($key)}"}' data-images='{$offer->getPhotosJson()}' data-sticks='{$offer->getStickJson()}'/>
{/foreach}
<input type="hidden" name="offer" value="0"/>
{/if}
Где стрелка - там показывается комплектация цвет, а называется фото. Хотя у вас в документации http://readyscript.ru/dev-manual/dev_co … v_code_var написано:
Имя переменной должно отражать суть её содержимого.
Я не был в курсе, что photo - это цвет, а наш макет не подразумевает фотографий в месте смены комплектаций (у нас просто квадраты), и поэтому, в первый раз, я сделал вот так:
<div class="multiOffers">
{foreach $product.multioffers.levels as $level}
{if !empty($level.values) && $level.title != 'Цвет'}
<div class="multiofferTitle">{if $level.title}{$level.title}{else}{$level.prop_title}{/if}</div>
{if !$level.is_photo && !isset($level.values_photos)} {* Если отображать не как фото (выпадающим списком)*}
<select name="multioffers[{$level.prop_id}]" data-prop-title="{if $level.title}{$level.title}{else}{$level.prop_title}{/if}">
{foreach $level.values as $value}
<option value="{$value.val_str}">{$value.val_str}</option>
{/foreach}
</select>
<div class="multiofferBlock multiofferBlock{$level.prop_id}">
{foreach $level.values as $value key=i}
<div class="moItem{if $i == 1} active{/if}"><div class="moItemInner">{$value.val_str}</div></div>
{/foreach}
</div>
<div class="clearfix"></div>
{else}
<div class="multiOfferValues">
<input type="hidden" name="multioffers[{$level.prop_id}]" data-prop-title="{if $level.title}{$level.title}{else}{$level.prop_title}{/if}"/>
{foreach $level.values as $value}
{if isset($level.values_photos[$value.val_str])}
<a class="multiOfferValueBlock {if $value@first}sel{/if}" data-value="{$value.val_str}" title="{$value.val_str}"><img src="{$level.values_photos[$value.val_str]->getUrl(40,40,'axy')}"/></a>
{else}
<a class="multiOfferValueBlock likeString {if $value@first}sel{/if}" data-value="{$value.val_str}" title="{$value.val_str}">{$value.val_str}</a>
{/if}
{/foreach}
</div>
{/if}
{else if !empty($level.values) && $level.title == 'Цвет'}
<div class="multiofferTitle">{if $level.title}{$level.title}{else}{$level.prop_title}{/if}</div>
<select name="multioffers[{$level.prop_id}]" data-prop-title="{if $level.title}{$level.title}{else}{$level.prop_title}{/if}">
{foreach $level.values as $value}
<option value="{$value.val_str}">{$value.val_str}</option>
{/foreach}
</select>
<div class="multiofferBlock multiofferBlock{$level.prop_id}">
{foreach $level.values as $value key=i}
<div class="moItem{if $i == 1} active{/if}"><div class="moItemInner" style="background-color:#fff;background-image: linear-gradient( -45deg, {$colors.colors[$value.val_str].color2} 0%, {$colors.colors[$value.val_str].color2} 50%, {$colors.colors[$value.val_str].color1} 50%, {$colors.colors[$value.val_str].color1} 50%);" title="{$value.val_str}">{$value.val_str}</div></div>
{/foreach}
</div>
<div class="clearfix"></div>
{/if}
{/foreach}
</div>
Сейчас все нормально, спасибо за подсказки.
Но с JS вы "здорово" придумали. Посмотрите на код - у меня там дублируется цикл и таким образом генерирует значение, так что мне его не нужно получать, оно априори есть в $(this). В итоге - это было последнее, исправление. Поменял обратно на prev(), тк как closest() начистую отказался работать.
Кстати, а чем вас prev() не устраивает? По-моему, хороший метод. Сам не проверял, но по логике, должен работать в разы быстрее чем closest() так как объекты на prev и next у каждого объекта jquery при инициализации прописываются.
Скажите, а предусмотрена ли (или может в планах) такая вещь, как скрытие пустых комплектаций (с 0 остатком)? Чтобы при смене, например, цвета, менялся и список остальных свойств, в зависимости от наличия на складе.
И еще вопрос - у вас в демках и в моей теме тоже остатки отображаются стиками, индикатором, возможно ли как то быстро отказаться от этой системы, и выводить остатки обычным числом?