Sınırsız Kategori/Menu ÖNEMLİ

Merhabalar,

MVC'de sınırsız kategori/menü için şöyle bi mantık kurdum ne kadar doğrudur bilmiyorum. Yanlış veya daha iyisi varsa yardımcı olursanız çok sevinirim.
Öncelikler Model dosyamda 2 tane veri tabanı işlemi yapıyorum.
Birincisi Üst başlıkları çağırıyor, ikincisi ise alt başlıkları,
Çıktı verirken de aynı mantıkta 2 tane fonksiyon kullanıyorum.
Öncelikle model dosyam şöyle;
Burada üst başlıkların kaç tane alt kategorisi olduğunu grub by ile saydırıyorum ve bunu Count değerine aktarıyorum.

public function Menu($katid)
{
return $this->db->query("SELECT a.ID, a.baslik, a.modul, JBA.Count ,a.modul FROM `menu` a LEFT OUTER JOIN (SELECT katid, COUNT(*) AS Count FROM `menu` GROUP BY katid) JBA ON a.ID = JBA.katid WHERE a.katid=".$katid." and bolum IN ('menu','Kategori') Order by siraNO ASC")->results();

}
public function Alt_menu($katid)
{
return $this->db->query("SELECT a.ID, a.baslik, a.modul, JBA.Count FROM `menu` a LEFT OUTER JOIN (SELECT katid, COUNT(*) AS Count FROM `menu` GROUP BY katid) JBA ON a.ID = JBA.katid WHERE a.katid=".$katid." and bolum IN ('menu','Kategori') Order by siraNO asc")->results();
}


Bu sorguları kullanmak için controller dosyamda yukarıda belirttiğim gibi iki ayrı fonksiyonum var.Basitce anlatmak gerekirse 1. fonksiyon üst başlıkları 2. fonksiyon ise alt başlıkları oluşturuyor. Bu fonksiyonların içine model dosyamı load etmeme gerek yok çünkü ; Controller dosyamda kullandığım örneğin index methoddunda zaten model dosyamı dahil ediyorum.(Ne kadar doğru bilmiyorum).Burada sadece model dosyamda oluşturmuş olduğum sorguları kullanıyorum. Anasayfa diye bit model classım ve bu classın içinde Üst başlık sorgusu yapan Menu ve alt başlık sorgusu yapan alt_menu olmak üzere 2 adet metodum var.
Tekra hatırlatmakta fayda var mysql Count fonksiyonu ile hangi başlığın kaç tane alt başlığı olduğunu saydırıyorum.

public function menuolustur($katid,$seviye) {
$data["menu"] = $this->Anasayfa->Menu($katid);// katid ingilizcesi parent_id Bildiğiniz gibi 0'dan başlıyor ve model dosyamdaki Menu fonksiyonu öncelikle katidsi 0 olanları cagırıyor.Seviye ise bildiğiniz gibi kaç kere dönerse o kadar artıyor ve 1den başlatıyorum.
echo '<ul class="nav navbar-nav" data-hover="dropdown" data-animations="fadeInUp fadeInRight fadeInUp fadeInLeft" id="cssmenu">';
foreach ($data["menu"] as $schn) {
if ($schn->Count > 0) { //Burada Count 0 'dan buyukse li arasına altmenuolustur fonksiyonumu çağırıyorum.
echo '<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">'.stripslashes($schn->baslik).'<span class="caret"></span></a>';
$this->altmenuolustur($schn->ID,$seviye + 1);//1. parametre olarak üst başlığın id değerini gönderiyorum ve bu veritabanında bu id değerine göre diğer kayıtların sorgusunu yapıyorum
echo '</li>';
} elseif ($schn->Count == 0) { // Eğer count 0 ise Direk Üst başlık oluşturuyorum.
echo '<li class=""><a href="'.$schn->modul.'/'.$schn->ID.'/'.seo($schn->baslik).'">'.stripslashes($schn->baslik).'</a></li>';
} else;
}
echo '</ul>';
}
//Yukarıda açıklamasını yaptığım Menu Fonksiyonu ile hemen hemen aynı
public function altmenuolustur($katid,$seviye) {
$data["alt_menu"] = $this->Anasayfa->Alt_menu($katid);
echo '<ul class="dropdown-menu">';
foreach ($data["alt_menu"] as $schn) {
if ($schn->Count > 0) {
echo '<li class="dropdown"><a href="" class="dropdown-toggle">'.stripslashes($schn->baslik).'<span class="caret"></span></a>'.stripslashes($schn->baslik).'</li>';
$this->altmenuolustur($schn->ID,$seviye + 1);
echo "</li>";
} elseif ($schn->Count == 0) {
echo '<li><a href="'.$schn->modul.'/'.$schn->ID.'/'.seo($schn->baslik).'">'.stripslashes($schn->baslik).'</a></li>';
} else;
}
echo '</ul>';
}


Ve son olarak çıktı almak istediğimde view dosyamda menu olustur fonksiyonumu cagırarak çalıştırıyorum ve istediğim sonucu alıyorum.
 $this->menuolustur(0,1); 

Tablomda bu şekilde

CREATE TABLE `menu` (
`ID` int(11) NOT NULL,
`bolum` varchar(100) COLLATE utf8_turkish_ci NOT NULL,
`baslik` varchar(255) COLLATE utf8_turkish_ci NOT NULL,
`modul` varchar(50) COLLATE utf8_turkish_ci NOT NULL,
`katid` int(11) NOT NULL,
`siraNO` int(11) NOT NULL,
`durum` tinyint(1) NOT NULL DEFAULT '1',
`dil` varchar(10) COLLATE utf8_turkish_ci NOT NULL DEFAULT 'TR',
`tarih` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci;


Asıl merak ettiğim konu ise şu MVC'de bu işlemin daha basit bir yolu varmı yada daha iyi daha stabil çalışan bir şey yapabilir miyiz. Eğer bu işlemler doğru ise kullanmak isteyen arkadaşlarıma bi nebze yardımcı olduysam ne mutlu bana.

Hepinize şimdiden tek tek teşekkür ediyorum kolay gelsin.

Cevap Yazın


[code=php,css,sql]kod[/code] , [url=http:...com] , [img=imaj linki] , [color=renk_kodu]metin[/color]