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

Ahmet

Sıradan bloglardan birisi :) Google+

Sevebilirsin...

34 Yanıt

  1. Kathy Holloway diyor ki:

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

  2. karton diyor 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 diyor 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 diyor 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 diyor 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 diyor 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 diyor 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 diyor 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 diyor 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 diyor 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 diyor ki:

      Edit:

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

      • kamil diyor 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 diyor 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 diyor 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ı diyor 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 diyor 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ı diyor 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 diyor 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 diyor ki:

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

  15. Fatih Mert Doğancan diyor 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 diyor ki:

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

  17. Murat diyor 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 diyor 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 datamentalteknik@gmail.com mail adresine gönderebilir misiniz?

  19. Erdo diyor 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 diyor 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 diyor 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 diyor ki:

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

  23. Ufuk MERT diyor 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 diyor ki:

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

  25. ahmet diyor 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 ..

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Yorum onaylama sistemi etkin; yorumunuzun yayınlanması biraz zaman alabilir.