Быстрый заказ может значительно облегчить шоппинг в интернет-магазине и, как следствие, повысить конверсию (конверсия сайта — соотношение итоговых реальных заказов от числа всех посетителей).
В статье рассмотрены основные принципы организации быстрого заказа товаров без регистрации, приведены иллюстрации. Это может наглядно продемонстрировать работу данного типа модулей интернет-магазинов и послужить заказчикам веб-услуг и владельцам сайтов в качестве ознакомительного экскурса. Кроме того, материал содержит пошаговую фрагментацию функционального кода, и может оказаться полезным для веб-разработчиков в практическом применении.
Давно известна закономерность: чем меньше в форме регистрации полей, тем охотнее пользователи её заполняют — тем охотнее осуществляет покупки в интернет-магазине. Не удивительно, что всё более популярной становится практика создания формы быстрого заказа на сайте, где посетитель может указать лишь необходимые данные для доставки (имя, адрес, телефон), минуя необходимость заполнения имейлов, паролей, почтовых индексов (где они не нужны) и пр. В то же время, стоит учитывать фактор физического местонахождения магазина / склада. Рационально использовать форму быстрого заказа именно в том городе, где расположен магазин с товаром (например — Москва). При этом, для жителей других городов оставить полную регистрацию, где они смогут указать почтовый индекс, способ доставки и другую необходимую информацию.
Принципы организации быстрого заказа товара без регистрации
Итак, мы определились с целями и задачами, теперь перейдем к средствам реализации. Форму быстрого заказа я писала для интернет-магазина, разработанного на движке osCommerce v.2.3 (чит. также «Тюнинг osCommerce v.2.3, или прокачка интернет-магазина для дизайнерских и seo-целей«), хотя аналогичный скрипт можно написать под любую другую CMS. По сути, всё, что нам нужно для отправки заказа товара на имейл продавца — это ID товара, который предполагается извлечь со страницы, на которой будет размещена кнопка быстрого заказа (страница товара, страница категории товаров). Задумка конструкции такова — данная кнопка «Быстрый заказ» вызывает модульное окошко, в котором пользователю предлагается следующее.
- Подтвердить локацию («Да, я из Москвы»), или опровергнуть («Нет, я НЕ из Москвы»). При опровержении, в том же окошке должно появиться извинительное сообщение и кнопка «Зарегистрироваться» — для полной регистрации на сайте. При подтверждении, переходим к пункту 2:
- Указать имя, адрес в Москве и контактный телефон. При желании, можно также отправить произвольный комментарий. После нажатия кнопки «Заказать» / «Купить», в скрипте складывается письмо с данными заказа (включая скрытый ID товара), которое отправляется на имейл администратора сайта — менеджера продаж интернет-магазина (позже менеджер может отзвониться покупателю, уточнить адрес и удобное время доставки). Покупателю выводиться сообщение: «Заказ успешно отправлен».
Рис. 1. Быстрый заказ для интернет-магазина. Кнопка быстрого заказа на странице товара. При нажатии открывается модульное окошко поверх страницы (см. рис. 2).
Рис. 2. Быстрый заказ в интернет-магазине. Опровержение локации — «Нет, я НЕ в Москве». Далее — переход к инструкции пройти полную регистрацию, заполнив все необходимые данные покупателя (рис. 3).
Рис. 3. Другой город — покупка возможна только при регистрации.
Рис. 4. Быстрый заказ для интернет-магазина без регистрации (город Москва). Переходим к форме заказа товара (рис. 5):
Рис. 5. Быстрый заказ в интернет-магазине без регистрации. Форма заказа товара.
Скрипт быстрого заказа для интернет-магазина
С интерфейсом определились, теперь пройдемся по коду для данной реализации.
У нас будет 1 основной php-файл — страница, которая будет вызываться в модульное окошко. Назовем его bistriy_zakaz_s_sayta.php. Вспомогательные функции, как то: проверка полей, брейк-тайм (время сессии — скажем, 5 мин, — в течении которого невозможно отправить заказ с того же компьютера дважды) будем использовать по аналогии с формой обратной связи, уже существующей в движке. Собственно, их мы прописывать не будем, а только вызывать. Для этого, прежде всего, запросим рабочие файлы движка:
Теперь будем проверять, получены ли данные с формы быстрого заказа (если заказ произведен). Если мы обнаруживаем наличие пересылаемых данных, производим их обработку:
//определяем, получены ли данные с формы?
//Если да, производим их обработку и складываем данные для письма:
if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'send') && isset($HTTP_POST_VARS['formid']) && isset($HTTP_POST_VARS['products_id']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
$error = false;
$name = tep_db_prepare_input($HTTP_POST_VARS['name']);
$phone_num = tep_db_prepare_input($HTTP_POST_VARS['phone']);
$adress_moscow = tep_db_prepare_input($HTTP_POST_VARS['adress_moscow']);
$prod_link = tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . tep_db_prepare_input($HTTP_POST_VARS['products_id']));
$enquiry = iconv('cp1251','utf-8','Получен заказ на товар: '). '
' . $prod_link . '
'.iconv('cp1251','utf-8','Контактное лицо (имя): ') . $name . '
'.iconv('cp1251','utf-8','Телефон: ') . $phone_num . '
'. iconv('cp1251','utf-8','Адрес в Москве: ') . $adress_moscow .'
'. iconv('cp1251','utf-8','Сообщение: ') . tep_db_prepare_input($HTTP_POST_VARS['enquiry']);
// брейк-тайм
$actionRecorder = new actionRecorder('ar_contact_us', (tep_session_is_registered('customer_id') ? $customer_id : null), $name);
if (!$actionRecorder->canPerform()) {
$error = true;
$actionRecorder->record(false);
$messageStack->add('contact', sprintf(ERROR_ACTION_RECORDER, (defined('MODULE_ACTION_RECORDER_CONTACT_US_EMAIL_MINUTES') ? (int)MODULE_ACTION_RECORDER_CONTACT_US_EMAIL_MINUTES : 5)));
}
//запрос к базе данных по id-товара (из формы отправки)
$product_info_query = tep_db_query("select p.products_id, p.products_model, p.products_image, p.products_price, p.products_tax_class_id, pd.products_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_id = '" . (int)$HTTP_POST_VARS['products_id'] . "' and p.products_status = '1' and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "'");
if ($error == false) {
//если ошибок нет, отправляем письмо:
tep_mail(STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS, iconv('cp1251','utf-8','Быстрый заказ с интернет-магазина'), $enquiry, $name, STORE_OWNER_EMAIL_ADDRESS);
$actionRecorder->record();
//устанавливаем сессию Москва, чтобы при следующем заказе не спрашивать покупателя о локации:
session_start();
$_SESSION['moscow'] = '1';
//сообщаем об успехе отправки быстрого заказа и перенаправляем на соответствующую страницу с сообщением
tep_redirect(tep_href_link('bistriy_zakaz_s_sayta.php', 'action=success'));
}
}
//завершение условия о полученных данных формы.
В противном случае, — если отправки формы быстрого заказа не производилось, — создаем запрос к базе данных для получения первоначальных сведений о товаре (картинка товара, название, цена).
Здесь нужно обратить внимание, что ID товара мы получаем в GET-переменной, которая определяется на странице товара и задается в URL для модульного окна. Если данная переменная вдруг окажется пустой, нужно, чтобы скрипт вывел ошибку (проследим это в строках 53-59).
Особой обработки потребуют такие данные, как цена, ведь товар может задействоваться в сейле. В этом случае, мы должны указать обычную цену и специальную — со скидкой. (Строки 63-67.)
else{
//если данные формы не получены, то предоставляем пустую форму быстрого заказа для заполнения
//Делаем запрос к базе данных по ID товара, полученным со страницы товара, в GET-переменных ($HTTP_GET_VARS['products_id']):
$product_info_query = tep_db_query("select p.products_id, p.products_model, p.products_image, p.products_price, p.products_tax_class_id, pd.products_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and p.products_status = '1' and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "'"); }
//проверяем, удачно ли прошел запрос к БД
if (!tep_db_num_rows($product_info_query)) {
//запрос выдал нулевой результат - переводим на страницу ошибки
tep_redirect(tep_href_link('bistriy_zakaz_error.php'));
} else {
//запрос успешен - продолжаем
$product_info = tep_db_fetch_array($product_info_query);
}
//производим обработку данных
//специальная цена (скидки)
if ($new_price = tep_get_products_special_price($product_info['products_id'])) {
$products_price = '' . $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id'])) . ' ' . $currencies->display_price($new_price, tep_get_tax_rate($product_info['products_tax_class_id'])) . '';
} else {
$products_price = $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id']));
}
?>
Далее переходим к формированию содержимого страницы, ее внешнего вида и взаимодействия с пользователем.
В шапке подключим основные стили сайта, а также js-скрипты и jquery-библиотеку.
Дополнительно, пропишем стили для двух блоков, определяющих взаимодействие с пользователем на шаге уточнения локации. Внешне это выглядит так, будто перед нами разные страницы (сравните рис. 2 и рис. 5). Но это муляж. На самом деле, в первом случае основная форма просто загорожена пластом блока, растянутым по ширине и высоте окошка.
Собственно, изначально, перед посетителем откроется блок подтверждения / опровержения города местонахождения (см. рис. 2). Класс «displaymoscow» и id #moscow. Его положение на странице зададим в стилях как абсолютное и с z-индексом 1800 над остальным содержимым страницы. (Подробнее о z-индексах и прочих фокусах с блоками читайте здесь: «Создание сайтов и целевая CSS-верстка. HTML и CSS сниппеты«.) Тот же класс (displaymoscow) используется для второго блока #moscownot, изначально скрытого на странице.
Пропишем динамику в
Быстрый заказ очков и оправ на StarOptic
Внимание! Сервис быстрого заказа доступен только для жителей Москвы. Это связано с тем, что для жителей других городов требуется более детальная информация.
Быстрый заказ очков и оправ на StarOptic
Пожалуйста, пройдите регистрацию на сайте, чтобы осуществлять покупки в нашем интернет-магазине.
Следующим шагом мы посмотрим, отправлялся ли заказ. Если да, то выводим сообщение об успешной отправке.
Быстрый заказ очков и оправ на StarOptic
size('contact') > 0) {
echo $messageStack->output('contact');
}
//если заказ отправлен, выводим сообщение об успешной отправке
if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'success')) {
?>
Заказ успешно отправлен в отдел обслуживания магазина. Наш менеджер свяжется с Вами по контактному телефону для уточнения деталей заказа и времени доставки.
Иначе выводим форму быстрого заказа:
else { //иначе (если заказ еще не отправлялся) выводим форму быстрого заказа:
?>
'; ?>
' . $products_price . ' '.$product_info['products_name'].' ' . '
Доставка: Доставка по Москве в пределах МКАД (при заказе от 3500 руб) бесплатно. Подроднее об условиях доставки читать здесь'); ?>