В летнем обновлении до версии Shop-Script 5.1.4 появилась очень полезная возможность спрашивать только те данные пользователя, которые действительно нужны для доставки. С этим обновлением процесс оформления заказа у этого движка стал лучшим среди тех движков, за которыми я наблюдаю.
Но для точной настройки необходимо изменить все модули доставки, используемые в конкретном магазине. Каждый модуль должен возвращать список полей, которые необходимы для доставки этим конкретным способом.
В подопытном магазине у меня используется следующий порядок оформления заказа:
- Контактная информация и страна с регионом
- Имя (обязятельно)
- Фамилия (необязятельно)
- Телефон (обязательно)
- E-mail (обязательно)
- Страна (обязательно)
- Регион (обязательно)
- Способ доставки
- Способ оплаты
- Подтверждение
Соответственно для почтового отправления нужны все остальные поля адреса, для партнерских пунктов выдачи заказов город и почтовый индекс (по нему определяется город через API курьерской службы), для курьера «Курьер Санкт-Петербург в пределах КАД» только улица, дом.
Как следует из описания обновления каждый модуль может иметь метод requestedAddressFields() который возвращает массив требуемых полей адреса. К сожалению, в документации нет описания опций этого массива. Пришлось покопаться и поэкспериментировать. Вот что получилось. Массив возвращаемых значений содержит массивы, в качестве ключей — название поля. Поля могут быть только из адреса, т.е. принудительно спросить фамилию не получится :(. Поддерживаются следующие поля адреса: country, region, city, street, zip (страна, регион, город, улица/дом, индекс).
Если массив параметров поля пустой, все настройки для него будут по умолчанию, заданные в настройках магазина
1 |
array('city' => array()); |
В качестве значения ключа тоже ассоциативный массив, который может содержать следующие ключи:
- cost — поле используется для расчета доставки
- required — поле обязательно для заполнения, независимо от глобальных настроек магазина. может быть true или false
- hidden — скрытое поле. Не будет показано пользователю, но значение его будет передано для обработки
- value — значение поля. Можно принудительно указывать какое-то значение для скрытого поля.
Например в штатном модуле доставки почтой России страна жестко задана:
1 |
'country' => array('hidden'=>TRUE, 'value'=>'rus', 'cost'=>TRUE); |
То есть для подопытного магазина я оставил в глобальных настройках только страну и регион, а все модули изменил, чтобы они возвращали список полей, которые необходимы для оформления заказа, с пометкой required
.
Странная логика. Имеем стандартные поля адреса и доп.поле Склад.
Чтобы исключить поле склад надо написать
public function requestedAddressFields()
{
return $this->prompt_address ? array(
‘country’ => array( ‘hidden ‘=> true ),
‘zip’ => array( ‘hidden ‘=> true ),
‘region’ => array( ‘hidden ‘=> true ),
‘city’ => array( ‘hidden ‘=> true ),
‘street’ => array( ‘hidden ‘=> true ),
) : false;
Т.е. не склад прячем, а поля адреса «прячем»
Я вообще оставил только страну и регион, а стандартные и свои модули изменил так, чтобы они спрашивали остальные нужные им поля. Увы, многие отделения почты требуют отчество получателя, пришлось и такое поле добавить :-)
Однако, если покупателю не предлагается указать значение для какого-то поля адреса, можно задать некоторое