#php #javascript
#php #javascript
Вопрос:
Я знаю, что на эту тему вы можете найти множество ответов… Я потратил довольно много времени на поиск решения, которое я ищу.
У меня есть PHP-файл с формой. Этот PHP-файл использует JavaScript для предварительного выбора из выпадающего списка. Означает: если пользователь выбирает значение в выпадающем меню 1, то в выпадающем меню 2 выбор ограничен. Этот JavaScript определенно нуждается в перезагрузке PHP-файла для изменения значений второго выпадающего списка 2.
Вопрос теперь: Как я могу сохранить введенные пользователем значения в форме после выполнения JavaScript. В настоящее время все введенные данные теряются.
Одним из вариантов было бы установить все значения в URL и захватить их с помощью GET . Да .. это был бы вариант, но поскольку я использую 13 значений, URL-адрес выглядел бы не слишком красиво. Я не хочу, чтобы пользователь обращал внимание на то, что происходит. Я не могу использовать POST, так как я не нажимаю кнопку публикации.. это просто JavaScript, который выполняется и перезагружает страницу.
Я думал о заполнении сеанса введенными данными, но это невозможно напрямую, поскольку JavaScript находится на стороне клиента, а сеанс — на стороне сервера.
У вас есть какие-либо предложения?
Пример формы: Имя (текстовое поле) Фамилия (текстовое поле) Возраст (выпадающий список), Пол (выпадающий список)
Провинция (выпадающий список JS) Район (выпадающий список JS) Коммуна (выпадающий список JS) Деревня (выпадающий список JS)
Перевод.из (выпадающего списка) Центр здоровья (текстовое поле) Кнопка отправки скорой помощи (выпадающий список) Self.transfer (выпадающий список)
dynmicoptionlist.js код:
//Set parameters for provinces selection
function reload1(form) {
var val1=form.provinces.options[form.provinces.options.selectedIndex].value;
//Get the current URL
var url1=window.location.href;
//Check if the current URL has the search term in it (-1 means it is not in it)
if(url1.search("amp;provinces=") != -1) {
//Now that the search term was found, cut the search term from the URL so that it can be replaced
//This is necessary for multiple selections in the same drop down box
var url2 = url1.substr(0,url1.search("amp;provinces="));
//If the user has selected "Please select", then dont add the provinces parameter
if(val1 == "") {
//Create the new URL
self.location= url2
}
else {
//Create the new URL
self.location= url2 "amp;provinces=" val1 ;
}
}
else {
//The search term was not found, so just add the provinces
self.location= url1 "amp;provinces=" val1;
}
}
//Set parameters for districts selection
function reload2(form) {
var val1=form.provinces.options[form.provinces.options.selectedIndex].value;
var val2=form.districts.options[form.districts.options.selectedIndex].value;
//Get the current URL
var url1=window.location.href;
//Check if the current URL has the search term in it (-1 means it is not in it)
if(url1.search("amp;districts=") != -1) {
//Now that the search term was found, cut the search term from the URL so that it can be replaced
//This is necessary for multiple selections in the same drop down box
var url2 = url1.substr(0,url1.search("amp;districts="));
//If the user has selected "Please select", then dont add the provinces parameter
if(val2 == "") {
//Create the new URL
self.location= url2
}
else {
//Create the new URL
self.location= url2 "amp;districts=" val2 ;
}
}
else {
//The search term was not found, so just add the districts
self.location= url1 "amp;districts=" val2;
}
}
//Set parameters for communes selection
function reload3(form) {
var val1=form.provinces.options[form.provinces.options.selectedIndex].value;
var val2=form.districts.options[form.districts.options.selectedIndex].value;
var val3=form.communes.options[form.communes.options.selectedIndex].value;
//Get the current URL
var url1=window.location.href;
//Check if the current URL has the search term in it (-1 means it is not in it)
if(url1.search("amp;communes=") != -1) {
//Now that the search term was found, cut the search term from the URL so that it can be replaced
//This is necessary for multiple selections in the same drop down box
var url2 = url1.substr(0,url1.search("amp;communes="));
//If the user has selected "Please select", then dont add the provinces parameter
if(val3 == "") {
//Create the new URL
self.location= url2
}
else {
//Create the new URL
self.location= url2 "amp;communes=" val3 ;
}
}
else {
//The search term was not found, so just add the communes
self.location= url1 "amp;communes=" val3;
}
}
По предложению JohnP вот мои изменения на данный момент:
Я добавил функцию onload для заполнения скрытого поля значением:
<body onload="setValue()">
JavaScript, заполняющий значение, выглядит следующим образом:
<script type="text/javascript">
function setValue() {
document.getElementById("dyndrpdwnhidden").value="createPatient";
}
</script>
В моей форме я добавил скрытое поле:
<input type="hidden" id="dyndrpdwnhidden">
Чтобы получить значения из полей ввода формы в моем JavaScript dynmicoptionlist.js выше я использовал в качестве примера:
var entry_date = form.entry_date.value;
Комментарии:
1. Если вы знаете jQuery, не могли бы вы использовать вызов ajax для вызова php-скрипта без обновления страницы формы? Или просто обычный вызов ajax, просто jQuery упрощает использование вызовов ajax.
Ответ №1:
Может быть, вы пытаетесь использовать SESSION? Данные сеанса не исчезнут даже при обновлении страницы или перенаправлении.
Для сохранения любых данных:
session_start();
$_SESSION['data']=$_POST['data_from_previous_page'];
Чтобы прочитать это на любой странице:
session_start();
$_SESSION['data'];
Чтобы очистить все данные сеанса:
unset($_SESSION);
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
session_destroy();
Комментарии:
1. Пожалуйста, поправьте меня, если я ошибаюсь, но, насколько я понимаю, я могу использовать POST, только если отправлю форму. Поскольку этого не происходит (JavaScript просто перезагружает страницу) Я не могу это использовать, верно?
2. @Daniel, это правильно, СЕАНС применим только в том случае, если вы разместите форму. Теперь я понимаю вашу проблему, но на данный момент я все еще думаю о простом решении для вас. Но на самом деле проблема может быть решена, если вы можете остановить java для перезагрузки страницы после изменений в поле выбора. Jquery Ajax может очень упростить это. Итак, если страница не перезагружается после внесения изменений в поле выбора, все готово. Но это означало бы, что вам придется изменить кодировку и добавить Jquery, который, я думаю, вам пока не интересен. Позвольте мне поразмыслить и провести некоторое исследование по этому поводу, я уверен, что решение есть.
3. @Daniel: Можете ли вы поделиться кодом выпадающего списка JS, который вы используете? Возможно, я могу изменить это с помощью Jquery и Ajax, чтобы страница не перезагружалась, а просто обновляла содержимое поля выбора при изменении. Лучше, если вы сможете показать нам ту страницу, которую вы разрабатываете, дизайн вашей страницы для меня довольно расплывчатый. Если я знаю больше, то легче найти обходной путь.
4. Большое спасибо за ваши усилия, mmk! Я добавил исходный код моего выпадающего списка JS.
5. @Daniel: Возможно ли, чтобы вы разместили ссылку на свои веб-приложения, если она открыта для публики, чтобы я мог лучше оценить, прежде чем писать код модификации.
Ответ №2:
Почему бы просто не заставить ваш JS отправить форму? Это сделает переменные доступными, и вы можете активировать второй выпадающий список, просмотрев данные post вместо данных $ _GET, которые отправляет JS.
Комментарии:
1. точно, вы можете отправлять формы с помощью JS с помощью myFormObject.submit()
2. Если я отправлю форму, результатом следующего действия будет запись набора данных в базу данных. Поскольку выпадающий список находится как раз в середине формы, я думаю, что текстовые поля / другие выпадающие списки, возможно, еще не были введены пользователем. Я добавил образец формы в свой оригинальный пост.
3. Вы можете просто установить значение в скрытом поле, указывающее, что форма отправляется не для сохранения, а просто для извлечения выпадающих данных.
4. Извините за вопрос, но означает ли это, что я отправляю форму с помощью JS (просто для создания следующих выпадающих списков), но окончательная отправка формы все еще может быть выполнена так, как она есть прямо сейчас (html)?
5. @Daniel, ага. Обычно вы справляетесь с этим, устанавливая значение скрытого поля равным значению по умолчанию при загрузке страницы (например, —
save
), но при изменении значения выпадающего списка JS может изменить это значение на что-то другое и отправить форму. В вашем PHP-коде вы просто сохраняете форму, только если значение в скрытом поле является значением по умолчанию. Это звучит сложно, но это не так. Вы также можете заставить его работать и без JS, чтобы не нарушать доступность
Ответ №3:
используйте localStorage https://www.w3schools.com/jsref/obj_storage.asp
Объект хранения Объект хранения Web Storage API предоставляет доступ к сессионному хранилищу или локальному хранилищу для определенного домена. Это позволяет вам читать, добавлять, изменять и удалять сохраненные элементы данных.