Разный тип данных для одной и той же характеристики На рассмотрении

1

Долго думал как это объяснить и... так и не придумал. Пойду простым путём и попытаюсь объяснить на примере дефолтной темы.

В шаблоне product.html в пользовательской функции _render_sku_features есть условие:

{if is_array($_feature_value)}

Одна и та же характеристика типа "цвет" является массивом(объектом) у обычных товаров и товаров с выбором характеристик. Но если товар с выбором артикулов, то $_feature_value становится обычной строкой. На дефолтной теме разницы не будет никакой. Но если в теме эта часть кастомизируется, то эта кастомизация перестанет работать у товаров с выбором артикулов.

Один из простых примеров такой кастомизации:

{if is_array($f_value)}
	{if $features[$f_code].type == 'color'}
		{foreach $f_value as $color}
			<div class="tab-chars__color-item">
				<div class="color-text">
					<div class="c-color{if $color->code eq 16777215} c-color_white{/if}" style="{$color->style}"></div>
					<div class="color-text__text">{$color->value}</div>
				</div>
			</div>
		{/foreach}
	{else}
		{implode(', ', $f_value)}
	{/if}
{else}
	{$f_value}
{/if}

5 комментариев

  • +1
    Anton F Anton F 1 августа 2021 22:00 #

    Преобразовывать одиночные значения в массив:

    {if $features[$f_code].type == 'color'}
        {if !is_array($f_value)}
            {$f_value = [$f_value]}
        {/if}
        {foreach $f_value as $_color}
            <div class="tab-chars__color-item">
                <div class="color-text">
                    <div class="c-color{if $_color->code eq 16777215} c-color_white{/if}" style="{$_color->style}"></div>
                    <div class="color-text__text">{$_color->value}</div>
                </div>
            </div>
        {/foreach}
    {else}
        {if is_array($f_value)}
            {$f_value = implode(', ', $f_value)}
        {/if}
        {$f_value}
    {/if}

    либо сделать вывод значений функцией:

    {function name="render_feature_color" _color=null}
        <div class="tab-chars__color-item">
            <div class="color-text">
                <div class="c-color{if $_color->code eq 16777215} c-color_white{/if}" style="{$_color->style}"></div>
                <div class="color-text__text">{$_color->value}</div>
            </div>
        </div>
    {/function}

  • +1
    Евгений Леман Евгений Леман 2 августа 2021 01:31 #

    Я как в эту часть лезу, так часами пытаюсь разобраться. В общем ошибки тут никакой нет. Есть некое неудобство, но вряд ли это будут считать ошибкой. Ибо логика в этом есть. Для товара($product.features) цвет всегда выводится массивом. Даже если он один:

    А для артикула($product.skus.features) иначе:

    И без того запутанная система вызвала еще больше путаницы.

    • +1
      Anton F Anton F 2 августа 2021 18:23 #

      все правильно: у SKU может быть только один цвет, а у товара(т.е. группы SKU) - несколько

    • +1
      Михаил Ушенин Михаил Ушенин Webasyst 2 августа 2021 06:48 #

      Почему вы считаете это ошибкой? Разве что неудобство для разработчика темы дизайна.

      • +1
        Евгений Леман Евгений Леман 2 августа 2021 14:14 #

        При первой публикации не до конца разобрался. И в комментарии выше всё дополнил и скорректировал. Да, это трудно назвать ошибкой. Это неудобство всё же можно обойти при работе. Но всё же когда один и тот же результат выводится разным способом, это не совсем правильно.

        Добавить комментарий

        Чтобы добавить комментарий, зарегистрируйтесь или войдите