Yeni bir yazıdan herkese merhaba
Bu yazımda PHP ile bir klasördeki dosyaları listeleyip sayfalara nasıl bölebiliriz konusunu işlemeye çalışacağım.
Bir çok makalede bu konu işlenmiştir ancak ufak araştırmalarımdan gördüğüm kadarı ile sayfalama yapılırken ez geçilen bir konu var o da eğer çok sayıda dosya varsa sayfa numaraları çok fazla olup sayfanın nahoş bir görüntü almasına sebep oluyor, bu yazıdaki sayfalama örneği daha önce PDO türü veritabanı sınıfında kullandığım mantık ile istenilen basamaklı sayfa linklerini sayfaya bastıktan sonra Sonraki Önceki şeklinde sayfa numaraları arasında da bir nevi sayfalama oluşturur alttaki resim bu sayfalama butonları gösteriyor.
Öncelikle bu işlemleri yababilmemiz için ihtiyacımız olacaklar şu şekilde diyebilirim.
Sürekli değişen sayfa numarasına ihtiyacımız var bunu GET ile alacağız herhangi bir sayfa belirtilmediyse varsayılan sayfa 1 ayarlamamız gerekir
Dizindeki Dosyaları listelemek için glob() fonksiyonunu kullanacağım sebebi okunmasını istediğimiz dosya uzantılarını fonksiyonun kendisinde belirtebilmemiz fonksiyon bize dosyaları bir Array() dizi olarak verecektir tüm dosyalar bir diziye alınmalıdır sonra bu dizi içinden istediğimiz aralıkta dosyaları sayfaya yazdıracağız ne yazık ki bildiğim kadarı ile sadece istediğimiz kadar dosyayı okuma şansımız yok mecburen tüm dosyaları diziye almalıyız.
$dizin = glob("okunacak?klasor/*.{jpeg,jpg,gif,png}", GLOB_BRACE);
Üstteki örnek glob() fonksiyonunu dosya uzantıları ile kullanımı gösteriyor $dizin elemanına bir dizi olarak ekliyor daha sonra bu dizideki toplam dosya sayısını count() ile alıp sayfa bası kayda bölerek toplam sayfa elde edeceğiz bunları elde ettikten sonrası zaten kolay bulunduğumuz sayfa toplam kayıt ve toplam sayfa elimizde olduğuna göre array_slice() ile glob ile elde ettiğimiz diziye müdahale ederek içindeki kayıtlı elemanlardan istediğimiz aralıktakileri yeni bir diziye alarak sayfaya yeni dizideki dosya adlarını yazdıracağız.
ama bundan önce natsort($dizin); diyerek bu dizideki tüm elemanları Doğal sıralama düzeninde sıralamamız gerek tabi dosya isim sırasına göre listelensin istersek.
array_slice($dizin,$baslangic,$sayfabasi_kayit)
üstteki örnek $dizin değişkeninde olan dosya sayısına müdahale etmemizi sağlıyor diyelim ki $dizin değişkeninde 20 kayıt var array_slice($dizin,5,3) dersek bu dizide kayıtlı elemanların 5. sıradakinden başlayıp devamında 3 elemanı bize yeni bir dizi olarak döndürür böylece bulunduğumuz sayfaya ve toplam göstermek istediğimiz kadar kaydı oluşturan bu yeni diziyi foreach ile sayfaya yazdırabiliriz.
Buraya kadar sanırım yapılacaklar az çok anlaşılmıştır fakat bu dizi boş dönebilir veya gösterilecek kayıt kadar bilgi içermiyor olabilir bu yüzden bunun da kontrolleri yapılmalı ve sayfa başı kadar kayıt yoksa array_slice ile tekrar yeni bir dizi oluşturmak yerine doğrudan glob ile alınan dizi foreach döngüsünde sayfaya yazdırılmalıdır yani count() ile saydığımız toplam kayıt sayfa başı kayıttan büyükse array_slice() ile yeni dizi oluşturulmalıdır.
Altta kodların birleştirilmiş hali var kodların içinde de açıklamalar buna rağmen sormak istediğiniz anlamak istediğiniz yerler olursa yorum yazabilirsiniz.
Önce sayfa numaraları daha düzgün görünmesi için alttaki CSS kodlarını sayfanın head etiketi aralığına ekleyin.
<style>
.sayfala {
margin-top: 10px;
color: #000;
}
.sayfala, li {
cursor:pointer;
margin-right: 8px;
font-size: 12px;
display: inline-block;
padding: 5px 9px;
background-color: #efefef;
border: 1px solid #ccc;
border-radius: 3px
}
.sayfala, li:hover, li.current {
color: #000;background-color: #c9d2da;
}
</style>
Kopyala
PHP kodumuzda images dizini kendi dizin adınızla ve dosya türlerini kendi kullanım alanınıza göre değiştirmeyi unutmayın.
<?php
$sayfa = isset($_GET["sayfa"]) ? (int) $_GET["sayfa"] : 1;
if(empty($sayfa)) { $sayfa = 1; }
if($sayfa < 1) $sayfa = 1;
$dizin = glob("images/*.{jpeg,jpg,gif,png}", GLOB_BRACE); // Okunacak dizin ve dosya türleri
$sayfabasi_kayit = 20; // sayfa başı gösterilecek kayıt sayısı
$x = 3; //geçerli sayfanın Önceki Sonraki seçimleri arasında görünmesini istediğiniz adet sayfa butonu
$link = "?sayfa=";
natsort($dizin); // Dizin Sıralama kuralı diğer sıralama kuralları için https://www.php.net/manual/tr/array.sorting.php
$toplamkayit = count($dizin);
$toplamsayfa = ceil($toplamkayit / $sayfabasi_kayit);
if($sayfa > $toplamsayfa) { $sayfa = 1; }
$baslangic = ($sayfa-1)*$sayfabasi_kayit;
$dizinliste = array();
if($dizin){ //$dizin false veya boş değilse
$dizinliste = ($toplamkayit > $sayfabasi_kayit) ? array_slice($dizin,$baslangic,$sayfabasi_kayit) : $dizin;
} else {
echo "Bu dizinde dosya bulunamadı!";
}
foreach ($dizinliste as $dosyayolu) { // $dizinliste'ye alınan dosyaları sayfaya yazdırıyoruz
$dosyaadi = basename($dosyayolu); // Dosya yolundan sadece dosya ismi almak için
echo '<a href="/images/'.$dosyaadi.'" target="_blank">'.$dosyaadi.'</a><br>';
}
// « İlk Önceki 1 [2] 3 4 Sonraki Son » butonları oluşturan kodlar
$sayfala = "";
if($toplamkayit > $sayfabasi_kayit) {
if($sayfa > 1){
$onceki = $sayfa-1;
$sayfala .="<li><a href=\"".$link."1\">« İlk</a></li>";
$sayfala .="<li><a href=\"".$link.$onceki."\">Önceki</a></li>";
}
if($sayfa==1){ $sayfala .="<li><a class=\"current\">[1]</a></li>"; }
elseif($sayfa-$x < 2){ $sayfala .="<li><a href=\"".$link."1\">1</a></li>"; }
if($sayfa-$x > 2){ $i = $sayfa-$x; }else{ $i = 2; }
if($sayfa-$x-10 > 0){ $sayfala .="<li><a class=\"current\" href=\"".$link.($sayfa-$x-10)."\">[".($sayfa-$x-10)."]</a></li>"; }
for($i; $i<=$sayfa+$x; $i++) {
if($i==$sayfa){ $sayfala .="<li><a class=\"current\">[$i]</a></li>"; }else{ $sayfala .="<li><a href=\"".$link.$i."\">$i</a></li>"; }
if($i==$toplamsayfa) break;
}
if($sayfa+$x+10 < $toplamsayfa){ $sayfala .="<li><a class=\"current\" href=\"".$link.($sayfa+$x+10)."\">[".($sayfa+$x+10)."]</a></li>"; }
if($sayfa < $toplamsayfa){
$sonraki = $sayfa+1; $sayfala .="<li><a href=\"".$link.$sonraki."\">Sonraki</a></li>";
$sayfala .="<li><a href=\"".$link.$toplamsayfa."\">Son »</a></li>";
}
}
echo $sayfala;
echo "<br>";
echo "Toplam: ".$toplamsayfa." sayfa, şu anda ".$sayfa.". Sayfadasiniz..";
?>
Kopyala
Umarım geç saatlerde yazdığım bu yazı faydalı olur ve uygulamalarınızda kolayca kullanırsınız.
Başka bir yazıda buluşmak dileği ile iyi çalışmalar.