PHP - создать разбиение на страницы из массива 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, где есть плагин веб-галереи, который уже делает это, но макет для мобильных устройств — это беспорядок, и это немного сложнее, чем то, что этот код уже делает легко.
Я думаю, что мой нынешний сайт выглядит и работает отлично, но единственное, чего ему не хватает, это нумерация страниц.


person sleepywan    schedule 26.04.2015    source источник


Ответы (2)


Итак, вам нужно подсчитать количество файлов, которые у вас есть.

$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 со следующим кодом

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 ", это будет делать -> (2-1) * 15
Таким образом, ваша $page будет 15, и поэтому изображение начнет отображаться только после того, как мы прошли цикл 15 раз, он остановится. 15 петель дальше.

В следующем цикле, который вы нам дали, я добавил еще одно небольшое условие if, если вы посмотрите на конец цикла, вы увидите $number++. Это увеличивает $number на единицу каждый раз, когда он запускает цикл. Он покажет только изображение между 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++
}
}
} 

Я не пробовал, но я надеюсь, что вы поняли общее представление.

person Bidoubiwa    schedule 26.04.2015
comment
Вы явно приложили много усилий, и я ценю это. к сожалению, это все потеряно для меня. :( Я понятия не имею, куда это идет и с чем взаимодействует (поскольку на моей странице явно есть больше кода, который я не включил). Судя по тому, как я сделал код на своей предыдущей странице (MySQL), это было намного проще, поэтому я думаю, я думал, что это будет меньший фрагмент. - person sleepywan; 27.04.2015
comment
Ну, если хочешь, мы можем поговорить по скайпу, но я понятия не имею, как тебе написать. Дело в том, что вы не используете свою базу данных для получения информации, поэтому вы не можете использовать LIMIT. Информация, которую вы извлекаете, находится в ваших папках, а не в вашей базе данных. - person Bidoubiwa; 27.04.2015
comment
Не беспокойтесь - я ценю вашу помощь. Я надеялся, что это будет более простая задача, чем кажется, поэтому мне придется придумать что-то еще. Спасибо, что нашли время ответить и помочь. - person sleepywan; 28.04.2015

Похоже, вы уже выполнили большую часть работы и сохранили ссылки на файлы в массиве, поэтому вы должны иметь возможность использовать метод среза для извлечения частей массива по своему усмотрению. Псевдокод, чтобы дать вам представление:

$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>";
            }
        }
person Professor Abronsius    schedule 26.04.2015
comment
Спасибо за ваш ответ. К сожалению, как и мой ответ выше, я понятия не имею, куда поместить это или что оно делает. Я был серьезно настроен заплатить кому-то за это. Я просто недостаточно знаком с методом получения изображений, как это делает этот код, - person sleepywan; 27.04.2015