как передать данные чекбокса? CheckBox async fetch POST [РЕШЕНО]
как передать значения чекбоксов в файл, для того что б при обновлении страницы данные тянулись из файла-настроек? уже всю голов сломал. (проблемный код помечен в комментариях)
есть текстовый файл типа setting.ini, в нем данные для списка чекбокса
("0" будет означать - не активен, 1 - активен):
qwe=1
asd=0
zxc=0
придумался вот такой код check.php:
<form id="check_form">
<?php
$setting = file('setting.ini');
for($s=0; $s<count($setting); $s++){
$set = explode('=', $setting[$s]);
$Name = $set[0];
$Value = $s;
if ($set[1] == 0) {
$Checked = '';
} else {
$Checked = 'checked';
}
echo '<label><input class="checkbox" type="checkbox" name="QQQ" value="'.$Checked.' "'.$Checked.'>'.$Name.'</label>';
echo "\n";
}
?>
<button type="submit" name="ZZZ" onclick="getCheckedCheckBoxes()"> Кто выбран? </button>
</form>
<div class = "CheckSess"></div>
<script>
async function getCheckedCheckBoxes() {
var checkboxes = document.getElementsByClassName('checkbox');
var checkboxesChecked = [];
for (var index = 0; index < checkboxes.length; index++) {
if (checkboxes[index]) {
checkboxesChecked.push(checkboxes[index].name,checkboxes[index].checked); // положим в массив выбранный
var x = checkboxesChecked;
}
}
let response = await fetch('outtest.php',{
method: 'POST',
//----!!! ВОТ ЗДЕСЬ НАДО ЧТО-ТО НАПИСАТЬ, что бы как то "х", который принимает значения
// типа zxc,true (при выбранном чекбоксе), ПЕРЕДАТЬ в outtest.php
body: new FormData(document.querySelector({$x})), //(понятно, что неправильно)
});
document.querySelector('.CheckSess').innerHTML = await response.text();
}
</script>
в файле outtest.php типа :
$del_arr = $_POST['ZZZ'];
print_r($del_arr);
добавлено 01.10.21
я не знаю как из JS передать во что-то. у меня есть код для примера с
<?php
$dir = 'path'; // какой-то путь
$files = scandir($dir, 0); // проверяем, что папка
// из этой формы мы будем брать данные в JS
$select = '<form id = "sel_dir">';
// здесь главное - это имя sel, оно и будет отрабатываться в out.php,
// а скрипт upIncome() сработает по клику
$select .= '<SELECT name ="sel" onchange="upIncome();">';
$select .= '<option hidden="none">'.$er.$end.'</b>  '.'</option>';
for($i = 1; $i < count($files); $i++) {
$infiles = $files[$i];
$dir_out = $dir .'/'. $infiles;
if (is_dir($dir_out)) {
$select .= '<option name ="'.$infiles.'" value="'.$infiles.'">'.$infiles.'</option>';
}
}
}
$select .= '</select>';
$select .= '</form>';
echo $select; // выводим форму select
?>
<!-- здесь покажем то, что обработает файл out.php из скрипта -->
<div class="from-server"></div>
<script>
async function upIncome(){ // наша основная фукция при клике в select
let response = await fetch('out.php',{ // укажем на файл
method: 'POST', // как передадим
body: new FormData(document.querySelector('#sel_dir')), // передадим из HTML формы sel_dir .. как "он" понял что имя sel ???
});
// отдадим div-классу в HTML возвращаемое значение из переменной response, которая вернула значение из файла out.php
document.querySelector('.from-server').innerHTML = await response.text();
};
</script>
в файле out.php:
$NEW_DIR = $_POST['sel'];
здесь внимание - sel - это name в select .... и делай что хошь с полученным, хоть в куки хоть в файл пиши, хоть что.
как это же проделать с чекбоксом? явой в файл писать, понятно, низяю. Про куки, что б потом в php $session затянуть - то же хз.
при том варианте JS, который описан в вопросе, все отрабатывает как мне надо, он отдает результат в виде:
string0,true string1,false ... и т.д.
а в php я отработаю данные хоть массивом, хоть строкой, как мне их получить ?
------- добавлено 03.10.2021 -----------
в общем, методом научного тыка и манов рабочий желаемый вариант (комментарии в коде)
set.ini
чекбокс0=0
чекбокс1=0
чекбокс2=1
чекбокс3=0
check.php
<?php
// создаем HTML форму с чекбоксами из файла
echo '<form id="forma">';
$setting = file('set.ini');
for($s=0; $s<count($setting); $s++){
echo '</br>';
$set = explode('=', $setting[$s]);
$Name = $set[0];
$Value = $set[1];
// проверяем, если 2й элемент массива равен 0 то чекбокс неактивен
if ($set[1] == 0) {
$Checked = '';
} else {
$Checked = 'checked';
}
echo '<label><input class="check_line" type="checkbox" name="nameone['.$Name.']" value="'.$Value.'" '.$Checked.'>'.$Name.'</label>';
echo "\n";
}
echo "</br>";
// имя в кнопке укладываем в массив, он будет передавать только активные элементы
// чекбокса в формате: Array ( [ИМЯ1] => 1 [ИМЯ2] => 1 ), т.е. имена будут в ключе
echo '
<button type="submit" name="nameone['.$Name.']" onclick="upIncome()">Что выбрали? </button>
';
echo '</form>';
?>
<!-- здесь отобразим OK из out.php -->
<div class="from-server"></div>
<script>
async function upIncome(){ // наша основная функция
let response = await fetch('out.php',{ //куда
method: 'POST', // как
// что. в данном случае *name* из кнопки в форме чекбоксов (наш массив)
body: new FormData(document.querySelector('#forma')),
});
// заберем ОК
document.querySelector('.from-server').innerHTML = await response.text();
};
</script>
out.php
<?php
// заберем файл и зададим всем значениям 0
// запихнем в новый массив
$setting = file('set.ini');
for ($q=0; $q<count($setting); $q++) {
$setq = explode('=', $setting[$q]);
$setq[1] = '0';
$newq = implode('=', $setq);
$set_clear[$q] = $newq;
}
$set_new = $set_clear;
// откроем запись
$f = fopen('set.ini','w+');
// проверим что нам что-то пришло
if (isset($_POST['nameone'])) {
// если да - то начнем искать в исходном *чистом* массиве
// значения, равные значениям в именах ключей полученного массива
$del_arr = $_POST['nameone'];
// создаем массив из ключей
$var = array_keys($del_arr);
// ищем
for ($x=0; $x<count($set_new); $x++) {
$setx = explode('=', $set_new[$x]);
for ($y=0; $y<count($var); $y++) {
$sety = explode('=', $var[$y]);
// если нашли, то меняем на 1.
// из формы мы как бы просто получили имена, которые должны быть
// активными чекбоксами
if ($setx[0] == $sety[0]) {
$setx[1] = '1';
$new = implode('=', $setx);
$set_new[$x] = $new;
}
}
}
// пишем в файл
for ($i=0; $i<count($set_new); $i++) {
fwrite($f, $set_new[$i]."\n");
}
} else {
// если все *галки* были сняты, то пишем в файл *чистый* массив
for ($i=0; $i<count($set_clear); $i++) {
fwrite($f, $set_clear[$i]."\n");
}
}
// закрывем
fclose($f);
// наш ОК, что уже вывел скрипт
echo 'ОК';
?>
но стопудово должно быть как-то короче