Как привязать акцию к местоположению покупателя?

Подскажите, пожалуйста, как можно привязать акцию к местоположению или геолокации покупателя?
Например, зачем покупателю из Хабаровска показывать на странице оформления заказа, что у него есть бонус в виде бесплатной курьерской доставки в пределах МКАД ?
Screenshot_42

Может это можно как то отключить для других регионов и показывать только для Москвы?

1 лайк

как вариант сделать такую промоакцию

Надо расширить схему акций.

В app/schemas/promotions/schema.php после кода:

$schema['conditions']['state'] = array(
    'operators' => array ('eq', 'neq', 'in', 'nin'),
    'type' => 'input',
    'field' => '@cart.user_data.s_state',
    'zones' => array('cart')
);

Вставьте:

$schema['conditions']['city'] = array(
    'operators' => array ('eq', 'neq', 'in', 'nin'),
    'type' => 'input',
    'field' => '@cart.user_data.s_city',
    'zones' => array('cart')
);

После этого, в условиях акции появится новый параметр, в котором можно указать город:

Языковую переменную параметру можно добавить через Администрирование - Языки - Переводы.

Спасибо. Помогло.

А это не слетит при следующем обновлении?

А это не слетит при следующем обновлении?

Вряд ли, акции не обновляют уже давно, но можно перестраховаться и сделать через модуль.

Включите модуль “Мои изменения”, затем создайте файл schema.post.php в папке /app/addons/my_changes/schemas/promotions (отсутствующие папки тоже надо создать) и вставьте в файл:

<?php
$schema['conditions']['city'] = array(
	'operators' => array ('eq', 'neq', 'in', 'nin'),
	'type' => 'input',
	'field' => '@cart.user_data.s_city',
	'zones' => array('cart')
);

return $schema;

Почистите кэш.

С таким алгоритмом точно не слетит, если будет обновление.

3 лайка

Спасибо. Попробую.
Но первый способ кажется более простым.

Да, для Москвы подходит первый способ и можно не заморачиваться. Для других городов такое не подойдет, потому что код города будет действовать на весь регион.

Согласен.
Посмотрел, такой способ ещё для Питера подойдёт и, как ни странно, для Севастополя.

Зачем, если из коробки этот функционал уже имеется?

У меня последняя версия. Возможности настроить акцию для города не вижу в списке условий.
Например нужна акция для города в московской области (не для всей области, а для города).
Как сделать из коробки?

@albinoz выше уже написал как сделать. Нужно расширить схему

Это я понял, но @ecomlabs написал ,что это из коробки возможно стало. Вот и хочу узнать как. Коробочный вариант предпочтительнее всегда ели он есть и работает как надо.

Возможно, имелся ввиду индекс как условие города?

Возможно, но с индексом неудобно. У меня в чекауте например индекс совсем убран, он не нужен

Среди условий нет выбора города для акции.

image

Для Москвы и Питера можно подставить код и акция будет работать для города, но для других городов это не подойдет. Например, у Краснодара код KDA и такой же код у всех остальных населенных пунктов региона – поэтому акция будет работать только на весь регион, что и логично.

Если в коробке есть этот функционал, он настолько неочевидный, что найти его проблемно, поэтому и приходится расширять схемы.

А языковую переменную можно через модуль добавить для параметра?

У нас в подмосковном городе 12 почтовых отделейний и 12 индексов соответственно - ненадобавляешься )
поэтому спасибо @albinoz - поставил в закладки

1 лайк

Надо загрузить файл с расширением .pо, в котором прописаны переводы. Так как используется модуль “Мои изменения”, то my_changes.po уже существует.
Я добавил в нем перевод для promotion_cond_city; файл устанавливается через “Языки - Языки”, нажимаете шестеренка у нужного языка, выбираете “Обновить переводы” и загружаете файл.

my_changes.zip (744 Байта)

Но гораздо проще и лучше перевести переменную через “Языки - Переводы”.

Ясно спасибо, раз полная автоматизация невозможна через модуль, то проще менять руками переменную конечно. Модулем пожалуй отдельным сделаю а не через мои изменения. Не люблю все в один модуль пихать - в случае багов не поймешь потом где проблема, а отдельные модули можно отключать

1 лайк