PHP - 从opendir数组创建分页(照片库页面)

时间:2015-04-26 16:18:26

标签: php limit photo opendir

我使用我的MySQL数据库完成了这项工作,但大约一年前,我将我的网站改为更方便的编码布局,用于我的摄影缩略图。其他人编写了代码,它使用opendir功能根据特定文件夹中的图像文件自动创建缩略图。

问题是,如果我有一个包含100多个图像的图库,它会在页面上加载所有图像,用户无法选择要查看的内容,直到它们全部加载完毕。

我想创建分页,例如,一次加载15,然后允许用户转到其他页面(如果有的话)。这段代码是我脑子里写的,因为我是PHP的新手。

以下是我认为需要更新的相关代码:

$dir = $dir.$gallery."/";

//Put files into an array
// create a handler to the directory
$dirhandler = opendir($dir);

// read all the files from directory

$nofiles=0;
while ($file = readdir($dirhandler)) {

// if $file isn't this directory or its parent 
//add to the $files array
if ($file != '.' && $file != '..')
{
$nofiles++;
$files[$nofiles]=$file;                
}   
}

//close the handler
closedir($dirhandler);

// sort folder names alphabetically, ignore case
natcasesort($files); 
?>

<div style="clear:both"></div>

<?
//Show images
foreach ($files as $file){   
if ($file!="."&&$file!="..")
{
$extention = explode('.', $file);
if ($extention[1] != "")
{       
echo "<div class='imgwrapper'>";
echo"<a class='fancybox' rel='group' href='$dir$file' return='false' title='$filename'>";
echo "<img src='timthumb.php?src=$dir$file&h=$height&w=$width' alt='$extention[0]' width='$width' height='$height'>";
echo"</a><br>";
echo "</div>";
}
}
}   
?>

这可能不是一切。老实说,我愿意付钱给别人为我做这件事。我不知道它有多难或多么容易。如有必要,我可以发送整个页面或复制整个代码。

昨天我花了7个小时尝试将我的网站转换为WordPress布局,其中有一个已经执行此操作的网络库插件,但移动布局很乱,而且比这个代码已经轻松实现的要复杂得多。
我认为我现在的网站外观和效果都很好,但这种分页是唯一缺少的。

2 个答案:

答案 0 :(得分:0)

您似乎已经完成了大部分工作,并且您已经存储了对数组中文件的引用,因此您应该能够使用slice方法根据需要检索数组的某些部分。伪代码给你的想法:

$total_to_display=10;
$pn=$_GET['pn'];
$preserve=true;

$slice=array_slice( $files, $pn, $total_to_display, $preserve );

foreach( $slice as $key => $file ) echo "<img src='$file' />";

从上面开始,这是一个有效的测试版本 - 虽然可能有一些需要注意的事情,因为它没有经过严格的测试!

        define('ROOT','c:/wwwroot' );
        $dir='/images/gallery/loch_clunie_April07';
        $fullpath=realpath( ROOT . $dir );
        $files=array();

        if( $fullpath ){
            /* Find jpg, png and gif images in nominate directory */
            $filepaths=preg_grep( '@\.jpg|\.png|\.gif@i', glob( $fullpath . '/*' ) );

            /* Prepare an array to hold data about each image in directory */
            foreach( $filepaths as $path ){
                $info=(object)pathinfo( $path );
                list( $width, $height, $type, $attr ) = getimagesize( $path );
                $files[]=array( 'name'=>$info->basename, 'dir'=>$dir, 'ext'=>$info->extension, 'size'=>filesize( $path ), 'created'=>filectime( $path ), 'width'=>$width, 'height'=>$height );
            }


            /* Set default values to prevent errors */
            $tR=0;
            $mR=0;
            $tP=0;
            $pN=0;

            /* Number of images to display */
            $mR=15;
            /* Total number of images found in directory */
            $tR=count( $files );
            /* Current page number */
            $pN=isset( $_GET['pN'] ) ? filter_var( filter_input( INPUT_GET, 'pN', FILTER_SANITIZE_NUMBER_INT ), FILTER_VALIDATE_INT ) : 0;
            /* Determine number of pages */
            $tP=( $mR > 0 ) ? abs( ceil( $tR / $mR ) - 1 ) : 0;


            /* Ensure that the page number is valid based upon number of records to display AND number of images found */
            if( abs( $mR * $pN ) > $tR-1 ) $pN=0;




            $slice=array_slice( $files, abs( $pN * $mR ), $mR, false );
            foreach( $slice as $key => $array ){
                $img=(object)$array;
                echo "
                <div class='imgwrapper'>
                    <a class='fancybox' rel='group' href='{$img->dir}{$img->name}' return='false' title='{$img->name}'>";
                    /* Replace the following with your timthumb code */
                echo "
                        <img src='{$img->dir}/{$img->name}' />";
                /*
                echo "
                        <img src='timthumb.php?src={$img->dir}{img->name}&h={$img->height}&w={$img->width}' alt='{$img->ext}' width='{$img->width}' height='{$img->height}'>";
                */
                echo "
                    </a>
                </div>";
            }





            /* Display pagination links - You might wish to prefix the actual links with the path to the gallery page rather than just ?pN=X etc */
            if( $tP > 0 && $tR > $mR ){
                echo "<div class='rspaging'>";

                if( $pN==0 ) echo "<div id='paging_first'>First</div>";
                else echo "<a href='?pN=0'>First</a>";

                if( $pN > 0 ) echo "<a href='?pN=".max( 0, $pN - 1 )."'>Previous</a>";
                else echo "<div id='paging_previous'>Previous</div>";

                if( ( $pN + 1 ) > $tP ) echo "<div id='paging_next'>Next</div>";
                else echo "<a href='?pN=".min( $tP, $pN + 1 )."'>Next</a>";

                if( $pN==$tP ) echo "<div id='paging_last'>Last</div>";
                else echo "<a href='?pN={$tP}'>Last</a>";

                echo "</div>";
            }
        }

答案 1 :(得分:0)

好的,你需要计算你拥有的文件数量

$fi = new FilesystemIterator(__DIR__, FilesystemIterator::SKIP_DOTS);
//if doesnt work replace __DIR__ with the path to your gallery
$amountfile = (int) iterator_count($fi);
// $amountfile is the number of file you got in one directory
$amountpage = (int) $amountfile / 15 
// this number will tell us how much page with 15 pictures you gonna have

在页面的末尾,我们需要创建一个小表单才能访问其他页面

<form action="THISFILE.php" method="GET">

<?php

for($i=0; $i<= $amountfile, $i++){

   echo "<input type="submit" name='page' value=";
   echo $i;   
   echo "'>";

}   

?>

</form>

这将重新加载文件并通过GET页面的编号。接下来,您必须使用以下代码拦截GET

if($_GET['page'])
{
   $choice = (int) $_GET['page'];
   $page = ($choice -1) * 15;
}
else
{
   // in case we have not clicked on a specific page there is no GET    
   $page = 0;
}

然后我们只需要修改你的循环,这样它就只会显示15张图片,具体取决于你的页面选择。 所以想象你点击页面“2”它会做 - &gt; (2-1)* 15
因此,您的$页面将为15,因此只有在我们通过de循环15次后才开始显示图片,它将进一步停止15个循环。

在你给我们的下一个循环中,如果你看一下,我会放入另一个小的 循环结束你会看到$ number ++。每次运行循环时,$ number增加1。它只显示之间的图像 15和15 + 15(30)

$number = 0;
foreach ($files as $file){   
if($number > $page  && $number < $page + 15){


if ($file!="."&&$file!="..")
{
$extention = explode('.', $file);
if ($extention[1] != "")
{       
echo "<div class='imgwrapper'>";
echo"<a class='fancybox' rel='group' href='$dir$file' return='false' title='$filename'>";
echo "<img src='timthumb.php?src=$dir$file&h=$height&w=$width' alt='$extention[0]' width='$width' height='$height'>";
echo"</a><br>";
echo "</div>";
}
elseif($number > $page + 15)
{
// this stop the loop while you have showed your 15 pictures
break;
}


$number++
}
}
} 

我没有尝试过,但我希望你能得到一般的想法。