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

Sınırsız kategorileri Site Map tarzı ya da list style şekline sokmak

örnek dosyalar.

http://www.upload.gen.tr/d.php/www/xb8w0rxj/ornek.rar.html
Başlık konuyu tam ifade edip edemediği konusunda şüphelerim var.
kısaca anlatıp dosya ve resimlerle destekleyeyim.

Sınırsız kategori, Nested set model tarzında kategoriler var.
SQL ve tablo hali aşağıda.
CREATE TABLE `tblkategori` (
  `kategori_id` int(3) NOT NULL auto_increment,
  `kategori_ad` varchar(100) NOT NULL,
  `left` int(3) default NULL,
  `right` int(3) default NULL,
  `depth` int(3) default NULL,
  PRIMARY KEY  (`kategori_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=13;
INSERT INTO `tblkategori` (`kategori_id`, `kategori_ad`, `left`, `right`, `depth`) VALUES
(1, 'Kategoriler', 1, 24, 0),
(2, 'Kategoriler 01', 2, 9, 1),
(3, 'Kategoriler 01 A', 3, 4, 2),
(4, 'Kategoriler 01 B', 5, 6, 2),
(5, 'Kategoriler 01 C', 7, 8, 2),
(6, 'Kategoriler 02', 10, 15, 1),
(7, 'Kategoriler 02 A', 11, 12, 2),
(8, 'Kategoriler 02 B', 13, 14, 2),
(9, 'Kategoriler 03', 16, 23, 1),
(10, 'Kategoriler 03 A', 17, 18, 2),
(11, 'Kategoriler 03 B', 19, 20, 2),
(12, 'Kategoriler 03 C', 21, 22, 2);


http://i51.tinypic.com/307yknc.jpg


normal bir ürünler tablomuz var...
CREATE TABLE `tblurun` (
  `urun_id` int(5) NOT NULL auto_increment,
  `urun_kategori_id` int(3) default NULL,
  `urun_ad` varchar(100) NOT NULL,
  PRIMARY KEY  (`urun_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=16;
INSERT INTO `tblurun` (`urun_id`, `urun_kategori_id`, `urun_ad`) VALUES
(1, 3, 'Ürün 01'),
(2, 3, 'Ürün 02'),
(3, 3, 'Ürün 03'),
(4, 4, 'Ürün 04'),
(5, 4, 'Ürün 05'),
(6, 5, 'Ürün 06'),
(7, 7, 'Ürün 07'),
(8, 7, 'Ürün 08'),
(9, 7, 'Ürün 09'),
(10, 7, 'Ürün 10'),
(11, 8, 'Ürün 11'),
(12, 8, 'Ürün 12'),
(13, 10, 'Ürün 13'),
(14, 11, 'Ürün 14'),
(15, 12, 'Ürün 15');


http://i55.tinypic.com/2agm4k0.jpg


şimdi buradan gelen verileri aşağıdaki formata getirmeye çalışıyorum Ancak başaramadım.
Konuyla ilgili fikir ve önerilerinize ihtiyacım var.

Beni bekleyen 2 sorun var.

1. Php ile kategoriler döngüsü içine <ul> <li> şeklinde list style taglarını yerleştirebilmek.
Şu şekilde bir sonuç yazması gerekir mevcut databasedeki kategori ve ürünler ile...
<ul>
 <li>Kategoriler 01
  <ul>
   <li>Kategoriler 01 A</li>
   <li>Kategoriler 01 B</li>
   <li>Kategoriler 01 C</li>
  </ul>
 </li>
 <li>Kategoriler 02
  <ul>
   <li>Kategoriler 02 A</li>
   <li>Kategoriler 02 B</li>
  </ul>
 </li>    
 <li>Kategoriler 03
  <ul>
   <li>Kategoriler 03 A</li>
   <li>Kategoriler 03 B</li>
   <li>Kategoriler 03 C</li>
  </ul>
 </li>
</ul>


http://i55.tinypic.com/11wfqk5.jpg

2. Php ile kategoriler döngüsü içine <ul> <li> şeklinde list style taglarını yerleştirdikten sonra o kategoriye ait ürün adlarını ekleyebilmek (1. sorun çözüldüğünde bu kısmı kolay...).
son hali şu şekil bir görüntü verir.
<ul>
 <li>Kategoriler 01
  <ul>
   <li>Kategoriler 01 A
    <ul>
         <li>Ürün 01</li>
         <li>Ürün 02</li>
         <li>Ürün 03</li>
    </ul>        
   </li>
   <li>Kategoriler 01 B
    <ul>
         <li>Ürün 04</li>
         <li>Ürün 05</li>
    </ul>        
   </li>
   <li>Kategoriler 01 C
    <ul>
         <li>Ürün 06</li>
    </ul>        
   </li>
  </ul>
 </li>
 <li>Kategoriler 02
  <ul>
   <li>Kategoriler 02 A
    <ul>
         <li>Ürün 07</li>
         <li>Ürün 08</li>
         <li>Ürün 09</li>
         <li>Ürün 10</li>
    </ul>        
   </li>
   <li>Kategoriler 02 B
    <ul>
         <li>Ürün 11</li>
         <li>Ürün 12</li>
    </ul>        
   </li>
  </ul>
 </li>
 <li>Kategoriler 03
  <ul>
   <li>Kategoriler 03 A
    <ul>
         <li>Ürün 13</li>
    </ul>        
   </li>
   <li>Kategoriler 03 B
    <ul>
         <li>Ürün 14</li>
    </ul>        
   </li>
   <li>Kategoriler 03 C
    <ul>
         <li>Ürün 15</li>
    </ul>        
   </li>
  </ul>
 </li>
</ul>


http://i51.tinypic.com/3ug53.jpg


<?php
require('inc_ust.php');

$sorgu = mysql_query("
SELECT
parent.kategori_id, parent.kategori_ad, parent.left, parent.right, parent.depth,
urun.urun_id, urun.urun_kategori_id, urun.urun_ad, COUNT(urun.urun_ad) AS urun_toplam
FROM tblkategori AS node,
tblkategori AS parent,
tblurun  AS urun
WHERE node.left BETWEEN parent.left AND parent.right
  AND node.kategori_id = urun.urun_kategori_id
GROUP BY parent.kategori_ad
ORDER BY parent.kategori_id;
");


echo "<ul>\n";
while ($row = mysql_fetch_array($sorgu)) {
 $kategori_id = $row["kategori_id"];
 $kategori_ad = $row["kategori_ad"];
 $left = $row["left"];  
 $right = $row["right"];  
 $depth = $row["depth"];  
 $urun_id = $row["urun_id"];
 $urun_kategori_id = $row["urun_kategori_id"];
 $urun_ad = $row["urun_ad"];
 $urun_toplam = $row["urun_toplam"];

if ($kategori_id != 1)  {
echo " <li><a href='id=$kategori_id' title='left degeri : $left - right degeri : $right - depth degeri : $depth'>$kategori_ad</a> [$urun_toplam adet ürün var]</li>\n";
}
}

echo "</ul>\n";
require('inc_alt.php');
?>


http://i51.tinypic.com/30kdmja.jpg


konuyla ilgili dosyalarıda en yalın halde hazırladım.
Bu da genel bir resim.

konuyla benzer örnek uygulama önerileride işimi kolaylaştırabilir.
+0
-0
Cevaba KatılıyorumKatılmıyorum
Cevap Yaz Yorum Yaz Arşivime Ekle Takip Et

Cevaplar

  • Frauzer adlı üyenin fotoğrafı
    12 yıl önce yazılmış
    40 cevap - 37 soru
    Anladığım kadarıyla
    Anakategori
    Altkategoriler
    Anakategori
    Altkategoriler
    .
    .
    şeklinde sıralamak istiyorsunuz.
    Öncelikle mysql kısmını geçiyorum.
    Yapmanız gereken
    anakategori.adı ona bağlı olan alt kategori şeklinde bir sorgu ile bu şekil bir sorgunuz olur
    Mesela

    Araba Mercedes
    Araba Bmw
    Bilgisayar Acer
    Bilgisayar Toshiba

    Siz bunları yazdırırken
    anakategori kısmını kontrol ettirmelisiniz
    Eğer önceki yazılan anakategori ile şuanki aynı ise sadece altkategori sütnunu yazdır.Ve sadece 1 kere anakategori yazdırılacak.
    Bunuda son yazılan anakategoriyi değişkene alarak denetliyebilirsiniz.
    İf değişken anakategoriye eşit ise sadece altkategori yazdır şeklinde.
    Umarım yardımcı olur kolay gelsin
  • 1
    Jumper adlı üyenin fotoğrafı
    12 yıl önce yazılmış
    4 cevap - 0 soru
    Merhaba aşağıdaki şekilde kategoriler listelenebiliyor. hatta alt kategori kademesi (depth) 2 den fazla olsa bile listelemeyi yapılabiliyor.

    gruplama yapıldığı için ürün isimlerinin hepsini bu listeye dahil edemezsiniz (veya ben bilmiyorum) ürün listesi için baska bir recordset daha oluşturarak döngü içerisinde her alt kategorinin ürünleri sorgulatabilirsiniz. bana en pratik yöntem bu gibi geliyor.

    right join ile kategori tablosu ve urun tablosu birleştirilmiş olsa belki tek sorguyla çözülebilir. fakat koddaki kontrol noktalarının çoğalması hata payını arttıracaktır. bence buna hiç gerek yok.

    <?php
    $sorgu = mysql_query("
    SELECT
    parent.kategori_id, parent.kategori_ad, parent.left, parent.right, parent.depth,
    urun.urun_id, urun.urun_kategori_id, urun.urun_ad, COUNT(urun.urun_ad) AS urun_toplam
    FROM tblkategori AS node,
    tblkategori AS parent,
    tblurun  AS urun
    WHERE node.left BETWEEN parent.left AND parent.right
      AND node.kategori_id = urun.urun_kategori_id
      GROUP BY parent.kategori_ad
      ORDER BY parent.kategori_id;
    ");
    
    
    echo "<ul>\n";
    $d1 = 1;
    while ($row = mysql_fetch_array($sorgu)) {
     $kategori_id = $row["kategori_id"];
     $kategori_ad = $row["kategori_ad"];
     $left = $row["left"];  
     $right = $row["right"];  
     $depth = $row["depth"];  
     $urun_id = $row["urun_id"];
     $urun_kategori_id = $row["urun_kategori_id"];
     $urun_ad = $row["urun_ad"];
     $urun_toplam = $row["urun_toplam"];
     $d2=$depth;
     
    	if ($d2 != 0) {
    
    		if ($d1==$d2) {
    			//echo " <li><a href='id=$kategori_id' title='left degeri : $left - right degeri : $right - depth degeri : $depth'>$kategori_ad</a> [$urun_toplam adet ürün var]</li>\n";
    			echo " <li><a href='id=$kategori_id' title='left degeri : $left - right degeri : $right - depth degeri : $depth'>$kategori_ad</a>\n";	
    		} else {
    			
    			if ($d1<=$d2) {
    				echo "<ul>\n";
    				//echo "<li><a href='id=$kategori_id' title='left degeri : $left - right degeri : $right - depth degeri : $depth'>$kategori_ad</a> [$urun_toplam adet ürün var]</li>\n";
    				echo "<li><a href='id=$kategori_id' title='left degeri : $left - right degeri : $right - depth degeri : $depth'>$kategori_ad</a>\n";
    			} else {
    				echo "</ul>\n";
    				//echo "<li><a href='id=$kategori_id' title='left degeri : $left - right degeri : $right - depth degeri : $depth'>$kategori_ad</a> [$urun_toplam adet ürün var]</li>\n";
    				echo "<li><a href='id=$kategori_id' title='left degeri : $left - right degeri : $right - depth degeri : $depth'>$kategori_ad</a>\n";
    				
    			}
    			$d1 = $d2;	
    		}
    	}
    }
    echo "</ul>\n";
    ?>