Kodları lütfen aşağıdaki butonları kullanarak renklendirin. Örnek: <php> echo "Selam Dünya"; </php>
Yardım
karakter kaldı

sınırsız kategori'de yazının hangi kategoride olduğunu nasıl buldurabilirim?

Tekrar merhaba :)

Sınırsız kategorileme yaptım ama ben bunları nasıl yazıda çekiceğimi bulamadım, bir türlü kurgulayamadım nasıl yapacağımı

kategori tablosu şöyle


katid - altkatid - katisim
1        0          php
2        1          Symfony
3        2          deneme


şeklinde bir kategori tablom var

yaziid - yazikatid - baslik - icerik
1         3          deneme    deneme
2         1          deneme2   deneme2


şeklindede bir yazı tablom var

1 id'li yazıda id'si 3 olan kategorim var, ben deneme kategori adını çekebiliyorum ama bunun alt kategori olduğunu nasıl anlayabilirim, ve üst kategorilerini nasıl çekebilirim, yani şöyle

php -> Symfony -> deneme

şeklinde bunu nasıl yapabilirim :)
  • Dikkatini şurayada çekeyim altkatid alanı aslında alt değil ana ya da üst id olmaktadır. Symfony kategorisi alt iken php onun üstündedir yani php diğerini kapsar...
    zyber 9 yıl önce yazdı
+0
-0
Cevaba KatılıyorumKatılmıyorum
Cevap Yaz Yorum Yaz Arşivime Ekle Takip Et

Doğru Cevap

  • zyber adlı üyenin fotoğrafı
    9 yıl önce yazılmış
    57 cevap - 25 soru
    Sorduğunuz işlemin adı Breadcrumb dır.

    Recursiv(Recursion) yöntem ile hazırlanmış bir sistem için (sizin sisteminiz) aşağıya basit ve oldukça sade bir örnek yaptım.

    Yapmanız gereken php isminde mysql de bir veritabanı oluşturmak ve bu veritabanı içine aşağıdaki tabloyu oluşturmak
    CREATE TABLE IF NOT EXISTS `tblkategori` (
      `id` int(6) NOT NULL auto_increment,
      `parent_id` int(4) NOT NULL default '0',
      `ad` varchar(255) NOT NULL,
      PRIMARY KEY  (`id`),
      KEY `parent_id` (`parent_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
    
    INSERT INTO `tblkategori` (`id`, `parent_id`, `ad`) VALUES
    (1, 0, 'Kategori 01'),
    (2, 0, 'Kategori 02'),
    (3, 0, 'Kategori 03'),
    (4, 1, 'Kategori 01 A'),
    (5, 1, 'Kategori 01 B'),
    (6, 1, 'Kategori 01 C'),
    (7, 4, 'Kategori 01 AA'),
    (8, 4, 'Kategori 01 AB'),
    (9, 4, 'Kategori 01 AC');
    



    işlemi yapan php kodları ise aşağıdadır.
    Bu çok daha gelişmiş halde ve class ile yapılabilir ama işin mantığını göstermek açısından basit bir örnek sanırım yeterlidir.

    <?php
     $id = $_GET['id'];
     $db_host="localhost";
     $db_user="root";
     $db_pass="123456";
     $veritabani_ad="php";
     
     $baglanti = mysql_connect($db_host,$db_user,$db_pass) or die('Bağlantı yok : '.mysql_error());
     
    mysql_select_db($veritabani_ad) or die('Veritabanı yok yada ulaşılamadı : '.mysql_error());
    mysql_query("SET NAMES 'utf8'");
    mysql_query("SET CHARACTER SET utf8");
    mysql_query("SET COLLATION_CONNECTION = 'utf-8'");
    
    $x = fonkKategoriListesi();
    $breadcrumb = " » ".fonkBreadcrumb($x, $id);
    echo "<a href=\"breadcrumb.php\">Ana Sayfa</a>";
    echo $breadcrumb;
    
    echo "<p><a href=\"breadcrumb.php?id=1\">Ürün 1</a> <a href=\"breadcrumb.php?id=2\">Ürün 2</a> <a href=\"breadcrumb.php?id=3\">Ürün 3</a>  <a href=\"breadcrumb.php?id=4\">Ürün 4</a> <a href=\"breadcrumb.php?id=5\">Ürün 5</a>  <a href=\"breadcrumb.php?id=6\">Ürün 6</a>  <a href=\"breadcrumb.php?id=7\">Ürün 7</a> <a href=\"breadcrumb.php?id=8\">Ürün 8</a> <a href=\"breadcrumb.php?id=9\">Ürün 9</a></p>";
    
    mysql_close($baglanti);
    
    function fonkKategoriListesi() {
     $query = mysql_query("SELECT * FROM tblkategori ORDER BY parent_id");
     while ($row = mysql_fetch_array($query)) {
      $arrKategori[$row['id']] = array('id' => $row['id'], 'parent_id'   => $row['parent_id'], 'ad' => $row['ad']);
     }
    return $arrKategori;
    }
    
    function fonkBreadcrumb($x, $id) {
    if(! $id) return;
     $parent_id = $x[$id]['parent_id'];
     $liste = "<a href=\"$PHP_SELF?kategori={$x[$id]['id']}\">{$x[$id]['ad']}</a>";
    while ($parent_id) {
     $liste = "<a href=\"$PHP_SELF?kategori={$x[$parent_id]['id']}\">{$x[$parent_id]['ad']}</a>" . " » " . $liste;
     $parent_id = $x[$parent_id]['parent_id'];
     if( $x[$parent_id]['parent_id'] == $x[$parent_id]['id'] ) break;
    }
    return $liste;
    }
    ?>
    



    Örnek dosyalar.
    http://www.upload.gen.tr/d.php/www/sas6axzg/breadcrumb.rar.html
    • pl_phe adlı üyenin fotoğrafı pl_phe
      öncelikle hepinize teşekkürederim ilgilendiğiniz için, sayenizde bişeyler daha öğreniyorum :)

      zyber tam istediğim mantığı anlamışsın :)

      kulandığı kodları bu siteden aldım, reklam olurmu bilemem ama zaten bu kodlar bir çok sitede var.

      <a href="http://www.koodla.com/2008/08/09/php-ile-sinirsiz-alt-kategori-mantigi/" target="_blank" class="external" rel="nofollow">http://www.koodla.com/2008/08/09/php-ile-sinirsiz-alt-kategori-mantigi/</a>

      sizin verdiğiniz kodu ben çalıştırdım yanlız 39. satırında hata aldım

      function fonkBreadcrumb($x, $id) {
      if(! $id) return;
       $parent_id = $x[$id]['parent_id'];
       $liste = "<a href=\"localhost?kategori={$x[$id]['id']}\">{$x[$id]['ad']}</a>";
      while ($parent_id) {
       $liste = "<a href=\"localhost?kategori={$x[$parent_id]['id']}\">{$x[$parent_id]['ad']}</a>" . " » " . $liste;
       $parent_id = $x[$parent_id]['parent_id'];
       if( @$x[$parent_id]['parent_id'] == @$x[$parent_id]['id'] ) break;
      }
      return $liste;
      }
      


      şu bölüm hata veriyor anlaadım tam ama :)

       if( @$x[$parent_id]['parent_id'] == @$x[$parent_id]['id'] ) break;
      


      şöyle bir hata

      Notice: Undefined index: 0 in D:\wamp\www\breadcrumb\breadcrumb.php on line 39
      9 yıl önce yazılmış 9 yıl önce güncellenmiş
    • zyber adlı üyenin fotoğrafı zyber
      Bu hata değil bir uyarıdır.
      undefined index tanımsız indis demek yani dizide olmayan bir elemana erişmeye çalışıyorsun demek.
      Kategoriler dizisinde tanımlı olmayan bir eleman buna sebep olur.
      Son yani hata veren satırı kaldırırsan hata vermeyecektir. Çalışmasına da engel değildir.

      Ancak bunun asıl sebebi şudur.
      php.ini dosyanda hata gösterim şekli buna sebep olur.
      php.ini dosyanı aç error_reporting satını bul ve error_reporting(E_ALL ^ E_NOTICE); şu şekilde değiştir. Artık o uyarı çıkmayacaktır.
      Ancak kendini geliştirme seviyesindeysen bence açık kalsın her notu ve hatayı görmek tedbir için iyidir.
      Yani siz büyük bir olasılıkla localde değilde sunucuda kodları çalıştırdığınızda bu hatayı almayacaksınız.
      9 yıl önce yazılmış
    • pl_phe adlı üyenin fotoğrafı pl_phe
      hm. teşekkürederim

      peki son bir sorum daha olucak, bu kategorileme yöntemi sizce doğru bir yöntemmidir acaba ?
      daha iyisi varsa nasıl olmalıdır
      9 yıl önce yazılmış
    • zyber adlı üyenin fotoğrafı zyber
      orta ve büyük sayılabilecek bir sistem için kullanılabilir.
      Ancak bana sorarsan nested set model kategorileme sistemi çok daha profesyoneldir ancak bu konuda çok örnek ve bilgi yok. Olanlarda çok kısıtlı.
      Senin durumunda bir kişi için recursion yani bu kategori yöntemi yeterlidir.

      bu örnek kodu datalife engine cms kullanıyor. ve bu rus kaynaklı cms çoğu warez sitesinde kullanılmaktadır. Yani o kadar içeriği başarılı bir şekilde döndürmektedir.
      Ancak datalife engine dizi halinde çekilen kategorileri cache de tutmakta ve oradan çağırmaktadır.

      Mantıklı olanda budur. Her bir oturumda yeni bir dizi oluşturup kategorileri almak sunucuyu yorar. Kategoriler her an değişmez. O zaman bu kategorileri cacheye yazmak mantıklıdır. Admin kategori değiştirme işleminin olduğu yerde kategoriler değiştiğinde o cachedeki diziyi silip yenisini yazdınız mı bir sonraki değişikliğe kadar artık mysql i araya sokmaksızın işlemi gerçekleştirmiş oluruz.
      9 yıl önce yazılmış

Cevaplar

  • siyahbeyaz adlı üyenin fotoğrafı
    9 yıl önce yazılmış
    9 yıl önce güncellenmiş
    472 cevap - 20 soru
    sunumu demek istiyorsun..

    en üst kategori sectiyse o üst kategorinin altındaki kategorilere ait icerikleride getirmek istiyorsun oylemi

    ornek

    Türkiye
       -Ankara
           - Elmalı
           - Kızılay
       -Diyarbakır
          - Mazıdağı
              - Poyraz Mahallesi.
           -Merkez
               -Yeni Şehir
               -Ofis
               -kayapınar
                  - Yüksel Budak
    Amerika
        - Washington
    


    gibi bir kategoride
    ankara ve ankaranın altındaki iceriklerinimi listelemek istiyorsun.
    • pl_phe adlı üyenin fotoğrafı pl_phe
      aslında onu yaptım,

      demek istediğim tam olarak şöyle

      bi yazı yayınladım ve kategorisi alt kategori olan bir kategoriyi seçtim,

      yayınlanan bölümde o yazıyı kayıt ettiğim kategoriyi çağırabiliyorum, ama onun üst kategorilerini çağırabileceğim bir mantığı kuramadım

      title'da kategoileri şöyle göstermek istiyorum

      mesela Kızılar kategorisi içine yazı girdiğimi düşünelim, o yazı içerisine girdiğimde

      title'da ise Türkiye -> Ankara -> Kızılay şeklinde olmasını istiyorum

      Elmalı kategorisi içine girdiğimde ise

      Türkiye -> Ankara -> Elmalı olarak
      9 yıl önce yazılmış
    • siyahbeyaz adlı üyenin fotoğrafı siyahbeyaz
      usten asagıya dogru ınebılıyorsunuz ama altan yukarı dogru cıkamıyorsunuz bu olay benımde basıma gelmisti. cok ugrasmıstım ama yapmıstım. senın ıcın bır ornek hazırladım..

      ilk olarak su resme bak.
      http://www.omerabul.com/siyahbeyaz.png
      


      mysql icin
      $sql =mysql_query("SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
      FROM category AS t1
      LEFT JOIN category AS t2 ON t2.parent = t1.category_id
      LEFT JOIN category AS t3 ON t3.parent = t2.category_id
      LEFT JOIN category AS t4 ON t4.parent = t3.category_id
      WHERE t4.category_id = 10");
      $yaz = mysql_fetch_array($sql);
      
      echo $yaz["rev1"]." > ";
      echo $yaz["rev2"]." > ";
      echo $yaz["rev3"]." > ";
      echo $yaz["rev4"]." > ";  
      
      /* burda dikkat etmen gereken birsey var. normalde tablomda rev1 rev2 gibi fieldler yok. sorgu sonucu bu hayali fieldler geliyor.. */
      
      echo "<br><pre>";
      print_r($yaz);
      
      9 yıl önce yazılmış
    • siyahbeyaz adlı üyenin fotoğrafı siyahbeyaz
      kaynak : http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

      Retrieving a Single Path basligi altında.
      9 yıl önce yazılmış
    • zyber adlı üyenin fotoğrafı zyber
      o gösterdiğiniz nested set model yapıdır.
      9 yıl önce yazılmış
    • zyber adlı üyenin fotoğrafı zyber
      hayali field(alan)ler yerine Alias ya da Takma Ad denilebilir.
      9 yıl önce yazılmış
    • zyber adlı üyenin fotoğrafı zyber
      Bu işlemide WHERE IN(1,5,9) vb Array şeklinde gelen alt kategorilerle yapılır.
      Array şeklinde almak için bir tek fonksiyon yeterlidir...
      9 yıl önce yazılmış
    • zyber adlı üyenin fotoğrafı zyber
      aslında onu yaptım, dediğiniz kodları merak ettim. Paylaşırsanız alternatif kodlar yazabilirim....
      9 yıl önce yazılmış