Çok Kademeli Kategori Sistemi (Multilevel Category System)

by admin on Eylül 22, 2010

Özellikle e ticaret ile uğraşan arkadaşlar yakından bilirler. Bu kategori mantığı eğer kötü kurulursa çok büyük sıkıntılar yaratabilir. Peki nasıl yapmalı? İşte bu bölümde bu konuyu anlatmaya çalışacağım?

Sınırsız alt kategori

Sınırsız alt kategori gibi bir sistem düşünüyorsak bu işi tek tabloda Parent- Child ilişkisine göre yapmamız mantıklı olacaktır.Tablomuzu şu şekilde tasarladığımızı düşünelim.

category_id, category_name,parent_category_id

burada belli olduğu gibi categoryid bir kategoriye ait id değerini, name o kategorinin adını, parentcategory_id ise o kategorinin ana hangi ana kategoriye ait olduğunu söyler.

Şu şekilde düşünebiliriz.Tabloların id değerleri 1 den başladığı için Ana kategoriler için parentcategoryid değerini 0 vermeliyiz ki parent_id si 0 dediğimiz zaman bize bütün ana kategoriler gelsin.

Bu mantık ile ilerlersek

id = 1, category_name = Araba, parent_category_id = 0

şeklinde bir kategori ekledim.Şimdi bunu dallandırıp iyice alt kategorilere ayırmaya geldi sıra.

id=2, category_name = BMW, parent_category_id = 1

şeklinde Araba -> BMW yi ekledim.Şimdi BMW altına model ekleyeceğim.

id=3, category_name = 3.18, parent_category_id = 2

Burada önemli noktalardan birisi eklediğim 3.18 modelinin parentcategoryid si 1 değil 2 olarak verdim çünkü 3.18 i arabalar altına değil BMW altına koymak istediğim için… Şimdi yapımız şu oldu

Araba->BMW->3.18 şeklinde oldu bunu istediğimiz kadar uzatabiliriz. İyi ama kod tarafında bunu nasıl bir ağaç yapısında oluşturabiliriz?

İşte tam bu sırada recursive dediğimiz yapı devreye giriyor.

Basit olarak şu yapıda oluşturabiliriz.

function buildTree($ar, $parent = 0)
{
    $op = array();
    foreach( $ar as $item )
    {
        if( $item['parent_category_id'] == $parent )
        {
            $op[$item['category_id']] = $item;
            $children =  buildTree( $ar, $item['category_id'] );
            if( $children )
            {
                $op[$item['category_id']]['children'] = $children;
            }
        }
    }
    return $op;
}

Yukarıdaki kod bloğu (PHP için :) ) bize diziyi bir ağaç yapısı şeklinde elde etmemizi sağlar. Diziyi yazdırmak için

function printTree($arr)
{
    foreach ($arr as $item)
    {
        echo "<li><span class='file'>" . $item['category_name'] . "</span>";
        if (!empty($item['children']))
        {

            echo "<ul><li><span>";
            printTree($item['children']);
            echo  "</span></li></ul>\n";

        }
        echo "</li>";
    }

şeklinde yazdırabiliriz.

Not: bununla beraber Jquery nin bir treeview eklentisini kullanabilir, çok daha hoş işler yapabilirsiniz.

Leave your comment

Required.

Required. Not published.

If you have one.