Sınırsız hiyerarşik kategori sistemi (ver. 1) PHP-PDO-MYSQL

Sınırsız hiyerarşik kategori sistemi (ver. 1) PHP-PDO-MYSQL

Kategori sistemi, başta alışveriş siteleri ve bloglar olmak üzere bir çok sitede ihtiyaç olabiliyor.

Çoğu kişi bu konuda kod yazmıştır eminim, hiç birisini incelemedim, daha önce kendim de bir tane yazmıştım.

Eskiden yazdığım kodları inceledim, sürekli bir veritabanı sorgusu var, kaç tane kategori var ise o kadar sorgu yapıyor, demek ki 100 tane kategori olsa 100 tane sorgu yapacak, siteye aynı anda 10 kişi girse aynı anda 1000 sorgu yapılacak, sistemi neden yoralım dedim, bir kereye mahsus sorgu yapıp, gelen sonucu bir diziye aktarıp, bütün işleri o dizide hallerim dedim ve ilk versiyonu çıkardım.

öncelikle Veritabanı tablosu:

PHP kodlar şu şekilde:

<?php

header('content-type:text/html; charset=utf-8');

$ip = "localhost";
$user = "root";
$password = "";
$db = "kategoriler";

try {
    $bag = new PDO("mysql:host=$ip;dbname=$db", $user, $password);
    $bag->exec("SET CHARSET UTF8");
} catch (PDOException $e) {
    die("hata var");
}

//bütün kayıtları bir kereye mahsus olmak üzere listeliyoruz; daha doğrusu, bir diziye aktarmak için verileri çekiyoruz
$query = "SELECT * FROM kategoriler order by id";
$goster = $bag->prepare($query);
$goster->execute(); //queriyi tetikliyor

$toplamSatirSayisi = $goster->rowCount(); //malumunuz üzere sorgudan dönen satır sayısını öğreniyoruz

$tumSonuclar = $goster->fetchAll(); //DB'deki bütün satırları ve sutunları $tumSonuclar değişkenine dizi şeklinde aktarıyoruz
//örnek kullanımlar :
/*
  echo ($tumSonuclar[0]['ustKategori'] . " " . $tumSonuclar[0]['baslik'] . "<br>");
  echo ($tumSonuclar[1]['ustKategori'] . " " . $tumSonuclar[1]['baslik'] . "<br>");
  echo ($tumSonuclar[2]['ustKategori'] . " " . $tumSonuclar[2]['baslik'] . "<br>");
 */

//alt kategorisi olmayan kategorilerin sayısını öğreniyoruz:
$altKategoriSayisi = 0;
for ($i = 0; $i < $toplamSatirSayisi; $i++) {
    if ($tumSonuclar[$i]['ustKategori'] == "0") {
        $altKategoriSayisi++;
    }
}

echo "Kategoriler ($altKategoriSayisi) <br />";

echo "\n";
echo "<ul>";
echo "\n";

for ($i = 0; $i < $toplamSatirSayisi; $i++) {
    if ($tumSonuclar[$i]['ustKategori'] == "0") {
        Kategoriler($tumSonuclar[$i]['id'], $tumSonuclar[$i]['baslik'], $tumSonuclar[$i]['ustKategori']);
    }
}

echo "</ul>";

/*
 * FONKSIYONUN OZELLIKLERI:
 * verilen kategoriyi yazar sonra, yeni bir <ul> </ul> arasina o kategorinin alt kateogirilerini yazar.
 * bu işlemi sonsuza kadar yapar, yani ne kadar alt kategoriniz varsa hepsini ekler
 */

function Kategoriler($id, $baslik, $ustKategori) {

    global $tumSonuclar;
    global $toplamSatirSayisi;

    //kategorinin, alt kategori sayısını öğreniyoruz:
    $altKategoriSayisi = 0;
    for ($i = 0; $i < $toplamSatirSayisi; $i++) {
        if ($tumSonuclar[$i]['ustKategori'] == $id) {
            $altKategoriSayisi++;
        }
    }
    ///////////////////////////////////////////

    echo "\n";
    echo "<li>";
    echo "\n";

    echo "\t";
    echo "<a href='$baslik.html'>  $baslik  ";
    if ($altKategoriSayisi > 0) {
        echo "( $altKategoriSayisi )";
    }
    echo "</a>";

    if ($altKategoriSayisi > 0) { //alt kategorisi varsa onları da listele
        echo "\n";
        echo "<ul>";

        for ($i = 0; $i < $toplamSatirSayisi; $i++) {

            if ($tumSonuclar[$i]['ustKategori'] == $id) {
                Kategoriler($tumSonuclar[$i]['id'], $tumSonuclar[$i]['baslik'], $tumSonuclar[$i]['ustKategori']);
            }
        }

        echo "</ul>";
    }
    echo "\n";
    echo "</li>";

    echo "\n";
}
?>

 

Çıktı görüntüsü:

 

HTML sonucu da bu:

Kategoriler (3) <br />
<ul>

<li>
	<a href='Programlama dilleri.html'>  Programlama dilleri  ( 1 )</a>
<ul>
<li>
	<a href='pascal.html'>  pascal  </a>
</li>
</ul>
</li>

<li>
	<a href='Entrumanlar.html'>  Entrumanlar  ( 2 )</a>
<ul>
<li>
	<a href='Bağlama.html'>  Bağlama  </a>
</li>

<li>
	<a href='ney.html'>  ney  ( 2 )</a>
<ul>
<li>
	<a href='kız ney.html'>  kız ney  </a>
</li>

<li>
	<a href='bolaheng ney.html'>  bolaheng ney  </a>
</li>
</ul>
</li>
</ul>
</li>

<li>
	<a href='Sporlar.html'>  Sporlar  ( 2 )</a>
<ul>
<li>
	<a href='Aikido.html'>  Aikido  </a>
</li>

<li>
	<a href='futbol.html'>  futbol  </a>
</li>
</ul>
</li>
</ul>

 

 

Daha sonraki versiyonlarda planladıklarım:

1- Bir alt kategorinin birden fazla üst kategorisi olabilir.

2- Tabloda sıralama isminde bir sutun açıp, o sıralamaya göre listeleme yapılacak

3- Tabloda özellik diye bir veya daha fazla kısım açılıp, projeye göre farklı şeyler yaptırılabilir, örneği kategori resim linki olabilir, veya üzerine gelince çıkan yazının içeriği olabilir, veya özel bir link olabilir vs.

4- Kategori ekle, çıkart, alt kategori ekle, sıralama değiştir, şeklinde düzenlemeler yapılabilecek bir admin sayfası

5- Şu an sadece listeleme yapıyor ancak, jquery ile kullanışlı menüler kullanarak, 3-4 çeşit kullanım örneği sergilenecek, yatay açılır menü, dikey açılır menü, akordiyon şeklinde menü, + – şeklinde menü, girintili çıkıntılı menü gibi bir çok versiyon olabilir.

6- Tabiki kodlar daha da optimize edilecek. Nesneye dayalı bir tasarım ile daha kullanışlı olabilir.

Bütün bu saydıklarım gelen ilgi ve yorumlara bağlı olarak değişebilir.

13 thoughts on “Sınırsız hiyerarşik kategori sistemi (ver. 1) PHP-PDO-MYSQL

  1. maalesef bu mantığı 2003 yılında devexpress componentlerinde
    kullanmıştı ve seneler önce php de buna benzer çok kategorilendirmeler
    yapıldı recursive mantığı işin temelidir zaten…

  2. Eğer “ustKategori” kolonu 0 ise yani bu bir ana kategori ise, ve alt kategori sayısı 0 ise , link vermeyin.

    Şu satırdaki if’de değişiklikler yapmalısınız:

    echo ” href=’$baslik.html’ rel=”nofollow”> $baslik “;
    if ($altKategoriSayisi > 0) {
    echo “( $altKategoriSayisi )”;
    }
    echo ““;

  3. kardeşim süper kodlamışsın ama benim gibi acemi biri için ekle ve düzenle de olsa süper olurdu haniii

  4. Ellerine sağlık çok güzel bir paylaşım düzgün çalışıyor yalnız tek sıkıntı yaşadığım ondanda ben hata yapıyorum sanırım 2 menü yan yana iki isimle verip 2 tane yan yana php kodlarını kullanıp kategori adı değiştirdiğimde göstermiyor çözemedim maalesef yinede çok sağol

  5. Selamlar Gökhan Bey, sınırsız kategori mantığınızı inceledim ve biraz daha değiştirdikten sonra kullanmaya başladım. aslında çözmek istediğim iki konu var.
    1. Breadcumps olarak tabir edilen içteki herhangi bir katgoride iken en üst kategoriden başlayarak hangi kategoride bulunduğunu gösteren yer yapısı. yani kategorinin üst kategorilerini bularak sıralamak.
    Menü > Bilgisaayar > Notebook > Acer örneği gib.

    2. olarak bir kategoriyi silindiğğinde buna bağlı olarak alt kategorileri ve buna bağlı ürünleri silme mantığı nedir?

    Teşekkürler, kolay gelsin

  6. merhaba kardeşim güzel olmuş çok işime yaradı fakat benimde bir sorum olacak. bütün menüyü aldık fakat icinde alt kategorisi olan a şunu eklemek istiyorum class=\”dropdown-toggle\” data-toggle=\”dropdown\” yani gibi bunu nasıl yaparım

    • Fonksiyon içerisinde en başa $class=”; değişkeni olarak boş bir değişken tanımla sonra alt kategori sayısının alındığı for döngüsünün altına if($altKategoriSayisi>0){$class=” class=’dropdown-toggle’ data-toggle=’dropdown’ “;}else{$class=””;} satırını ekle. Alt kategorisi olan ul tagının olduğu echo ile başlayan satırı echo “”; olarak değiştir.

  7. Kategorileme adına İnternetde çalışan en stabil kod. Özellikte tek sogulama olması üstün bir performans sergiliyor. ul ve li taglarına eklenecek küçük bir değişkenle ul class ve li class larını fonksiyonlar öncesinden tanımlayarak deep kategori destekleyen bütün templatelere anında ve hızlı bir şekilde entegrasyon sağlayabiliyorsun. Bu da küçük projelerde inanılmaz hız sağlıyor. Teşekkürler.

  8. sa Gökhan ,a
    şu anda kategori sistemi yapmaya çalışıyorum . Bunu ilişkisel veritabanı yöntemi ile yapıyorum . Kısaca 6
    ayrı tablodan veri ekliyeceğim bu tabloları eklediğimde hepsinin kategori ıd aynı olacak ve bu şekilde tabloları indexlerken bu id ile birleştirmeyi düşünüyorum . Bu konuda yarodımcı olabilir misin bana .(birde sql de sabit değer atayamıyorum ör: pro_cat1 = 1 değerini alacak her yazı eklendiğinde )

Bir Cevap Yazın