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

1

Решение

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

$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
Таким образом, ваша страница $ будет 15 и будет показывать изображение только после того, как мы пройдем через de loop 15 раз, это остановит еще 15 циклов.

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

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

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>";
}
}
0

По вопросам рекламы [email protected]