Разработка серверной части калькулятора стоимости монтажа кабельных лотков
Рисунок 1 - Пример кода калькулятора
Для разработки логики работы и обработки запросов на сервере, используем серверный язык программирования PHP. Чтобы отправлять данные на сервер и обратно их принимать используется метод ajax-запросов с типом POST.
POST - скрытый метод отправки данных на сервер. Метод POST передает информацию через HTTP-заголовки. Информация кодируется, как описано в случае метода GET, и помещается в заголовок QUERY_STRING. Метод POST не имеет ограничений по объему отправляемых данных. Метод POST может использоваться для отправки ASCII, а также двоичных данных.
Создаем отдельный файл, который будет принимать выбранные параметры из формы, заполненные пользователем. Так как данные из формы будут передаваться массивом, мы в нём и создадим переменные для хранения суммы и вывода расчетов пользователю.
$data - переменная, в которую записываем все данные, полученные методом POST.Запишем условия проверки данных, все ли они передались и нет ли пустых значений:
//Условие при отправке запроса //Если запрос пуст if (empty($_POST)) { echo $errors[] = 'Данные не отправлены!'; } if (!empty($_POST)): $data = $_POST; $errors[] = ''; if (!empty($data['top_lotok']) AND $data['top_lotok'] == 1): $top_true = 1; endif; if (!empty($data['type_lotok'])): $type = $connect->query('SELECT * FROM view_lotok WHERE id_views='.$data['type_lotok']); $type = mysqli_fetch_Array($type); else: $errors[] = 'Тип лотка не определён или выбраны неверные значения!'; endif; if (!empty($data['kolvo_uglov']) OR isset($data['kolvo_uglov'])): $kolvo_uglov = $data['kolvo_uglov']; elseif ($data['kolvo_uglov'] == 0): $kolvo_uglov = 0; else: $errors[] = 'Количество углов не введено!'; endif; if (!empty($data['length_line'])): $length = intval($data['length_line']); else: $errors[] = 'Длина прямых участков не указана!'; endif; if (!empty($data['width_lotka'])): $width = $connect->query('SELECT * FROM width_lotok WHERE id_width='.$data['width_lotka']); $width = mysqli_fetch_array($width); else: $errors[] = 'Ширина лотка не выбрана или по данной ширине нет лотков!'; endif; if (!empty($data['height_lotka'])): $height = $connect->query('SELECT * FROM height_lotok WHERE id_height='.$data['height_lotka']); $height = mysqli_fetch_array($height); else: $errors[] = 'Высота лотка не выбрана или по данной высоте нет лотков!'; endif; if (!empty($height) and !empty($width)): $lotok = $connect->query('SELECT * FROM lotok WHERE id_height=''.$height['id_height'].'' AND id_width=''.$width['id_width'].'' AND id_views=''.$type['id_views'].'''); $lotok = mysqli_fetch_array($lotok); else: $errors[] = 'С такими данными лоток не найден!'; endif; $cost = 0; // Проверка выбора покрытия if ($lotok == '' OR !$lotok OR empty($lotok) OR $lotok == null): $errors[] = 'Лоток не найден с такими параметрами!'; else: $cost = 'Измените данные для расчета!'; if ($data['pokryitie_lotka'] == 'hot'): $cost = $lotok['lotok_cost_procreator']; else: $cost = $lotok['lotok_cost_etm']; endif; endif; // Проверка длины прямых углов и добавление до кратности 3м if ($length % 3 == 0 or $length == 3) { $cost = $cost * $length; } else if ($length == 1) { $length = $length + 2; $cost = $cost * $length; } else if ($length % 2 == 0) { $length = $length + 1; $cost = $cost * $length; }
Запишем формулы расчетов сумм:
// Расчёт стоимости работ
$sto_rabot = ($length * 1000) + (1500 * $kolvo_uglov)
где
$length - длина прямых участков (м)
$kolvo_uglov - количество углов
// Сумма углов
$cost_cap = $kolvo_uglov * $data[‘cost_cap’]
Общая сумма без крышки:
// Сумма заказа
$summa = $cost + $sto_rabot + $cost_cap
где
$cost - цена лотка
$cost_cap - сумма углов
Общая сумма при наличии крышки:
$summa = $cost + $sto_rabot + ($top['cost_etm'] * $length) + $cost_cap;
где
$top - массив данных о крышке, подходящей по ширине и высоте к лотку.
Также если пользователь выбрал “горячее цинкование” то берутся записи цен с названием столбца “cost_procreator”, иначе берутся цены “'cost_etm”.
Код обработки данных и подсчетов:
// Расчёт стоимости работ $sto_rabot = ($length * 1000) + (1500 * $kolvo_uglov); if ($kolvo_uglov != 0): $cap = $connect->query('SELECT * FROM cap_lotok'); $cap = mysqli_fetch_array($cap); if ($data['pokryitie_lotka'] == 'hot'): $cost_cap = $cap['cost_etm'] * $kolvo_uglov; else: $cost_cap = $cap['cost_procreator'] * $kolvo_uglov; endif; else: $cost_cap = 0; endif; // Сумма заказа $summa = $cost + $sto_rabot + $cost_cap; //Проверка наличия крышки и расчет суммы при её наличии if ($data['top_lotok'] == 1 AND !empty($data['top_lotok'])) { $top = $connect->query('SELECT * FROM top_lotok WHERE top_lotok.width_top='.$width['id_width'].' OR top_lotok.height_top='.$height['id_height']); $top = mysqli_fetch_array($top); $top_cost = $top['cost_etm']; if ($data['pokryitie_lotka'] == 'hot'): $summa = $cost + $sto_rabot + ($top['cost_procreator'] * $length) + $cost_cap; $top_cost = $top['cost_procreator']; else: $summa = $cost + $sto_rabot + ($top['cost_etm'] * $length) + $cost_cap; $top_cost = $top['cost_etm']; endif; } endif;
Результат получаем в виде блока Html:
if (!empty($errors)): <div class='promtex-error'> <strong style='color: red; text-align: center; display: block; width: 100%;'> <?php echo array_shift($errors); </strong> </div> endif; <span class='font-weight: bold; text-align:center; margin-bottom: 10px;'>Спецификация</span> <span><strong>Тип лотка: </strong><? echo $type['name_view'] ?></span> <span><strong>Длина прямых участков (м): </strong><? echo $length; ?></span> if (!empty($top)): <span><strong> Наличие крышки: </strong> Есть </span> endif; <span><strong>Наличие углов: </strong> // Проверка количества и наличия углов if (!empty($cap) OR isset($cap) AND $cap != 0): echo 'Есть'; else: echo 'Нет'; endif; </span> <span><strong>Сумма работ: </strong> echo $sto_rabot .' руб'; </span> <span><strong>Общая сумма: </strong> echo $summa.' руб'; </span> ';