我正在阅读目录中的图像'图像'其中包含几个带图像的文件夹。我希望在div中显示每个图像,并使用复选框来确定它是时尚还是不时尚。我使用以下代码从目录中读取文件并在浏览器中显示它们。 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)时,我注意到,提交它的默认值被解析为该函数,因此它存储具有默认值和所选值的图像名称对于第一个图像,将其解析为第二个图像,将第二个图像的选择值存储到具有第三个图像的文件中,依此类推。当我在侧输入提交标签中进行呼叫时,它开始从第二个图像以第一个值的值存储到文件中,依此类推。我无法设法在文件中存储图像与所选值之间的正确对应关系。我应该在哪里调用动作函数才能正确执行?
编辑:当我在表单中进行调用时,在用户按下提交按钮之前立即调用它。提交表单时如何才能正确调用我的函数?我尝试使用if(strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') {}
:
if(strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') {
action($image);
}
我在html标记之前添加了上面的代码,但是,我得到的结果与我在提交输入标记中放置动作函数的情况相同。知道如何解析正确的图像来写值吗?
答案 0 :(得分:2)
使用$ _SESSION记住您最后使用的图像,这样当用户按下提交时您可以移动到下一个图像,或者您可以使用隐藏字段来记住图像。
我会将文件夹中的所有图像加载到一个数组中,然后只传递上次使用过的图像的索引号,这样就可以通过array[index+1]
答案 1 :(得分:2)
每次显示一张图像时都需要断开循环。此外,您需要保存图像网址,以避免多次显示相同的图像。 我使用会话保存图片网址,但您可以使用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" />