Передача переменной из элемента select в функцию обновления JSON - PHP
Я пытаюсь обновить индивидуально загруженные файлы .json
в зависимости от того, какой вариант в <select>
выбран. Он загружает файл .json
, а затем обновляет индивидуальный файл до тех пор, пока я определяю $myFile
как конкретный файл .json
, например $myFile = "data/data.json";
Но когда я пытаюсь передать опцию select в качестве имени файла, ничего не сохраняется. Где я это испортил?
Вот выбор HTML:
<form action="/server/php/data/process.php" method="post">
<select class="ui mini fluid search dropdown" id="templateSelection" type="text" name="selectTemplate" onchange="loadTemplate()">
<option value="" selected="selected">Select Template</option>
<?php
foreach(glob(dirname(__FILE__) . '/server/php/data/*') as $filename){
$filename = basename($filename);
echo "<option value='" . $filename . "'>".$filename."</option>";
}
?>
</select>
</form>
Вот параметры, которые заполняются:
<option value="data.json">data.json</option>
<option value="data2.json">data2.json</option>
<option value="data3.json">data3.json</option>
И вот process.php:
<?php
//$myFile = "data/data.json";
$filename = $_POST['selectTemplate'];
$myFile = "data/" . $filename;
$arr_data = array(); // create empty array
try
{
//Get form data
$formdata = array(
'ID'=> $_POST['ID'],
'attributeName'=> $_POST['attributeName'],
'valueX'=> $_POST['valueX']
);
//Get data from existing json file
$jsondata = file_get_contents($myFile);
// converts json data into array
$arr_data = json_decode($jsondata, true);
$updateKey = null;
foreach ($arr_data as $k => $v) {
if ($v['ID'] == $formdata['ID']) {
$updateKey = $k;
}
}
if ($updateKey === null) {
array_push($arr_data,$formdata);
} else {
$arr_data[$updateKey] = $formdata;
}
$jsondata = json_encode($arr_data);
//write json data into data.json file
if(file_put_contents($myFile, $jsondata)) {
echo 'Data successfully saved';
}
else
echo "error";
}
catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
?>
EDIT: я отправляю его (с кнопкой отправки) через другую форму на той же странице с тем же действием. Эта другая форма позволяет мне изменить некоторые значения json, которые загружаются при выборе опции в первой форме. Вот как выглядит эта вторая форма:
<form class="ui form" action="server/php/process.php" method="POST" target="frame">
....
<input type="submit" value="Save">
</form>
Возможно, именно здесь и возникает проблема? Я решил, что подача на эту вторую форму подберет выбранную опцию в первой форме и сохранит опцию в переменной.
Ответы
Ответ 1
При отправке HTML-форм браузеры публикуют только теги в тегах <form></form>
.
Простое решение состоит в том, чтобы сделать все поля в одной форме или вы можете использовать Javascript для заполнения скрытого поля в фактической форме, которую вы отправляете.
Ответ 2
Попробуйте добавить кнопку отправки в родительскую форму вашего элемента select (и удалить обработчик onchange для отладки).
Как вы писали:
"EDIT: я отправляю его (с кнопкой отправки) через другую форму на той же странице".
HTML-формы не могут быть вложенными, а кнопка submit представляет только прямую родительскую форму (если вы не используете некоторую магию javascript).
Примечание. Если вы действительно хотите представить поля из двух форм, посмотрите здесь:
Отправить несколько форм с помощью одной кнопки отправки
Ответ 3
Самый простой способ его отладки - это:
var_dump($_POST);
$filename = $_POST['selectTemplate'];
var_dump($filename);
$myFile = "data/" . $filename;
var_dump($myFile);
$arr_data = array(); // create empty array
Если это так, что все работает, когда вы делаете hardcode $myFile = 'data/data.json
- скорее всего, один из этих варов не держит то, что вы ожидаете от них.
Ответ 4
Я понимаю, ваш фактический HTML-код выглядит примерно так:
<form class="ui form" action="server/php/process.php" method="POST" target="frame">
<form action="server/php/process.php" method="get">
<select class="ui mini fluid search dropdown" id="templateSelection" type="text" name="selectTemplate" onchange="loadTemplate()">
<option value="" selected="selected">Select Template</option>
<option value="data.json">data.json</option>
<option value="data2.json">data2.json</option>
<option value="data3.json">data3.json</option>
</select>
</form>
<input type="submit" value="Save">
</form>
Когда вы установите method='get'
, вы, вероятно, увидите, что ваша кнопка отправки ничего не делает. И вот почему:
Вложенные формы не допускаются в HTML. Если вы посмотрите на что-то вроде Firefox-Inspector, вы можете как браузер обрабатывает тот же самый код:
![Тот же код в Firefox-Inspector]()
Как вы можете видеть, браузер удаляет начало вашего внутреннего <form>
-tag и конца внешнего <form>
-tag. В результате ваша кнопка отправки находится вне формы и поэтому бесполезна.