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

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

<?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) из внутреннего тега формы, я заметил, что значение по умолчанию для отправки анализируется в функцию, поэтому оно сохраняет имя изображения со значением по умолчанию и выбранным значением для первого image разбирается на второе изображение, выбранное значение второго изображения сохраняется в файл с третьим изображением и так далее. Когда я делаю вызов в теге отправки бокового ввода, он начинает сохранять в файл второе изображение со значением первого и так далее. Мне не удалось сохранить в файл правильное соответствие между изображением и выбранным значением. Где я должен вызвать функцию действия, чтобы сделать это правильно?

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

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

                        action($image);
}

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


person snake plissken    schedule 27.01.2015    source источник
comment
Много возможностей, либо вы используете что-то на стороне клиента, например JQuery, либо вы модифицируете свой сервер, чтобы он принимал параметр идентификатора или счетчика, чтобы получить только хорошее изображение.   -  person Michael Laffargue    schedule 27.01.2015


Ответы (2)


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

Вот код:

<?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" />
person Wissam El-Kik    schedule 27.01.2015
comment
Есть ли способ показывать каждый раз только один div, а не все? - person snake plissken; 27.01.2015
comment
С предложенным кодом он показывает мне каждый раз все изображения, кроме тех, которые представлены с помощью переключателя. Я хотел бы иметь каждый раз только одно изображение. Более того, можно ли инициализировать таблицу сеансов? - person snake plissken; 27.01.2015
comment
Я знаю, что мои вопросы немного глупы, однако я не знаком с php. - person snake plissken; 27.01.2015
comment
Я отредактировал код. Это была моя ошибка, я использовал break; вместо break 2;. Последний вырывается из двух циклов, как только мы отображаем одно изображение. С другой стороны, нет такой вещи, как сессионный стол. Сеанс представляет собой файл cookie (с дополнительной защитой). Это не база данных. Весь код написан на PHP, если у вас возникли проблемы с освоением основ, вам следует поискать в Google бесплатное руководство по PHP, вы найдете множество руководств и руководств для изучения основ. - person Wissam El-Kik; 27.01.2015
comment
В коде ошибка индекса. По какой-то причине он сохраняет первое изображение со значением по умолчанию, второе изображение со значением первого изображения и так далее. - person snake plissken; 03.02.2015
comment
Я не использую никаких индексов. Я заполняю массив, используя $_SESSION['pictures'][]. Если массив не существует, я его создаю. Я не могу правильно протестировать функцию, потому что у меня нет всего кода. Я не очень понимаю, что не так. - person Wissam El-Kik; 03.02.2015
comment
У меня есть функция действия, которая берет имя изображения и выбор пользователя и сохраняет его в текстовом файле. Однако кажется, что я вызываю функцию действия до того, как присвоил значение радиоблоку. Таким образом, в первый раз он анализирует значение по умолчанию из переключателя, а на следующих изображениях анализирует предыдущие значения. Как я могу разобрать для функции фактические значения радиобоксов? - person snake plissken; 04.02.2015
comment
Я попытался изменить положение функции действия. Вместо того, чтобы вызывать его внутри формы, я попытался вызвать его при вводе. На результат это не повлияло. - person snake plissken; 04.02.2015

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

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

person Tom    schedule 27.01.2015