Связанные атрибуты

Автор kulich, 28 сентября 2013, 19:53:03

« назад - далее »

kdvbpspr

Верим, надеемся, ждём!!!

kdvbpspr

#31
Подскажите пожалуйста...
Хочу связать атрибуты по цвету и размерам.
Изменил function findCombination(firstTime) в product.js для 1.6, по образу и подобию как у Вас для 1.5.

Сейчас URL генерируется, как я думаю, правильно, т.е. отображается ближайшая правильная комбинация.
Однако не происходит изменений в списке атрибутов по размерам, отображается старый вариант, хотя в URL уже новый...
По цвету то же самое...

На, что следует обратить внимание, чтобы в атрибутах также происходили изменения?

Sykoku

#32
http://market-stamp.com/ru/numbererauto/67-5756.html

Уже работает (с ошибками), но еще не обновляет список параметров на экране (в строке URL меняет)

UpdateDisplay не работает как надо.

kdvbpspr

#33
Нашёл интересную особенность.
Файл product.tpl
В версии 1.5 было так
<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>


Сейчас в 1.6 имеем
<select name="{$groupName}" id="group_{$id_attribute_group|intval}" class="form-control attribute_select no-print">
{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:'html':'UTF-8'}">{$group_attribute|escape:'html':'UTF-8'}</option>
{/foreach}
</select>


Если в 1.6 изменить class="form-control attribute_select no-print">
на class="attribute_select no-print">
то в принципе размер изменяется, при изменении цвета...

Теперь бы ещё в обратном направлении при выборе размера изменять цвет, если искомой комбинации нет,
уже было бы хорошо...

Sykoku

#34
Есть свойство:
<p id="availability_statut"{if ($product->quantity <= 0 && !$product->available_later && $allow_oosp) || ($product->quantity > 0 && !$product->available_now) || !$product->available_for_order || $PS_CATALOG_MODE} style="display: none;"{/if}>

При его выполнении появляется надпись, что нет такого товара.

Что мешает вместо следующего блока переписать/вызвать другой стиль?


Дальше, где идут параметры:

<div class="attribute_list">
{if ($group.group_type == 'select')}


<select[b] {if ($group.attributes|@count < 2)} disabled {/if}[/b] name="{$groupName}" id="group_{$id_attribute_group|intval}" {if ($group.attributes|@count > 1)} class="form-control attribute_select no-print" {/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:'html':'UTF-8'}">{$group_attribute|escape:'html':'UTF-8'}</option>
{/foreach}
</select>

Жирным - добавочка.

Стиль описать не забудьте.

И здесь же можно добавить проверку на вышеописанное условие - подставляем свой стиль, что все стало блекло-серым.

Sykoku

Родная версия 6-ки, без ошибок (вставлены проверки на существование массивов и 1 объявлен - красавцы !).
Может кому нужна.
Только есть странность: порядок атрибутов скачет после "#" как хочет - то в начале строки, то в конце...


Чуть позже будет измененная

kdvbpspr

#36
При выборе размера мне нужно перерисовать Color(квадраты с цветами), а именно (вариант когда для выбранного размера текущий цвет не подходит и нужно обрисовать рамкой ближайший по релевантности цвет)
Например указан красный цвет для 6-го размера. Я выбираю из списка 7-ой размер, соответственно для него нет такого цвета, а ближайший с данным размером это чёрный.

При выборе размера из списка генерируется следующее событие:
$(document).on('change', '.attribute_select', function(e){
e.preventDefault();
findCombination();
getProductAttribute();
});

Подскажите где этот момент лучше реализовать? Возможно, он уже реализован?

Sykoku

А зачем? При смене комбинации выбирается новая с наиболее близкими атрибутами. Если там не будет красного цвета, выберется первый попавшийся. Специально для этого ничего делать будет не надо. Если же хочется найти какое-то подобие, то в условиях подбора комбинации (findCombination) надо будет вставлять дополнительную проверку на цвет и для нее брать не точное соответствие, а минимальное расстояние. Только это уже второй цикл: сначала найти нужные комбинации, а потом пробежаться по доп. признакам с таким расстоянием. Найденный код для мин. расстояния и будет искомым.

kdvbpspr

#38
Возможно у меня как то не так отрабатывает function checkUrl
Вобщем вот таким образом при смене атрибута у меня подсвечивается цвет из URL-а
$(document).on('change', '.attribute_select', function(e){
e.preventDefault();
findCombination();
getProductAttribute();
$('.color_pick').removeClass('selected');
$('.color_pick').parent().parent().children().removeClass('selected');
url = window.location + '';
params = url.substring(url.indexOf('#') + 1, url.length);
tabParams = params.split('/');
tabValues = [];
if (tabParams[0] == '')
tabParams.shift();
for (var i in tabParams)
tabValues.push(tabParams[i].split('-'));


for (var z in tabValues)
for (var a in attributesCombinations)
if (attributesCombinations[a]['group'] === decodeURIComponent(tabValues[z][0])
&& attributesCombinations[a]['attribute'] === tabValues[z][1])
{
$('#color_' + attributesCombinations[a]['id_attribute']).addClass('selected');
$('#color_' + attributesCombinations[a]['id_attribute']).parent().addClass('selected');
}
});

Теперь хочется, чтобы при выборе определённого размера отображались только те цвета, для которых он присутствует...
Подскажите как лучше это реализовать?         

Sykoku

Да не здесь это делается.

Здесь переводится текущая комбинация в код после #

Поиск комбинаций выполняется в FindCombination

Sykoku

Уже работает, но почему-то не перерисовывает все атрибуты заново. При этом, если навести курсор на нужный объект, его значение меняется. Строчка URL правильная.

Ищу.

kdvbpspr

#41
Спасибо за проделанную работу!!!
Удивительное дело. Вроде одна версия Prestashop 1.6.
Однако для разных тем файл product.js тоже разный.

И если этот вариант работает с темой default-bootstrap

То категорически отказывается работать с темой 01premium

Я в замешательстве...

Sykoku

Просто я, когда вносил дополнения, вводил несколько глобальных переменных. Дефолтная схема "слямзила" мои ухищрения, до конца их не осознав. Отсюда и полезли ошибки - в основном попытки обращения к тому, чего нет. Как это реализовано у других - отдельная история. Я, например, уже нашел пару ляпов в стандартной отрисовке product.tpl : selected присваивается набору по умолчанию, а не выбранному. А это значит, что при попытке обновить страницу с полным набором атрибутов после # получим... ПРАВИЛЬНО - комбинацию по умолчанию.

kdvbpspr

#43
Вот такая ошибка сейчас при выборе любого атрибута

ReferenceError: combinations is not defined
$('#idCombination').val(combinations[0]['idCombination']);


product.js (строка 53)

Как правильно исправить?

Sykoku

Не выбрана комбинация по умолчанию (или у товара их вообще нет ни одной). Эта ошибка будет не единственной.

Стандартная проверка на существование:

   if ((combinations != undefined) && (combinations))  {}