Отображение одного изображения за другим с помощью действия отправки Переполнение стека

Я читаю изображения из каталога ‘images’, который содержит несколько папок с изображениями. Я хочу показать каждое изображение в блоке и с помощью флажка, чтобы решить, является ли это мода или не мода. Я использую следующий код для чтения файлов из каталога и показа их в браузере. Дивы один за другим:

<?php
function listFolderFiles($dir){
$html = '';
// Init the session if it did not start yet
if(session_id() == '') session_start();
$html .= '<ol>';
foreach(new DirectoryIterator($dir) as $folder){
if(!$folder->isDot()){
if($folder->isDir()){
// $html .= '<li>';
$user = $dir . '/' . $folder;
foreach (new DirectoryIterator($user) as $file) {
if($file != '.' && $file != '..'){
$image = $user . '/' . $file;
// Check the pictures URLs in the session
if(isset($_SESSION['pictures']) && is_array($_SESSION['pictures'])){
// Check if this image was already served
if(in_array($image, $_SESSION['pictures'])){
// Skip this image
continue;
}
} else {
// Create the session variable
$_SESSION['pictures'] = array();
}
// Add this image URL to the session
$_SESSION['pictures'][] = $image;
// Build the form
//echo $image, "</br>";
$html .= '
<style>
form{
font-size: 150%;
font-family: "Courier New", Monospace;
display: inline-block;
align: middle;
text-align: center;
font-weight: bold;
}

</style>

<form class = "form" action="' . action($image) . '" method="post">
<div>
<img src="' . $image . '"  alt="" />
</div>
<label for="C1">FASHION</label>
<input  id="fashion" type="radio" name="fashion" id="C1" value="fashion" />

<label for="C2"> NON FASHION </label>
<input id="nfashion" type="radio" name="nfashion" id="C2" value="nfashion" />

<input type="submit" value="submit" />
</form>';
// Show one image at a time
// Break the loop
break 2;
}
}
// $html .= '</li>';
}
}
}
$html .= '</ol>';
return $html;
}
//##### Action function

function action($img){

$myfile = fopen("annotation.txt", "a");

if (isset($_POST['fashion'])) {
fwrite($myfile, $img." -- fashion\n");
// echo '<br />' . 'fashion image';
}
else{
fwrite($myfile, $img." -- nonFashion\n");
// echo '<br />' . ' The  submit button was pressed<br />';
}
}

echo listFolderFiles('images//');
?>

Когда я выполняю призыв к действию ($ image) из внутреннего тега формы, я заметил, что значение по умолчанию для отправки это обрабатывается функцией, таким образом, в нем хранится имя изображения со значением по умолчанию и выбранное значение для первого Изображение анализируется на втором изображении, выбранное значение второго изображения сохраняется в файле с третьим изображением и так далее. Когда я выполняю вызов в боковом входном теге submit, он начинает сохранять в файл второе изображение со значением первого и так далее. Мне не удалось сохранить в файле правильное соответствие между изображением и выбранным значением. Где я должен сделать вызов функции действия, чтобы сделать это правильно?

РЕДАКТИРОВАТЬ: Когда я делаю вызов внутри формы, функция действия вызывается непосредственно перед тем, как пользователь нажмет кнопку отправки. Как я могу вызвать именно мою функцию при отправке формы? Я пытался использовать if(strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') {}:

if(strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') {

action($image);
}

Я добавляю приведенный выше код перед тегом html, однако получаю те же результаты, что и в случае, когда я помещаю функцию действия в тег ввода ввода. Любая идея, как разобрать правильное изображение, чтобы записать значение?

0

Решение

Вам нужно прерывать цикл каждый раз, когда вы показываете одно изображение. Кроме того, вам нужно сохранить URL-адреса изображений, чтобы не показывать одно и то же изображение более одного раза.
Я использую сеанс для сохранения URL-адресов изображений, но вы можете использовать куки, базу данных и т. Д.

Вот код:

<?php
function listFolderFiles($dir){
$html = '';
// Init the session if it did not start yet
if(session_id() == '') session_start();
$html .= '<ol>';
foreach(new DirectoryIterator($dir) as $folder){
if(!$folder->isDot()){
if($folder->isDir()){
$html .= '<li>';
$user = $dir . '/' . $folder;
foreach (new DirectoryIterator($user) as $file) {
if($file != '.' && $file != '..'){
$image = $user . '/' . $file;
// Check the pictures URLs in the session
if(isset($_SESSION['pictures']) && is_array($_SESSION['pictures'])){
// Check if this image was already served
if(in_array($image, $_SESSION['pictures'])){
// Skip this image
continue;
}
} else {
// Create the session variable
$_SESSION['pictures'] = array();
}
// Add this image URL to the session
$_SESSION['pictures'][] = $image;
// Build the form
$html .= '  <form action="action.php" method="post">
<div>
<img src="' . $image . '"  alt="" />
</div>
<label for="C1">fashion</label>
<input type="checkbox" name="fashion" id="C1" value="fashion" />
<label for="C2"> nfashion </label>
<input type="checkbox" name="nfashion" id="C2" value="nfashion" />
<input type="submit" value="submit" />
</form>';
// Show one image at a time
// Break out of the 2 loops
break 2;
}
}
$html .= '</li>';
}
}
}
$html .= '</ol>';
return $html;
}
echo listFolderFiles('images');
?>

Хорошей практикой было бы избегать печати содержимого HTML внутри функции. Контент лучше распечатать, когда он будет полностью готов, поэтому я собираю весь HTML-код в переменную.

Я обнаружил, что вы используете 2 флажка в форме, что означает, что пользователь может выбрать оба варианта и отправить форму.
Исходя из логики этого приложения, я думаю, вы должны использовать переключатель, чтобы пользователь выбирал только один вариант.

Вы должны изменить форму следующим образом:

<label for="C1">fashion</label>
<input type="radio" name="choice" id="C1" value="fashion" />
<label for="C2"> nfashion </label>
<input type="radio" name="choice" id="C2" value="nfashion" />
<input type="submit" value="submit" />
2

Другие решения

Используйте $ _SESSION, чтобы запомнить, какое изображение вы использовали в последний раз, чтобы вы могли перейти к следующему, когда пользователь нажимает «Отправить», или вы можете использовать скрытое поле, которое запоминает изображение.

Я загружал бы все изображения в папке в массив и просто передавал порядковый номер вашего последнего использованного изображения, чтобы вы могли легко перейти к следующему, выполнив array[index+1]

2