Menampilkan gambar satu demi satu menggunakan tindakan kirim PHP

Saya membaca gambar dari direktori 'gambar' yang berisi beberapa folder dengan gambar. Saya ingin menampilkan setiap gambar dalam div dan dengan kotak centang untuk memutuskan apakah itu fashion atau bukan fashion. Saya menggunakan kode berikut untuk membaca file dari direktori dan menampilkannya di browser. Divnya satu demi satu:

<?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//');
?>

Ketika saya membuat panggilan tindakan($gambar) dari dalam tag formulir, saya perhatikan, bahwa nilai default kirim diurai ke fungsi, sehingga menyimpan nama gambar dengan nilai default dan nilai yang dipilih untuk yang pertama gambar itu diurai ke gambar kedua, nilai yang dipilih dari gambar kedua disimpan ke file dengan gambar ketiga dan seterusnya. Ketika saya melakukan panggilan di tag kirim masukan samping, ia mulai menyimpan ke file dari gambar kedua dengan nilai yang pertama dan seterusnya. Saya tidak dapat menyimpan ke file korespondensi yang benar antara gambar dan nilai yang dipilih. Di mana saya harus memanggil fungsi tindakan agar dapat melakukannya dengan benar?

EDIT: Saat saya melakukan panggilan di dalam formulir, fungsi tindakan dipanggil segera sebelum pengguna menekan tombol kirim. Bagaimana saya bisa memanggil fungsi saya dengan tepat ketika formulir dikirimkan? Saya mencoba menggunakan if(strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') {}:

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

                        action($image);
}

Saya menambahkan kode di atas sebelum tag html, namun, saya mendapatkan hasil yang sama seperti jika saya meletakkan fungsi tindakan di dalam tag kirim masukan. Adakah yang tahu cara mengurai gambar yang tepat untuk menulis nilai?


person snake plissken    schedule 27.01.2015    source sumber
comment
Banyak kemungkinan, baik Anda menggunakan sisi klien seperti JQuery, atau Anda memodifikasi server Anda untuk mengambil ID atau parameter penghitung untuk hanya mendapatkan gambar yang bagus.   -  person Michael Laffargue    schedule 27.01.2015


Jawaban (2)


Anda perlu memutus perulangan setiap kali Anda menampilkan satu gambar. Selain itu, Anda perlu menyimpan URL gambar agar gambar yang sama tidak ditampilkan lebih dari sekali. Saya menggunakan Sesi untuk menyimpan URL gambar, tetapi Anda dapat menggunakan Cookie, database, dll.

Berikut kodenya:

<?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');
?>

Praktik yang baik adalah menghindari pencetakan konten HTML di dalam fungsi. Lebih baik mencetak konten setelah benar-benar siap, itu sebabnya saya mengambil semua HTML dalam sebuah variabel.

Saya mengetahui bahwa Anda menggunakan 2 kotak centang di formulir, yang berarti pengguna dapat memilih kedua opsi dan mengirimkan formulir. Dari logika di balik aplikasi ini, saya kira Anda harus menggunakan tombol radio sehingga pengguna hanya memilih satu opsi.

Anda harus mengubah formulir seperti itu:

<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
Apakah ada cara untuk menampilkan setiap kali hanya satu div dan tidak semuanya? - person snake plissken; 27.01.2015
comment
Dengan kode yang diusulkan, ia menampilkan semua gambar kepada saya setiap saat kecuali yang dikirimkan dengan tombol radio. Saya ingin memiliki setiap kali hanya satu gambar. Selain itu apakah mungkin untuk menginisialisasi tabel sesi? - person snake plissken; 27.01.2015
comment
Saya tahu pertanyaan saya agak konyol, namun saya tidak paham dengan php. - person snake plissken; 27.01.2015
comment
Saya mengedit kodenya. Itu adalah kesalahan saya, saya menggunakan break; bukannya break 2;. Yang terakhir keluar dari 2 loop setelah kita menampilkan satu gambar. Di sisi lain, tidak ada yang namanya tabel sesi. Sesi ini adalah cookie (dengan keamanan ekstra). Ini bukan database. Seluruh kode ditulis dalam PHP, jika Anda kesulitan mendapatkan dasar-dasarnya, Anda harus mencari tutorial PHP gratis di Google, Anda akan menemukan banyak tutorial dan panduan untuk mempelajari dasar-dasarnya. - person Wissam El-Kik; 27.01.2015
comment
Ada kesalahan indeks dalam kode. Untuk beberapa alasan, ia menyimpan gambar pertama dengan nilai default gambar kedua dengan nilai gambar pertama dan seterusnya. - person snake plissken; 03.02.2015
comment
Saya tidak menggunakan indeks apa pun. Saya mengisi array menggunakan $_SESSION['pictures'][]. Jika array tidak ada, saya membuatnya. Saya tidak dapat menguji fungsinya dengan benar karena saya tidak memiliki seluruh kode. Saya tidak begitu mengerti apa yang salah. - person Wissam El-Kik; 03.02.2015
comment
Saya memiliki fungsi tindakan yang mengambil nama gambar dan pilihan pengguna dan menyimpannya dalam file teks. Namun sepertinya saya memanggil fungsi tindakan sebelum saya memberi nilai pada kotak radio. Jadi untuk pertama kalinya ia mengurai nilai default dari kotak radio dan pada gambar berikutnya ia mengurai nilai sebelumnya. Bagaimana saya bisa mengurai fungsi nilai sebenarnya dari kotak radio? - person snake plissken; 04.02.2015
comment
Saya mencoba mengubah posisi fungsi aksi. Alih-alih memanggilnya di dalam formulir, saya mencoba memanggilnya di input kirim. Hal itu tidak mempengaruhi hasilnya. - person snake plissken; 04.02.2015

Gunakan $_SESSION untuk mengingat gambar mana yang terakhir Anda gunakan, sehingga Anda dapat melanjutkan ke gambar berikutnya ketika pengguna menekan kirim atau Anda dapat menggunakan bidang tersembunyi yang mengingat gambar tersebut.

Saya akan memuat semua gambar dalam folder ke dalam array dan hanya meneruskan nomor indeks gambar yang terakhir Anda gunakan, sehingga Anda dapat dengan mudah berpindah ke gambar berikutnya dengan melakukan array[index+1]

person Tom    schedule 27.01.2015