• 22-03-2009, 04:39:51
    #1
    merhaba arkadaşlar direk konuya giriyorum,



    bu benim databasede ki kategori tablosunun içeriği, parent_id 'si 0 olanlar ana kategoriler oluyor, 0 dan farklı olanlar ise parent_id'de ki değer neyse o id li kategorinin alt kategorisi oluyor. Demek istediğimi anlamışsınızdır, bu sayede sonsuz alt kategori ve ana kategori oluşturabiliyorum, herneyse devam edelim:

            <select size="1" name="parentcat">
            <option value='0'>-</option>
            <?
            $al=mysql_query("select * from taxonomy where parent_id='0' order by id desc");
            while($ver=mysql_fetch_array($al))
            {
            echo "<option value='".$ver["id"]."'>".$ver["name"]."</option>";
                    $al2=mysql_query("select * from taxonomy where parent_id='".$ver["id"]."' order by id desc");
                    while($ver2=mysql_fetch_array($al2))
                    {
                    echo "<option value='".$ver2["id"]."'>&nbsp;&nbsp;&nbsp;> ".$ver2["name"]."</option>";
                        $al3=mysql_query("select * from taxonomy where parent_id='".$ver2["id"]."' order by id desc");
                        while($ver3=mysql_fetch_array($al3))
                        {
                        echo "<option value='".$ver3["id"]."'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;> ".$ver3["name"]."</option>";
                        }
                    }
            }
            ?>
            </select>
    bu kodu çalıştırdığım zaman aşağıda ki select box'ımı elde etmiş oluyorum, gördüğünüz gibi sıralamalar ana kategoriler, onların altında alt kategoriler ve varsa o alt kategorilerin alt kategorileri şeklinde sıralanmış. Örneğin : Kütüphane : ana kategori, Katalog arama : kütüphanenin alt kategorisi, Yazar adına göre arama ise katalog aramanın alt kategorisi. aşağıda ki comboboxda da göreceğiniz üzere.



    şimdi gelelim benim sorunuma, yukarda ki php koduna bakarsanız eğer, 3 tane içiçe mysql sorgusu yaptım ana kategori, onun alt kategorisi ve alt kategorinin alt kategorisini çekmek için. çünkü ben biliyorum ki maximum 3 kategori ilerledim database de ki kategori tablomda. f

    Fakat ilerde bu alt kategori olayını abarttım diyelim, alt alta 10 20 tane kategori açtım diyelim. o zaman ne olacak ? içiçe 20 mysql_query sorgusu yapmak çok mantıksız geliyor bana. hem kod çöplüğüne dönecek hem de aşırı bir mysql yorulması olacak eminim. bu konuda sizlerin fikirlerinizi almak istedim. php olması gerekmiyor yapabilen varsa javascriptle , ajaxla falan yapılıyorsa çözüm önerilerinizi öğrenmek isterim.
  • 22-03-2009, 06:21:17
    #2
    gözüme uyku girmedi yapmadan en sonunda başardım.

    <?
    function kategorial($id,$s){
            
            $al=mysql_query("select * from taxonomy where parent_id='$id' order by id asc");
            while($ver=mysql_fetch_array($al))
            {
            
            if($s=='0'){$kaydir2="•"; $css="class='alt'";}
            else{    for($a=0;$a<2*$s;$a++){$kaydir.="&nbsp;";}$kaydir2="$kaydir »";}
            
            echo "<option $css value='".$ver["id"]."'>$kaydir2".$ver["name"]."</option>";
            
             unset($kaydir);
            
            $altkategorivarmi=mysql_num_rows(mysql_query("select id from taxonomy where parent_id='".$ver["id"]."'"));
            if($altkategorivarmi>0){global $i; $i++; kategorial("".$ver["id"]."","$i"); $i=$i-1;}
      
        }
    }
    ?>
    yukarda ki fonksiyonu şu şekilde çağırıyoruz :

    <?
    echo kategorial('0','0');
    ?>
    <style type="text/css">
    <!--
    select { font-family: verdana; font-size: 12px; border: #000000; border-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px}
    
    select option {
         background-color: #ffe;
    }
    select option.alt {
        background-color: #eff;
        font-weight: bold;
    }
    
    -->
    </style>
    bu css kodumuzu sayfamızın en yukarısına koyuyoruz.

    ve karşımıza hem css 'li hem de mantıksal kategorili select box menümüz çıkıyor



    gördüğünüz gibi ana kategoriler kalın renk , • semboluyle ve yeşil arkaplanıyla gösteriliyor, alt kategoriler ise » sembolü ve turuncu arka planla gösteriliyor, ve artık sonsuz adet alt ve üst kategori ekleseniz dahi php kodunuza ekstra bir kod eklemenize gerek yoktur, yukarda ki fonksiyon otomatik hepsini halledecektir.

    herkese kolay gelsin, kodumu istediğiniz gibi istediğiniz yerde kullanabilir, istediğiniz sitede dağıtabilirsiniz. bilgi paylaştıkça çoğalır
  • 22-03-2009, 07:40:48
    #3
    Üyeliği durduruldu
    Güzel fonksiyon olmuş.
    $altkategorivarmi=mysql_num_rows(mysql_query("sele ct id from taxonomy where parent_id='".$ver["id"]."'"));
    Şu satırı select count (*) lı şekilde yazarsan daha hızlı olur gibi geliyor. Çünkü while baya dönüyor perfomans artsın maksat
  • 22-03-2009, 14:00:26
    #4
    SNaRe adlı üyeden alıntı: mesajı görüntüle
    Güzel fonksiyon olmuş.
    $altkategorivarmi=mysql_num_rows(mysql_query("sele ct id from taxonomy where parent_id='".$ver["id"]."'"));
    Şu satırı select count (*) lı şekilde yazarsan daha hızlı olur gibi geliyor. Çünkü while baya dönüyor perfomans artsın maksat
    evet haklısın, el alışkanlığı işte alışmışım mysql_num_rows yazmaya hep. sağol hatırlattığın için
  • 24-03-2009, 18:49:41
    #5
    elelrine sağlık. döktürmüşsünüz. Bu işime yarayacak.
  • 24-03-2009, 20:48:45
    #6
    Mysql sorgusu yükünü azaltmak için azaltmak için bu sorgunun olduğu php dosyası cachelenir.
    https://www.r10.net/php/82095-sql-cac...lay-cozum.html

    Bu adreste basit entegre edilen ve kullanışlı bir cache sistemi verilmişti.
    kategoriyi ayrı bir php dosyasından çektirirsiniz ve kategorileri çekip sıralayan dosyayı ana dosyaların içine include edersiniz.

    Böylece cachelenen html sayfasını istenilen her yere include edebilirsiniz. Cache süresini de istediğiniz gibi ayarlayabilirsiniz.
    Bir siteye her dakika yeni bir kategori eklenmiyorsa bir kaç saatte bir yenilenen cache dosyası yaparsınız. Böylece kasacağını düşündüğünüz mysql sorgusu saatte bir kez çalışır.
  • 24-03-2009, 22:44:47
    #7
    rekürsif fonksiyon doğru tercih olmuş
  • 24-03-2009, 23:41:35
    #8
    arkadaşlar localde deneme yaparken loop döngüsünde sorun olduğunu farkettim, $i=0; yerine $i=$i-1; yazmam gerekiyormuş. şu an fonksiyon sorunsuz çalışmaktadır. yeni hali :

    <?
    
    function kategorial($id,$s)
    {
            
            $al=mysql_query("select * from taxonomy where parent_id='$id' order by id asc");
            while($ver=mysql_fetch_array($al))
            {
            
            if($s=='0'){$kaydir2="-"; $css="class='alt'";}
            else{    for($a=0;$a<2*$s;$a++){$kaydir.="&nbsp;";}$kaydir2="$kaydir »";}
            
            echo "<option $css value='".$ver["id"]."'>$kaydir2".$ver["name"]."</option>";
            
             unset($kaydir);
            
            $altkategorivarmi=mysql_num_rows(mysql_query("select id from taxonomy where parent_id='".$ver["id"]."'"));
            if($altkategorivarmi>0){global $i; $i++; kategorial("".$ver["id"]."","$i"); $i=$i-1;}
      
        }
    }
    
    
    ?>
    kullanım şekli ise :

    <? echo kategorial('0','0'); ?>
    örneğin anakategorilerin tamamı değilde spesifik bi anakategori ve alt kategorilerini ekrana bastırmak istiyorsanız : (örneğin akademik birimler ve alt kategorilerini bastırmak istiyorum, ve akademik birimlerin id si 1)

    <? echo kategorial('1','0'); ?>
    ve karşımıza çıkan select box:



    Bir adım daha ileri gidip admin panelimize kategorilerimizi mantıksal olarak bastıralım :

    <table bgcolor=white width=800>
    <tr bgcolor="#008080"><td width=%90><center><font color=white><b>Kategori Adı</td><td><center><font color=white><b>Düzenle</td><td><center><font color=white><b>Sil</td></tr>
    
    
    <?
    
    function kategoribas($id,$s)
    {
            
            $al=mysql_query("select * from taxonomy where parent_id='$id' order by id asc");
            
            while($ver=mysql_fetch_array($al))
            {
            
            if($s=='0'){$kaydir2="-"; $css="<b>";}
            else{    for($a=0;$a<2*$s;$a++){$kaydir.="&nbsp;";}$kaydir2="$kaydir »";}
            
            echo "<tr><td>$css $kaydir2".stripslashes($ver["name"])."</td><td><center><a style='text-decoration:none' href='kategoriduzenle2.php?id=".$ver["id"]."'>[D]</a></td><td><a style='text-decoration:none' href='kategorisil.php?id=".$ver["id"]."'><font color=red>[x]</a></td></tr>";
            
             unset($kaydir);
            
            $altkategorivarmi=mysql_num_rows(mysql_query("select id from taxonomy where parent_id='".$ver["id"]."'"));
            if($altkategorivarmi>0){global $i; $i++; kategoribas("".$ver["id"]."","$i"); $i=$i-1;}
      
        }
    }
    
    
    
    echo kategoribas(0,0);
    ?>
    
    </table>
    ekran görüntüsü :



    ilk postumda belirttiğim kategori mantığı gerçekten mükemmel işe yarıyor. bu sayede sınırsız alt ve üst kategori oluşturmanızın yanı sıra, örneğin bi alt kategoriyi başka bi ana kategoriye taşıdığınız zaman, o alt kategori ve onun altında ki tüm kategoriler otomatikman yeni ana kategoriye taşınmaktadır.

    örneğin yukarda ki resimde Kampüs Hayatı kategorisinin normalde ana kategorisi Eğitim kategorisiymiş. ben bu Kampüs Hayatı kategorisini Araştırma ana kategorisine import ettiğim zaman, Kampüs Hayatı ve alt kategorileri olan Kampüs Tur, Fotoğraflar, Güney Kampüs, Yerleşim Planı, spor ve yurtlar vs. kategorileri de otomatikman Araştırma kategorisinin yeni alt kategorisi olan Kampüs hayatı alt kategorisinin alt kategorileri olacaktır.

    herkese kolay gelsin şimdilik bu kadar
  • 24-03-2009, 23:55:56
    #9
    e hadi gitmişken bir adım daha ilerleyelim , sitemizin anasayfasına bu databaseimizde ki kategorilerle css navbar menu oluşturalım elim hazır ısınmışken paylaşayım dedim.


    <script language="JavaScript" src="nav.js" type="text/JavaScript"></script>
    <link rel="stylesheet" href="nav.css" type="text/css" />
    
    <ul id="navmenu-h">
    
    <?
    
    function navbas($id)
    {
            
            $al=mysql_query("select * from taxonomy where parent_id='$id' order by id asc");
            while($ver=mysql_fetch_array($al))
            {
                    
            echo "<li><a href='#'>".$ver["name"]."</a>";
            
            $altkategorivarmi=mysql_num_rows(mysql_query("select id from taxonomy where parent_id='".$ver["id"]."'"));
            if($altkategorivarmi>0){echo "<ul>"; navbas("".$ver["id"].""); echo "    </ul>";}
        
        echo "</li>\n";
      
        }
    }
    
    
    echo navbas(0);
    
    ?>
    
    </ul>
    Ve karşımızda mantıksal kategorili 4 kademeli css navbar menumuz