как передать данные чекбокса? 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>&nbsp&nbsp'.'</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 'ОК';
?>

но стопудово должно быть как-то короче


Ответы (0 шт):