|
|
|
| Добрый день!
Была на форуме php с данной проблемой, посоветовали обратиться за помощью Javascript-функции. Пишу форму следующую по смыслу:
человек выбирает себе услуги, которые указаны в текстовых полях и в checkbox-ах, каждая из этих услуг соответствует определенной цене, в середине формы должна выйти общая стоимость выбранных услуг. Так же человек должен заполнить данные некоторых других полей, лишь затем форма идет на обработку delivery.php и на подтверждение этому человеку с возможностью что-либо поправить и сделать последующий заказ.
Помогите реализовать похожее на это:
<HTML><HEAD>
<TITLE>Please Choose a Service</TITLE>
<META http-equiv=Content-Type content=text/html;charset=windows-1251>
</HEAD>
<BODY style="FONT: 9px A9898 size=2 face=Arial>" leftMargin=0 topMargin=0
marginheight="0" marginwidth="0">
<FORM name=form action=delivery.php method=post>
<SELECT size=1 name=Service >
<OPTION value=CompletePlus
selected>Complete Plus ( KIT, EIN, Registered Agent, S-Election (for
corp.))</OPTION>
<OPTION value=CompleteService>Complete Service Package
(with corporate KIT)</OPTION>
<OPTION value="Economy ">Economy (Basic
documents only)</OPTION>
<OPTION value=SpecialNY>Special offer-NY State
Business Corporation-$355</OPTION>
<OPTION value=SpecialNJ>Special
offer-NJ Business Corporation-$310</OPTION>
</SELECT>
<INPUT type=checkbox value=On name=ExpeditedService> <FONT
face=Arial size=1>Expedited Service-$25
<INPUT type=checkbox value=RoutineService name=RoutineService > Routine
Service-$0
<div>
<script language="JavaScript" type="text/javascript">
function get_sum()
{
switch(document.form.Service.value) {
case "CompletePlus":
var Service=300;
break;
case "CompleteService":
var Service=280;
break;
case "Economy":
var Service=280
break;
case "SpecialNY":
var Service=355
break;
case "SpecialNJ":
var Service=310
break;
default:
var Service=300
break;
}
if (document.form.ExpeditedService.checked) {
var ExpeditedService = 25
} else {
var ExpeditedService = 0
}
if (document.form.RoutineService.checked) {
var RoutineService= 0
} else {
var RoutineService = 0
}
var result = Service + ExpeditedService + RoutineService
document.form.result.value=result
}
</script>
</div>
<li onMouseOver="get_sum()" > посчитать </li>
<INPUT maxLength=30 size=30 name=result value="" ></TD>
</FORM>
</BODY></HTML>
|
| |
|
|
|
|
|
|
|
для: Nadyusha
(07.10.2007 в 19:15)
| | Вопрос: что вы хотите получить, отправив форму на сервер, текстовые значения элементов, или вам нужна общая сумма, либо то и другое вместе? | |
|
|
|
|
|
|
|
для: sim5
(07.10.2007 в 19:28)
| | Нужна общая сумма на этой же странице без перезагрузки, с сохранением данных для подтверждения клиентом, которое будет обрабатываться скриптом php и отправляться клиентом на заказ. | |
|
|
|
|
|
|
|
для: Nadyusha
(07.10.2007 в 19:38)
| | Тогда удалите из значений опшенов текстовые значения, а вместо них вставьте стоимость этой услуги, соответсвующую стоимость укажите и в других выбираемых полях. Тогда, в JS функции подсчитывайте в цикле, проверяющем выбранные элементы формы, сумму их значений. Такое сможите сами написать или нет? Кстати не вставляйте JS-скрипт в DIV, и желательно, не указывайте тег <FONT>. | |
|
|
|
|
|
|
|
для: sim5
(07.10.2007 в 19:46)
| | По правде говоря у меня мало опыта с JS....
Но вот что получилось:
<script language="JavaScript" type="text/javascript">
function get_sum()
{
switch(document.form.Service.value) {
case "300":
var 300;
break;
case "280":
var 280;
break;
case "280":
var 280;
break;
case "355":
var 355;
break;
case "310":
var 310;
break;
default:
var 300;
break;
}
if (document.form.25.checked) {
var 25;
} else {
var 0;
}
if (document.form.0.checked) {
var 0;
} else {
var 0;
}
var result = Service + 25 + 0
document.form.result.value=result
}
</script>
|
| |
|
|
|
|
|
|
|
для: Nadyusha
(07.10.2007 в 21:07)
| | И что: неужели что-то в этом скрипте работает?! Вы объявляете переменную var 300 !!! Такие переменные нельзя объявлять ни в ява-скрипт, ни (я так думаю) в любом другом языке. | |
|
|
|
|
|
|
|
для: Nadyusha
(07.10.2007 в 21:07)
| | У вас значение одного чекбокса равно 0, поэтому он не учитывается при подсчете, остальное можно так:
<script language="JavaScript" type="text/javascript">
function get_sum(f) {
var m = parseInt(f.service.options[f.service.selectedIndex].value);
if (f.expeditd.checked) var n = parseInt(f.expeditd.value);
else var n = 0;
f.result.value = m + n;
}
</script>
<FORM name="form" action="delivery.php" method="post">
<SELECT size="1" name="service" onchange="get_sum(this.form)">
<OPTION value=120>Complete Plus - 120</OPTION>
<OPTION value=150>Complete Service - 150</OPTION>
<OPTION value=200>Economy - 200</OPTION>
<OPTION value=355>Special - 355</OPTION>
<OPTION value=310>Special offer - 310</OPTION>
</SELECT>
<INPUT type="checkbox" value=25 name="expeditd" onclick="get_sum(this.form)">Expedited Service-$25
<INPUT type="checkbox" value=0 name="RoutineService">Routine Service-$0
<br>
<INPUT maxLength=30 size=30 name="result" value="" >
</FORM>
|
Название полей и их значения просто произвольные, выставите свои. | |
|
|
|
|
|
|
|
для: sim5
(07.10.2007 в 22:11)
| | СПАСИБО ОГРОМНОЕ!!!!!!!
Форма работает, теперь я поняла!
Благодарю за помощь, вы меня ТАК выручили!!! | |
|
|
|
|
|
|
|
для: sim5
(07.10.2007 в 22:11)
| | там и правда строки
if (document.form.RoutineService.checked) {
var RoutineService= 0
} else {
var RoutineService = 0
}
можно заменить просто
var RoutineService = 0
:)
я так понимаю что для подсчёта суммы обязательно надо вызывать событие как
напаример <li onMouseOver="get_sum()" > наведение курсора мышки на какой-нибудь раздел, или есть способ что-бы цифра сама менялась ?
и как можно вывести цифру не в INPUT , а например просто на странице ? | |
|
|
|
|
|
|
|
для: EXP
(07.10.2007 в 23:06)
| | Зачем onMouseOver? Сумма должна подсчитываться после выбора того или иного значения, а это либо нажатие, либо щелчек, либо изменение состояния (у селекта).
Вывести на страницу, а вернее в элемент на странице, все-таки страница форматируется с их помощью, можете через свойство элемента innerHTML, обратившись к элементу по его ID или NAME. | |
|
|
|
|
|
|
|
для: sim5
(07.10.2007 в 23:17)
| | Почему-то поле с выводом общей суммы выходит в самом верху страницы, как его поставить например на середину страницы? | |
|
|
|
|
|
|
|
для: Nadyusha
(07.10.2007 в 23:43)
| | Прошу прощения, уже исправила.... | |
|
|
|
|
|
|
|
для: Nadyusha
(07.10.2007 в 23:43)
| | Тогда лучше поступить иначе. Сумму к оплате за выбранные услуги показывать не в форме, а в другом эелементе на странице. Например это будет называться как "Корзина", либо "Выбранные услуги", в общем это уже вы решаете, а элементом отображающим это будет DIV. Вы можете даже показывать это в одной из ячеек таблицы, если страница оформлена с ее помощью. При этом нужно будет внести небольшое дополнение.
1. Елемент result теперь будет иметь тип hidden, и не будет виден на странице, его задача принять сумму за услуги, кторую вы получите на стороне сервера.
2. Добавить элемент для отображения суммы (в примере это DIV cart).
3. В функции дополнить вывод текста плюс суммы в div.
Вот, как пример, это будет выглядеть:
//это добавляем в функцию get_sum(f)
document.getElementById('cart').innerHTML = 'Выбрано услуг на $'+(m + n);
//так должен быть прописан элемент result
<input type="hidden" name="result" value="">
//добавим элемент отображающий сумму выбранных услуг
<div id="cart">Услуги не выбраны</div>
|
Элементу cart прописать стиль
<style>
#cart {
width: 160px;
height: 20px;
border: 1px solid #000;
position: absolute;
top: 100px;
left: 200px;
font: 12px Verdana, Geneva, Arial, Helvetica, sans-serif;
}
</style>
|
Теперь вы можете поместить эту корзину куда угодно, прописав в стиле для DIV нужное его местоположение. Это просто пример, вы можете поступить по другому, просто теперь форма и "корзина" не связаны "жестко" друг с другом, а это даст вам больше сводбоды. | |
|
|
|
|
|
|
|
для: sim5
(08.10.2007 в 13:46)
| | Действительно это намного свободнее!
Такой вопрос: могу ли я сделать так, чтобы результат показывался и на этой же странице и на следующей с выбранными позициями для подтверждения? | |
|
|
|
|
|
|
|
для: Nadyusha
(09.10.2007 в 03:12)
| | Можно конечно. Для этого данные касающиеся выбранного товара/услуги должны находиться во "временном хранилище", которым зачастую служит сессия. | |
|
|
|
|
|
|
|
для: sim5
(09.10.2007 в 07:50)
| | и куки | |
|
|
|
|
|
|
|
для: sim5
(09.10.2007 в 07:50)
| | Можете уточнить что значит "временное хранилище"? Каким образом его надо формировать? | |
|
|
|
|
|
|
|
для: Nadyusha
(11.10.2007 в 19:54)
| | Ну где вы должны хранить записи, например сколько сделали заказов и чего. Вы можете использовать для этого базу, файл, куки или сессию. Первое в вашем случае не нужно, второе не удобно, третье может быть отключено у клиента. А вот сессия - это механизм, который вам как раз подойдет. Использовать это просто. Если у вас все обращения построены через индексный файл, то достаточно в нем один раз записать вызов сессиии, если нет, то в каждом скрипте вы должны это делать.
<?
// стартуем сессию
session_start();
// теперь, например, при получениии формы, мы берем заказ
// клиента и помещаем его в сессиюю, пусть это будет просто сумма
$_SESSION["summa"] = $_POST['summa'];
// вам достаточно при формировании любой из страниц получить
// эту переменную из сессии, и вывести на экран
if ($_SESSION["summa"]) // если создана такая переменная (был заказ)
// то выводим
echo '<div id="cart">'.$_SESSION['summa'].'</div>';
?>
|
Вы можете использовать сессию не только для того чтобы выводить эту сумму на страницу, но и, если пользователь выберет еще что-то, то проссумировать ее, добавлять записи вида (категории) услуг и многое другое. | |
|
|
|
|
|
|
|
для: sim5
(11.10.2007 в 20:09)
| | Почему-то выдает ошибку:
Not Found
The requested URL /function.session-start was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request. | |
|
|
|
|
|
|
|
для: Nadyusha
(11.10.2007 в 21:57)
| | Вы это проверяете на локальной машине или на реальном хосте? Если на локальном, то включены ли у вас сессии в php.ini? Как у вас происходит запрос к страницам, например, так (url как пример):
index.php?orders // запрос страницы заказов через индекный файл
или
orders.php //прямой вызов скрипта страницы заказов
PS. Вы как вызываете сессию, так:
session-start() ?
если да, то не верно, пишется так session_start() ! | |
|
|
|
|
|
|
|
для: sim5
(11.10.2007 в 22:02)
| | Сессию вызываю так:
Проверяю сразу на реальном хосте. Запрос к странице заказов не сделала... видимо поэтому... | |
|
|
|
|
|
|
|
для: Nadyusha
(11.10.2007 в 23:00)
| | Не густо с ответами ). Но если вы правильно пишите функцию, то странный возврат ошибки:
>Not Found
>The requested URL /function.session-start was not found on this server.
Это означает, что не существует функции session-start().
Отрабатывать лучше на локальном, установите себе сервер, Денвера вам вполне достаточно будет. И помните, если вы напрямую обращаетесь к своим скриптам, которые будут работать с сессией, то session_start() должна вызываться во всех этих скриптах, иначе данные сессии будут утеряны. | |
|
|
|
|
|
|
|
для: sim5
(12.10.2007 в 05:28)
| | Я конечно жутко извиняюсь, но установив сервер "Денвер", не могу сдвинуться с места.... Помогите пожалуйста разобраться с моей ошибкой. Когда я в скрипте delivery.php прописала
<?
print "<P ALIGN=CENTER><font color=#9900CC size=3 face=Tahoma> Hello! </P><BR>";
print "<P ALIGN=CENTER><font color=#9900CC size=3 face=Tahoma> Your order is: <font color=#ff0000 size=2 face=Tahoma</font>" .$POST_['result']."</P><BR>"
?>
<?
session_start();
$_SESSION["summa"] = $_POST['summa'];
if ($_SESSION["summa"])
echo '<div id="cart">'.$_SESSION['summa'].'</div>';
?>
|
На хосте выходит следующее:
Hello!
Your order is:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home2/e4914306/public_html/delivery.php:8) in /home2/e4914306/public_html/delivery.php on line 15
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home2/e4914306/public_html/delivery.php:8) in /home2/e4914306/public_html/delivery.php on line 15
|
В строке 15, на которую он ругается прописано начало скрипта
В самой форме прописала
<?
session_start();
$_SESSION["summa"] = $_POST['summa'];
if ($_SESSION["summa"])
echo '<div id="cart">'.$_SESSION['summa'].'</div>';
?>
<script language="JavaScript" type="text/javascript">
function get_sum(f) {
var m = parseInt(f.service.options[f.service.selectedIndex].value);
if (f.ExpeditedService.checked) var n = parseInt(f.ExpeditedService.value);
else var n = 0;
if (f.EIN.checked) var p = parseInt(f.EIN.value);
else var p = 0;
if (f.seal.checked) var t = parseInt(f.seal.value);
else var t = 0;
if (f.NY.checked) var r = parseInt(f.NY.value);
else var r = 0;
if (f.agent.checked) var k = parseInt(f.agent.value);
else var k = 0;
if (f.sert.checked) var w = parseInt(f.sert.value);
else var w = 0;
if (f.sertIncor.checked) var d = parseInt(f.sertIncor.value);
else var d = 0;
if (f.stamp.checked) var h = parseInt(f.stamp.value);
else var h = 0;
if (f.website.checked) var g = parseInt(f.website.value);
else var g = 0;
f.result.value = m + n + p + t + r + k + w + d + h + g;
}
</script>
|
Причем в начале странице стало выходить:
'.$_SESSION['summa'].''; ?>
|
Может ли в форме быть не стыковка двух скриптов php и JS? | |
|
|
|
|
|
|
|
для: Nadyusha
(13.10.2007 в 07:06)
| | session start первой строчкой | |
|
|
|
|
|
|
|
для: Nadyusha
(13.10.2007 в 07:06)
| | bronenos - ну че так скупо?))
Nadyusha - session_start() не обязательно первой строкой в скрипте должно быть прописано, главное чтобы до этой записи не было никакого вывода, например, echo, print, лементов HTML и прочее. И кроме того, даже пустых строк в коде, а так же пустых строк, пробелов перед <?php.
$_SESSION['summa'] выводится на старнице потому, что у вас сессия не рабоатет (вы ее стартуете не правильно, см. выше), нет такой переменной $_SESSION['summa'], вот вы и получаете это на странице. При правильном старте сессии, вы сможете увидеть ее запись в папке установленного Денвера. Они хранятся в папке tmp под такими именами, например, sess_1baff5e9f299f318eac761ca84ea8390. Это обычный текст и вы можете посмотреть его Блокнотом, возможно это вам потребуется когда либо.
Вы, как я вижу, добавили еще в форму чекбоксов. Можно конечно и так, как вы пишите, добавлять к общей сумме их значения, но если вы еще будете добавлять элементы, то лучше проверять отмеченные чекбоксы в цикле, суммировать значения выбранных, добавив затем их к общей сумме. | |
|
|
|
|
|
|
|
для: sim5
(13.10.2007 в 11:29)
| | я сидел с телефона и просто вот так высказал
а что, скажете, неправильно? ) | |
|
|
|
|
|
|
|
для: bronenos
(13.10.2007 в 12:17)
| | Почему, просто ляпсусов с передачей заголовков гораздо больше, и связаны они скорее не с тем, что первой строкой не прописаны.) | |
|
|
|
|
|
|
|
для: sim5
(13.10.2007 в 11:29)
| | Спасибо за четкие советы!
Голова уже кругом идет... сейчас ругается :
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in /home2/e4914306/public_html/delivery.php on line 18
где в строке 18 стоит
print "<P ALIGN=CENTER><font color=#9900CC size=3 face=Tahoma> Hello! </P><BR>";
|
получается, когда я стартую сессию, я не могу ничего писать? | |
|
|
|
|
|
|
|
для: Nadyusha
(13.10.2007 в 19:00)
| | Да нет, причина не в сессии, где то до этой строки вы допустили ошибку. Проверьте все внимательно. А эту строку в чистом виде РНР выведет без проблем.
PS. У вас в этой строке не закрыт тег FONT. Да и вообще, ну их к ляху на страницах, лучше тегу P указать необходимый стиль в CSS. | |
|
|
|
|
|
|
|
для: sim5
(13.10.2007 в 19:26)
| | Спасибо.
Такой вопрос: что может означать ошибка
Parse error: syntax error, unexpected T_VARIABLE in /home2/e4914306/public_html/delivery.php on line 10
|
в 10 строке:
$session["summa"] = $POST_['summa'];
|
Чтобы я не делала, не меняла, ошибка не исправляется...
И еще один вопрос: когда прописываю этот же скрипт в форме, появляется сверху на странице скрипт в таком виде: '.$session['summa'].''; ?>, почему, тоже не могу понять где искать ошибку....
PS. Я еще не научилась работать с CSS, и не умею пока создавать циклы, к сожалению, хотя знаю, что намного облегчает работу.... научусь обязательно, не все сразу. | |
|
|
|
|
|
|
|
для: Nadyusha
(14.10.2007 в 07:09)
| | Это сообщение говорит: "Синтаксическая ошибка, неизвестная переменная в строке 10 файла delivery.php." Скорее это потому, что вы просто копируете себе в код то, что я вам пишу как пример.:) У вас ведь элементом в форме, который хранит сумму выбранных услуг, является:
<input type="hidden" name="result" value="">
|
Значит вы должны в скрипте, который принимает данные из формы записать:
<?php
session_start(); //помните о недопустимом выводе в браузер
if (isset($_POST['result'])) $_SESSION["summa"] = $_POST['result'];
?>
|
А мой пример $_POST['summa'] удалите. Теперь у вас в сессии будет находится сумма за выбранные услуги - $_SESSION["summa"], и вы можете вывести это значение на любой странице. Но перед выводом проверяйте, существует ли эта переменная:
<?php
session_start();
if (isset($_SESSION["summa"])) //ваши действия
?>
|
Теперь о $session["summa"] - найдите в файле Servers\usr\local\php5\php.ini строчку register_globals, проверьте, если она равна on или 1, то поставьте ей значение off или 0. Сохраните файл и если у вас был запущен сервер, то перезапустите его (чтобы изменения вступили в силу).
После этого всегда обращайтесь к сессии, как к элементу суперглобального массива:
$_SESSION["summa"] - как отмечено жирным.
Обратите внимание, у вас еще ошибка в записи - $POST_['summa'], вы должны писать так:
$_POST['summa'] - это тоже элемент суперглобального массива.
>когда прописываю этот же скрипт в форме, появляется сверху на странице скрипт в таком виде: $session['summa']
Про $session['summa'] я уже сказал, а вот что значит прописываю в форме, не понял, зачем? Прикрепите код вашей страницы полностью, чтобы посмотреть.
Функцию подсчета суммы get_sum() перепешите так:
<script>
function get_sum(f) {
var c = 0;
var s = eval(f.service.options[f.service.selectedIndex].value);
for (i=0; i<f.length; i++) {
if (f.elements[i].type == 'checkbox' && f.elements[i].checked)
c = c + eval(f.elements[i].value);
}
f.result.value = c + s;
}
</script>
|
Ну и добавить в каждый чекбокс вызов этой функции onclick="get_sum(this.form)", ну это у вас видимо наверняка сделано. Теперь вы можете в форму еще добавить (при необходимости) чекбоксов, при этом саму функцию редактировать не надо будет. | |
|
|
|
|
 11.8 Кб |
|
|
для: sim5
(14.10.2007 в 08:18)
| | Да, я теперь многое поняла и запомню на долго! Хороший урок! Спасибо.
Вроде бы все сделала....
>когда прописываю этот же скрипт в форме, появляется сверху на странице скрипт в таком виде: $session['summa']
Писала потому, что Вы говорили,что надо прописывать в каждом скрипте. Но когда убрала написанное, ошибка пропала.
А функция подсчета суммы get_sum() в таком виде намного меньше места занимает и спокойнее работает! Это и есть цикл?
В файле Servers\usr\local\php\php.ini - register_globals = 0, ничего не меняла. | |
|
|
|
|
|
|
|
для: Nadyusha
(14.10.2007 в 20:25)
| | Ну тогда дальнейших успехов!
В каждом скрипте работающем с сессией, надо прописывать session_start(), чтобы продливать открытую сессию, если ваши скрипты вызываются индивидуально. А если вызов страниц идет через индексный файл с параметрами, например: index.php/orders?p=12, то достаточно session_start() прописать один раз, в файле index.php. Вот о чем я говорил. А $session['summa'] - это неверная запись получения переменной из сессии.
Да это и есть цикл (FOR), в нем последовательно перебираются все элементы формы, и если элементом оказывается элемент типа checkbox и он будет отмечен (checked), то его значение суммируется к переменной 'с'. После цикла эта переменная суммируется со значением выбранного опшена элемента SELECT. Вот и все. | |
|
|
|