php Интернет-магазин(неразобрано)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php Интернет-магазин(неразобрано)相关的知识,希望对你有一定的参考价值。

Общие сведения

1) В системную таблицу "Пользователи" необходимо добавить поле "Phone".2) Необходимы компоненты "Товар", "Корзина", "Пункт самовывоза", "Заказ", "Заказ оформлен".3) В файле AddTemplate.html компонента "Заказ" необходимо настроить ID группы пользователей, ID особых методов доставки, ID компонента где хранятся пункты самовывоза.4) Должны быть способы доставки и оплаты (минимум по одному).5) Должны быть способы доставки: "Самовывоз" и "Доставка курьером". ID этих методов записать как написано в пункте (3).

Последовательность действий

1. Создание компонента "Товар"

2. Создание компонента "Корзина"

3) Создание компонента "Заказ"

4) Создание компонента "Заказ оформлен"

5) Создание компонента "Пункт самовывоза"

6) Создание разделов с компонентами "Товар"

7) Создание раздела "Заказы"

Создаём раздел "Заказы".Выключаем.Ключевое слово: "orders".Прикрепляем одноименный компонент.Меняем ID компонента в разделе на "order", вместо "orders".

8) Создание раздела "Заказ оформлен"

Создаем раздел "Заказ оформлен", дочерний для раздела "Заказы".Ключевое слово: "added".Прикрепляем одноименный компонент.

9) Настраиваем интернет-магазин в настройках модуля

Указываем компонент "Заказ" в настройках.
Добавляем валюты.Добавляем методы доставки.Добавляем методы оплаты.

Компоненты и файлы

_CDN

В файл /_cdn/order/city.php необходимо запихнуть содержимое:

<?php

//###############
//#Подключалочки#
//###############

require_once $_SERVER['DOCUMENT_ROOT'].'/netcat/connect_io.php';

//##############
//#Основной код#
//##############

// Запрашиваемый город
$city = $x_db->escape($x_post->city);

// Найдём в базе
$id = $x_db->query_cell("SELECT `Region_ID` FROM `Classificator_Region` WHERE `Region_Name`='$city'");

// Если нет - добавим
if (empty($id)) {
    $x_db->query("INSERT INTO `Classificator_Region` (`Region_Name`,`Checked`,`Value`) VALUES ('$city','1','GENERATED')");
    
    $id = $x_db->last_insert_id();
}

// Вернём ID города
exit($id);

?>

Товар

Убедиться в том, что товары, выводимые на фронте, обёрнуты в форму.

Settings.html

$nc_core = nc_Core::get_object();
$nc_netshop = nc_netshop::get_instance();

RecordTemplate.html

<?php $nc_item = new nc_netshop_item($res[$f_RowNum]); ?>

<form action="<?= $nc_netshop->get_add_to_cart_url(); ?>" method="post">
    <input type="hidden" name="redirect_url" value="<?= nc_message_link($nc_item['Message_ID'], $nc_item['Class_ID']); ?>">
    <input type="hidden" name="cart_mode" value="add">
    <input type="hidden" name="cart<?= $nc_item['RowID']; ?>" value="1">
    
    <button type="button" class="button-add-item-to-cart">Добавить в корзину</button>
</form>

RecordTemplateFull.html

<?php $nc_item = new nc_netshop_item($resMsg); ?>

<form action="<?= $nc_netshop->get_add_to_cart_url(); ?>" method="post">
    <input type="hidden" name="redirect_url" value="<?= nc_message_link($nc_item['Message_ID'], $nc_item['Class_ID']); ?>">
    <input type="hidden" name="cart_mode" value="add">
    
    <input type="number" name="cart<?= $nc_item['RowID']; ?>" value="1">
    
    <button type="button" class="button-add-item-to-cart">Добавить в корзину</button>
</form>

Корзина

FormPrefix.html

<?php if ($has_items): ?>
    
    <style>
        .middle {
            vertical-align: middle !important;
        }
        .center {
            text-align: center !important;
        }
        .error {
            color: #ae2727;
        }
        .button-delete-item-from-cart:hover {
            cursor: pointer;
            color: red;
        }
    </style>
    
<?php /* ######################################################################## */ ?>
<?php /* #                                КОРЗИНА                               # */ ?>
<?php /* ######################################################################## */ ?>
    
    <h2>1.1 - Корзина</h2>
    
    <form method="post" action="<?= $nc_netshop->get_add_to_cart_url(); ?>" id="form-cart">
        <input type="hidden" name="redirect_url" value="<?= $_SERVER["REQUEST_URI"]; ?>"/>
        <input type="hidden" name="cart_mode" value="">
        
        <table class="table">
            <tr>
                <!-- Номер товара -->
                <th class="visible-lg visible-md center middle">#</th>
                
                <!-- Фото товара -->
                <th class="visible-lg visible-md center">Фото</th>
                
                <!-- Информация о товаре -->
                <th>Информация о товаре</th>
                
                <!-- Кол-во товара -->
                <th class="visible-lg visible-md">Выбор количества</th>
                
                <!-- Цена товара -->
                <th class="visible-lg visible-md">Цена</th>
                
                <!-- Скидка на товар -->
                <th class="visible-lg visible-md">Скидка</th>
                
                <!-- Стоимость товара -->
                <th>Стоимость</th>
                
                <!-- Кнопка "Удалить из корзины" -->
                <th class="visible-lg visible-md center">Удалить</th>
            </tr>
            
            <?php foreach ($nc_items as $nc_item):
                $nc_item_subdivision_url = nc_folder_path($nc_item['Subdivision_ID']);
                $nc_item_subdivision_name = $nc_core->subdivision->get_by_id($nc_item['Subdivision_ID'], 'Subdivision_Name'); ?>
                
                <tr class="cart-item">
                    <!-- Номер товара -->
                    <td class="visible-lg visible-md center middle"><?= $nc_items_counter++; ?></td>
                    
                    <!-- Фото товара -->
                    <td class="visible-lg visible-md">
                        <img src="<?= $nc_item['Image']; ?>" class="img-responsive" style="width:125px;"/>
                    </td>
                    
                    <!-- Информация о товаре -->
                    <td class="middle">
                        <?= $nc_item['ItemID']; ?><br/>
                        <a href="<?= $nc_item['URL'] ?>"><?= $nc_item['FullName']; ?></a><br/>
                        <a href="<?= $nc_item_subdivision_url; ?>"><?= $nc_item_subdivision_name; ?></a>
                    </td>
                    
                    <!-- Кол-во товара -->
                    <td style="vertical-align: middle" class="visible-lg visible-md">
                        <input name="cart<?= $nc_item['RowID'] ?>" type="number" min="1" class="cart-item-name" value="<?= $nc_item['Qty']; ?>" data-units="<?= htmlspecialchars($nc_item['Units']) ?>">
                    </td>
                    
                    <!-- Цена товара -->
                    <td class="middle"><?= $nc_item['OriginalPriceF']; ?></td>
                    
                    <!-- Скидка на товар -->
                    <td class="middle"><?= $nc_item['ItemDiscountF']; ?></td>
                    
                    <!-- Стоимость товара -->
                    <td class="middle"><?= $nc_item['TotalPriceF']; ?></td>
                    
                    <!-- Кнопка "Удалить из корзины" -->
                    <td class="visible-lg visible-md center middle"><i class="fa fa-trash button-delete-item-from-cart" title="Удалить из корзины"></i></td>
                </tr>
            
            <?php endforeach;
            
            if ($nc_cart_discount > 0): ?>
                
                <tr>
                    <!-- Номер товара -->
                    <td class="visible-lg visible-md"></td>
                    
                    <!-- Фото товара -->
                    <td class="visible-lg visible-md"></td>
                    
                    <!-- Информация о товаре -->
                    <td></td>
                    
                    <!-- Кол-во товара -->
                    <td class="visible-lg visible-md"></td>
                    
                    <!-- Цена товара -->
                    <td class="visible-lg visible-md"></td>
                    
                    <!-- Скидка на товар -->
                    <td class="visible-lg visible-md"></td>
                    
                    <!-- Стоимость товара -->
                    <td class="lead">
                        Скидка<br>на корзину:<br/>
                        <?= $nc_netshop->format_price($nc_cart_discount); ?>
                    </td>
                    
                    <!-- Кнопка "Удалить из корзины" -->
                    <td class="visible-lg visible-md"></td>
                </tr>
                
            <?php endif; ?>
            
            <tr>
                <!-- Номер товара -->
                <td class="visible-lg visible-md"></td>
                
                <!-- Фото товара -->
                <td class="visible-lg visible-md"></td>
                
                <!-- Информация о товаре -->
                <td></td>
                
                <!-- Кол-во товара -->
                <td class="visible-lg visible-md"></td>
                
                <!-- Цена товара -->
                <td class="visible-lg visible-md"></td>
                
                <!-- Скидка на товар -->
                <td class="visible-lg visible-md"></td>
                
                <!-- Стоимость товара -->
                <td class="lead">
                    Итого:<br/>
                    <?= $nc_netshop->format_price($nc_cart_total_price); ?>
                </td>
                
                <!-- Кнопка "Удалить из корзины" -->
                <td class="visible-lg visible-md"></td>
            </tr>
            
        </table>
    </form>


<?php /* ######################################################################## */ ?>
<?php /* #                                 КУПОНЫ                               # */ ?>
<?php /* ######################################################################## */ ?>
    
    <h2>1.2 - Купоны</h2>
    
    <div class="row">
        <form method="post" class="col-md-12">
            <!-- Ошибка добавления купона -->
            <span class="error"><?= $nc_coupons_error_text; ?></span>
            
            <!-- Примененные купоны -->
            <?php if (count($nc_coupons)): ?>
                
                <h3>Применённые купоны</h3>
                
                <?php foreach ($nc_coupons as $i => $coupon): ?>
                    
                    <div>
                        <span><?= $i + 1; ?>. <?= $coupon['code'] ?></span>&nbsp;&nbsp;&nbsp;
                        <button type="submit" name="coupon_clear[<?= $i ?>]" class="btn btn-warning btn-sm" value="1">Удалить</button>
                    </div>
                    
                <?php endforeach ?>
                
            <?php endif; ?>
            
            <!-- Добавление купона -->
            <h3>Использовать купон</h3>
            <input type="text" name="coupon_add" class="form-control" style="width: 300px;">
            <button type="submit" class="btn btn-success">Применить купон</button>
        </form>
    </div>

<?php /* ######################################################################## */ ?>
<?php /* #                                 КНОПКИ                               # */ ?>
<?php /* ######################################################################## */ ?>

    <div class="row">
        <div class="col-md-12">
            <a href="<?= $nc_core->SUB_FOLDER; ?>/orders/add_order.html" class="btn btn-success pull-right">Оформить заказ</a>
            <button type="button" class="btn btn-primary pull-right" style="margin-right: 15px;" id="button-recalculate-cart">Пересчитать корзину</button>
            <div class="clearfix"></div>
        </div>
    </div>

<?php else: ?>

    <div class="row">
        <div class="col-md-12">
            <div>Корзина пуста</div>
        </div>
    </div>

<?php endif; ?>

<?php /* ######################################################################## */ ?>
<?php /* #                                СКРИПТ                                # */ ?>
<?php /* ######################################################################## */ ?>

<script>
    $(document).ready(function() {
        $('input[type="number"]').styler();
        
        // Отправим форму, чтобы пересчитать корзину
        $('#button-recalculate-cart').click(function() {
            $('#form-cart').submit();
        });
    });
</script>

Settings.html

<?php

/*
// Вывод ошибок
ini_set('display_errors',1);
error_reporting(E_ALL);
*/

// #####################
// #ОСНОВНЫЕ ПЕРЕМЕННЫЕ#
// #####################

$nc_core = nc_Core::get_object();
$nc_netshop = nc_netshop::get_instance();
$nc_cart = $nc_netshop->cart;
$nc_input = $nc_core->input;

// ###################
// #ОБРАБОТКА КУПОНОВ#
// ###################

// Ссылка на корзину
$current_link = $_SERVER['HTTP_REFERER'];

// Сбрасываем купон
if ($coupon_clear = $nc_input->fetch_post('coupon_clear')) {
    $coupons = $nc_netshop->promotion->get_registered_coupons();
    
    foreach ($coupons as $i => $coupon) {
        if ($coupon_clear[$i]) {
            $nc_netshop->promotion->unregister_coupon_code($coupon['code']);
        }
    }
    
    header("Location: $current_link");
    exit;
}

// Активирум купон
if ($coupon_add = $nc_input->fetch_post('coupon_add')) {
    if ($nc_netshop->promotion->register_coupon_code($coupon_add)) {
        ob_end_clean();
        
        header("Location: $current_link");
        exit;
    }
}

// Ошибка применения купона
$nc_coupons_error_text = $nc_netshop->promotion->get_coupon_notifications();

// Массив применённых купонов
$nc_coupons = $nc_netshop->promotion->get_registered_coupons();

// ###################
// #ПРОЧИЕ ПЕРЕМЕННЫЕ#
// ###################

$nc_items = $nc_cart->get_items();
$nc_items_count = count($nc_items);
$has_items = $nc_items_count > 0;
$nc_items_discount = $nc_items->get_field_sum('TotalDiscount');
$has_items_discount = $nc_items_discount > 0;
$nc_cart_discount = $nc_cart->get_discount_sum();
$has_cart_discount = $nc_cart_discount > 0;
$has_discounts = $has_items_discount || $has_cart_discount;
$nc_cart_total_items_price = $nc_items->sum('TotalPrice');
$nc_cart_total_price = $nc_cart->get_totals();

$nc_items_counter = 1;

?>

Макет дизайна

В нужное место положить файлы FormStyler'a и DaData'ы и в нужном месте подключить скрипты и стили.
Файлы для загрузки:
jquery.formstyler.cssjquery.formstyler.min.jssuggestions.csssuggestions.min.js

<link rel="stylesheet" href="/_cdn/formstyler/jquery.formstyler.css">
<link rel="stylesheet" href="/_cdn/suggestions/suggestions.css">

<script type="text/javascript" src="/_cdn/formstyler/jquery.formstyler.min.js"></script>
<script type="text/javascript" src="/_cdn/suggestions/suggestions.min.js"></script>

Settings.html

Убедиться в том, что есть следующие объекты

$nc_core = nc_Core::get_object();
$nc_netshop = nc_netshop::get_instance();

$nc_cart = $nc_netshop->cart;

$nc_items = $nc_cart->get_items();

$cart_goods_count = $nc_cart->get_item_count(true);
$cart_goods_price = $nc_cart->get_totals();
$cart_goods_price_f = $nc_netshop->format_price($cart_goods_price);

Header.html

В месте где вывод данных о корзине

<!-- ===========================    КОРЗИНА    =========================== -->
<span class="b-cart">В корзине <span class="b-cart__goods_count"><?= $cart_goods_count; ?></span> <span class="b-cart__goods_count_text"><?= x_plural_form($cart_goods_count, 'товар', 'товара', 'товаров'); ?></span> на сумму <span class="b-cart__goods_price"><?= x_format_price($cart_goods_price); ?></span> <span class="b-cart__goods_price_text"><?= x_plural_form($cart_goods_count, 'рубль', 'рубля', 'рублей'); ?></span></span>
<!-- =========================== ./ КОРЗИНА    =========================== -->

<br>
ИЛИ
<br>

<!-- ===========================    КОРЗИНА    =========================== -->
<span class="b-cart">В корзине <span class="b-cart__goods_count"><?= $cart_goods_count; ?></span> <span class="b-cart__goods_count_text"><?= x_plural_form($cart_goods_count, 'товар', 'товара', 'товаров'); ?></span> на сумму <span class="b-cart__goods_price_f"><?= $cart_goods_price_f; ?></span></span>
<!-- =========================== ./ КОРЗИНА    =========================== -->

Footer.html

Вставить код в конец тега body

<div class="modal fade" role="dialog" id="modal-delete-item-from-cart">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
        
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h6 class="modal-title">Удаление из корзины</h6>
            </div>
            
            <div class="modal-body">
                <form method="post" action="<?= $nc_netshop->get_add_to_cart_url(); ?>">
                    <input type="hidden" name="redirect_url" value="<?= $_SERVER["REQUEST_URI"]; ?>"/>
                    <input type="hidden" name="cart_mode" value="">
                    <input type="hidden" name="" value="0" id="modal-delete-item-from-cart-item">
                    
                    <p>Вы действительно хотите удалить данный товар из корзины?</p>
                    
                    <input type="submit" class="btn btn-info" value="Удалить">
                </form>
            </div>
        
        </div>
    </div>
</div>

<div class="modal fade" role="dialog" id="modal-item-added-to-cart">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
        
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h6 class="modal-title">Товар добавлен</h6>
            </div>
            
            <div class="modal-body">
                <p>Ваш товар добавлен в <a href="/cart/">корзину</a>.</p>
                <p>Спасибо за покупку!</p>
            </div>
        
        </div>
    </div>
</div>

Вставить в тег script в самом конце body

$(document).ready(function() {
    function pluralForm(itemQuantity, one, two, many) {
        itemQuantity = Math.abs(itemQuantity) % 100;
        var underHundred = itemQuantity % 10,
        result = many;
        
        if (underHundred > 1 && underHundred < 5) { result = two; }
        if (underHundred == 1) { result = one; }
        if (itemQuantity > 10 && itemQuantity < 20) { result = many; }
        
        return result;
    }
    
    function numberFormat(number, decimals, decPoint, thousandsSep) {
        var i, j, kw, kd, km;
        
        if( isNaN(decimals = Math.abs(decimals)) ){
            decimals = 2;
        }
        
        if( decPoint == undefined ){
            decPoint = ",";
        }
        
        if( thousandsSep == undefined ){
            thousandsSep = ".";
        }
    
        i = parseInt(number = (+number || 0).toFixed(decimals)) + "";
    
        if( (j = i.length) > 3 ){
            j = j % 3;
        } else {
            j = 0;
        }
    
        km = (j ? i.substr(0, j) + thousandsSep : "");
        kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousandsSep);
        kd = (decimals ? decPoint + Math.abs(number - i).toFixed(decimals).replace(/-/, 0).slice(2) : "");
        
        return km + kw + kd;
    }
    
    function formatPrice(number, digits = 2) {
        return numberFormat(number, digits, '.', ' ');
    }
    
    $(".button-add-item-to-cart").click(function() {
        // Получим форму для отправления
        var form = $(this).closest('form');
        
        // Отправим форму серверу
        $.ajax({
            type: 'POST',
            url: form.attr('action'),
            data: form.serialize() + '&json=1',
            dataType: 'json',
            // Обработаем успешное добавление товаров в корзину
            success: function(response) {
                // Обработка ответа от сервера
                var items = response.Items;
                
                // Кол-во товаров и текст
                var itemsCount = response.TotalItemCount;
                var itemsCountText = pluralForm(itemsCount, 'товар', 'товара', 'товаров');
                
                // Цена на корзину и текст
                var itemsPrice = response.TotalItemPrice;
                var itemsPriceF = response.TotalItemPriceF;
                var itemsPriceText = pluralForm(itemsPrice, 'рубль', 'рубля', 'рублей');
                
                // Обновим элементы на странице
                $('.b-cart__goods_count').text(itemsCount);
                $('.b-cart__goods_count_text').text(itemsCountText);
                
                $('.b-cart__goods_price').text(formatPrice(itemsPrice));
                $('.b-cart__goods_price_text').text(itemsPriceText);
                $('.b-cart__goods_price_f').html(itemsPriceF);
                
                // Вызовем модальное окно
                $('#modal-item-added-to-cart').modal();
            },
            // Обработаем ошибки при добавлении
            error: function(response) {
                alert('Не удалось добавить товар в корзину');
            }
        });
    });
    
    $('.button-delete-item-from-cart').click(function() {
        // Получим атрибут name у input поля товара
        var cartItemName = $(this).parents('.cart-item').find('input.cart-item-name').attr('name');
        
        // Установим полученное имя в одноимённый атрибут в форме удаления товара в модальном окне
        $('#modal-delete-item-from-cart-item').attr('name', cartItemName);
        
        // Вызовем модальное окно
        $('#modal-delete-item-from-cart').modal();
    });
});

Заказ

AddTemplate.html

<?php /* ######################################################################## */ ?>
<?php /* #                              НАСТРОЙКИ                               # */ ?>
<?php /* ######################################################################## */ ?>

<?php

//##############
//#Вывод ошибок#
//##############

/*
ini_set('display_errors',1);
error_reporting(E_ALL);
*/

//######################
//#Глобальные настройки#
//######################

// Определим особенные методы доставки и оплаты, требующие доп. функционала
$delivery_method_pickup_id = 2;
$delivery_method_courier_id = 1;

// Компонент "Пункт самовывоза".
// Должен содержать как минимум поля "Name" и "Address"
$pickup_class_id = 77;

// Группа пользователей "Покупатели"
$buyer_permission_group_id = 8;

//#########
//#Функции#
//#########

// Печатаем ошибку
function print_warning($text) {
    ob_start(); ?>
    
    <p style="color:red;"><?= $text; ?></p>
    
    <?php return ob_get_clean();
}

// Печатаем ошибки
function print_warnings($warnings) {
    if (empty($warnings)) {
        return;
    }
    
    foreach ($warnings as $warning) {
        echo print_warning($warning);
    }
}

// Добавляем ошибку
function add_warning($text) {
    global $warnings;
    
    if (!isset($warnings) || empty($text)) {
        return;
    }
    
    $warnings[]= $text;
}

// Есть ли ошибки?
function has_warnings() {
    global $warnings;
    
    return isset($warnings) && !empty($warnings);
}

// Маска для '+7 (999) 999-99-99'
function check_phone($phone) {
    return preg_match('/^\+7 \([0-9]{3}\) [0-9]{3}-[0-9]{2}-[0-9]{2}$/', $phone);
}

// Регистрация пользователя
function reg_user($email, $fio, $phone, $permission_group_id) {
    global $nc_core;
    global $x_url;
    
    // Проверим, юзверь с таким Phone уже есть?
    $user_row = new x_Row('User', $phone, 'Phone');
    
    // Прервём скрипт если юзверь с таким Phone уже есть
    if ($user_row->has()) {
        return;
    }
    
    $is_email_generated = false;
    
    // Если передан Email
    if (!empty($email)) {
        // Проверим, юзверь с таким Email уже есть?
        $user_row = new x_Row('User', $email, 'Email');
        
        // Прервём скрипт если юзверь с таким Email уже есть
        if ($user_row->has()) {
            return;
        }
    }
    
    // Если Email не передан - найдём свободный email
    else {
        $row = null;
        
        do {
            // Сгенерируем случайный Email
            $email = x_gen_rand_str(8).'@gmail.com';
            
            $row = new x_Row('User', $email, 'Email');
        } while($row->has());
        
        $is_email_generated = true;
    }
    
    // Создаём нового пользователя
    $user_row = new x_Row('User', -1, 'User_ID');
    
    // Генерируем пароль
    $password = x_gen_rand_str(10);
    
    // Задаём ему характеристики
    $date = date('Y-m-d h:i:s');
    
    $user_row->PermissionGroup_ID = $permission_group_id;
    $user_row->Login = $email;
    $user_row->Password = md5($password);
    $user_row->Email = $email;
    $user_row->ForumName = $fio;
    $user_row->ForumSignature = $email;
    $user_row->Phone = $phone;
    $user_row->Created = $date;
    $user_row->LastUpdated = $date;
    $user_row->Checked = 1;
    $user_row->Confirmed = 1;
    
    $user_row->save();
    
    // Создаём запись в таблице "Группа пользователя"
    $user_group_row = new x_Row('User_Group', -1, 'ID');
    
    $user_group_row->User_ID = $user_row->User_ID;
    $user_group_row->PermissionGroup_ID = $permission_group_id;
    
    $user_group_row->save();
    
    // Шлём письмо с данными регистрации
    if (!$is_email_generated) {
        $subject = 'Регистрация на planetjeans';
        
        $message = <<<EOD
<p>Спасибо за регистрацию на planetjeans!</p>

<p><b>Ваш логин:</b> $email</p>

<p><b>Ваш пароль:</b> $password</p>

<p>С уважением, команда planetjeans.</p>

EOD;
        
        $from_name = $from_email = 'noreply@planetjeans.ru';
        
        x_send_mail($from_name, $email, $subject, $message);
    }
    
    // Авторизуем юзверя
    $nc_core->user->authorize_by_id($user_row->User_ID);
}

function get_recovery_pass_text_by_field($field, $pass_recovery_url) {
    return "Пользователь с таким $field уже есть. Если это действительно Ваш $field - либо авторизуйтесь на вкладке \"Авторизация\", либо <a href=\"$pass_recovery_url\" style=\"text-decoration: underline;\">восстановите пароль</a>.";
}

//############
//#Переменные#
//############

$nc_core = nc_Core::get_object();
$nc_netshop = nc_netshop::get_instance();
$nc_cart = $nc_netshop->cart;
$nc_input = $nc_core->input;
$user_id = $AUTH_USER_ID;
$is_authorized = $user_id > 0;

$nc_items = $nc_cart->get_items();
$nc_cart_discount = $nc_cart->get_discount_sum();
$nc_cart_total_price = $nc_cart->get_totals();

$nc_items_counter = 1;

$pass_recovery_url = '/netcat/modules/auth/password_recovery.php';

//##########################
//#Методы доставки и оплаты#
//##########################

// Все методы доставки и оплаты
$all_delivery_methods = $nc_netshop->delivery->get_enabled_methods();
$all_payment_methods = $nc_netshop->payment->get_enabled_methods();

// Объект заказа
$nc_order = nc_netshop_order::from_post_data((array)$nc_core->input->fetch_post(), $nc_netshop);

// Контекст для получения подходящих методов доставки и оплаты
$context = $nc_netshop->get_condition_context();
$context->set_order($nc_order);

// Доступные методы доставки и оплаты
$delivery_methods = $all_delivery_methods->matching($context);
$payment_methods = $all_payment_methods->matching($context);

// Выбранные методы доставки и оплаты
$delivery_method_id = $nc_input->fetch_post('f_DeliveryMethod');
$payment_method_id = $nc_input->fetch_post('f_PaymentMethod');

// Если не выбраны ещё - примем первый метод за выбранный
$delivery_method_id = !empty($delivery_method_id) ? $delivery_method_id : $delivery_methods[0]->get_id();
$payment_method_id = !empty($payment_method_id) ? $payment_method_id : $payment_methods[0]->get_id();

// Получим выбранный метод доставки
$delivery_method = null;

foreach ($delivery_methods as $method) {
    if ($method->get_id() == $delivery_method_id) {
        $delivery_method = $method;
        
        break;
    }
}

// Получим выбранный метод оплаты
$payment_method = null;

foreach ($payment_methods as $method) {
    if ($method->get_id() == $payment_method_id) {
        $payment_method = $method;
        
        break;
    }
}

// Наценка на выбранный метод доставки
$delivery_method_cost = 0;

$estimate = $delivery_method->get_estimate($nc_order);

if (!$estimate->has_error()) {
    $delivery_method_cost = $estimate->get('price');
}

// Наценка на выбранный метод оплаты
$payment_method_cost = 0;

if ($payment_method->evaluate_conditions($context)) {
    $payment_method_cost = $payment_method->get_extra_cost($nc_order);
}

// Пункты самовывоза
$pickup_points = $x_db->query(
    "SELECT
        `Message_ID` AS `id`,
        `Name`,
        `Address`
    FROM
        `Message$pickup_class_id`",
    'id'
);

// Выбранный метод самовывоза 
$pickup_point_id = $nc_input->fetch_post('f_PickupPointID');

// Если не был выбран ранее метод - выберем первый
if (empty($pickup_point_id)) {
    $ids = array_keys($pickup_points);
    
    $pickup_point_id = $ids[0];
}

//#####################################################
//#Итоговая цена на корзину и методы доставки и оплаты#
//#####################################################

$total_price = $nc_cart_total_price + $delivery_method_cost + $payment_method_cost;

//################
//#Номера страниц#
//################

$page_user = $page_delivery = $page_payment = $page_confirmation = -1;

$counter = 1;

// Страница пользователя
$page_user = $counter++;

// Страница доставки
$page_delivery = $counter++;

// Страница оплаты
$page_payment = $counter++;

// Страница подтверждения
$page_confirmation = $counter++;

// Итоговое кол-во страниц
$pages_count = $page_confirmation;

// Начальная страница
$start_page = !$is_authorized ? $page_user : $page_delivery;

//##################
//#Названия страниц#
//##################

$pages_names = array();

$pages_names[$page_user] = 'Пользователь';
$pages_names[$page_delivery] = 'Доставка';
$pages_names[$page_payment] = 'Оплата';
$pages_names[$page_confirmation] = 'Подтверждение';

//##################
//#Текущая страница#
//##################

// Нужен ли переход на следующую страницу?
$go_to_next_page = $nc_input->fetch_post('go_to_next_page');

// Нужен ли переход на предыдущую страницу?
$go_to_prev_page = $nc_input->fetch_post('go_to_prev_page');

// Текущая страница
$page = $nc_input->fetch_post('page');

$prev_page = $page;

// Переключение страниц
if ($go_to_next_page) {
    $page++;
} else if ($go_to_prev_page) {
    $page--;
}

$page = !empty($page) ? $page : $start_page;

//###################
//#Вся бизнес-логика#
//###################

// Массив для ошибок
$warnings = array();

// Обработка событий на страницах
if ($prev_page == $page_user) {
    // Получим POST данные с данной страницы
    $auth_login = $nc_input->fetch_post('auth_login');
    $auth_password = $nc_input->fetch_post('auth_password');
    $reg_fio = $nc_input->fetch_post('reg_fio');
    $reg_email = $nc_input->fetch_post('reg_email');
    $reg_phone = $nc_input->fetch_post('reg_phone');
    $anonym_fio = $nc_input->fetch_post('anonym_fio');
    $anonym_phone = $nc_input->fetch_post('anonym_phone');
    
    $is_auth = !empty($auth_login) || !empty($auth_password);
    $is_reg = !empty($reg_fio) || !empty($reg_email) || !empty($reg_phone);
    $is_anonym = !empty($anonym_fio) || !empty($anonym_phone);
    
    $is_anything = $is_auth || $is_reg || $is_anonym;
    
    if (!$is_anything) {
        add_warning('Нельзя проложить оформление, не заполнено ни одно поле!');
    } else {
        // Авторизуем пользователя?
        if ($is_auth) {
            if (empty($auth_login)) {
                add_warning('Поле "Логин" не может быть пустым.');
            }
            
            if (empty($auth_password)) {
                add_warning('Поле "Пароль" не может быть пустым.');
            }
            
            // Если ошибок нет - можно авторизовать пользователя по тем данным, что он вписал
            if (!has_warnings()) {
                // Определим ID пользователя
                $user_row = new x_Row('User', $auth_login, 'Email');
                
                // Есть ли юзверь с данным email?
                if ($user_row->has()) {
                    // Админ(1) или Покупатель(6)?
                    if (in_array($user_row->PermissionGroup_ID, array(1, $buyer_permission_group_id))) {
                        $auth_password = md5($auth_password);
                        
                        // Пароль верный?
                        if (strcmp($user_row->Password, $auth_password) == 0) {
                            // Авторизуем юзверя
                            $nc_core->user->authorize_by_id($user_row->User_ID);
                        } else {
                            add_warning('Не правильный пароль.');
                        }
                    }
                } else {
                    add_warning('Пользователь с таким логином не найден.');
                }
            }
        }
        
        // Регистрируем пользователя?
        else if ($is_reg) {
            // Валидация fio
            if (empty($reg_fio)) {
                add_warning('Поле "Ф.И.О." не может быть пустым.');
            }
            
            // Валидация Email
            if (empty($reg_email)) {
                add_warning('Поле "Email" не может быть пустым.');
            } else {
                // Валидация Email
                if (!filter_var($reg_email, FILTER_VALIDATE_EMAIL)) {
                    add_warning('Поле "Email" имеет не верный формат.');
                } else {
                    // Проверим, вдруг такой юзверь уже есть?
                    $user_row = new x_Row('User', $reg_email, 'Email');
                    
                    // Если нет юзверя с таким email - регаем нового
                    if ($user_row->has()) {
                        add_warning(get_recovery_pass_text_by_field('"Email"', $pass_recovery_url));
                    }
                }
            }
            
            // Валидация Phone
            if (empty($reg_phone)) {
                add_warning('Поле "Телефон" не может быть пустым.');
            } else {
                if (!check_phone($reg_phone)) {
                    add_warning('Поле "Телефон" имеет не верный формат.');
                } else {
                    // Проверим, вдруг такой юзверь уже есть?
                    $user_row = new x_Row('User', $reg_phone, 'Phone');
                    
                    // Если нет юзверя с таким Phone - регаем нового
                    if ($user_row->has()) {
                        add_warning(get_recovery_pass_text_by_field('"Телефон"', $pass_recovery_url));
                    }
                }
            }
            
            // Если ошибок нет - можно регистрировать пользователя
            if (!has_warnings()) {
                reg_user($reg_email, $reg_fio, $reg_phone, $buyer_permission_group_id);
            }
        }
        
        // Пользователь решил быть без регистрации?
        else if ($is_anonym) {
            // Валидация fio
            if (empty($anonym_fio)) {
                add_warning('Поле "Ф.И.О." не может быть пустым.');
            }
            
            // Валидация Phone
            if (empty($anonym_phone)) {
                add_warning('Поле "Телефон" не может быть пустым.');
            } else {
                if (!check_phone($anonym_phone)) {
                    add_warning('Поле "Телефон" имеет не верный формат.');
                } else {
                    // Проверим, вдруг такой юзверь уже есть?
                    $user_row = new x_Row('User', $anonym_phone, 'Phone');
                    
                    // Если нет юзверя с таким Phone - регаем нового
                    if ($user_row->has()) {
                        add_warning(get_recovery_pass_text_by_field('"Телефон"', $pass_recovery_url));
                    }
                }
            }
            
            // Если ошибок нет - можно регистрировать пользователя
            if (!has_warnings()) {
                // Всё равно регаем анонимного пользователя - чтобы не было заказов без пользователей
                reg_user(null, $anonym_fio, $anonym_phone, $buyer_permission_group_id);
            }
        }
    }
    
    // Если есть ошибки
    if (has_warnings()) {
        // Не пускаем дальше
        $page = $prev_page;
        
        // Почистим данные
        if ($is_auth) {
            $is_reg = $is_anonym = false;
            $reg_fio = $reg_email = $reg_phone = null;
            $anonym_fio = $anonym_phone = null;
        } else if ($is_reg) {
            $is_auth = $is_anonym = false;
            $auth_login = $auth_password = null;
            $anonym_fio = $anonym_phone = null;
        } else if ($is_anonym) {
            $is_auth = $is_reg = false;
            $auth_login = $auth_password = null;
            $reg_fio = $reg_email = $reg_phone = null;
        }
    }
}

if ($prev_page == $page_delivery) {
    // Если был выбран метод доставки - "Доставка курьером"
    if ($delivery_method_id == $delivery_method_courier_id) {
        // Получим POST данные со страницы
        $delivery_pickup_address = $nc_input->fetch_post('f_Address');
        $delivery_pickup_city = $nc_input->fetch_post('f_City');
        $delivery_pickup_zip = $nc_input->fetch_post('f_Zip');
        
        if (empty($delivery_pickup_address)) {
            add_warning('Поле "Адрес" не может быть пустым.');
        }
        
        if (empty($delivery_pickup_city)) {
            add_warning('Поле "Город" не может быть пустым.');
        }
        
        if (empty($delivery_pickup_zip)) {
            add_warning('Поле "Индекс" не может быть пустым.');
        }
        
        // Если есть ошибки
        if (has_warnings()) {
            // Не пускаем дальше
            $page = $prev_page;
        }
    }
}

?>
<?=$warnText;?>
<form method="post" action="<?= $SUB_FOLDER.$HTTP_ROOT_PATH ?>add.php">

<?php /* ######################################################################## */ ?>
<?php /* #                   ЧАСТЬ ФОРМЫ, ОБЩАЯ ДЛЯ ВСЕХ СТРАНИЦ                # */ ?>
<?php /* ######################################################################## */ ?>
    
    <!-- Hidden поля формы -->
    <?= $nc_core->token->get_input(); ?>
    <input type="hidden" name="admin_mode" value="<?= $nc_core->admin_mode; ?>"/>
    <input type="hidden" name="catalogue" value="<?= $catalogue; ?>"/>
    <input type="hidden" name="cc" value="<?= $cc; ?>"/>
    <input type="hidden" name="sub" value="<?= $sub; ?>"/>
    <input type="hidden" name="posting" value="0"/>
    <input type="hidden" name="curPos" value="0"/>
    <input type="hidden" name="page" value="<?= $page; ?>"/>
    <input type="hidden" name="f_ContactName" value="<?= $current_user['ForumName']; ?>">
    <input type="hidden" name="f_Email" value="<?= $current_user['Email']; ?>">
    
    <!-- Сохраним POST параметры в hidden поля, чтобы ничего не потерять -->
    <?php if ($page > 1):
        // Для каждого POST параметра с префиксом 'f_' или '__' создадим hidden поле
        // 'f_*' - Поля компонента NetCat
        // '__*' - Поля формы, значение которых нужно сохранять при переходах по страницам
        foreach ((array)$nc_core->input->fetch_post() as $key=>$value):
            // Не забываем про исключения, например 'f_Parent_Message_ID'
            if (strpos($key, 'f_') === 0 || strpos($key, '__') === 0): ?>
                
                <input type="hidden" name="<?= htmlspecialchars($key, ENT_QUOTES); ?>" value="<?= htmlspecialchars($value, ENT_QUOTES); ?>">
                
            <?php endif;
        endforeach;
    endif; ?>
    
    <!-- Заголовок страницы -->
    <h2><?= $pages_names[$page]; ?></h2>
    
<?php /* ######################################################################## */ ?>
<?php /* #                         СТРАНИЦА "ПОЛЬЗОВАТЕЛЬ"                      # */ ?>
<?php /* ######################################################################## */ ?>
    <?php if ($page == $page_user):
        // По умолчанию - пункт авторизации
        $is_auth = !$is_anything ? true : $is_auth; ?>
    
    <ul class="nav nav-tabs user-page-tabs">
        <li <?= isset($is_auth) && $is_auth ? ' class="active" ' : ''; ?> ><a data-toggle="tab" href="#auth">Авторизация</a></li>
        <li <?= isset($is_reg) && $is_reg ? ' class="active" ' : ''; ?> ><a data-toggle="tab" href="#reg">Регистрация</a></li>
        <li <?= isset($is_anonym) && $is_anonym ? ' class="active" ' : ''; ?> ><a data-toggle="tab" href="#anonym">Оформить без регистрации</a></li>
    </ul>
    
    <?= print_warnings($warnings); ?>
    
    <div class="tab-content">
        <div id="auth" class="tab-pane fade <?= isset($is_auth) && $is_auth ? ' in active ' : ''; ?> ">
            
            <div class="col-md-6">
                <h3>Авторизация</h3>
                <p>Если вы уже являетесь нашим клиентом, то просим Вас авторизоваться.</p>
                
                <div class="form-group">
                    <label for="input-auth-login">Логин (Email):</label>
                    <input type="email" name="auth_login" value="<?= $auth_login; ?>" class="form-control" id="input-auth-login" placeholder="Введите Email">
                </div>
                
                <div class="form-group">
                    <label for="input-auth-password">Пароль:</label>
                    <input type="password" name="auth_password" value="<?= $auth_password; ?>" class="form-control" id="input-auth-password" placeholder="Введите Ваш пароль">
                </div>
                
                <div class="form-group">
                    <p>Забыли пароль? <a href="<?= $pass_recovery_url; ?>">Восстановить.</a></p>
                </div>
            </div>
            
        </div>
        <div id="reg" class="tab-pane fade <?= isset($is_reg) && $is_reg ? ' in active ' : ''; ?> ">
            
            <div class="col-md-6">
                <h3>Регистрация</h3>
                <p>Если вы ещё не являетесь нашим клиентом - то самое время им стать! Заполните, пожалуйста, следующие поля.</p>
                
                <div class="form-group">
                    <label for="input-reg-fio">Ф.И.О.:</label>
                    <input type="text" name="reg_fio" value="<?= $reg_fio; ?>" class="form-control" id="input-reg-fio" placeholder="Введите Ф.И.О.">
                </div>
                
                <div class="form-group">
                    <label for="input-reg-email">Email:</label>
                    <input type="email" name="reg_email" value="<?= $reg_email; ?>" class="form-control" id="input-reg-email" placeholder="Введите Email">
                </div>
                
                <div class="form-group">
                    <label for="input-reg-phone">Телефон:</label>
                    <input type="text" name="reg_phone" value="<?= $reg_phone; ?>" class="form-control phonemask" id="input-reg-phone" placeholder="Введите Ваш номер телефона">
                </div>
            </div>
            
        </div>
        <div id="anonym" class="tab-pane fade <?= isset($is_anonym) && $is_anonym ? ' in active ' : ''; ?> ">
            
            <div class="col-md-6">
                <h3>Оформить без регистрации</h3>
                <p>Тем не менее, нам необходимы некоторые данные от Вас.</p>
                
                <div class="form-group">
                    <label for="input-anonym-fio">Ф.И.О.:</label>
                    <input type="text" name="anonym_fio" value="<?= $anonym_fio; ?>" class="form-control" id="input-anonym-fio" placeholder="Введите Ф.И.О.">
                </div>
                
                <div class="form-group">
                    <label for="input-anonym-phone">Телефон:</label>
                    <input type="text" name="anonym_phone" value="<?= $anonym_phone; ?>" class="form-control phonemask" id="input-anonym-phone" placeholder="Введите Ваш номер телефона">
                </div>
            </div>
            
        </div>
    </div>
    
    
    <?php endif; ?>
<?php /* ######################################################################## */ ?>
<?php /* #                           СТРАНИЦА "ДОСТАВКА"                        # */ ?>
<?php /* ######################################################################## */ ?>
    <?php if ($page == $page_delivery): ?>
    
    <div class="row">
    
        <?= print_warnings($warnings); ?>
    
        <?php
        
        $counter = 0;
        
        foreach ($delivery_methods as $method):
            $counter++;
            
            $method_id = $method->get_id();
            $method_name = $method->get('name');
            $method_description = $method->get('description'); ?>
            
            <label class="col-md-4">
                <h2><input type="radio" name="f_DeliveryMethod" value="<?= $method_id; ?>" <?= $method_id == $delivery_method_id ? 'checked' : ''; ?> > <?= $method_name; ?></h2>
                <p><?= $method_description; ?></p>
            </label>
            
            <!-- Перенос методов в другой div, чтобы не рушить сетку -->
            <?php if ($counter == 3): ?>
                
                </div>
                <div class="row">
                
            <?php $counter = 0;
            endif; ?>
            
        <?php endforeach; ?>
    
    </div>
    
    <div class="row" id="block-delivery-method-pickup" <?= $delivery_method_id != $delivery_method_pickup_id ? 'style="display:none;"' : '' ?> >
        <div class="col-md-12">
            
            <br><br><br>
            
            <h3>Самовывоз</h3>
            
            <div class="row">
                
                <?php
                
                $counter = 0;
                
                foreach ($pickup_points as $id=>$data):
                    $counter++; ?>
                    
                    <label class="col-md-4">
                        <h2><input type="radio" name="f_PickupPointID" value="<?= $id; ?>" <?= $id == $pickup_point_id ? 'checked' : ''; ?> > <?= $data['Name']; ?></h2>
                        <p><?= $data['Address']; ?></p>
                    </label>
                    
                    <!-- Перенос методов в другой div, чтобы не рушить сетку -->
                    <?php if ($counter == 3): ?>
                        
                        </div>
                        <div class="row">
                        
                    <?php $counter = 0;
                    endif; ?>
                    
                <?php endforeach; ?>
            
            </div>
            
        </div>
    </div>
    
    <div class="row" id="block-delivery-method-courier" <?= $delivery_method_id != $delivery_method_courier_id ? 'style="display:none;"' : '' ?> >
        <div class="col-md-12">
            
            <br><br><br>
            
            <h3>Курьерская доставка</h3>
            
            <!-- Т.к. в текущей вёрстке placeholder'ы очень похожи на значение поля - сделаем их менее заметными -->
            <style>
                .thin-placeholder::-webkit-input-placeholder {
                    color: rgba(0, 0, 0, 0.1);
                }
                .thin-placeholder::-moz-placeholder {
                    color: rgba(0, 0, 0, 0.1);
                }
                .thin-placeholder:-ms-input-placeholder {
                    color: rgba(0, 0, 0, 0.1);
                }
                .thin-placeholder:-moz-placeholder {
                    color: rgba(0, 0, 0, 0.1);
                }
            </style>
            
            <div class="form-group">
                <label for="input-delivery-courier-search">Поле для поиска - впишите свой полный адрес:</label>
                <input type="text" name="__delivery_courier_search" value="<?= $_POST['__delivery_courier_search']; ?>" class="form-control thin-placeholder" id="input-delivery-courier-search" placeholder="г. Волгоград, ул. им. Менжинского, д. 2, кв. 90">
            </div>
            
            <p style="color: #ce0896"><i><b>Внимание!</b> При правильном заполнении поля для поиска остальные <u>поля ниже заполнятся автоматически</u>!</i></p>
            
            <div class="form-group">
                <label for="input-delivery-courier-address">Адрес:</label>
                <input type="text" name="f_Address" value="<?= $f_Address; ?>" class="form-control thin-placeholder" id="input-delivery-courier-address" placeholder="ул. им. Менжинского, д. 2, кв. 90">
            </div>
        </div>
        
        <div class="col-md-6">
            <div class="form-group">
                <label for="input-delivery-courier-city">Город:</label>
                <input type="hidden" name="f_City" value="<?= $f_City; ?>">
                <input type="text" name="__delivery_courier_city" value="<?= $_POST['__delivery_courier_city']; ?>" class="form-control thin-placeholder" id="input-delivery-courier-city" placeholder="Волгоград">
            </div>
        </div>
        
        <div class="col-md-6">
            <div class="form-group">
                <label for="input-delivery-courier-zip">Индекс:</label>
                <input type="text" name="f_Zip" value="<?= $f_Zip; ?>" class="form-control thin-placeholder" id="input-delivery-courier-zip" placeholder="400033">
            </div>
        </div>
        
        <div class="col-md-12">
            <div class="form-group">
                <label for="input-delivery-courier-comments">Комментарии к доставке:</label>
                <textarea name="f_Comments" class="form-control thin-placeholder" id="input-delivery-courier-comments" placeholder="Введите Ваш комментарий, если Вам есть что сказать..."><?= $f_Comments; ?></textarea>
            </div>
        </div>
    </div>
    
    <?php endif; ?>
<?php /* ######################################################################## */ ?>
<?php /* #                           СТРАНИЦА "ОПЛАТА"                          # */ ?>
<?php /* ######################################################################## */ ?>
    <?php if ($page == $page_payment): ?>
    
    
    <div class="row">
    
        <?php
        
        $counter = 0;
        
        foreach ($payment_methods as $method):
            $counter++;
            
            $method_id = $method->get_id();
            $method_name = $method->get('name');
            $method_description = $method->get('description'); ?>
            
            <label class="col-md-4">
                
                <h2><input type="radio" name="f_PaymentMethod" value="<?= $method_id; ?>" <?= $method_id == $payment_method_id ? 'checked' : ''; ?> > <?= $method_name; ?></h2>
                <p><?= $method_description; ?></p>
            </label>
            
            <!-- Перенос методов в другой div, чтобы не рушить сетку -->
            <?php if ($counter == 3): ?>
                
                </div>
                <div class="row">
                
            <?php $counter = 0;
            endif; ?>
            
        <?php endforeach; ?>
    
    </div>
    
    
    <?php endif; ?>
<?php /* ######################################################################## */ ?>
<?php /* #                        СТРАНИЦА "ПОДТВЕРЖДЕНИЕ"                      # */ ?>
<?php /* ######################################################################## */ ?>
    <?php if ($page == $page_confirmation): ?>
    
    <style>
        .middle {
            vertical-align: middle !important;
        }
        .center {
            text-align: center !important;
        }
    </style>
    
    <!-- ТОВАРЫ В ЗАКАЗЕ -->
    <h2>Состав заказа</h2>
    
    <table class="table">
        <tr>
            <!-- Номер товара -->
            <th class="visible-lg visible-md center middle">#</th>
            
            <!-- Фото товара -->
            <th class="visible-lg visible-md center">Фото</th>
            
            <!-- Информация о товаре -->
            <th>Информация о товаре</th>
            
            <!-- Кол-во товара -->
            <th class="visible-lg visible-md">Кол-во</th>
            
            <!-- Цена товара -->
            <th class="visible-lg visible-md">Цена</th>
            
            <!-- Скидка на товар -->
            <th class="visible-lg visible-md">Скидка</th>
            
            <!-- Стоимость товара -->
            <th>Стоимость</th>
        </tr>
        
        <?php foreach ($nc_items as $nc_item):
            $nc_item_subdivision_url = nc_folder_path($nc_item['Subdivision_ID']);
            $nc_item_subdivision_name = $nc_core->subdivision->get_by_id($nc_item['Subdivision_ID'], 'Subdivision_Name'); ?>
            
            <tr class="cart-item">
                <!-- Номер товара -->
                <td class="visible-lg visible-md center middle"><?= $nc_items_counter++; ?></td>
                
                <!-- Фото товара -->
                <td class="visible-lg visible-md">
                    <img src="<?= $nc_item['Image']; ?>" class="img-responsive" style="width:125px;"/>
                </td>
                
                <!-- Информация о товаре -->
                <td class="middle">
                    <?= $nc_item['ItemID']; ?><br/>
                    <a href="<?= $nc_item['URL'] ?>"><?= $nc_item['FullName']; ?></a><br/>
                    <a href="<?= $nc_item_subdivision_url; ?>"><?= $nc_item_subdivision_name; ?></a>
                </td>
                
                <!-- Кол-во товара -->
                <td class="middle" class="visible-lg visible-md">
                    <?= $nc_item['Qty']; ?> <?= htmlspecialchars($nc_item['Units']) ?>
                </td>
                
                <!-- Цена товара -->
                <td class="middle"><?= $nc_item['OriginalPriceF']; ?></td>
                
                <!-- Скидка на товар -->
                <td class="middle"><?= $nc_item['ItemDiscountF']; ?></td>
                
                <!-- Стоимость товара -->
                <td class="middle"><?= $nc_item['TotalPriceF']; ?></td>
            </tr>
        
        <?php endforeach;
        
        if ($nc_cart_discount > 0): ?>
            
            <tr>
                <!-- Номер товара -->
                <td class="visible-lg visible-md"></td>
                
                <!-- Фото товара -->
                <td class="visible-lg visible-md"></td>
                
                <!-- Информация о товаре -->
                <td></td>
                
                <!-- Кол-во товара -->
                <td class="visible-lg visible-md"></td>
                
                <!-- Цена товара -->
                <td class="visible-lg visible-md"></td>
                
                <!-- Скидка на товар -->
                <td class="visible-lg visible-md"></td>
                
                <!-- Стоимость товара -->
                <td class="lead">
                    Скидка<br>на корзину:<br/>
                    <?= $nc_netshop->format_price($nc_cart_discount); ?>
                </td>
            </tr>
            
        <?php endif; ?>
        
        <tr>
            <!-- Номер товара -->
            <td class="visible-lg visible-md"></td>
            
            <!-- Фото товара -->
            <td class="visible-lg visible-md"></td>
            
            <!-- Информация о товаре -->
            <td></td>
            
            <!-- Кол-во товара -->
            <td class="visible-lg visible-md"></td>
            
            <!-- Цена товара -->
            <td class="visible-lg visible-md"></td>
            
            <!-- Скидка на товар -->
            <td class="visible-lg visible-md"></td>
            
            <!-- Стоимость товара -->
            <td class="lead">
                Итого:<br/>
                <?= $nc_netshop->format_price($nc_cart_total_price); ?>
            </td>
        </tr>
        
    </table>
    
    <!-- МЕТОД ДОСТАВКИ -->
    <h2>Выбранный метод доставки</h2>
    <p><b>Название:</b> <?= $delivery_method->get('name'); ?></p>
    
    <!-- Если самовывоз -->
    <?php if ($delivery_method_id == $delivery_method_pickup_id): ?>
        
        <p><b>Пункт самовывоза:</b> <?= $pickup_points[$pickup_point_id]['Name']; ?></p>
        
    <?php endif; ?>
    
    <!-- Если курьерская доставка -->
    <?php if ($delivery_method_id == $delivery_method_courier_id): ?>
        
        <p><b>Город:</b> <?= $_POST['__delivery_courier_city']; ?></p>
        <p><b>Адрес:</b> <?= $f_Address; ?></p>
        <p><b>Индекс:</b> <?= $f_Zip; ?></p>
        <p><b>Комментарий к доставке:</b> <?= $f_Comments; ?></p>
        
    <?php endif; ?>
    
    <p><b>Наценка:</b> <?= $nc_netshop->format_price($delivery_method_cost); ?></p>
    
    <p><button type="submit" name="page" value="<?= $page_delivery; ?>" class="btn btn-primary">Изменить</button></p>
    
    <!-- МЕТОД ОПЛАТЫ -->
    <h2>Выбранный метод оплаты</h2>
    <p><b>Название:</b> <?= $payment_method->get('name'); ?></p>
    <p><b>Наценка:</b> <?= $nc_netshop->format_price($payment_method_cost); ?></p>
    
    <p><button type="submit" name="page" value="<?= $page_payment; ?>" class="btn btn-primary">Изменить</button></p>
    
    <!-- ИТОГО -->
    <h2>Итоговая сумма</h2>
    <p><b>Итого:</b> <?= $nc_netshop->format_price($total_price); ?></p>
    
    
    <?php endif; ?>
<?php /* ######################################################################## */ ?>
<?php /* #                         ИТОГОВЫЕ КНОПКИ ФОРМЫ                        # */ ?>
<?php /* ######################################################################## */ ?>
    
    <div class="row">
        <div class="col-md-12">
            
            <?php
            
            $style = ' style="margin-left:15px;" ';
            
            if ($page == $pages_count): ?>
                
                <button type="submit" name="posting" value="1" class="btn btn-primary pull-right" <?= $style; ?> >Оформить</button>
                
            <?php else: ?>
                
                <button type="submit" name="go_to_next_page" value="1" class="btn btn-primary pull-right" <?= $style; ?> >Далее</button>
                
            <?php endif; ?>
            
            <?php if ($page > $start_page): ?>
                
                <button type="submit" name="go_to_prev_page" value="1" class="btn btn-primary pull-right">Назад</button>
                
            <?php endif; ?>
            
        </div>
    </div>
    
</form>

<script>
    $(document).ready(function() {
        // Маска для полей с телефоном
        $('.phonemask').mask('+7 (999) 999-99-99');
        
        // ########################################################################
        // #ЧИСТКА ПОЛЕЙ В ТАБАХ НА СТРАНИЦЕ "ПОЛЬЗОВАТЕЛЬ" ПРИ ПЕРЕКЛЮЧЕНИИ ТАБОВ#
        // ########################################################################
        
        // Поля
        var inputAuthLogin = $('#input-auth-login');
        var inputAuthPassword = $('#input-auth-password');
        
        var inputRegFIO = $('#input-reg-fio');
        var inputRegEmail = $('#input-reg-email');
        var inputRegPhone = $('#input-reg-phone');
        
        var inputAnonymFIO = $('#input-anonym-fio');
        var inputAnonymPhone = $('#input-anonym-phone');
        
        // При переключении табов
        $('.user-page-tabs a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
            // Узнаем ID таба, на который мы переключились
            var id = $(e.target).attr('href');
            id = id.replace(/#/, '');
            
            // Почистим данные в других табах
            if (id === 'auth') {
                inputRegFIO.val('');
                inputRegEmail.val('');
                inputRegPhone.val('');
                
                inputAnonymFIO.val('');
                inputAnonymPhone.val('');
            } else if (id === 'reg') {
                inputAuthLogin.val('');
                inputAuthPassword.val('');
                
                inputAnonymFIO.val('');
                inputAnonymPhone.val('');
            } else if (id === 'anonym') {
                inputAuthLogin.val('');
                inputAuthPassword.val('');
                
                inputRegFIO.val('');
                inputRegEmail.val('');
                inputRegPhone.val('');
            }
        });
        
        // ##########################################################
        // #ПОДСКАЗКИ ПРИ ВЫБОРЕ МЕТОДА ДОСТАВКИ "КУРЬЕРСКАЯ СЛУЖБА"#
        // ##########################################################
        
        $('input[name="__delivery_courier_search"]').suggestions({
            serviceUrl: 'https://suggestions.dadata.ru/suggestions/api/4_1/rs',
            token: 'ade54f576082516df9065a5c2c95674a68c7fc1d',
            type: 'ADDRESS',
            count: 5,
            onSelect: function(response) {
                var data = response.data;
                
                // Данные из ответа
                var city = data.city;
                var city_type = data.city_type;
                var street = data.street;
                var street_type = data.street_type;
                var house = data.house;
                var house_type = data.house_type;
                var flat = data.flat;
                var flat_type = data.flat_type;
                
                var zip = data.postal_code;
                
                // Итоговый адрес
                var address = '';
                
                if (street !== null) {
                    address += street_type + ' ' + street;
                }
                
                if (house !== null) {
                    address += ', ' + house_type + ' ' + house;
                }
                
                if (flat !== null) {
                    address += ', ' + flat_type + ' ' + flat;
                }
                
                $('input[name="f_Address"]').val(address);
                
                // Почтовый индекс
                $('input[name="f_Zip"]').val(zip);
                
                // Город (текстовое значение)
                $('input[name="__delivery_courier_city"]').val(city);
                
                // Город (ID города из списка)
                if (city.length > 0) {
                    $.ajax({
                        type: 'POST',
                        url: '/_cdn/order/city.php',
                        data: {
                            city: city
                        },
                        success: function(response) {
                            // Установим значение ID города в нужное поле
                            $('input[name="f_City"]').val(response);
                        }
                    });
                }
            }
        });
        
        // #########################################################
        // #ПОКАЗ/СОКРЫТИЕ БЛОКОВ ДЛЯ ОПРЕДЕЛЕННЫХ МЕТОДОВ ДОСТАВКИ#
        // #########################################################
        
        var deliveryMethodPickupID = <?= $delivery_method_pickup_id; ?>;
        var deliveryMethodCourierID = <?= $delivery_method_courier_id; ?>;
        
        var blockDeliveryMethodPickup = $('#block-delivery-method-pickup');
        var blockDeliveryMethodCourier = $('#block-delivery-method-courier');
        
        $('input[name="f_DeliveryMethod"]').click(function() {
            var id = parseInt($(this).val());
            
            // Скрываем все доп. блоки
            blockDeliveryMethodPickup.hide();
            blockDeliveryMethodCourier.hide();
            
            // Очищаем все поля, связанные с курьерской доставкой
            $('input[name="__delivery_courier_search"]').val('');
            $('input[name="__delivery_courier_city"]').val('');
            $('input[name="f_Address"]').val('');
            $('input[name="f_Zip"]').val('');
            $('input[name="f_City"]').val('');
            
            // Выбираем первый пункт самовывоза (как бы сбрасываем выбор пунктов самовывоза)
            $('input:radio[name="f_PickupPointID"]:first').prop('checked', true);
            
            // Показываем доп. блок при выборе связанного с ним метода доставки
            if (id === deliveryMethodPickupID) {
                blockDeliveryMethodPickup.show();
            } else if (id === deliveryMethodCourierID) {
                blockDeliveryMethodCourier.show();
            }
        });
        
    });
</script>

AddCond.html

<?php

$nc_core = nc_core::get_object();
$netshop = nc_netshop::get_instance();

$order = nc_netshop_order::from_post_data($nc_core->input->fetch_post(), $netshop);
$order_errors = $netshop->check_new_order($order);

if ($order_errors) {
    $posting = 0;
    $warnText = (isset($warnText) && strlen($warnText) ? "$warnText<br />\n" : "") .
                join("<br />\n", $order_errors);
}

?>

AddActionTemplate.html

<?php

$order->set_id($msgID);
$order->offsetUnset('SignUp');
$email = $order['Email'];
$reg_data = array();
$auth_settings = $nc_core->get_settings('', 'auth', false, $catalogue_id);
if (!$AUTH_USER_ID) {
    if (!isset($_SESSION['user_hash'])) {
        $_SESSION['user_hash'] = md5((mt_rand(1, 1000) * mt_rand(1, 100) + mt_rand(1, 10000)) / mt_rand(1, 10));
    }
    $order->set('user_hash', $_SESSION['user_hash']);

    if ($nc_core->input->fetch_post('f_SignUp')) {
        $user_id = 0;

        if ($nc_core->user->check_login($email) == NC_AUTH_LOGIN_OK) {
            $alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
            $length = strlen($alphabet);
            $password = '';

            for ($i = 0; $i < 8; $i++) {
                $password .= $alphabet[mt_rand(0, $length - 1)];
            }

            $registration_code = $auth_settings['confirm'] ? md5(uniqid('', true)) : '';

            try {
                $user = array(
                    'Email' => $email,
                    'Login' => $email,
                    'ForumName' => $order['ContactName'],
                );
                $user_id = $nc_core->user->add($user, 2, $password, array(
                    'Checked' => $auth_settings['confirm'] ? 0 : 1,
                ), $registration_code);
            } catch (Exception $e) {

            }
        }

        if ($user_id) {
            $order->set('User_ID', $user_id);
            $reg_data = array('user_id' => $user_id, 'password' => $password);
            if ($auth_settings['autoauthorize']) {
                $nc_core->user->authorize_by_id($user_id);
            }
        }
    }
}

setcookie('Order_ContactName', $order['ContactName'], time() + 31536000, '/');
setcookie('Order_Email', $order['Email'], time() + 31536000, '/');
setcookie('Order_City', $order['City'], time() + 31536000, '/');
setcookie('Order_Phone', $order['Phone'], time() + 31536000, '/');
setcookie('Order_Address', $order['Address'], time() + 31536000, '/');
setcookie('Order_Zip', $order['Zip'], time() + 31536000, '/');

$netshop->place_order($order, $reg_data);

$payment_method = new nc_netshop_payment_method($order['PaymentMethod']);
$payment_system_id = $payment_method['handler_id'];

$invoice = null;
if ($payment_system_id && nc_module_check_by_keyword('payment', false)) {
    $invoice = new nc_payment_invoice(array(
        "payment_system_id" => $payment_system_id,
        "amount" => $order->get_totals(),
        "description" => "Оплата заказа $msgID",
        "currency" => $netshop->get_currency_code(),
        "customer_id" => $AUTH_USER_ID,
        "customer_name" => (string)$f_ContactName,
        "customer_email" => (string)$f_Email,
        "customer_phone" => (string)$f_Phone,
        "order_source" => 'netshop',
        "order_id" => $msgID,
    ));
    $invoice->save();
}

while (ob_end_clean()) ;

if ($isNaked) {
    echo 'OK';
} else {
    header("Location: {$nc_core->SUB_FOLDER}/orders/added" . ($invoice ? ("?invoice=" . $invoice->get('id')) : ""));
}

exit;

?>

以上是关于php Интернет-магазин(неразобрано)的主要内容,如果未能解决你的问题,请参考以下文章

La Sylphide 仙女

text ТаймингиMODX(Запросыкбазеданных,времяпарсингаит.д。)

php сортировкамногомерногомассивапозначению

php Изменяетзапрос,чтобыработалапагинациянастранице类别。 Страница(page)categoryдолжнабытьсозданавадмин

python Скриптпреобразованияматрицызаполняемойпострочновматрицузаполняемуюпоспирали---найденчерезгугл

php Добавлениесобственныхфразпередзаголовкомтовара,настраницетовара