Sonsuz alt kategorilendirme özellikle E-Ticaret uygulamalarında lazım olabilecek bir yapıdır. Öyleki bir kategori başka bir kategorinin alt kategorisi ve başka kategoriler de bu kategorinin alt kategorileri olarak özyineli bir şekilde devam edebilmektedir. Örneğin bir giyim firması için e-ticaret uygulaması hazırladığımızı düşünelim ve şu şekilde bir yapılanma olması istensin:

Kadın
Erkek
        Ayakkabılar
        Kıyafetler
        Aksesuarlar
                Cüzdanlar
                       Deri cüzdanlar
                                ...
                                        ...
                                                ...
                       Süet cüzdanlar
Çocuk

Bu şekilde bir yapı tabiiki sonsuz değildir ancak bir kategorinin kaç alt kategorisi olduğu bilinemeyebilir. Yani uygulamanın ihtiyaç duyacağı maximum alt kategori sayısını belirleyerek gerekli algoritmayı pek tabii ki yazabiliriz ancak bazı durumlarda uygulamanın ihtiyaçları değişkenlik gösteriyor olabilir ve maximum alt kategori sayısı belirli olmayabiliyor. İşte bu sebeple ben bu tür sorunları alt kategorilendirmeyi sonsuz hale getirerek çözüme ulaştırmayı tercih ediyorum. Sonsuzdan kastımız sonsuza kadar ilerleyen bir yapı oluşturmak değil, sonsuzdan kastımız özyineli bir şekilde, ne kadar alt kategori varsa maximum alt kategori sayısını bilmeye gerek duymadan, verileri uygun bir ağaç yapısına getirerek kullanıcaya sunabilmek.

Not: Öncelikle ben bunu kendi yazmış olduğum Y-MVC ile gerçekleştirmeyi tercih ediyorum. Bu yüzden kodlardaki anlamadığınız değişkenler için Projelerimden Y-MVC projesini incelemenizi tavsiye ediyorum.

Öncelikle veritabanımızda alt kategorilendirme için tek bir tabloyu şu şekilde tutmak bizim için yeterli olacaktır. Burada gerekli olan şey her kategoriye ait bir id, ve top_id (ust kategorinin id'si).

id ad top_id
1 Erkek 0
2 Kadın 0
3 Çocuk 0
4 Elbiseler 2
5 Kırmızılar 4
. . .
. . .
. . .

Görüldüğü gibi Erkek ve Çocuk kategorilerinin alt kategorileri yok ancak Kadın kategorisinin alt kategorisi olan Elbiseler ve Elbiseler kategorisinin alt kategorisi olan Kırmızı kategorisi bulunmakta. Kırmızı kategorisinin de sayısını bilmediğimiz kadar alt kategorileri olabilirdi.

Biz bu tablonun bir ağaç yapısında olduğunu düşünerek prefix yöntemiyle gezerek kullanıcıya sunacağız. Bunun için bir fonksiyon oluşturup gerekli kodlarımızı yazalım

<?php

class categories {
    public $result ="";
    public function endless($model, $top_id) {
        $data = $model->select("categories", "*", "top_id = '$top_id'");
        // üst satırdaki kodun karşılığı: "SELECT * FROM categories WHERE top_id='$id'";

        if($data) {
            $this->result.="<ul>";
            foreach($data as $t) {
                $this->result .=  "<li>";
                $this->result .=  $t['ad'];
                $this->endless($model, $t['id']);
                $this->result .= "</li>";
            }
            $this->result .= "</ul>";
        }
        return $this->result;
    }
    // $model değişkeni veri tabanından veri çekmeyi sağlayan bir sınıftır.
    // Bu sınıfa Y-MVC projemen ulaşabilirsiniz.

    echo endless($model, 0);
    //Ya da sonucu bir controller üzerinden View aracılığıyla kullanıcıya sunabiliriz.
}

?>

Bu kodun HTML çıktısı aşağıdaki gibi olacaktır.


<ul>
    <li>Erkek</li>
    <li>Kadın
        <ul>
            <li>Elbiseler
                <ul>
                    <li>Kırmızılar</li>
                </ul>
            </li>
        </ul>
    </li>
    <li>Çocuk</li>
</ul>