Разработка серверной части калькулятора стоимости монтажа кабельных лотков
Рисунок 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>
';