[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Создание формы "Расчета стоимости посылки"!
iskatel2000
ЗАДАЧА: Создать форму расчета стоимости посылки, все подробности ниже...

Все выложено здесь: http://stopline.org/calc.php

user posted image



как видно саму форму, создал. с чего начать потом? описание переменных, функций... и желательно чтобы это все было в этом же файле (calc.php)


--



Спустя 33 минуты, 51 секунда (26.08.2012 - 19:44) Лена написал(а):
Начать с проектирования базы - неправильно спроектируете, после будут проблемы.
Из того, что есть, навскидку вырисовывается 3 таблицы:
country
id,country_name,tax (налог в этой стране)

delivery_option
id,id_country(внешний ключ с таблицей стран),date_to(фиксир. срок доставки),max_weight,max_cost

delivery (конкретная доставка)
id,kg(кол-во доставляемого в кг),cost_kg(стоимость за кг),to_date(конечная дата доставки),courier(1/0 - забор курьером)

Что дальше вызывает трудности? Вам остается расчитать стоимость конкретной доставки, у вас что-нибудь, кроме формы уже написано? Там все через if-else делается, используя информацию в базе. Проверка веса - через ajax.

Спустя 1 час, 35 минут, 1 секунда (26.08.2012 - 21:19) iskatel2000 написал(а):
оу, как все... может базу данных не использовать, данных то не много может просто все описать в самом файле? а то эти запросы... мне пжл ток начать а дальше я сам пойду

Спустя 13 минут (26.08.2012 - 21:32) bodja написал(а):
Цитата
оу, как все... может базу данных не использовать, данных то не много может просто все описать в самом файле? а то эти запросы... мне пжл ток начать а дальше я сам пойду

Такие вещи делаются вообще JS ,тем более если данных немного.

Спустя 13 часов, 50 минут, 44 секунды (27.08.2012 - 11:22) iskatel2000 написал(а):
Народ, подскажите просто как написать одну функцию на одну страну... потому что формула разная будет для каждой страны...

и еще вопрос, как сделать чтобы как только выбрал страну чтобы эти поля (Cроки доставки, Mаксимальный вес, Mаксимальная заявленная стоимость) сразу показывали значения... т.е. не после нажатия а сразу ... потому что они хранят постоянные данные

Спустя 29 минут, 48 секунд (27.08.2012 - 11:52) Игорь_Vasinsky написал(а):
нужны навыки JS, я щас на работе, поэтому некогда расписывать

смысл прост, нужно читать value инпутов и после того как все инпуты считаны запустить функцию ( onclick(getData();) - на кнопку расчитать )

function getData(страна, вес, курьер)
{
//вычесления
return result
// а точнее в твоём случае использовать innerHTML = result; для блока куда ты хочешь вывести результат
}


получить value c элемента можно, например, знав его ID

document.getElementById('ID инпута').value()



при этом стоит учитывать, что производятся арифметические действия, и перед самой формулой нужно все циферные переменные обработать parseInt() или parseFloat() (т.е. указать тип), смотря что за цифры

всё работает в реал тайме - без перезагрузки.

Спустя 9 минут, 43 секунды (27.08.2012 - 12:02) iskatel2000 написал(а):
видел один подобный исходник на JS

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
Калькулятор на JavaScript</title>
<meta
http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<script
type="text/javascript">

/*
* Функция подсчета стоимости услуг на создания дизайна сайта
*/

function calc() {
var type_design = document.getElementById("type_design"); //получаем ссылку на элемент Select (Тип дизайна)
var is_html = document.getElementById("is_html"); //получаем ссылку на чекбокс (Требуется верстка?)
var count = document.getElementById("count"); //получаем ссылку на элемент input (Кол-во вариантов)
var result = document.getElementById("result"); //получаем ссылку на элемент span, в него будем писать стоимость дизайна

var price = 0;
price += parseInt(type_design.options[type_design.selectedIndex].value);
price += (is_html.checked == true) ? parseInt(is_html.value) : 0;
price = parseInt(count.value) * price;

result.innerHTML = price;
}

</script>
</head>
<body>
<b>
Тип дизайна:</b><br/>
<select
onchange="calc()" id="type_design">
<option
value="0">Выбрать</option>
<option
value="5000">Простой дизайн сайта</option>
<option
value="7000">Сложный дизайн сайта</option>
<option
value="10000">Дизайн интернет-магазина</option>
</select><br/>
<input
type="checkbox" onchange="calc()" value="5" id="is_html" /> <label for="is_html">Забор курьера</label>
<br/>

Вес: <input type="text" id="count" value="1" onchange="calc()" />
<div>
Стоимость пересылки: <span id="result">0</span> руб.</div>

</body>
</html>


Спустя 5 минут, 17 секунд (27.08.2012 - 12:07) Shuriken написал(а):
Твой пример:

Цитата
Стоимость считается по формуле (пример Беларусь, за 1 кг=2,7 налог=10, минимальная сумма=21):

20 кг без курьера: 20*2,7+10=64
25 кг с курьером 25*2,7+10+5+1,81=84,31
3 кг без курьера:3*2,7+10=21


Рассчитывается приблизительно так:

<?
if (isset ($_POST['ves']))
{
$res=$_POST['ves']*2.7+10;
if (!empty($_POST['yes']))
{
$res=$res+5;
}
if ($res>77.47)
{
$res=$res+1.81;
}
if ($res<21)
{
$res=21;
}
}

?>





<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>
Документ без названия</title>

</head>

<body>

<form
action="calc.php" method="post">

<p>
<select
name="contry" >
<option
value="">Страна</option>
<option
value=""></option>
<option
value="Азербайджан">Азербайджан</option>
<option
value=" Армения"> Армения</option>
<option
value=" Белоруссия"> Белоруссия</option>
<option
value=" Грузия"> Грузия</option>
<option
value=" Казахстан"> Казахстан</option>
<option
value=" Киргизия"> Киргизия</option>
<option
value=" Латвия"> Латвия</option>
<option
value=" Литва"> Литва</option>
<option
value=" Молдова"> Молдова</option>
<option
value=" Польша"> Польша</option>
<option
value=" Россия"> Россия</option>
<option
value=" Узбекистан"> Узбекистан</option>
<option
value=" Украина"> Украина</option>
<option
value=" Эстония"> Эстония</option>
</select>
<br>

Вес: <input type="text" name="ves" />
<br>
<input
type="checkbox" name="yes" />
Забор курьером
<br>
<input
type="submit" name="calc" value="Рассчитать"/>
</p>

</form>
<strong>
Результат:</strong>
<table
width="444" border="1">
<tr>
<td
width="349">Стоимость пересылки</td>
<td
width="79"><? echo $res; ?></td>
</tr>
<tr>
<td>
Cроки доставки</td>
<td>
 </td>
</tr>
<tr>
<td>
Mаксимальный вес</td>
<td>
 </td>
</tr>
<tr>
<td>
Mаксимальная заявленная стоимость </td>
<td>
 </td>
</tr>
</table>

</body>
</html>



Если не хочешь использовать базу данных, то тебе нужно в файле прописать все значения налогов.

Спустя 1 минута, 47 секунд (27.08.2012 - 12:09) Игорь_Vasinsky написал(а):
ужс....


там кода на 10 строчек. и всё на JS


Спустя 8 минут, 54 секунды (27.08.2012 - 12:18) iskatel2000 написал(а):
Shuriken
СПАСИБО! ща буду пробывать...

Игорь_Vasinsky

ты про это имел ввиду?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
Калькулятор на JavaScript</title>
<meta
http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<script
type="text/javascript">

/*
* Функция подсчета стоимости услуг на создания дизайна сайта
*/

function calc() {
var type_design = document.getElementById("type_design"); //получаем ссылку на элемент Select (Тип дизайна)
var is_html = document.getElementById("is_html"); //получаем ссылку на чекбокс (Требуется верстка?)
var count = document.getElementById("count"); //получаем ссылку на элемент input (Кол-во вариантов)
var result = document.getElementById("result"); //получаем ссылку на элемент span, в него будем писать стоимость дизайна

var price = 0;
price += parseInt(type_design.options[type_design.selectedIndex].value);
price += (is_html.checked == true) ? parseInt(is_html.value) : 0;
price = parseInt(count.value) * price;

result.innerHTML = price;
}

</script>
</head>
<body>
<b>
Тип дизайна:</b><br/>
<select
onchange="calc()" id="type_design">
<option
value="0">Выбрать</option>
<option
value="5000">Простой дизайн сайта</option>
<option
value="7000">Сложный дизайн сайта</option>
<option
value="10000">Дизайн интернет-магазина</option>
</select><br/>
<input
type="checkbox" onchange="calc()" value="5" id="is_html" /> <label for="is_html">Забор курьера</label>
<br/>

Вес: <input type="text" id="count" value="1" onchange="calc()" />
<div>
Стоимость пересылки: <span id="result">0</span> руб.</div>

</body>
</html>



Спустя 22 минуты, 17 секунд (27.08.2012 - 12:40) Игорь_Vasinsky написал(а):
iskatel2000
ес оф коз. а что нужно было?

Спустя 53 секунды (27.08.2012 - 12:41) Игорь_Vasinsky написал(а):
хм biggrin.gif смотри как я точно всю ситуацию расписал, даже некоторые переменные именами совпали laugh.gif

Спустя 9 минут, 11 секунд (27.08.2012 - 12:50) iskatel2000 написал(а):
Товарищи, вопрос РЕШЕН!!! один очень хороший человек [YS.PRO] сделал решение вот в таком виде, я считаю лучше быть не может! ОГРОМНОЕ ЕМУ СПАСИБО!

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>
Документ без названия</title>

</head>

<body>

<form
action="calc.php" method="post">

<p>
<select
name="country" >
<option
value="">Страна</option>
<option
value=""></option>
<option
value="Азербайджан">Азербайджан</option>
<option
value="Армения"> Армения</option>
<option
value="Белоруссия"> Белоруссия</option>
<option
value="Грузия"> Грузия</option>
<option
value="Казахстан"> Казахстан</option>
<option
value="Киргизия"> Киргизия</option>
<option
value="Латвия"> Латвия</option>
<option
value="Литва"> Литва</option>
<option
value="Молдова"> Молдова</option>
<option
value="Польша"> Польша</option>
<option
value="Россия"> Россия</option>
<option
value="Узбекистан"> Узбекистан</option>
<option
value="Украина"> Украина</option>
<option
value="Эстония"> Эстония</option>
</select>
<br>

Вес: <input type="text" name="ves" />
<br>
<input
type="checkbox" name="yes" />
Забор курьером
<br>
<input
type="submit" name="calc" value="Рассчитать"/>
</p>

</form>



<?php


$prices = array(
'Белоруссия' => array(
'price_per_kg' => 2.7,
'tax' => 10,
'min_sum' => 21,
'max_sum' => 120,
'delivery_period' => 15,
'courier_price' => 5
),
'Армения' => array(
'price_per_kg' => 2.8,
'tax' => 11,
'min_sum' => 22,
'max_sum' => 121,
'delivery_period' => 16,
'courier_price' => 6
)

);


$additional_fee = 1.81;

if(!empty($_POST)) {
$country = trim($_POST['country']);
$weight = (int)$_POST['ves'];
$courier = isset($_POST['yes']) ? true : false;

// проверяем вес
$invalid_weight = false;

if(in_array($country, array('Белоруссия', 'Украина'))) {
if(30 < $weight) {
$invalid_weight = true;
}
}
elseif(20 < $weight) {
$invalid_weight = true;
}

if ($invalid_weight) {
// если превышен вес, ничего не считаем, а выводим сообщение
echo '<h3>Превышен максимально разрешенный вес</h3>';
} elseif (empty($country)) {
echo '<h3>Выберите страну</h3>';
} elseif (!isset($prices[$country])) {
echo '<h3>Для рассчета необходимо внести значения в массив $prices для данной страны ('.$country.')</h3>';
} else {
// рассчитываем цену
$price = $weight * $prices[$country]['price_per_kg'] + $prices[$country]['tax'];

// добавляем оплату курьера, если нужно
if($courier) {
$price += $prices[$country]['courier_price'];
}

// дополнительная комиссия 1.81 за превышение цены в 77.47
if($price > 77.47) {
$price += 1.81;
}

// установка минимальной цены если нужно
if($price < $prices[$country]['min_sum']) {
$price = $prices[$country]['min_sum'];
}

?>

<strong>
Результат:</strong>
<table
width="444" border="1">
<tr>
<td>
Страна доставки</td>
<td><?php
echo $country; ?></td>
</tr>
<tr>
<td
width="349">Стоимость пересылки</td>
<td
width="79"><?php echo $price; ?></td>
</tr>
<tr>
<td>
Cроки доставки</td>
<td><?php
echo $prices[$country]['delivery_period'] ?></td>
</tr>
<tr>
<td>
Mаксимальный вес</td>
<td><?php
echo in_array($country, array('Белоруссия', 'Украина')) ? 30 : 20; ?></td>
</tr>
<tr>
<td>
Mаксимальная заявленная стоимость </td>
<td><?php
echo $prices[$country]['max_sum'] ?></td>
</tr>
</table>

<?php

}

}


?>


</body>
</html>

Спустя 5 минут, 22 секунды (27.08.2012 - 12:56) Игорь_Vasinsky написал(а):
бееее... я на JS элегантней.

if(!empty($_POST))

мало ли у тя там ещё вдруг форма будет, и тогда засыпет тя нотисами

проверял бы нажатие кнопки isset()

Цитата
$weight = (int)$_POST['ves'];

тут надобы проверять корректность введённых данных, а не тупо приводить их к типу - введёт "аываыа" - ты получишь 0 и произведёшь расчёт

Спустя 6 минут, 25 секунд (27.08.2012 - 13:02) iskatel2000 написал(а):
вот теперь можно и дорабатывать еще было бы хорошо не перезагружать страницу (ajax)

Спустя 1 минута, 59 секунд (27.08.2012 - 13:04) KOPOJI написал(а):
Цитата
проверял бы нажатие кнопки isset()
empty() тоже не выдаст нотайс, она тоже проверяет на NULL. это вообще аналог isset(), только больше проверок выполняет (и в отличии от isset-а может принимать только один аргумент)

Спустя 2 минуты, 28 секунд (27.08.2012 - 13:07) Игорь_Vasinsky написал(а):
это всё разные вещи.

empty() - переменная есть, но пустое
!isset() - переменной нет isset() - переменная есть
NULL - есть, но значения нет, т.е. оно NULL laugh.gif

вроде biggrin.gif

Спустя 2 минуты, 24 секунды (27.08.2012 - 13:09) KOPOJI написал(а):
empty()
isset()
возвращаемые значения посмотри wink.gif

Спустя 3 минуты, 25 секунд (27.08.2012 - 13:12) Игорь_Vasinsky написал(а):
вспомнил laugh.gif

просто я всегда стараюсь применять то - что пытаюсь поймать wink.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.