Php Sınırsız Kategori Fonksiyonları (Tek Sorgu Kullanarak)
Sınırsız kategori oldukça sıkıcıdır ve eğer hazır fonksiyonlarınız yok ise bazı durumlarda içinden çıkılmaz bir hal alır. Aşağıda sınırsız kategori mantığı ile temel işlemleri yapabileceğimiz fonksiyonları listeledim. Herkese iyi çalışmalar.
01. Sınırsız Kategori İçin Veritabanı Tablo Yapısı
Yukarıda resimde görüldüğü gibi tablomuzda bu üç sütun mutlaka olmak zorunda.
02. Sınırsız Kategorilerin Görünümü
Sınırısız kategori mantığı ile sıralanmış bir liste görüyoruz.
03. Kategoriler Listelemek (Hiyerarşi Sırası ile)
Bu fonksiyon sayesinde kategorilerimizin hiyerarşisini oluşturacağız. Fonksiyona $Kategori_Id değişkeni göndermezsek tüm kategorileri array() olarak döndürür. Eğer $Kategori_Id değerini gönderirsek sadece belirtilen $Kategori_Id’nin alt kategorilerini döndürmektedir.
function Kategori_List($Kategori_Id=0) { /* * Kategori Listesini Array olarak döndürür. * * Eğer $Kategori_Id SET edilmiş ise sadece o kategorinin alt kategorilerinin döndürür. * */ // Kategorilerin bulunduğu tablomuzdan tüm kayıtları alıyoruz. $request=mysql_query('SELECT kategori_id,kategori_adi,ust_kategori_id FROM ai_kategoriler ORDER BY kategori_adi ASC'); // $list değişkeninde sırayla tümkategoriler bulunuyor. $list=array(); while($row=mysql_fetch_assoc($request)){ $list[$row['kategori_id']]=$row; } mysql_free_result($request); // Şimdi sırayla eklenmişleri hiyerarşilenmiş bir biçimde $tree değişkenine vereceğiz. $tree = array(); // Her bir kategoriyi tek tek döndür... foreach ($list as $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['ust_kategori_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['ust_kategori_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']]); } } }
04. Kategori_List() Fonksiyonunun Çıktısı
Aşağıda gördüğünüz gibi kategori listemizi array() içinde topladık.
Array ( [2] => Array ( [kategori_id] => 2 [kategori_adi] => Telefon [ust_kategori_id] => 0 [sub_cats] => Array ( [5] => Array ( [kategori_id] => 5 [kategori_adi] => Galaxy S3 [ust_kategori_id] => 2 ) [6] => Array ( [kategori_id] => 6 [kategori_adi] => iPhone 5 [ust_kategori_id] => 2 ) ) ) [1] => Array ( [kategori_id] => 1 [kategori_adi] => Televizyon [ust_kategori_id] => 0 [sub_cats] => Array ( [7] => Array ( [kategori_id] => 7 [kategori_adi] => Crt Tv [ust_kategori_id] => 1 ) [3] => Array ( [kategori_id] => 3 [kategori_adi] => Led Tv [ust_kategori_id] => 1 ) [4] => Array ( [kategori_id] => 4 [kategori_adi] => Plazma [ust_kategori_id] => 1 ) ) ) [8] => Array ( [kategori_id] => 8 [kategori_adi] => Yazılım [ust_kategori_id] => 0 [sub_cats] => Array ( [9] => Array ( [kategori_id] => 9 [kategori_adi] => Windows 7 [ust_kategori_id] => 8 [sub_cats] => Array ( [11] => Array ( [kategori_id] => 11 [kategori_adi] => Windows 7 Home [ust_kategori_id] => 9 [sub_cats] => Array ( [12] => Array ( [kategori_id] => 12 [kategori_adi] => Windows 7 Home Alt [ust_kategori_id] => 11 [sub_cats] => Array ( [13] => Array ( [kategori_id] => 13 [kategori_adi] => Windows 7 Home Alt Alt [ust_kategori_id] => 12 ) ) ) ) ) ) ) ) ) )
05. Özel Sınırsız Kategori Fonksiyonları (Bir Kategorinin Tüm Alt Kategorilerinin Listesi)
Kategorilerin tüm alt kategorilerini bir array() listede toplayalım.
/* Alt Kategori ID lerinin Döndürüleceği Array */ $Alt_Kategori_Id_List=array(); function Alt_Kategori_List($tree,$saydir=1) { /* * Alt Kategorilerin ID Listesini Array() Olarak Döndürür */ global $Alt_Kategori_Id_List; foreach ($tree as $id => $item) { $Alt_Kategori_Id_List[]=$item['kategori_id']; if (!empty($item['sub_cats'])){ Alt_Kategori_List($item['sub_cats'],0); } } if ($saydir==1){ return $Alt_Kategori_Id_List; } } /* Kullanımı */ $haric_kategoriler=Alt_Kategori_List(Kategori_List($row->kategori_id)); Kategori_Select_Duzenle(Kategori_List(),$row->kategori_id,$row->ust_kategori_id,$haric_kategoriler,0,1);
05. Özel Sınırsız Kategori Fonksiyonları (Select Box)
Şimdi kategori listemizi <select ></select > içinde gösterelim.
function Kategori_Select($tree,$level=0){ /* * Sadece Yeni Kategori Ekleme Formunda kullanılan Select Box */ foreach ($tree as $id => $item) { echo '<option value="'.$id.'">'.str_repeat(' ', $level*7).$item['kategori_adi'].'</option>'; if (!empty($item['sub_cats'])){ Kategori_Select($item['sub_cats'],$level + 1); } } } // Kullanımı Kategori_Select(Kategori_List()); /* <option value="2">Telefon</option> <option value="5"> Galaxy S3</option> <option value="6"> iPhone 5</option> <option value="1">Televizyon</option> <option value="7"> Crt Tv</option> <option value="3"> Led Tv</option> <option value="4"> Plazma</option> <option value="8">Yazılım</option> <option value="9"> Windows 7</option> <option value="11"> Windows 7 Home</option> <option value="12"> Windows 7 Home Alt</option> <option value="13"> Windows 7 Home Alt Alt</option> */
06. Özel Sınırsız Kategori Fonksiyonları (Kategori Düzenle Select Box)
Kategori düzenleme en dikkat edilmesi gereken noktadır. Yanlış bir hareket ile tüm sistem içinden çıkılmaz bir hal alabilir. Düzenlenecek kategori kendisinin üst kategorisi olamaz. Kontrol mekanizmasında bunu belirtmeliyiz. Bir diğer nokta yine düzenlenecek kategorinin üst kategorisi alt kategorilerin de olamaz. Aşağıdaki örneğe göz atalım.
function Kategori_Select_Duzenle($tree,$Select_Kategori_Id,$Select_Kategori_Ust_Id,$Haric_Kategori,$level=0,$saydir=1){ /* 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){ echo '<option value="0" selected="selected">Bu Kategoriyi En Üst Kategori Yap</option>'; } foreach ($tree as $id => $item) { if ($Select_Kategori_Id==$id){ // Kategorinin Kendisi echo '<option value="'.$id.'" disabled="disabled">'.str_repeat(' ', $level*7).$item['kategori_adi'].'</option>'; }elseif (@in_array($id,$Haric_Kategori)){ // Kategorinin Alt Kategorileri echo '<option value="'.$id.'" disabled="disabled">'.str_repeat(' ', $level*7).$item['kategori_adi'].'</option>'; }elseif($Select_Kategori_Ust_Id==$id){ // Kategorinin Mevcut Ust Kategorisi echo '<option value="'.$id.'" selected="selected">'.str_repeat(' ', $level*7).$item['kategori_adi'].'</option>'; }else{ // Diğer Kategoriler echo '<option value="'.$id.'">'.str_repeat(' ', $level*7).$item['kategori_adi'].'</option>'; } if (!empty($item['sub_cats'])){ Kategori_Select_Duzenle($item['sub_cats'],$Select_Kategori_Id,$Select_Kategori_Ust_Id,$Haric_Kategori,$level + 1,0); } } } /* Kullanımı */ /* İlk Öncesi düzenlenecek kategorinin alt kategorilerinin listesini alalım... */ $haric_kat=Alt_Kategori_List(Kategori_List($row->kategori_id)); Kategori_Select_Duzenle(Kategori_List(),$row->kategori_id,$row->ust_kategori_id,$haric_kat,0,1);
Kafaları karıştıran sınırsız kategori mantığını kanımca anlatmaya çalıştım. Herkese iyi çalışmalar…
Alternatif Fonksiyonlar
07. Tek Fonksiyon ile Tüm Kategorileri Hiyerarşik Sıralamak
function SinirsizKategoriListele($kategoriArray , $ebeveyn = 0 , $kademe_pixel = 5 , $i = 0 , $menuler = NULL , $nested = FALSE ) { // Sayfalar Boşşa boş döndür. if( empty($kategoriArray) ){ return; } // Eğer fonksiyon içinden çağırılmıyorsa if( !$nested ){ // Sayfaları ebeveyn idsi ile yeni dizi oluştur foreach($kategoriArray as $row): $items[$row['ust_kategori_id']][]=$row; endforeach; }else{ // Nested ise gelen sayfaları al $items=$kategoriArray; } // Gelen sayfaları aç foreach( $items[$ebeveyn] as $sayfa ){ // Boşluk hesapla $bosluk=str_repeat(' ',($i * $kademe_pixel)); // Menuleri değişkene aktar $menuler .= '<li><a href="#">'.$sayfa['kategori_id'].' - '.$sayfa['kategori_adi'].'</a>'.PHP_EOL; // Açılan menude bir alt sayfa var ise nested çağır if(isset($items[$sayfa['kategori_id']])){ $menuler .= '<ul>'.PHP_EOL; $menuler=SinirsizKategoriListele($items,$sayfa['kategori_id'],$kademe_pixel,($i + 1),$menuler,TRUE); $menuler .= '</ul>'.PHP_EOL; } $menuler .= '</li>'.PHP_EOL; } // Oluşan menüleri return et return $menuler; }
07.01 Kategorileri Arrayda Toplamak
Öncelikle mysql_query() ile kategori listesimizi array()’da topluyoruz.
// Kategori Listesini Al $sql_kategori=mysql_query("SELECT * FROM ai_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]['ust_kategori_id']=$row_kategori->ust_kategori_id; $i++; }
07.02 SinirsizKategoriListele Fonksiyonunu Çalıştırıyoruz
SinirsizKategoriListele($kategori_list); fonksiyonunu çalıştırıyoruz.
07.03. Fonksiyon Çıktısı
08. Örnek Çalışma Dosyaları
- İndir – Kategoriye ait tüm alt kategorileri “href” özelliğinde toplamak
- İndir – Ana kategorilerin yan yana listelenerek, içinde alt kategorilerin hiyerarşik olarak gösterilmesi
Bu sayfa 25.664 kez görüntülendi.
Hi, thanks for sharing. I’m wondering if it’s OK to copy some of the text in my site?
OK. It’s not the problem. You can use it.
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.
Slm karton,
PHP kodlarını metin üzerinde direkt kopyala-yapıştır ile alabilirsiniz.
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.
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…
Güzel çalışma emeğinize sağlık. Bir kategoriyi tümalt kategorileri ile birlikte silmek için ne yapmalıyız.
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.
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 ?
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.
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
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).”;
?>
Edit:
Merhaba Kamil Bey,
Yorumun uzamaması için kodları aşağıdaki bağlantıda bulabilirsiniz.
https://ahmeti.com.tr/wp-content/uploads/2014/07/YanYanaKategoriListesi.rar
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.
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.
Bkz. https://ahmeti.com.tr/php-siniriz-kategori-fonksiyonlari-tek-sorgu-kullanarak/#comment-6506
Ç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…
Estağfurullah Hocam, ben çok bir şey yapmadım. Allah cümlemizden razı olsun. Hayırlı bayramlar, hoşçakalın…
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…
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.
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.
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);
?>
Süpersin kardeşim. Kodların süper yardımcı olacak bana
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..
mysql fonksiyonlarında tamam ama pdo kullanırken fonksiyon içinde sorgu yapamıyoruz. onu nasıl halledebilirim??
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?
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 [email protected] mail adresine gönderebilir misiniz?
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.
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.
Ü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.
Teşekkürler, verdiğiniz bilgileri bir projemde kullanacağım.. Allah razı olsun 🙂
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 ?
isteyene bunun asp ile çalışan şeklini verebilirim şuan üstünde çalıtığım sistem içerisinde mevcut yapılmış hali
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 ..
Merhaba Ahmet; çoklu kategori konusunda paylaşımın harika fakat ben bunu panelime uygulamakta baya zayıf kaldım. php ye yeni başladım ve kendi blogumu yapmaya çalışıyorum. Ancak yazımı ana ve alt kategorilerden oluşan birden fazla kategoriye eklemeye silmeye ve düzenlemeye ihtyarcım var. Bu konuda destek olabilir misin? Olursan böyle bir desteğin ücreti ne olur.
Saygılarımla,
Kod için teşekkürler, emeğine sağlık
Selam.Oncelikle islerinizde basarilar.Bi ricam olucakti sizden.Bir aydir ki,ariyordum ama sizin sitede buldum.Linkleri alt-alta acilir bir menude nasil ekleye bilirim ? Linkler bu
if ($number_21 != ‘x’)echo “» “.$number_21.”n”;
if ($number_22 != ‘x’)echo “» “.$number_22.”n”;
if ($number_23 != ‘x’)echo “» “.$number_23.”n”;
if ($number_24 != ‘x’)echo “» “.$number_24.”n”;
Nolursunuz yardimci olun.Ust menu konum site icin.
?php
include (“Connections/baglan.php”);
$sorgu=mysql_query(“SELECT * FROM projeler where resimid='”.$RESIMID.”‘ ORDER BY id ASC”);
$sayi=0;
while($yaz=mysql_fetch_assoc($sorgu))
{
if(($sayi != 0) AND ($sayi % 2) == 0) echo ”;
?>
<img class="img-ysm2" src="” >
<a href="” class=”fancybox”>
Büyütmek İçin Tıklayın
urun tablosu var birde resimler tablosu
urun tablosunda ki resimid resimler tablosundaki resimid ye eşit
urun resimid 1 ——- resimler resimid1 olan resimler listeleyecek
Mantıkları çok güzel, herşey düşünülerek anlatılmış. Özellikle düzenleme kısmındaki mantıklar çok güzel. Ama ben bu sistemi PDO ile düzenleyemedim ve bu konuda çok kişide bu sorunu yaşıyordur. Buradaki sistemi güncel bilginiz dahilinde güncellerseniz çok makbüle geçecek, çünkü bu konuda kaynaklar hep kısıtlı. Detaylı olarak siz ele almışsınız ama oda PDO değil. 🙁
Ahmet hocam bu sorgularda en alt kategoriyi nasıl öğrenebiliriz? Ürün eklerken en alt kategori hariç diğerleri disable olarak görünsün gibisinden birşey yapmak istiyorum.
Paylaşım çok güzel. Emeğinize sağlık. Bir noktada hatırlatma yapayım. Üst versiyon PHP kullanımında hata alan arkadaşlar. mysql_query kullanımını mysqli_query olarak değiştiriniz. Tüm mysql geçen bölümleri mysqli olarak çevirirseniz sorun ortadan kalkacaktır.
Tek sorguda listeleniyor mu yani
Merhaba, en baştaki kodu Codeigniter 4 e nasıl uyarlayabiliriz?
peki bu kategoriyi veri tabanında nasıl gösterecez
veri tabanındaki ismin->kategori->kstegorinin altına 3 tane kategori yapmak istiyorum bu mümkümmü