2015-04-26 1 views
1

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

ответ

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|\[email protected]', 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

Благодарим вас за ответ. К сожалению, как и мой ответ выше, я понятия не имею, куда положить это или что он делает. Я серьезно относился к тому, чтобы заплатить кому-то за это. Я просто недостаточно разбираюсь в методе получения изображений так, как это делает код, – sleepywan

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 с помощью следующего кода

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, и поэтому только начните показывать изображение, как только мы пройдем через цикл, 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

Вы явно приложили много усилий, и я это ценю. к сожалению, это все потеряно для меня. :(Я понятия не имею, где это происходит и с чем он взаимодействует (поскольку на странице у меня явно больше кода на том, что я не включал). С того момента, как я сделал код на моей предыдущей странице (MySQL), это было гораздо проще, поэтому я думаю, что я думал, что это будет меньший фрагмент. – sleepywan

+0

хорошо, если вы хотите, мы можем пойти по скайпу, но я понятия не имею, как вам до вечера. Дело в том, что вы не идете по базе данных, чтобы получить поэтому вы не можете использовать LIMIT. Информация, которую вы извлекаете, из ваших папок, а не из вашей базы данных. – Couteau

+0

Не беспокойтесь - я ценю вашу помощь. Я надеялся, что это будет более простая задача, чем кажется, Мне нужно что-то сделать. Спасибо, что нашли время ответить и помочь. – sleepywan

Смежные вопросы