Php Sınırsız Kategori Fonksiyonları (Tek Sorgu Kullanarak)

Sınırsız kategori oldukça sıkıcıdır ve eğer hazır fonksiyonlarınız yok ise bazı durumlarda içinden çıkılmaz bir hal alır. Aşağıda sınırsız kategori mantığı ile temel işlemleri yapabileceğimiz fonksiyonları listeledim. Herkese iyi çalışmalar.

01. Sınırsız Kategori İçin Veritabanı Tablo Yapısı

php-siniriz-kategori-fonksiyonlari-tablo-yapisi
Yukarıda resimde görüldüğü gibi tablomuzda bu üç sütun mutlaka olmak zorunda.

02. Sınırsız Kategorilerin Görünümü

php-siniriz-kategori-fonksiyonlari-gorunum
Sınırısız kategori mantığı ile sıralanmış bir liste görüyoruz.

03. Kategoriler Listelemek (Hiyerarşi Sırası ile)

Bu fonksiyon sayesinde kategorilerimizin hiyerarşisini oluşturacağız. Fonksiyona $Kategori_Id değişkeni göndermezsek tüm kategorileri array() olarak döndürür. Eğer $Kategori_Id değerini gönderirsek sadece belirtilen $Kategori_Id’nin alt kategorilerini döndürmektedir.

function Kategori_List($Kategori_Id=0)
{
    /*
     *  Kategori Listesini Array olarak döndürür.
     *  
     *  Eğer $Kategori_Id SET edilmiş ise sadece o kategorinin alt kategorilerinin döndürür.
     * 
     */

    // Kategorilerin bulunduğu tablomuzdan tüm kayıtları alıyoruz.
    $request=mysql_query('SELECT kategori_id,kategori_adi,ust_kategori_id FROM ai_kategoriler ORDER BY kategori_adi ASC');
    // $list değişkeninde sırayla tümkategoriler bulunuyor.
    $list=array();
    while($row=mysql_fetch_assoc($request)){
        $list[$row['kategori_id']]=$row;
    }

    mysql_free_result($request);

    // Şimdi sırayla eklenmişleri hiyerarşilenmiş bir biçimde $tree değişkenine vereceğiz.
    $tree = array();

    // Her bir kategoriyi tek tek döndür...
    foreach ($list as $id => $item)
    {

        if ($Kategori_Id > 0){
            // Eğer kategori id set edilmiş ise birincil düzey yap...
            $kontrol=$Kategori_Id;
        }else{
            // Eğer kategori birincil düzey ise... (yani alt kategorileri almıyoruz!)
            $kontrol=0;
        }

        if ($item['ust_kategori_id'] == $kontrol)
        {
            // $tree değişekeninde birincil düzey olarak ekledik.
            $tree[$item['kategori_id']] = $item;

            // Bu kategoriyi kaydettiğimiz için de (yani işimiz bitti!) $list dizisinden kaldırıyoruz.
            unset($list[$id]);

            // Ve şimdi can alıcı nokta! Bu ana kategorinin alt kategorisi var mı diye alt kategorilerine bakıyoruz...
            Kategori_Find_Sub_Cats($list, $tree[$item['kategori_id']]);
        }
    }

    return $tree;
}

function Kategori_Find_Sub_Cats(&$list, &$selected)
{
    /*  Kategori_List() fonksiyonu ile beraber çalışır.
     *  Alt kategorileri arayan yardımcı fonksiyonumuz.
     *  &$list: Veritabanından çektiğimiz ham kategorileri içeriyor.
     *  &$selected: Üzerinde işlem yapılacak (varsa alt kategorisi eklenecek) kategoriyi içeriyor.
     */

    // Her bir kategoriyi tek tek döndür...
    foreach ($list as $id => $item)
    {
        // Eğer babasının kimliğiyle kendi kimliği aynıysa... (yani alt kategori ise!)
        if ($item['ust_kategori_id'] == $selected['kategori_id'])
        {
            // Seçimin "sub_cats"ına alt kategorisini ekle.
            $selected['sub_cats'][$item['kategori_id']] = $item;

            // Babasını bulduğuna göre artık $list'eden kaldırabiliriz.
            unset($list[$id]);

            // Alt kategorinin de çocuğu olabilme ihtimali için aynı işlemleri ona da yapıyoruz...
            Kategori_Find_Sub_Cats($list, $selected['sub_cats'][$item['kategori_id']]);
        }
    }
}

04. Kategori_List() Fonksiyonunun Çıktısı

Aşağıda gördüğünüz gibi kategori listemizi array() içinde topladık.

Array
(
    [2] => Array
        (
            [kategori_id] => 2
            [kategori_adi] => Telefon
            [ust_kategori_id] => 0
            [sub_cats] => Array
                (
                    [5] => Array
                        (
                            [kategori_id] => 5
                            [kategori_adi] => Galaxy S3
                            [ust_kategori_id] => 2
                        )

                    [6] => Array
                        (
                            [kategori_id] => 6
                            [kategori_adi] => iPhone 5
                            [ust_kategori_id] => 2
                        )

                )

        )

    [1] => Array
        (
            [kategori_id] => 1
            [kategori_adi] => Televizyon
            [ust_kategori_id] => 0
            [sub_cats] => Array
                (
                    [7] => Array
                        (
                            [kategori_id] => 7
                            [kategori_adi] => Crt Tv
                            [ust_kategori_id] => 1
                        )

                    [3] => Array
                        (
                            [kategori_id] => 3
                            [kategori_adi] => Led Tv
                            [ust_kategori_id] => 1
                        )

                    [4] => Array
                        (
                            [kategori_id] => 4
                            [kategori_adi] => Plazma
                            [ust_kategori_id] => 1
                        )

                )

        )

    [8] => Array
        (
            [kategori_id] => 8
            [kategori_adi] => Yazılım
            [ust_kategori_id] => 0
            [sub_cats] => Array
                (
                    [9] => Array
                        (
                            [kategori_id] => 9
                            [kategori_adi] => Windows 7
                            [ust_kategori_id] => 8
                            [sub_cats] => Array
                                (
                                    [11] => Array
                                        (
                                            [kategori_id] => 11
                                            [kategori_adi] => Windows 7 Home
                                            [ust_kategori_id] => 9
                                            [sub_cats] => Array
                                                (
                                                    [12] => Array
                                                        (
                                                            [kategori_id] => 12
                                                            [kategori_adi] => Windows 7 Home Alt
                                                            [ust_kategori_id] => 11
                                                            [sub_cats] => Array
                                                                (
                                                                    [13] => Array
                                                                        (
                                                                            [kategori_id] => 13
                                                                            [kategori_adi] => Windows 7 Home Alt Alt
                                                                            [ust_kategori_id] => 12
                                                                        )

                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

05. Özel Sınırsız Kategori Fonksiyonları (Bir Kategorinin Tüm Alt Kategorilerinin Listesi)

Kategorilerin tüm alt kategorilerini bir array() listede toplayalım.

/* Alt Kategori ID lerinin Döndürüleceği Array */
$Alt_Kategori_Id_List=array();

function Alt_Kategori_List($tree,$saydir=1)
{
    /*
     *  Alt Kategorilerin ID Listesini Array() Olarak Döndürür
     */

    global $Alt_Kategori_Id_List;

    foreach ($tree as $id => $item)
    {
        $Alt_Kategori_Id_List[]=$item['kategori_id'];

        if (!empty($item['sub_cats'])){ 
            Alt_Kategori_List($item['sub_cats'],0);
        }
    }

    if ($saydir==1){
        return $Alt_Kategori_Id_List;
    }
}

/* Kullanımı */
$haric_kategoriler=Alt_Kategori_List(Kategori_List($row->kategori_id));

Kategori_Select_Duzenle(Kategori_List(),$row->kategori_id,$row->ust_kategori_id,$haric_kategoriler,0,1);

05. Özel Sınırsız Kategori Fonksiyonları (Select Box)

php-siniriz-kategori-fonksiyonlari-select-box

Şimdi kategori listemizi <select ></select > içinde gösterelim.

function Kategori_Select($tree,$level=0){

    /* 
     *  Sadece Yeni Kategori Ekleme Formunda kullanılan Select Box
     */

    foreach ($tree as $id => $item)
    {
        echo '<option value="'.$id.'">'.str_repeat(' ', $level*7).$item['kategori_adi'].'</option>';
        if (!empty($item['sub_cats'])){ Kategori_Select($item['sub_cats'],$level + 1); }
    }
}

// Kullanımı
Kategori_Select(Kategori_List());

/*
<option value="2">Telefon</option>
<option value="5">       Galaxy S3</option>
<option value="6">       iPhone 5</option>
<option value="1">Televizyon</option>
<option value="7">       Crt Tv</option>
<option value="3">       Led Tv</option>
<option value="4">       Plazma</option>
<option value="8">Yazılım</option>
<option value="9">       Windows 7</option>
<option value="11">              Windows 7 Home</option>
<option value="12">                     Windows 7 Home Alt</option>
<option value="13">                            Windows 7 Home Alt Alt</option>
*/

06. Özel Sınırsız Kategori Fonksiyonları (Kategori Düzenle Select Box)

php-siniriz-kategori-fonksiyonlari-edit-select-box

Kategori düzenleme en dikkat edilmesi gereken noktadır. Yanlış bir hareket ile tüm sistem içinden çıkılmaz bir hal alabilir. Düzenlenecek kategori kendisinin üst kategorisi olamaz. Kontrol mekanizmasında bunu belirtmeliyiz. Bir diğer nokta yine düzenlenecek kategorinin üst kategorisi alt kategorilerin de olamaz. Aşağıdaki örneğe göz atalım.

function Kategori_Select_Duzenle($tree,$Select_Kategori_Id,$Select_Kategori_Ust_Id,$Haric_Kategori,$level=0,$saydir=1){

    /*
        Sadece Kategori Düzenleme Formunda kullanılan Select Box.
        $saydir 1 olarak gelir sadece tek seferlik bir işlem yapar

     */

    // En üst kategori ise
    if ($saydir==1 && $Select_Kategori_Ust_Id==0){
        echo '<option value="0" selected="selected">Bu Kategoriyi En Üst Kategori Yap</option>';
    }

    foreach ($tree as $id => $item)
    {

        if ($Select_Kategori_Id==$id){
            // Kategorinin Kendisi
            echo '<option value="'.$id.'" disabled="disabled">'.str_repeat(' ', $level*7).$item['kategori_adi'].'</option>';

        }elseif (@in_array($id,$Haric_Kategori)){
            // Kategorinin Alt Kategorileri
            echo '<option value="'.$id.'" disabled="disabled">'.str_repeat(' ', $level*7).$item['kategori_adi'].'</option>';

        }elseif($Select_Kategori_Ust_Id==$id){
            // Kategorinin Mevcut Ust Kategorisi
            echo '<option value="'.$id.'" selected="selected">'.str_repeat(' ', $level*7).$item['kategori_adi'].'</option>';

        }else{
            // Diğer Kategoriler
            echo '<option value="'.$id.'">'.str_repeat(' ', $level*7).$item['kategori_adi'].'</option>';
        }

        if (!empty($item['sub_cats'])){ Kategori_Select_Duzenle($item['sub_cats'],$Select_Kategori_Id,$Select_Kategori_Ust_Id,$Haric_Kategori,$level + 1,0); }
    }

}

/* Kullanımı */

/* İlk Öncesi düzenlenecek kategorinin alt kategorilerinin listesini alalım... */
$haric_kat=Alt_Kategori_List(Kategori_List($row->kategori_id));
Kategori_Select_Duzenle(Kategori_List(),$row->kategori_id,$row->ust_kategori_id,$haric_kat,0,1);

Kafaları karıştıran sınırsız kategori mantığını kanımca anlatmaya çalıştım. Herkese iyi çalışmalar…


Alternatif Fonksiyonlar


07. Tek Fonksiyon ile Tüm Kategorileri Hiyerarşik Sıralamak

function SinirsizKategoriListele($kategoriArray , $ebeveyn = 0  , $kademe_pixel = 5 ,  $i = 0  ,  $menuler = NULL , $nested = FALSE ) 
{ 

   // Sayfalar Boşşa boş döndür. 
    if( empty($kategoriArray) ){
        return;
    }

    // Eğer fonksiyon içinden çağırılmıyorsa 
    if( !$nested ){
        // Sayfaları ebeveyn idsi ile yeni dizi oluştur 
        foreach($kategoriArray as $row):
            $items[$row['ust_kategori_id']][]=$row;
        endforeach;
    }else{
        // Nested ise gelen sayfaları al 
        $items=$kategoriArray;
    }

    // Gelen sayfaları aç 
    foreach( $items[$ebeveyn] as $sayfa ){
        // Boşluk hesapla 
        $bosluk=str_repeat(' ',($i * $kademe_pixel));

        // Menuleri değişkene aktar 
        $menuler .= '<li><a href="#">'.$sayfa['kategori_id'].' - '.$sayfa['kategori_adi'].'</a>'.PHP_EOL;

        // Açılan menude bir alt sayfa var ise nested çağır 
        if(isset($items[$sayfa['kategori_id']])){
            $menuler .= '<ul>'.PHP_EOL;
            $menuler=SinirsizKategoriListele($items,$sayfa['kategori_id'],$kademe_pixel,($i + 1),$menuler,TRUE);
            $menuler .= '</ul>'.PHP_EOL;
        }

        $menuler .= '</li>'.PHP_EOL;
    }

    // Oluşan menüleri return et 
    return $menuler;
}

07.01 Kategorileri Arrayda Toplamak

Öncelikle mysql_query() ile kategori listesimizi array()’da topluyoruz.

// Kategori Listesini Al
$sql_kategori=mysql_query("SELECT * FROM ai_kategoriler ORDER BY kategori_adi ASC");
$kategori_list=array();
$i=0;
while($row_kategori=mysql_fetch_object($sql_kategori)){
    $kategori_list[$i]['kategori_id']=$row_kategori->kategori_id;
    $kategori_list[$i]['kategori_adi']=$row_kategori->kategori_adi;
    $kategori_list[$i]['ust_kategori_id']=$row_kategori->ust_kategori_id;
    $i++;
}

07.02 SinirsizKategoriListele Fonksiyonunu Çalıştırıyoruz

SinirsizKategoriListele($kategori_list);  fonksiyonunu çalıştırıyoruz.

07.03. Fonksiyon Çıktısı

AlternatifKategoriCiktisi

08. Örnek Çalışma Dosyaları

  • İndir – Kategoriye ait tüm alt kategorileri “href” özelliğinde toplamak
  • İndir – Ana kategorilerin yan yana listelenerek, içinde alt kategorilerin hiyerarşik olarak gösterilmesi

Bu sayfa 25.664 kez görüntülendi.

Ahmet

Sıradan bloglardan birisi :)

Bunlar da hoşunuza gidebilir...

44 Cevaplar

  1. Kathy Holloway dedi ki:

    Hi, thanks for sharing. I’m wondering if it’s OK to copy some of the text in my site?

  2. karton dedi ki:

    Bu örneği indirebileceğimiz bir link paylaşırsanırz çok sevinirim. Zira pHP ye yeni başlayan biri olarak bu örneğin çok doğru olduğunu düşünüyorum. Elinize sağlık.

  3. sinan dedi ki:

    Selam..
    Aslında phpde oldukça iyi düşünüyorum ama şu sorun ömrümden ömür çaldı bir de size danışayım..

    Bir altkategorinin (ya da null değer gönderirsek tüm kategorilerin) alt kategorilerini hiyerarşik yapıya göre listeledik. ve hepsini a tagı içine aldık. Şimdi elimizdeki her link şu şekilde oldu;
    [a href=”kat_id” rel=”nofollow”]kat_adi[/a]

    bu etiketlerin href kısmına sadece kategorinin idsi değil de bu kategorinin alt kategorileri olan tüm kategorilerin idlerini bir ayraçla ayırarak nasıl yazdırabiliriz.

    istenen a etiketi;
    [a href=’12x45x78x45x65x87x48x44x16′ rel=”nofollow”]
    Teşekkürler.

  4. admin dedi ki:

    Merhaba sinan,

    İşin mantığını anlatmaya çalışayım. Sınırsız kategorileri listelerken aynı zamanda o kategorinin tüm alt kategori id lerini toplamaya çalışacağız. Bunun için 2 tane özyineli (recursive) fonksiyona ihtiyacımız olacak.

    01. mysql_query() ile kategori arrayda toplayacağız alacağız.(Bknz. 07.01)

    02. Bunları global yapacağız.
    // $AltKategoriList arrayını $Global yap
    $GLOBALS["AltKategoriList"]=$AltKategoriList;

    03. AltKategoriList arrayının oluşturacağız. Foreach ile $kategori_list arrayını döndrüp kategoriye ait tüm alt kategorileri $AltKategoriList arrayında toplayacağız.

    // Kategoriye ait tüm alt kategorileri topla
    $AltKategoriList=array();

    foreach($kategori_list as $kategori_ID){
    $AltKategoriList[$kategori_ID['kategori_id']]=listele($kategori_list,$kategori_ID['kategori_id']);
    }

    04. SinirsizKategoriListele fonksiyonuna yeni kontrol ekleyerek AltKategoriList arrayında topladığımız datayı alacağız.
    if (!empty($GLOBALS["AltKategoriList"][$sayfa['kategori_id']])){
    $menuler .=$GLOBALS["AltKategoriList"][$sayfa['kategori_id']];
    }else{
    $menuler .='Alt Kategorisi Yok';
    }

    Senin için yukarıda anlattıklarımı bir dosyada topladım. Buradan ulaşabilrisin.

    İyi çalışmalar…

  5. sabri dedi ki:

    Güzel çalışma emeğinize sağlık. Bir kategoriyi tümalt kategorileri ile birlikte silmek için ne yapmalıyız.

    • admin dedi ki:

      Merhaba Sabri,

      Zamanım kısıtlı olduğu için kod vermeden anlatmaya çalışayım. 03 nolu Kategoriler Listelemek (Hiyerarşi Sırası ile) başlıkta Kategori_List() fonsiyonunun açıklamasında yazdığı gibi “Eğer $Kategori_Id SET edilmiş ise sadece o kategorinin alt kategorilerinin döndürür.” hangi kategoriyi sileceksek kategori_id’yi fonksiyona göndermemiz gerekiyor.

      Bu foonksiyon sayesinde kategoriye ait tüm alt kategorileri bir array’da toplayabiliyoruz. Array’da topladıktan sonra “05 nolu Özel Sınırsız Kategori Fonksiyonları (Select Box)” fonksiyonunu biraz değiştirdikten sonra en alt kategoriden başlayarak en üste doğru sıralamamız gerekiyor. Bunu da $level değişkeninden elde edebiliriz. En alt kategoriden başlayarak silmemiz daha isabetli olacaktır. Tabi kategoriye ait yazı,etiket vb. bir şeyin bağlı olup olmadığını if yapısı ile kontrol ederek gerçekleştirilebilir.

  6. microt dedi ki:

    merhaba, paylaşım için teşekkürler çok yarardımcı oldu..

    fakat kategorileri sıralama işlemini nasıl yapmam gerektiğini anlamadım sira diye bir bölüm açtım yukarı aşşa ok koydum yukarı basında +1 aşşağı basınca -1 mi yapmalıyım ?

    • Ahmet dedi ki:

      Merhaba microt,
      Şunu mu anlamalıyız? Tam olarak emin olamadım da. Yukarıdaki kodlar kategori isimlerini hiyerarşik olarak A-Z olarak sıralamaktadır. Fakat siz A-Z değilde özel bir şekilde sıralatmak istiyorsunuz. Söylediğiniz gibi tabloda yeni bir sira sütunu açarak ile sorgudaki “ORDER BY kategori_adi ASC” metnini “ORDER BY sira ASC” değiştirdiğiniz takdirde özel sıralamanız oluşmuş olacaktır. +1 ve -1 dediğiniz gibi yapılabilir. İyi çalışmalar.

  7. Bymega dedi ki:

    Hocam kafam patlamıştı oturup sıfırdan yazamayacaktım kodları acil ihtiyacım vardı inan eline sağlık işimi gördü. Bir teşekkür etmeyi çok görmemek lazım

  8. Kamil dedi ki:

    Merhaba Ahmet bey, ben verdiğiniz kodları aşağıdaki şekilde sıralayıp checkbox’a çeviriyorum bir reklam scripti yazıyorum bu reklamların hangi kategorilerde görünmesini istediğini kullanıcı belirtecek sorun yok ama liste aşağıya doğru çok uzuyor, bende bunu yan yana sıralamak istiyorum. Yapmak istediğim şey en üst kategorilerden aşağıya doğru 3 değer oldukça aşağıya insin istiyorum bu kodların içerisinde her yere php count ile sıfırdan saydırıp 3 oldumu li ekle gibi çözümler denedim ama olmadı bir türlü, acaba bir kontrol edebilirmisiniz kodları nereye eklemem gerekiyor. Buyrun aşağıda sizin vermiş olduğunuz ve sistemime uyarladığım kodlar;

    <?php

    // Kategoriye Ait Tüm Alt Kategorileri String Olarak Dönüdür

    function listele($sayfalar , $ebeveyn = 0 , $i = 0 , $menuler = NULL , $nested = FALSE )

    {

    // Sayfalar Boşşa boş döndür.

    if(empty($sayfalar))

    return;

    // Eğer fonksiyon içinden çağırılmıyorsa

    if (!$nested)

    {

    // Sayfaları ebeveyn idsi ile yeni dizi oluştur

    foreach($sayfalar as $row):

    $items[$row['ust_kategori']][] = $row;

    endforeach;

    }

    else

    {

    // Nested ise gelen sayfaları al

    $items = $sayfalar;

    }

    // Gelen sayfaları aç

    foreach($items[$ebeveyn] as $sayfa)

    {

    // Menuleri değişkene aktar

    $menuler .='#'. $sayfa['seo'];

    // Açılan menude bir alt sayfa var ise nested çağır

    if (isset($items[$sayfa['seo']]))

    $menuler = listele($items , $sayfa['seo'] , ($i+1) , $menuler , TRUE);

    }

    // Oluşan menüleri return et

    return $menuler;

    }

    function kat_listele($sayfalar , $ebeveyn = 0 , $kademe_pixel = 5 , $i = 0 , $menuler = NULL , $nested = FALSE )

    {

    // Sayfalar Boşşa boş döndür.

    if(empty($sayfalar))

    return;

    // Eğer fonksiyon içinden çağırılmıyorsa

    if (!$nested)

    {

    // Sayfaları ebeveyn idsi ile yeni dizi oluştur

    foreach($sayfalar as $row):

    $items[$row['ust_kategori']][] = $row;

    endforeach;

    }

    else

    {

    // Nested ise gelen sayfaları al

    $items = $sayfalar;

    }

    // Gelen sayfaları aç

    foreach($items[$ebeveyn] as $sayfa)

    {

    // Boşluk hesapla

    $bosluk = str_repeat(' ',($i*$kademe_pixel));

    // Menuleri değişkene aktar

    $menuler .= '

    ‘.$sayfa[‘kategori_adi’].”;

    // Açılan menude bir alt sayfa var ise nested çağır

    if (isset($items[$sayfa[‘id’]]))

    {

    $menuler .= ”.PHP_EOL;

    $menuler = kat_listele($items , $sayfa[‘id’] , $kademe_pixel , ($i+1) , $menuler , TRUE);

    $menuler .= ”.PHP_EOL;

    }

    $menuler .= ”.PHP_EOL;

    }

    // Oluşan menüleri return et

    return $menuler;

    }

    // Kategori Listesini Al

    $sql_kategori=mysql_query(“SELECT * FROM kategoriler ORDER BY kategori_adi ASC”);

    $kategori_list=array();

    $i=0;

    while($row_kategori=mysql_fetch_object($sql_kategori)){

    $kategori_list[$i][‘id’]=$row_kategori->id;

    $kategori_list[$i][‘kategori_adi’]=$row_kategori->kategori_adi;

    $kategori_list[$i][‘seo’]=$row_kategori->seo;

    $kategori_list[$i][‘ust_kategori’]=$row_kategori->ust_kategori;

    $i++;

    }

    // Kategoriye ait tüm alt kategorileri topla

    $AltKategoriList=array();

    foreach($kategori_list as $id){

    $AltKategoriList[$id[‘id’]]=listele($kategori_list,$id[‘id’]);

    }

    // $AltKategoriList arrayını $Global yap

    $GLOBALS[“kat_list”]=$AltKategoriList;

    echo ”.kat_listele($kategori_list).”;

    ?>

    • Ahmet dedi ki:

      Edit:

      Merhaba Kamil Bey,
      Yorumun uzamaması için kodları aşağıdaki bağlantıda bulabilirsiniz.
      https://ahmeti.com.tr/wp-content/uploads/2014/07/YanYanaKategoriListesi.rar

      • kamil dedi ki:

        tekrar merhaba ahmet bey, istediğim şeyi hemen hemen anlamışsınız ama anlatmak istediğim şey bu değil sınırsız alt kategori mantığıyla kategorilerim sıralanıyor ortalama çoğu kategori 1 ana 2 alt kategori olarak sıralanıyor kategorilerim ben bu kategori kodları ile aynı şekilde kategorilere reklam ekleme işlemi yaptırıcam kayıt işlemi felan her şey tamam sorunsuz verdiğim kodlar çalışıyor tek sorun sayfa aşağıya doğru çok uzuyor bende ana kategorileri yada ana leri yan yana sıralayıp alt kategorileride altında alt alta sıralanmasını istiyorum sağ tarafta alan bitince kendisini aşağıya atsın istiyorum böylelikle sayfada boş alan kalmayacak boşada aşağıya doğru uzamayacak. Kategorilerim ana kategoriler 11 adetten oluşup alt ve onun alt kategorileri toplam 720+ üzerinde neden böyle istediğimi anlamıştırsınız. Yardımlarınız için yine teşekkür ederim.

  9. kamil dedi ki:

    merhaba kodlarınızı denedim istediğim şey aşağıdaki resimdeki şekilde bir şey olması;

    https://drive.google.com/file/d/0B5xqH_qYEw1fZGExckVNajlNLXM/edit?usp=sharing

    bunun gibi olmasını istiyorum, yardımcı olursanız şimdiden teşekkür ederim. iyi günler.

  10. kamil dedi ki:

    Çok teşekkür ederim ahmet bey oturup hiç sıkılmadan bu dediğim sorunla uğraştınız allah sizden razı olsun. Şaşırdım ayrıca baya uğraşmışsınız elleriniz dert görmesin. Tablolarda sağ taraftaki kategoriler uzun olunca sol tarafta boşluk kalıyor bunuda artık ben çözmeye çalışıcam. Çok teşekkür ederim ahmet bey sizin ve tüm müslüman aleminin ramazan bayramını kutlarım hayırlı bayramlar. İyi günler…

  11. kamil aykırı dedi ki:

    Tekrar merhaba ahmet bey;

    kategorilerimde aşağıdaki sınırsız kategori fonksiyonunu kullanıyorum, kategorilerim 1000+ aşmış durumda bu yüzden sitemin açılması çok uzun sürüyor bende sadece kategori ve alt kategorisini çekmesini istiyorum yani daha alt kategorileri çekmesini istemiyorum, böylece sitem hızlanacak. Kodları siz yazdığınız için nereye müdahale edeceğimi bilmiyorum rica etsem sınırlamayı siz yaparmısınız kodlarım aşağıda buyrun;

    https://drive.google.com/file/d/0B5xqH_qYEw1fbjdVd3cxLUJ6NjA/edit?usp=sharing

    şimdiden yardımınız için teşekkür ederim iyi günler…

    • Ahmet dedi ki:

      Merhaba Kamil Bey,
      Sadece alt kategorileri sıralamak yerine file cache kullanmanız daha isabetli olacaktır. İnternetten file cache özelliğini araştırırsanız, kayda değer bir şeyler bulabileceğinizi düşünüyorum. Eğer sonuca ulaşamazsanız Cumartesi günü yardımcı olabilirim. Selamalar, iyi çalışmalar.

  12. kamil aykırı dedi ki:

    Merhaba ahmet bey ilginiz için tekrar teşekkür ederim. 2844 tane kategori var şuan ve web siteme 30 40 kişi girince yaklaşık 7 8 saniyede açılıyor web sitem. Şimdilik kategorileri manuel yazıyorumİstediğim tek şey ana kategori ve alt kategori çekmek onun alt kategorilerini istiyorum onun alt kategorileri kalsın istiyorum.

  13. Çağatay dedi ki:

    Hocam kodları yazıyorum ekrana hiçbir çıktı alamıyorum veritabanım şöyle

    kategori_id kategori_adi altkategori_id

    $item)
    {

    if ($Kategori_Id > 0){
    // Eğer kategori id set edilmiş ise birincil düzey yap…
    $kontrol=$Kategori_Id;
    }else{
    // Eğer kategori birincil düzey ise… (yani alt kategorileri almıyoruz!)
    $kontrol=0;
    }

    if ($item[‘altkategori_id’] == $kontrol)
    {
    // $tree değişekeninde birincil düzey olarak ekledik.
    $tree[$item[‘kategori_id’]] = $item;

    // Bu kategoriyi kaydettiğimiz için de (yani işimiz bitti!) $list dizisinden kaldırıyoruz.
    unset($list[$id]);

    // Ve şimdi can alıcı nokta! Bu ana kategorinin alt kategorisi var mı diye alt kategorilerine bakıyoruz…
    Kategori_Find_Sub_Cats($list, $tree[$item[‘kategori_id’]]);
    }
    }

    return $tree;
    }

    function Kategori_Find_Sub_Cats(&$list, &$selected)
    {
    /* Kategori_List() fonksiyonu ile beraber çalışır.
    * Alt kategorileri arayan yardımcı fonksiyonumuz.
    * &$list: Veritabanından çektiğimiz ham kategorileri içeriyor.
    * &$selected: Üzerinde işlem yapılacak (varsa alt kategorisi eklenecek) kategoriyi içeriyor.
    */

    // Her bir kategoriyi tek tek döndür…
    foreach ($list as $id => $item)
    {
    // Eğer babasının kimliğiyle kendi kimliği aynıysa… (yani alt kategori ise!)
    if ($item[‘altkategori_id’] == $selected[‘kategori_id’])
    {
    // Seçimin “sub_cats”ına alt kategorisini ekle.
    $selected[‘sub_cats’][$item[‘kategori_id’]] = $item;

    // Babasını bulduğuna göre artık $list’eden kaldırabiliriz.
    unset($list[$id]);

    // Alt kategorinin de çocuğu olabilme ihtimali için aynı işlemleri ona da yapıyoruz…
    Kategori_Find_Sub_Cats($list, $selected[‘sub_cats’][$item[‘kategori_id’]]);
    }
    }
    }

    // Kategori Listesini Al
    $sql_kategori=mysql_query(“SELECT * FROM kategoriler ORDER BY kategori_adi ASC”);
    $kategori_list=array();
    $i=0;
    while($row_kategori=@mysql_fetch_object($sql_kategori)){
    $kategori_list[$i][‘kategori_id’]=$row_kategori->kategori_id;
    $kategori_list[$i][‘kategori_adi’]=$row_kategori->kategori_adi;
    $kategori_list[$i][‘altkategori_id’]=$row_kategori->ust_kategori_id;
    $i++;
    }

    Kategori_List($kategori_list);

    ?>

  14. Metin dedi ki:

    Süpersin kardeşim. Kodların süper yardımcı olacak bana

  15. Fatih Mert Doğancan dedi ki:

    Hocam çok teşekkürler,
    Anlatım harika, kodlar açıklayıcı çok beğendim..

    Fakat, kullanıcı Telefon kategorisine tıkladığında ilgili kategorinin alt kategorisinin sahip olduğu yazıları nasıl listeleriz ?
    İçeriği tutan tablom da kategorilere ait tek bir kolon var, o da asıl kategor_id ‘yi çekiyor.

    Teşekkürler..

  16. Ramazan Gökce dedi ki:

    mysql fonksiyonlarında tamam ama pdo kullanırken fonksiyon içinde sorgu yapamıyoruz. onu nasıl halledebilirim??

  17. Murat dedi ki:

    iyi günler, benim sormak istediğim sınırsız kategori listelerken hepsini değilde sadece herhangi bir kategorinin alt aktegorilerini nasıl listelebiliriz?
    bide yukarıdaki mantığın PDO ile olanı var mı acaba?

  18. Murat dedi ki:

    selamlar Ahmet Bey, Sınırsız kategori yazınızı inceledim ama bir türlü sizin ekran görüntüelrinize yapamadım. fonksiyonlarda hata veriyor, sanırım birşeyleri eksik yapıorum. birde sitemi PDO ile yapıyorum, acaba vaktiniz varsa yardımcı olabilir misiniz? Şimdiden teşekkür ederim.
    selamlar. ayrıca yapabilen varsa [email protected] mail adresine gönderebilir misiniz?

  19. Erdo dedi ki:

    Hocam Merhaba,

    hiyerarşik kategorilemem şöyle olsun

    Haber
    — Gündem
    —–Siyaset
    ——–Siyaset 2
    ———-Siyaset 3
    ———-Siyaset 4
    ——Spor

    Şimdi siz Haber kategorisinin altında bulunan tüm kategorileri listeletiyorsunuz bu fonksiyonuda sağolun yapmışsınız ancak ben Siyaset 4 Kategorisinin üst kategorilerine ihtiyaç duyuyorum. Yine hiyerarşik olarak…. Sitede Siyaset 4 Kategorisine girildiğinde.
    Anasayfa->Siyaset->Siyaset 2 -> Siyaset 4 ü görüntülemektesiniz diye bilmem ve bunlara link verebilmem için bu şart.

    İd leri sadece array a atsa yine olur ben o arraydan tek tek sql sorgusu alıp isimleri ve linkleri bulurum.

  20. Erdo dedi ki:

    Kategori_Select_Duzenle($tree,$Select_Kategori_Id,$Select_Kategori_Ust_Id,$Haric_Kategori,$level=0,$saydir=1,$option=null){

    /*
    Sadece Kategori Düzenleme Formunda kullanılan Select Box.
    $saydir 1 olarak gelir sadece tek seferlik bir işlem yapar

    */

    // En üst kategori ise
    if ($saydir==”1″ && $Select_Kategori_Ust_Id==0){
    $option .= ‘Bu Kategoriyi En Üst Kategori Yap’;
    }else{

    if($saydir==”1″){
    $option .= ‘Bu Kategoriyi En Üst Kategori Yap’;
    }

    }

    Şeklinde düzenlerseniz alt kategorilerinde ana kategori olması seçilebilir hale gelir. Şu haliyle alt kategorileri düzenlerken ana kategori seçilme option u gelmiyor.

  21. Erdo dedi ki:

    Üst Kategorileri listeleme,

    function Ust_Kategori_List($id,$toplambilgi=null)
    {

    $sorgula = $this->db->select(“kategoriler”, array(“kategori_id”=>$id), $relOpt = ‘=’, $locOpt = “and”, $orderColumn = null, $orderOpt = null, $limit = null, $lmtStart = null);

    $ustkatidisi = $sorgula[“0”][“ust_kategori_id”];
    $kategori_adi = $sorgula[“0”][“kategori_adi”];
    $selflink = $sorgula[“0”][“selflink”];

    $toplambilgi .= “$id-$selflink-$kategori_adi,”;

    if($ustkatidisi!=”0″){

    return $this->Ust_Kategori_List($ustkatidisi,$toplambilgi);

    }else{

    $toplambilgi = rtrim($toplambilgi,”,”);

    $toplambilgi = explode(“,”, $toplambilgi);

    $toplambilgi = array_reverse($toplambilgi);

    $ciktiolustur = array();
    $selflinktoparla =null;

    foreach($toplambilgi as $sirasi=>$icerik){

    $bolunmus = explode(“-“, $icerik);
    $katidssi = $bolunmus[“0”];
    $katselflink = $bolunmus[“1”];
    $kategori_adi = $bolunmus[“2″];

    $selflinktoparla .= $katselflink.”/”;

    $ciktiolustur[“ekstra”][$sirasi] = array(
    “katidssi” => $katidssi,
    “kategori_adi” => $kategori_adi,
    “katselflink” => $katselflink,
    “dongudeselflink” => $selflinktoparla,
    );

    }

    $ciktiolustur[“kendiselflink”] = $selflinktoparla;
    $ciktiolustur[“kendikategoriadi”] = $kategori_adi;

    return $ciktiolustur;
    }

    }

    $ustkategorilerigetir = $kategorifonksiyon->Ust_Kategori_List(“$kategori_id”); // Array olarak çıktı verir

    Ben sql üzerinden bu işlemi sağladım ancak, kategori list fonksiyonu zaten bu çıkıyı array olarak veriyor. O array üzerinden alt kategorinin en üst kategorisi tesbit edilirse sql sizde bu işlem yapılabilir ancak array search ile yapamadım yaparsanız geliştirirseniz güzel olabilir.

    Bu fonksion ile

    anasayfa >haberler >gündem > bilmemne > Başbakan istanbula geldi şeklinde çıktı alabilirsiniz.

  22. By.Kutlu dedi ki:

    Teşekkürler, verdiğiniz bilgileri bir projemde kullanacağım.. Allah razı olsun 🙂

  23. Ufuk MERT dedi ki:

    Süper fonksyonlar fakat bir sorunum var benim sorgum şu
    function kategoriII($id = 24, $string = 0)
    {
    $tamam = 0;
    $baglanti = mysqli_connect(“localhost”, “root”, “teknokilavuz06”, “audi_ticaret”) or die(mysqli_error());
    mysqli_set_charset($baglanti, “UTF8”);
    $query = mysqli_query($baglanti, “select * from kategori WHERE pUstKod = ‘$id’ order by nSira ASC “);
    if (mysqli_num_rows($query)) {
    while ($row = mysqli_fetch_array($query)) {

    echo ” . str_repeat(‘  ‘, $string) . $row[“sKategoriAd”] . ‘ : Alt Kategori Ekle‘;
    kategori($row[“Kategori_rowid”], $string + 2);
    }
    } else {
    return false;
    }
    }

    çalışıyor ancak mesela id’si 26 olana kadar tüm kategorileri bul demek istiyorum nasıl ?

  24. fatih dedi ki:

    isteyene bunun asp ile çalışan şeklini verebilirim şuan üstünde çalıtığım sistem içerisinde mevcut yapılmış hali

  25. ahmet dedi ki:

    3 yazdıgınız fonsiyonda kategorılerın id ile gözukmetedir görunmemesi için ne yapmalıyım kategori_id silincede alt kategorıle gostermıyor yardımcı olursan sevinirim ..

  26. ismail ardinc dedi ki:

    Merhaba Ahmet; çoklu kategori konusunda paylaşımın harika fakat ben bunu panelime uygulamakta baya zayıf kaldım. php ye yeni başladım ve kendi blogumu yapmaya çalışıyorum. Ancak yazımı ana ve alt kategorilerden oluşan birden fazla kategoriye eklemeye silmeye ve düzenlemeye ihtyarcım var. Bu konuda destek olabilir misin? Olursan böyle bir desteğin ücreti ne olur.

    Saygılarımla,

  27. Suleyman dedi ki:

    Kod için teşekkürler, emeğine sağlık

  28. Elcin Elizaminoglu dedi ki:

    Selam.Oncelikle islerinizde basarilar.Bi ricam olucakti sizden.Bir aydir ki,ariyordum ama sizin sitede buldum.Linkleri alt-alta acilir bir menude nasil ekleye bilirim ? Linkler bu

    if ($number_21 != ‘x’)echo “» “.$number_21.”n”;

    if ($number_22 != ‘x’)echo “» “.$number_22.”n”;

    if ($number_23 != ‘x’)echo “» “.$number_23.”n”;

    if ($number_24 != ‘x’)echo “» “.$number_24.”n”;

    Nolursunuz yardimci olun.Ust menu konum site icin.

  29. Turgut Duran dedi ki:

    ?php

    include (“Connections/baglan.php”);

    $sorgu=mysql_query(“SELECT * FROM projeler where resimid='”.$RESIMID.”‘ ORDER BY id ASC”);
    $sayi=0;

    while($yaz=mysql_fetch_assoc($sorgu))

    {
    if(($sayi != 0) AND ($sayi % 2) == 0) echo ”;

    ?>

    <img class="img-ysm2" src="” >

    <a href="” class=”fancybox”>
    Büyütmek İçin Tıklayın

    urun tablosu var birde resimler tablosu

    urun tablosunda ki resimid resimler tablosundaki resimid ye eşit

    urun resimid 1 ——- resimler resimid1 olan resimler listeleyecek

  30. Yazılım Yazar dedi ki:

    Mantıkları çok güzel, herşey düşünülerek anlatılmış. Özellikle düzenleme kısmındaki mantıklar çok güzel. Ama ben bu sistemi PDO ile düzenleyemedim ve bu konuda çok kişide bu sorunu yaşıyordur. Buradaki sistemi güncel bilginiz dahilinde güncellerseniz çok makbüle geçecek, çünkü bu konuda kaynaklar hep kısıtlı. Detaylı olarak siz ele almışsınız ama oda PDO değil. 🙁

  31. Yazılım Yazar dedi ki:

    Ahmet hocam bu sorgularda en alt kategoriyi nasıl öğrenebiliriz? Ürün eklerken en alt kategori hariç diğerleri disable olarak görünsün gibisinden birşey yapmak istiyorum.

  32. Murat dedi ki:

    Paylaşım çok güzel. Emeğinize sağlık. Bir noktada hatırlatma yapayım. Üst versiyon PHP kullanımında hata alan arkadaşlar. mysql_query kullanımını mysqli_query olarak değiştiriniz. Tüm mysql geçen bölümleri mysqli olarak çevirirseniz sorun ortadan kalkacaktır.

  33. Sadık dedi ki:

    Tek sorguda listeleniyor mu yani

  34. Mehmet dedi ki:

    Merhaba, en baştaki kodu Codeigniter 4 e nasıl uyarlayabiliriz?

  35. dilsah dedi ki:

    peki bu kategoriyi veri tabanında nasıl gösterecez

    veri tabanındaki ismin->kategori->kstegorinin altına 3 tane kategori yapmak istiyorum bu mümkümmü

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir