Doğru Cevap
-
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şturmakCREATE 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
ö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 3911 yıl önce yazılmış 11 yıl önce güncellenmiş -
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.11 yıl önce yazılmış -
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ır11 yıl önce yazılmış -
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.11 yıl önce yazılmış
-
Cevaplar
-
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
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ı olarak11 yıl önce yazılmış -
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);
11 yıl önce yazılmış -
siyahbeyaz
kaynak : http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
Retrieving a Single Path basligi altında.11 yıl önce yazılmış -
zyber
o gösterdiğiniz nested set model yapıdır.11 yıl önce yazılmış -
zyber
hayali field(alan)ler yerine Alias ya da Takma Ad denilebilir.11 yıl önce yazılmış -
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...11 yıl önce yazılmış -
zyber
aslında onu yaptım, dediğiniz kodları merak ettim. Paylaşırsanız alternatif kodlar yazabilirim....11 yıl önce yazılmış
-