База знаний
Войдите в личный кабинет для возможности задавать вопросы и отвечать на комментарии.
Полезная информация

Как подменить фразу "В наличии" в зависимости от складов в теме дизайна Megashop 3.0

Поддержка Bodysite
Поддержка Bodysite
6 марта 2024 14:08
+1

Начиная с версии 1.2.0 в теме дизайна Megashop 3.0 есть возможность подменить стандартные фразы "В наличии" / "Не в наличии" на свои, в зависимости от наличия на конкретном складе.

Как это выглядит:

Как настроить?

К сожалению, текущий штатный функционал настроек темы не позволяет нам создать интуитивно понятный интерфейс, поэтому требуется ввод несложного кода.

Для данного функционала нужно создать или использовать существующий блок с id megashop.stocks_available_statuses

Напомню, что блоки создаются в разделе "Сайт" - "Блоки".

Пример готового кода блока

{capture assign='stocks_condition'}
{literal}
    {if $stocks['1'] >= 5}
        {$status = "in-stock"}
        {$text = "В магазине"}
    {elseif $stocks['1'] >= 1}
        {$status = "low"}
        {$text = "В магазине (мало)"}
    {elseif $stocks['2'] >= 1}
        {$status = "in-stock"}
        {$text = "В наличии на складе"}
    {elseif $stocks['v1'] > 10}
        {$status = "low"}
        {$text = "Предзаказ"}
    {elseif $stocks['1'] <= 0 && $stocks['2'] <= 0 && $stocks['v1'] <= 0}
        {$status = "out-of-stock"}
        {$text = "Нет в наличии"}
    {else}
        {$status = "in-stock"}
        {$text = "В наличии"}
    {/if}
{/literal}
{/capture}

{$stocks_statuses = [
    '1' => [
        'in-stock' => 'Есть',
        'low' => 'Мало',
        'critical' => 'Почти нет',
        'out-of-stock' => 'Нет'
    ],
    '2' => [
        'low' => 'Осталось {$n}',
        'out-of-stock' => 'Нет'
    ]
]}

{$wa->globals('megashop.stocks_available_statuses', ['stocks_condition' => $stocks_condition, 'stocks_statuses' => $stocks_statuses])}

Далее описание составляющих этого кода:

Подмена фразы "В наличии" / "Не в наличии" без вывода по складам:

{capture assign='stocks_condition'}
{literal}
    {if $stocks['1'] >= 5}
        {$status = "in-stock"}
        {$text = "В магазине"}
    {elseif $stocks['1'] >= 1}
        {$status = "low"}
        {$text = "В магазине (мало)"}
    {elseif $stocks['2'] >= 1}
        {$status = "in-stock"}
        {$text = "В наличии на складе"}
    {elseif $stocks['v1'] > 10}
        {$status = "low"}
        {$text = "Предзаказ"}
    {elseif $stocks['1'] <= 0 && $stocks['2'] <= 0 && $stocks['v1'] <= 0}
        {$status = "out-of-stock"}
        {$text = "Нет в наличии"}
    {else}
        {$status = "in-stock"}
        {$text = "В наличии"}
    {/if}
{/literal}
{/capture}

где: 

$stocks['n1'] - указание конкретного склада. Вместо n2/n3/n1 нужно укзать id вашего склада, пример: $stocks['1'] , $stocks['2']. Если склад виртуальный, то добавить "v", пример: $stocks['v1'].

В теле условий указать присваивание двух переменных:

  • $status - Необязательна, нужна для стилизации. В качестве значения задать одно из: 'in-stock', 'low', 'critical', 'out-of-stock', чтобы статус окрасился в соответствующий ему цвет.
  • $text - текст статуса (обязательна).

Как узнать ID склада?

К сожалению, в текущем штатном функционале складов не указывается ID складов. Для того, чтобы узнать ID нужно навести курсор на кнопку редактирования склада и посмотреть на ссылку:

Если включен вывод наличия по складам:

В том же блоке ниже добавляем код:

{$stocks_statuses = [
    'n1' => [
        'in-stock' => 'Есть',
        'low' => 'Мало',
        'critical' => 'Почти нету',
        'out-of-stock' => 'Нету'
    ],
    'n2' => [
        'low' => 'Осталось {$n}',
        'out-of-stock' => 'Нету'
    ]
]}

Это массив, у которого ключи - id складов, значения - массив вида 'статус' -> 'текст'

В конце блока обе переменные ($stocks_condition, $stocks_statuses)(или одну, если только одна) поместить в глобальную переменную, в виде массива, с ключами, совпадающими с названиями переменных:

{$wa->globals('megashop.stocks_available_statuses', ['stocks_condition' => $stocks_condition, 'stocks_statuses' => $stocks_statuses])}