+7(863)285-04-66

info@promtechautomat.ru

г. Ростов-на-Дону. Социалистическая 74

Разработка серверной части калькулятора стоимости монтажа кабельных лотков

code-lotkov-calc

Рисунок 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>
                                    ';