cart->get_items(); $has_discount_column = $items->any('ItemDiscount', 0, '>'); $result = ""; $result .= $netshop->cart->get_quantity_notifications() . "

\n
\n" . "" . NETCAT_MODULE_NETSHOP_ITEM . "\n" . ($has_discount_column ? " | " . NETCAT_MODULE_NETSHOP_PRICE_WITHOUT_DISCOUNT_SHORT . "\n" : "") . ($has_discount_column ? " | " . NETCAT_MODULE_NETSHOP_DISCOUNT . "\n" : "") . " | " . ($has_discount_column ? NETCAT_MODULE_NETSHOP_PRICE_WITH_DISCOUNT_SHORT : NETCAT_MODULE_NETSHOP_ITEM_PRICE) . "\n" . " | " . NETCAT_MODULE_NETSHOP_QTY . "\n" . " | " . NETCAT_MODULE_NETSHOP_COST . "\n"; foreach ($items as $item) { $result .= "
--- | --- | --- | --- | --- | ---
" . "$item[FullName]" . ($has_discount_column ? " | $item[OriginalPriceF]" : "") . ($has_discount_column ? (" | " . ($item['ItemDiscount'] ? $item['ItemDiscountF'] : '—') . "") : "") . " | $item[ItemPriceF]" . " | $item[Qty] $item[Units]" . " | $item[TotalPriceF]" . "
\n"; } if ($netshop->cart->get_cart_discount_sum()) { $discount_sum = $netshop->cart->get_cart_discount_sum(); $result .= "
" . "" . ($discount_sum > 0 ? NETCAT_MODULE_NETSHOP_CART_DISCOUNT : NETCAT_MODULE_NETSHOP_SURCHARGE) . "" . " | " . ($discount_sum > 0 ? "−" : "") . "" . $netshop->format_price(abs($discount_sum)) . "" . "" . "
\n"; } $result .= "
" . "" . NETCAT_MODULE_NETSHOP_SUM . "" . " | " . $netshop->format_price($netshop->cart->get_totals()) . "" . "
\n"; $result .= "

\n
"; return $result; } if (!$netshop->cart->get_item_count()) { // корзина пуста! оформление заказа невозможно echo "
", NETCAT_MODULE_NETSHOP_ERROR_CART_EMPTY, "
\n"; } else { /** * Оформление заказа производится: * — на одной странице, если возможные методы доставки и оплаты не зависят от данных, * указываемых пользователем при оформлении заказа; * — на двух страницах, если методы доставки или оплаты зависят от данных, * указываемых пользователем при оформлении заказа, и возможные способы оплаты не * зависят от способов доставки; * — на трёх страницах, если методы оплаты зависят от способов доставки. * * 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++; } // ------------------------------------------------------------------------- // Общая часть формы (начало) // ------------------------------------------------------------------------- ?>
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"; } // Поля формы: ?>

##

E-mail*

ФИО*

Телефон

/> Зарегистрироваться на сайте для отслеживания вашего заказа, а также будущих покупок и получения скидок

##

Город*

Адрес

Индекс

Примечание

\n"; } } $blocks_shown++; } // "if $current_page == 1" else { // Это уже не первая страница; необходимо сохранить введённые значения // в hidden-полях формы: foreach ((array)$nc_core->input->fetch_post() as $key => $value) { if (strpos($key, "f_") === 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"; } $available_delivery_methods = $all_delivery_methods->matching($context); $methods_to_show = $show_unavailable_delivery_methods ? $all_delivery_methods : $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"; } $is_first = true; // флаг для пред-выбора первого элемента $method_ids_to_load_with_ajax = array(); foreach ($methods_to_show as $method) { ?>
evaluate_conditions($context); $method_id = $method->get_id(); $method_description = $method->get('description'); ?> 1) { // Если способов доставки более одного — нужны радио-кнопки // Решаем, должен ли текущий пункт быть выбранным: if ($is_available) { // checked, если уже был указан метод доставки (возврат со страницы // подтверждения), иначе — если это первый метод в списке: $is_checked = isset($f_DeliveryMethod) ? $f_DeliveryMethod == $method_id : $is_first; } else { // недоступные методы никогда не являются выбранными $is_checked = false; } // Выводим блок для текущего способа доставки: echo " "; } else { // Если выбора нет: if ($is_available) { echo ""; } } ?> get('name'); ?>
get('handler_id')) { // "(данные загружаются)" $price_estimate = NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_ESTIMATE_LOADING; $method_ids_to_load_with_ajax[] = $method_id; } else { // расчёт сроков и стоимости производятся на нашем сервере $estimate = $method->get_estimate($order); if ($estimate->has_error()) { // при расчёте стоимости возникла ошибка $estimate_error = $estimate->get('error'); $price_estimate = ""; } else { // значение для блока «Стоимость доставки» $price_estimate = $estimate->get_formatted_price_and_discount(); // значение для блока «Ожидаемые даты доставки»: $dates_estimate = "" . // "Ожидаемая дата доставки:" / "Ожидаемые даты доставки:" ($estimate->has_dates_interval() ? NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_ESTIMATE_DATES : NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_ESTIMATE_DATE) . " " . "" . $estimate->get_dates_string() . ""; // показывать блок с датами доставки только если есть оценка сроков: $show_dates_estimate = strlen($estimate->get('min_days')) > 0; } // конец блока «произведён расчёт на нашем сервере (без ошибок)» } // Сбор данных окончен. Выводим оценку сроков. if ($estimate_error) { echo "
", // Не удалось рассчитать стоимость доставки: $estimate_error NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_ESTIMATE_ERROR . ": " . $estimate_error . "
\n"; } else { // Вывод стоимости доставки: echo "
", // "Стоимость:" "", NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_ESTIMATE_PRICE, " ", // собственно стоимость "" . $price_estimate . "", "
\n"; // Вывод сроков доставки: if ($show_dates_estimate) { echo "
", $dates_estimate, "
\n"; } } ?>
\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(); ?> 1) { // Если способов оплаты более одного — нужны радио-кнопки // Решаем, должен ли текущий пункт быть выбранным: if ($is_available) { // checked, если уже был указан метод оплаты (возврат со страницы // подтверждения), иначе — если это первый метод в списке: $is_checked = isset($f_PaymentMethod) && $previously_selected_method_is_available ? $f_PaymentMethod == $method_id : $is_first; } else { // недоступные методы никогда не являются выбранными $is_checked = false; } // Выводим блок с названием текущего способа оплаты: echo " "; } else { // Если выбора нет: if ($is_available) { echo ""; } } ?> get('name'); ?>
get('description'); ?> evaluate_conditions($context)) { $extra_cost = $method->get_extra_cost($order); if ($extra_cost) { echo "
", "", // "Дополнительный сбор: " NETCAT_MODULE_NETSHOP_CHECKOUT_PAYMENT_EXTRA_CHARGE, " ", "", $netshop->format_price($extra_cost), "", "
\n"; } } ?>
\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; } $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($f_DeliveryMethod)) { echo "
\n", // "Доставка" "

### ", NETCAT_MODULE_NETSHOP_CHECKOUT_DELIVERY_METHOD_SECTION, "

\n"; $method = $netshop->delivery->get_method_if_enabled($f_DeliveryMethod, $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"; /** @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_CART_TOTALS, " ", // (Общая сумма) "", $netshop->format_price($netshop->cart->get_totals()), "\n", "
\n", "
\n", "", // "Общая сумма к оплате: " NETCAT_MODULE_NETSHOP_CHECKOUT_ORDER_TOTALS, " ", // (Общая сумма) "", $netshop->format_price($total_sum), "\n", "
\n", "
\n"; // --- Конец секции --- echo "
\n"; } // ------------------------------------------------------------------------- // Общая завершающая часть формы // ------------------------------------------------------------------------- ?>
1) { ?>