cart->get_item_count()) { // корзина пуста! оформление заказа невозможно echo "
", NETCAT_MODULE_NETSHOP_ERROR_CART_EMPTY, "
\n"; return; } // --- Таблица с содержимым заказа на первой странице оформления заказа, в блоке «Подтверждение состава заказа» function tpl_netshop_make_cart_contents_table() { $netshop = nc_netshop::get_instance(); $items = $netshop->cart->get_items(); $has_discount_column = $items->any('ItemDiscount', 0, '>'); $result = ""; $result .= $netshop->cart->get_quantity_notifications() . "\n\n" . "\n" . ($has_discount_column ? "\n" : "") . ($has_discount_column ? "\n" : "") . "\n" . "\n" . "\n"; foreach ($items as $item) { $result .= "" . "" . ($has_discount_column ? "" : "") . ($has_discount_column ? ("") : "") . "" . "" . "" . "\n"; } if ($netshop->cart->get_cart_discount_sum()) { $discount_sum = $netshop->cart->get_cart_discount_sum(); $result .= "" . "" . "" . "\n"; } if (count($items) > 1) { $result .= "" . "" . "" . "\n"; } $result .= "
" . NETCAT_MODULE_NETSHOP_ITEM . "" . NETCAT_MODULE_NETSHOP_PRICE_WITHOUT_DISCOUNT_SHORT . "" . NETCAT_MODULE_NETSHOP_DISCOUNT . "" . ($has_discount_column ? NETCAT_MODULE_NETSHOP_PRICE_WITH_DISCOUNT_SHORT : NETCAT_MODULE_NETSHOP_ITEM_PRICE) . "" . NETCAT_MODULE_NETSHOP_QTY . "" . NETCAT_MODULE_NETSHOP_COST . "
$item[FullName]$item[OriginalPriceF]" . ($item['ItemDiscount'] ? $item['ItemDiscountF'] : '—') . "$item[ItemPriceF]$item[Qty] $item[Units]$item[TotalPriceF]
" . ($discount_sum > 0 ? NETCAT_MODULE_NETSHOP_CART_DISCOUNT : NETCAT_MODULE_NETSHOP_SURCHARGE) . "" . ($discount_sum > 0 ? "" : "") . "" . $netshop->format_price(abs($discount_sum)) . "" . "
" . NETCAT_MODULE_NETSHOP_CHECKOUT_ITEM_TOTALS . "" . $netshop->format_price($netshop->cart->get_totals()) . "
\n
"; return $result; } /** * Оформление заказа производится: * — на одной странице, если возможные методы доставки и оплаты не зависят от данных, * указываемых пользователем при оформлении заказа; * — на двух страницах, если методы доставки или оплаты зависят от данных, * указываемых пользователем при оформлении заказа, и возможные способы оплаты не * зависят от способов доставки; * — на трёх страницах, если методы оплаты зависят от способов доставки. * * 1-страничный режим: данные заказа и выбор способа оплаты и выбор способа доставки * 2-страничный режим: данные заказа → выбор способа оплаты и выбор способа доставки * или: данные заказа и выбор способа оплаты → выбор способа доставки * 3-страничный режим: данные заказа → выбор способа оплаты → выбор способа доставки * * Если включена опция «Показывать страницу подтверждения заказа», то также будет * дополнительно отображена страница подтверждения. */ // Список способов доставки и оплаты на текущем сайте: $all_delivery_methods = $netshop->delivery->get_enabled_methods(); $all_payment_methods = $netshop->payment->get_enabled_methods(); // объекты, необходимые для дальнейших расчётов для способов доставки и оплаты: $order = nc_netshop_order::from_post_data((array)$nc_core->input->fetch_post(), $netshop); $context = $netshop->get_condition_context(); $context->set_order($order); // ------------------------------------------------------------------------- // Некоторые настройки отображения // ------------------------------------------------------------------------- // Для изменения настроек используйте соответствующие пункты в «Настройках // отображения компонента» в настройках инфоблока. // Загружать данные о стоимости и сроках доставки для способов с // автоматизированным расчётом через AJAX (по умолчанию — true): $use_ajax_to_load_delivery_estimate = isset($cc_settings['delivery_ajax_loading']) ? $cc_settings['delivery_ajax_loading'] : true; // Показывать недоступные методы доставки в списке способов доставки: $show_unavailable_delivery_methods = isset($cc_settings['show_all_delivery_methods']) ? $cc_settings['show_all_delivery_methods'] : false; // Показывать недоступные методы оплаты в списке способов оплаты: $show_unavailable_payment_methods = isset($cc_settings['show_all_payment_methods']) ? $cc_settings['show_all_payment_methods'] : false; // Показывать страницу подтверждения (по умолчанию — true): $show_confirmation_page = isset($cc_settings['show_confirmation_page']) ? $cc_settings['show_confirmation_page'] : true; // ------------------------------------------------------------------------- // Определение количества страниц, которое потребуется для оформления заказа // ------------------------------------------------------------------------- // Сколько страниц будет в оформлении заказа: $pages = 1; // Страница, на которой пользователя спросят о способах доставки: $delivery_page = count($all_delivery_methods) ? 1 : 0; // Страница, на которой пользователя спросят о способах оплаты: $payment_page = count($all_payment_methods) ? 1 : 0; // Страница подтверждения заказа: $confirmation_page = 0; // Если способы доставки зависят от полей заказа, показывать их на второй странице if ($all_delivery_methods->any('depends_on_order_data', true)) { $pages = 2; $delivery_page = 2; } // Если способы оплаты зависят от полей заказа, показывать их на второй странице if ($all_payment_methods->any('depends_on_order_data', true)) { $pages = 2; $payment_page = 2; } // Если способы оплаты зависят от способов доставки, показывать их на отдельной // (второй или третьей) странице if ($all_payment_methods->any('depends_on_delivery_method', true)) { $pages++; $payment_page = $delivery_page + 1; } // Учесть страницу подтверждения заказа: if ($show_confirmation_page) { $pages++; $confirmation_page = $pages; } // Заголовки страниц $page_titles = array( 1 => NETCAT_MODULE_NETSHOP_CHECKOUT_ORDER_DATA_SECTION, ); if ($payment_page == 2 && $payment_page == $delivery_page) { $page_titles[$payment_page] = NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_AND_PAYMENT_METHOD_SECTION; } else { if ($delivery_page > 1) { $page_titles[$delivery_page] = NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_METHOD_SECTION; } if ($payment_page > 1) { $page_titles[$payment_page] = NETCAT_MODULE_NETSHOP_CHECKOUT_PAYMENT_METHOD_SECTION; } } if ($confirmation_page) { $page_titles[] = NETCAT_MODULE_NETSHOP_CHECKOUT_CONFIRMATION_SECTION; } if ($all_payment_methods->any("handler_id", 0, ">")) { $page_titles[] = NETCAT_MODULE_NETSHOP_PAYMENT; } // Текущая страница: $current_page = $is_posted = $nc_core->input->fetch_post('current_page'); if (!$current_page) { $current_page = 1; } $go_to_next_page = $nc_core->input->fetch_post('go_to_next_page'); // ------------------------------------------------------------------------- // Сообщения об ошибках в полях формы // ------------------------------------------------------------------------- // В многостраничном режиме — проверить данные заказа на первой странице // (обязательные поля, формат полей) if ($is_posted && $pages > 1) { $posting = 1; require $nc_core->ROOT_FOLDER . "message_fields.php"; // nb, not require_once $posting = 0; // Если возникла ошибка — возврат на первую страницу if ($warnText) { $current_page = 1; } } // Ошибки в случае, если форма заполнена неправильно, выводятся в блоке «Данные заказа». // Если ошибок нет — переходим к следующей странице if (!$warnText && $go_to_next_page && $pages > 1) { $current_page++; } // Инициализация некоторых переменных $delivery_variant_id = $nc_core->input->fetch_post('delivery_variant_id'); $delivery_point_id = $nc_core->input->fetch_post('delivery_point_id'); // ------------------------------------------------------------------------- // Общая часть формы (начало) // ------------------------------------------------------------------------- ?>
token->get_input() . "\n" ?> \n"; } ?>
user->get_by_id($AUTH_USER_ID) : null; $last_order = null; if ($AUTH_USER_ID) { $sql = "SELECT `Message_ID` FROM `Message{$classID}` WHERE `User_ID` = {$AUTH_USER_ID} ORDER BY `Created` DESC LIMIT 1"; $last_order_id = $db->get_var($sql); if ($last_order_id) { $last_order = new nc_netshop_order(); $last_order->set_catalogue_id($catalogue_id); $last_order->load($last_order_id); } } $contact_name = null; if (!isset($f_ContactName)) { if (isset($user['ForumName']) || isset($user['Login'])) { $contact_name = $user['ForumName'] ? $user['ForumName'] : $user['Login']; } else if (isset($_COOKIE['Order_ContactName'])) { $contact_name = $_COOKIE['Order_ContactName']; } } $contact_email = null; if (!isset($f_Email)) { if (isset($user['Email'])) { $contact_email = $user['Email']; } else if (isset($_COOKIE['Order_Email'])) { $contact_email = $_COOKIE['Order_Email']; } } $contact_phone = null; if (!isset($f_Phone)) { if ($last_order) { $contact_phone = $last_order['Phone']; } else if (isset($_COOKIE['Order_Phone'])) { $contact_phone = $_COOKIE['Order_Phone']; } } $address = null; if (!isset($f_Address)) { if ($last_order) { $address = $last_order['Address']; } else if (isset($_COOKIE['Order_Address'])) { $address = $_COOKIE['Order_Address']; } } $zip = null; if (!isset($f_Zip)) { if ($last_order) { $zip = $last_order['Zip']; } else if (isset($_COOKIE['Order_Zip'])) { $zip = $_COOKIE['Order_Zip']; } } // Сделать выбранным по умолчанию город, в котором расположен магазин $selected_city = null; if (!isset($f_City)) { if (isset($_COOKIE['Order_City'])) { $selected_city = $_COOKIE['Order_City']; } else { $selected_city = $netshop->get_setting('City'); } } $sign_up = $nc_core->input->fetch_post('f_SignUp'); // Сообщение об ошибке (если есть) if ($warnText) { echo "

$warnText

\n"; } // Поля формы: ?>

location->get_suggest_script(); ?>

\n"; } } $blocks_shown++; } // "if $current_page == 1" else { // Это уже не первая страница; необходимо сохранить введённые значения // в hidden-полях формы: foreach ((array)$nc_core->input->fetch_post() as $key => $value) { if (strpos($key, "f_") === 0 || strpos($key, "delivery_") === 0) { echo "\n"; } } } // конец блока «Данные заказа» // ------------------------------------------------------------------------- // Выбор способа доставки // ------------------------------------------------------------------------- if ($delivery_page == $current_page) { echo "
\n"; if ($blocks_shown || $delivery_page == $payment_page) { echo "

", NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_METHOD_SECTION, "

\n"; } /** @var nc_netshop_delivery_method_collection $all_delivery_methods */ /** @var nc_netshop_delivery_method_collection $methods_to_show */ $available_delivery_methods = $all_delivery_methods->matching($context); $methods_to_show = $show_unavailable_delivery_methods ? $all_delivery_methods->with_variants($order) : $available_delivery_methods; $num_methods_to_show = count($methods_to_show); if (!count($available_delivery_methods)) { echo "

", NETCAT_MODULE_NETSHOP_CHECKOUT_NO_AVAILABLE_DELIVERY_METHODS, "

\n"; } global $method_ids_to_load_with_ajax; $method_ids_to_load_with_ajax = array(); // --- НАЧАЛО ШАБЛОНА ВЫВОДА СПОСОБА ДОСТАВКИ --- $print_delivery_method = function (nc_netshop_delivery_method $method, $options_block = '') use ($context, $use_ajax_to_load_delivery_estimate, $num_methods_to_show, $show_unavailable_delivery_methods) { static $is_first = true; // флаг для пред-выбора первого элемента global $method_ids_to_load_with_ajax, $delivery_variant_id; $order = $context->get_order(); $is_available = !$show_unavailable_delivery_methods || $method->evaluate_conditions($context); $method_id = $method->get_id(); $method_description = $method->get('description'); ?>
where('delivery_type', nc_netshop_delivery::DELIVERY_TYPE_COURIER); if (count($courier_delivery_methods)) { // «Доставка курьером по указанному адресу» echo "

", NETCAT_MODULE_NETSHOP_DELIVERY_TYPE_COURIER, "

\n"; echo "
\n"; /** @var nc_netshop_delivery_method $method */ foreach ($courier_delivery_methods as $method) { $print_delivery_method($method); } echo "
\n"; } unset($courier_delivery_methods); // 2) ДОСТАВКА ДО ПУНКТА САМОВЫВОЗА $pickup_delivery_methods = $methods_to_show->where('delivery_type', nc_netshop_delivery::DELIVERY_TYPE_PICKUP); if (count($pickup_delivery_methods)) { // «Доставка до пункта выдачи» echo "

", NETCAT_MODULE_NETSHOP_DELIVERY_TYPE_PICKUP, "

\n"; echo "
\n"; // название города $city = $order->get_location_name(); // --- КАРТА --- if ($pickup_delivery_methods->any('has_delivery_points_with_coordinates', true)) { // Готовим данные для карты $map_settings = array( 'balloon_select_point_button_text' => NETCAT_MODULE_NETSHOP_DELIVERY_POINT_SELECT_BUTTON, 'balloon_price_prefix' => NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_ESTIMATE_PRICE, 'delivery_methods' => array(), ); // На карте может быть показан адрес, введённый на предыдущем этапе if ($f_Address) { $map_settings['home_address'] = trim("$f_Zip $city $f_Address"); } else { $map_settings['home_address'] = ''; } /** @var nc_netshop_delivery_method $method */ foreach ($pickup_delivery_methods as $method) { $map_settings['delivery_methods'][] = array( 'id' => $method->get_id(), 'name' => $method->get('name'), 'price' => $netshop->format_price($method->get_estimate($order)->get('price')), 'points' => $method->get_delivery_points($city)->to_array(true), ); } // Подключение и инициализация скриптов ?>
get_delivery_points($city)->sort_by_property_value('address'); $delivery_points_div = ''; if (count($delivery_points)) { $delivery_points_div = "
\n"; /** @var nc_netshop_delivery_point $delivery_point */ foreach ($delivery_points as $delivery_point) { $this_delivery_point_id = $delivery_point->get_id(); $delivery_points_div .= "
\n\n
\n"; } $delivery_points_div .= "
\n"; } $print_delivery_method($method, $delivery_points_div); } echo "
\n"; } unset($pickup_delivery_methods_delivery_methods); // 3) ДОСТАВКА В ПОЧТОВОЕ ОТДЕЛЕНИЕ $post_delivery_methods = $methods_to_show->where('delivery_type', nc_netshop_delivery::DELIVERY_TYPE_POST); if (count($post_delivery_methods)) { // «Доставка в почтовое отделение» echo "

", NETCAT_MODULE_NETSHOP_DELIVERY_TYPE_POST, "

\n"; echo "
\n"; /** @var nc_netshop_delivery_method $method */ foreach ($post_delivery_methods as $method) { $print_delivery_method($method); } echo "
\n"; } unset($post_delivery_methods_delivery_methods); // показ дополнительных параметров доставки (выбор точки самовывоза) при выборе способа доставки // (требуется jQuery!) ?> \n"; } // конец блока «Выбор способа доставки» // ------------------------------------------------------------------------- // Выбор способа оплаты // ------------------------------------------------------------------------- if ($payment_page == $current_page) { echo "
\n"; if ($blocks_shown) { echo "

", NETCAT_MODULE_NETSHOP_CHECKOUT_PAYMENT_METHOD_SECTION, "

\n"; } $available_payment_methods = $all_payment_methods->matching($context); $methods_to_show = $show_unavailable_payment_methods ? $all_payment_methods : $available_payment_methods; $num_methods_to_show = count($methods_to_show); if (!count($available_payment_methods)) { echo "

" . NETCAT_MODULE_NETSHOP_CHECKOUT_NO_AVAILABLE_PAYMENT_METHODS . "

\n"; } // Если ранее был указан способ оплаты (возврат со страницы подтверждения // заказа), проверим, доступен ли он до сих пор (мог измениться способ // доставки): $previously_selected_method_is_available = isset($f_PaymentMethod) ? $available_payment_methods->any('id', $f_PaymentMethod) : false; $is_first = true; // флаг для пред-выбора первого элемента foreach ($methods_to_show as $method) { ?>
evaluate_conditions($context); $method_id = $method->get_id(); ?>
\n"; } // конец блока «Выбор способа оплаты» // ------------------------------------------------------------------------- // Подтверждение заказа // ------------------------------------------------------------------------- if ($confirmation_page == $current_page) { // Итоговая сумма к оплате $total_sum = $netshop->cart->get_totals(); echo "
\n", // "Подтверждение заказа" // "

", NETCAT_MODULE_NETSHOP_CHECKOUT_CONFIRMATION_SECTION, "

\n", // "Пожалуйста, проверьте правильность указанных данных." "

", NETCAT_MODULE_NETSHOP_CHECKOUT_PLEASE_REVIEW_ORDER, "

"; // --- Блок «Подтверждение контактных данных и адреса» --- echo "
\n", // "Контактные данные и адрес доставки" "

", NETCAT_MODULE_NETSHOP_CHECKOUT_ORDER_DATA_SECTION, "

\n"; $order_component = $nc_core->get_component($classID); foreach ($order->to_array() as $field_name => $value) { // Способы оплаты и доставки показываются в отдельном блоке: if ($field_name == 'DeliveryMethod' || $field_name == 'PaymentMethod') { continue; } // Не показывать поле «Адрес доставки», если выбран самовывоз if ($field_name == 'Address' && $order->get_delivery_point_id()) { continue; } $field = $order_component->get_field($field_name); // Не выводить поля, не являющиеся полем компоненты или «служебные» (напр., "user_hash") if (!$field || !$field['description']) { continue; } // Не выводить поля без значений: if (!strlen($value)) { continue; } // форматирование / подготовка значения в зависимости от типа поля: switch ($field['type']) { case NC_FIELDTYPE_BOOLEAN: $value = $value ? NETCAT_MODULE_NETSHOP_CHECKOUT_BOOLEAN_FIELD_YES : NETCAT_MODULE_NETSHOP_CHECKOUT_BOOLEAN_FIELD_NO; break; case NC_FIELDTYPE_TEXT: $value = "
" . nl2br(htmlspecialchars($value)) . "
\n"; break; case NC_FIELDTYPE_SELECT: case NC_FIELDTYPE_MULTISELECT: $values = explode(",", $value); $value = ""; foreach ($values as $id) { $value .= ($value ? ', ' : '') . nc_get_list_item_name($field['table'], $id); } break; case NC_FIELDTYPE_DATETIME: $value = date(NETCAT_MODULE_NETSHOP_DATETIME_FORMAT, strtotime($value)); $value = preg_replace('/\s+(?:00:)00:00$/', '', $value); break; } // Строка со значением поля: echo "
\n", "$field[description]: ", "$value\n", "
\n"; } // foreach order field // Кнопка «Изменить» [введённые данные] ?> \n"; // конец блока «Подтверждение контактных данных и адреса» // --- Блок «Подтверждение состава заказа» --- $items = $netshop->cart->get_items(); $has_discount_column = $items->any('ItemDiscount', 0, '>'); echo "
\n", "

", NETCAT_MODULE_NETSHOP_CHECKOUT_ITEMS_SECTION, "

\n", tpl_netshop_make_cart_contents_table(), "
\n"; // --- Блок «Подтверждение способа доставки» --- if (isset($delivery_variant_id)) { echo "
\n", // "Доставка" "

", NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_METHOD_SECTION, "

\n"; $method = $netshop->delivery->get_method_if_enabled($delivery_variant_id, $context); if (!$method) { echo "

", NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_INCORRECT_METHOD, "

\n"; } else { echo "
\n", "", // "Способ доставки: " NETCAT_MODULE_NETSHOP_CHECKOUT_SELECTED_DELIVERY_METHOD, " ", // (Название способа доставки) "", $method->get('name'), "\n", "
\n"; // Пункт выдачи if (!empty($delivery_point_id) && ($delivery_point = $method->get_delivery_point($delivery_point_id))) { echo "
\n", "", // "Пункт выдачи заказа: " NETCAT_MODULE_NETSHOP_CHECKOUT_SELECTED_DELIVERY_POINT, " ", // (Адрес пункта выдачи заказа) "", $delivery_point->get('address'), "\n", "
\n"; } /** @var nc_netshop_delivery_estimate $estimate */ $estimate = $method->get_estimate($order); if ($estimate->has_error()) { echo "

", // "Не удалось вычислить стоимость и сроки доставки" NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_ESTIMATE_ERROR, ': ', $estimate->get('error'), "

\n"; } else { $total_sum += $estimate->get('price'); // Стоимость доставки echo "
\n", "", // "Стоимость: " NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_ESTIMATE_PRICE, " ", "", $estimate->get_formatted_price_and_discount(), "\n", "
\n"; // Даты доставки if ($estimate->get('min_days') != null) { echo "
\n", "", // "Ожидаемая дата доставки:" / "Ожидаемые даты доставки:" ($estimate->has_dates_interval() ? NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_ESTIMATE_DATES : NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_ESTIMATE_DATE) . " " . "" . $estimate->get_dates_string() . "\n", "
\n"; } } } // Кнопка «Изменить» [способ доставки] if (count($all_delivery_methods->matching($context)) > 1) { ?> \n"; } // --- Блок «Подтверждение способа оплаты» --- if (isset($f_PaymentMethod)) { echo "
\n", // "Способ оплаты" "

", NETCAT_MODULE_NETSHOP_CHECKOUT_PAYMENT_METHOD_SECTION, "

\n"; $method = $netshop->payment->get_method_if_enabled($f_PaymentMethod, $context); if (!$method) { echo "

", NETCAT_MODULE_NETSHOP_CHECKOUT_PAYMENT_INCORRECT_METHOD, "

\n"; } else { echo "
\n", "", // "Способ оплаты: " NETCAT_MODULE_NETSHOP_CHECKOUT_SELECTED_PAYMENT_METHOD, " ", // (Название способа оплаты) "", $method->get('name'), "\n", "
\n"; $extra_cost = $method->get_extra_cost($order); if ($extra_cost) { $total_sum += $extra_cost; echo "
\n", "", // "Дополнительный сбор: " NETCAT_MODULE_NETSHOP_CHECKOUT_PAYMENT_EXTRA_CHARGE, " ", "", $netshop->format_price($extra_cost), "\n", "
\n"; } } // Кнопка «Изменить» [способ оплаты] if (count($all_payment_methods->matching($context)) > 1) { ?> \n"; } // --- Итоговые суммы --- echo "
\n", // "Итого" "

", NETCAT_MODULE_NETSHOP_CHECKOUT_TOTALS_SECTION, "

\n", "
\n", "", // "Общая сумма к оплате: " NETCAT_MODULE_NETSHOP_CHECKOUT_ORDER_TOTALS, " ", // (Общая сумма) "", $netshop->format_price($total_sum), "\n", "
\n", "
\n"; // --- Конец секции --- echo "
\n"; } // ------------------------------------------------------------------------- // Общая завершающая часть формы // ------------------------------------------------------------------------- ?>
1) { ?>