Codeigniter 3 ile sınırsız kategori yapımı

By Admin
In BackEnd
01/Temmuz/2020
Okuma Süresi: 3 dk.

Merhaba sevgili okur. 

Codeigniter 3 ile sınırsız kategori nasıl yapılırın cevabını birçok youtube videosu ve blogta gördüm ama işin mantığını Bilal'e anlatır gibi anlatan bir içerik göremedim maalesef. Lafı uzatmadan başlamak istiyorum.


Öncelikle helper'da buildTree adında bir fonksiyon oluşturuyoruz;


function buildTree($elements, $ust_id = 0){
    $branch = array();
    foreach($elements as $element){ 
       if ($element->ust_id == $ust_id){
            $children = buildTree($elements, $element->id);
            if ($children){
                $element->children = $children;
            }else{
                $element->children = array();
            }
            $branch[] = $element; 
        }
    }
    return $branch;
    }

Kodları inceleyelim satır satır.


1- function buildTree($elements, $ust_id = 0){ //$elements bütün kategorileri yolladığımız parametre, $ust_id ise 0 olarak tanımlıyoruz.
2- $branch = array(); //burası çokomelli. $branch adında bir array oluşturuyoruz ve bir alttaki foreach içerisinde olup biten her şeyin sonunda $branch[] = $elements diyerek bu boş olarak oluşturduğumuz $branch dizisinin sonuna her seferinde bir element eklemiş oluyoruz. 
3- foreach($elements as $element){ //$elements verisi array içinde objelerden oluşuyor. $element ise haliyle sadece objelerden oluşuyo.
4- if ($element->ust_id == $ust_id){ //burada basit bir örnek üzerinden gidelim. Blogumda yer alan Backend üst kategorisinin ust_id değeri = 0. Bütün üst kategorilerimin de ust_id değeri 0 çünkü. Bu Backend kategorisinin id değeri ise 1. Ayrıca Backend'in 2 alt kategorisi var. Bunlardan biri PHP (id = 15, ust_id = 1), diğeri de Codeigniter (id = 16, ust_id = 1). Eğer Backend'in ust_id değeri 0 ise bu if'in içine girebiliyoruz, değilse direkt olarak foreach'ten gelen diğer elemente geçiyoruz. ust_id değerinin 0 olmasını yukarıda biz kendimiz söylemiştik. Geçelim aşağı...
5- $children = buildTree($elements, $element->id); //$elements az önce yukarıda aldığımızın aynısı yani bütün kategorileri alan bir dizi. $element->id ile Backend'in id değerini ust_id = 1 olarak alıp fonksiyonu aynı fonksiyon içinde bir kez daha çalıştırıyor. Biraz kafa karıştırıcı olabilir ama aslında çok basit. Şimdi fonksiyona baştan başlamış gibi ilerlemek zorundayız ama bu sefer ust_id değerimiz 0 değil, 1. Şu kısma tekrar geliyoruz. if ($element->ust_id == $ust_id){... burada yine ilk sırada olan Backend kategorisine bakıyor sistem. elementin ust_id değeri = 0, $ust_id değerimiz ise 1. Bu durumda Backend kategorisi ve onun gibi ust_id değeri 0 olanları if'in içine sokmuyor. ust_id değeri 1 olanlar girebiliyor if'in içine. E zaten onlar da Backend'in alt kategorileri oluyor. Toplamda alt ve üst olarak 100 tane kategoriden oluştuğunu düşünelim $elements'in. Bunlardan sadece 2 tanesinin ust_id'si 1. Onlar da PHP ve Codeigniter. foreach bu 2sine geldiğinde önce PHP'yi alıyor. $element->ust_id değerimiz = 1, $ust_id değerimiz de 1. Bu durumda PHP if'in içine girebiliyor. Aynı işlem bu sefer de PHP kategorisi için başlayacak ve buildTree içinde yine $elements'i ve $element_id'yi alacaz. $element_id bu sefer 15. Yani recursive yine çalışacak ve içinde ust_idsi 15 olan kategorileri bulmaya çalışacak. PHP kategorisinin bir alt kategorisi olmadığı için haliyle bulamayacak. Yani PHP için 100 elemanlı $elements dönüp duracak ama asla if'in içine giremeyecek. İşte buraya kadar hep ileri gittiğimiz yerden şimdi aynı şekilde geri geri çıkacaz. PHP için dönen 100 elemanlı foreach bittiği zaman burada bir akıl kayması oluyor ve sanki 14. satırdaki return $branch satırına geçip fonksiyonu bitirecekmişiz sanıyoruz. halbuki biz daha 5. satırdayız. PHP için o satır çalıştı bitti ve boş döndü, bir child bulamadı. 6. satırdan devam edelim PHP için ve bir children bulamadığı için burada else çalışır. yani boş bir array değeri alır $element->children. Burada $element için children diye bir attribute oluşturduk. Bir kategorinin alt kategorisi yoksa bu attr değeri boş bir array oluyor. Sonra $branch dizisinin sonuna $elementi komple ekliyoruz. Bu ne demek? PHP için konuşacak olursak foreach'ten gelen $element aslında içinde id, title gibi verilerin olduğu bir objedir. biz bu objeye children adında bir attr daha ekledik sadece. yani children boş olsa dahi $element boş değil. Özetle buradaki if'in içine giren her element burada $branch[] ile dizinin sonuna eklenir. Devam edelim... PHP bittikten sonra aynı işlemler Codeigniter için de tekrarlanır ve en sonunda biz yine hala 5. satırdayızdır. Çünkü üst kategorimiz olan Backend'e geri dönemedik hala. Hala foreachteki ilk eleman olan Backend'i inceliyoruz aslında. O yüzden onun altkategorileri bittikten sonra işlem yine 6. satırdan devam eder. Bu sefer children olduğu için 7. satır çalışır oradan return edilen değerler yani children attr'si boş olan PHP ve Codeigniter objelerinin eklendiği $branch değerini eşitleriz $element->children ile. Yani Backend üst kategorisinin içinde bir array açıp içine PHP ve Codeigniter objelerini ekledik özetle.  
6- if ($children){
7- $element->children = $children;
8- }else{
9- $element->children = array();
10- }
11- $branch[] = $element; //Bu satır en önemli satır diyebilirim.
12- }
13- }
14- return $branch;
15- }


Codeigniter 3'de Arama Sonuçlarının Pagination ile Gösterilmesi
Varlık bir nesnel gerçekliktir, bilinç onun öznel yansısıdır