Автор Тема: Связанные атрибуты  (Прочитано 6810 раз)

01 Июль 2014, 11:05:34
Ответ #30
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Верим, надеемся, ждём!!!
03 Июль 2014, 12:30:03
Ответ #31
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Подскажите пожалуйста...
Хочу связать атрибуты по цвету и размерам.
Изменил function findCombination(firstTime) в product.js для 1.6, по образу и подобию как у Вас для 1.5.

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

На, что следует обратить внимание, чтобы в атрибутах также происходили изменения?
03 Июль 2014, 12:40:47
Ответ #32
  • Пользователь
  • **
  • Сообщений: 75
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
http://market-stamp.com/ru/numbererauto/67-5756.html

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

UpdateDisplay не работает как надо.
03 Июль 2014, 14:52:30
Ответ #33
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Нашёл интересную особенность.
Файл 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">
то в принципе размер изменяется, при изменении цвета...

Теперь бы ещё в обратном направлении при выборе размера изменять цвет, если искомой комбинации нет,
уже было бы хорошо...
03 Июль 2014, 16:05:03
Ответ #34
  • Пользователь
  • **
  • Сообщений: 75
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Есть свойство:
<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>
Жирным - добавочка.

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

И здесь же можно добавить проверку на вышеописанное условие - подставляем свой стиль, что все стало блекло-серым.
03 Июль 2014, 16:36:59
Ответ #35
  • Пользователь
  • **
  • Сообщений: 75
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Родная версия 6-ки, без ошибок (вставлены проверки на существование массивов и 1 объявлен - красавцы !).
Может кому нужна.
Только есть странность: порядок атрибутов скачет после "#" как хочет - то в начале строки, то в конце...


Чуть позже будет измененная
03 Июль 2014, 17:29:17
Ответ #36
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
При выборе размера мне нужно перерисовать Color(квадраты с цветами), а именно (вариант когда для выбранного размера текущий цвет не подходит и нужно обрисовать рамкой ближайший по релевантности цвет)
Например указан красный цвет для 6-го размера. Я выбираю из списка 7-ой размер, соответственно для него нет такого цвета, а ближайший с данным размером это чёрный.

При выборе размера из списка генерируется следующее событие:
$(document).on('change', '.attribute_select', function(e){
e.preventDefault();
findCombination();
getProductAttribute();
});
Подскажите где этот момент лучше реализовать? Возможно, он уже реализован?
03 Июль 2014, 18:41:01
Ответ #37
  • Пользователь
  • **
  • Сообщений: 75
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
А зачем? При смене комбинации выбирается новая с наиболее близкими атрибутами. Если там не будет красного цвета, выберется первый попавшийся. Специально для этого ничего делать будет не надо. Если же хочется найти какое-то подобие, то в условиях подбора комбинации (findCombination) надо будет вставлять дополнительную проверку на цвет и для нее брать не точное соответствие, а минимальное расстояние. Только это уже второй цикл: сначала найти нужные комбинации, а потом пробежаться по доп. признакам с таким расстоянием. Найденный код для мин. расстояния и будет искомым.
04 Июль 2014, 11:54:56
Ответ #38
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Возможно у меня как то не так отрабатывает 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');
}
});
Теперь хочется, чтобы при выборе определённого размера отображались только те цвета, для которых он присутствует...
Подскажите как лучше это реализовать?         
04 Июль 2014, 13:58:21
Ответ #39
  • Пользователь
  • **
  • Сообщений: 75
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Да не здесь это делается.

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

Поиск комбинаций выполняется в FindCombination
07 Июль 2014, 13:50:32
Ответ #40
  • Пользователь
  • **
  • Сообщений: 75
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Уже работает, но почему-то не перерисовывает все атрибуты заново. При этом, если навести курсор на нужный объект, его значение меняется. Строчка URL правильная.

Ищу.
08 Июль 2014, 14:23:06
Ответ #41
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Спасибо за проделанную работу!!!
Удивительное дело. Вроде одна версия Prestashop 1.6.
Однако для разных тем файл product.js тоже разный.

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

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

Я в замешательстве...
08 Июль 2014, 15:20:25
Ответ #42
  • Пользователь
  • **
  • Сообщений: 75
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Просто я, когда вносил дополнения, вводил несколько глобальных переменных. Дефолтная схема "слямзила" мои ухищрения, до конца их не осознав. Отсюда и полезли ошибки - в основном попытки обращения к тому, чего нет. Как это реализовано у других - отдельная история. Я, например, уже нашел пару ляпов в стандартной отрисовке product.tpl : selected присваивается набору по умолчанию, а не выбранному. А это значит, что при попытке обновить страницу с полным набором атрибутов после # получим... ПРАВИЛЬНО - комбинацию по умолчанию.
08 Июль 2014, 17:20:39
Ответ #43
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вот такая ошибка сейчас при выборе любого атрибута

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

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

Как правильно исправить?
08 Июль 2014, 17:41:01
Ответ #44
  • Пользователь
  • **
  • Сообщений: 75
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Не выбрана комбинация по умолчанию (или у товара их вообще нет ни одной). Эта ошибка будет не единственной.

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

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