[Joomla 2.5]การทำ category แบบหลายชั้น


แชร์ ความรู้ในการ พัฒนา Joomla Component Extension Module Plugin

Moderators: mindphp, ผู้ดูแลกระดาน

User avatar
tsukasaz
PHP VIP Members
PHP VIP Members
Posts: 10606
Joined: 18/04/2012 9:39 am

[Joomla 2.5]การทำ category แบบหลายชั้น

Post by tsukasaz » 19/11/2012 10:46 am

การทำ category แบบหลายชั้น
[Joomla 2.5]การทำ category แบบหลายชั้น cat1.JPG
cat1.JPG (16.53 KiB) Viewed 255 times
การสร้างตาราง category แบบหลายชั้น ในฐานข้อมูล ฟิล์ดที่จำเป็นต้องมี ได้แก่
- id = ใช้เก็บค่า id ของ category
- parent_id = ใช้เก็บค่า id ที่เป็นแม่ของ category นี้
- level = ใช้เก็บระดับความลึกของ category บนสุดคือ 0
- lft = ใช้เก็บลำดับของ category ทางซ้าย
- rgt = ใช้เก็บลำดับของ category ทางขวา
- title= ชื่อของ category
ส่วนฟิล์ดอื่นๆ สามารถเพิ่มได้ตามความต้องการในการใช้งาน

หลังจากสร้างตารางเรียบร้อยแล้วให้เพิ่มข้อมูลเข้าไปเป็นตัวเริ่มในการนับค่า lft กับ rgt
- id = 0
- parent_id = 0
- level = 0
- lft = 0
- rgt = 1
- title= root
ซึ่งตัว root นี้ จะอยู่ level สูงที่สุด ค่า lft ของ root จะเป็น 0 เสมอ
แต่ค่า rgt จะเปลี่ยนไปเป็นค่าสุดท้ายของการเรียง lft กับ rgt

การเรียงค่า lft กับ rgt
กรณีที่อยู่ใน level ค่าจะเรียงตามภาพตัวอย่างด้านล่าง
[Joomla 2.5]การทำ category แบบหลายชั้น cat2.JPG
cat2.JPG (17.87 KiB) Viewed 255 times
กรณีที่อยู่คนละ level และมี parent_id ค่าจะเรียงตามภาพตัวอย่างด้านล่าง
SUB-REGIONS เป็น parent ค่า lft จะไม่ได้ถูกส่งไปทางซ้าย
แต่จะส่งไปยัง ค่า lft ของ sub category ซึ่งเมื่อถึงสิ้นสุด sub category
ค่า rgt จะถูกส่งขึ้นมายัง parent
[Joomla 2.5]การทำ category แบบหลายชั้น cat3.JPG
cat3.JPG (15.01 KiB) Viewed 255 times
The last bug isn't fixed until the last user is dead. (Sidney Markowitz, 1995)

User avatar
tsukasaz
PHP VIP Members
PHP VIP Members
Posts: 10606
Joined: 18/04/2012 9:39 am

Re: [Joomla 2.5]การทำ category แบบหลายชั้น

Post by tsukasaz » 19/11/2012 10:49 am

ต้วอย่างโค้ด

Code: Select all

function updateLftAndRgt($orderby = 'lft') {
        $db =JFactory::getDBO();
        
        $query = 'SELECT * FROM '.$db->nameQuote('#__acc_categories')
                .' WHERE '.$db->nameQuote('id').'>1'
                .' ORDER BY '.$orderby.' asc';
        $db->setQuery($query);
        $db->query();
        $fetch = $db->loadObjectList();
        
        $lft = 1;
        $rgt = 2;
        
        for($i = 0, $n = count($fetch); $i < $n; $i++) {
            $row = $fetch[$i];
            $query = 'UPDATE '.$db->nameQuote('#__acc_categories')
                    .' SET '.$db->nameQuote('lft').'='.$lft
                    .' , '.$db->nameQuote('rgt').'='.$rgt
                    .' WHERE '.$db->nameQuote('id').'='.$row->id;
            $db->setQuery($query);
            $db->query();
            $lft = $lft + 2;
            $rgt = $rgt + 2;   
        }
        
        $rgt = $rgt - 1;
        $query = 'UPDATE '.$db->nameQuote('#__acc_categories').' SET '.
                    $db->nameQuote('rgt').' = '.$db->Quote($rgt)
                    .' WHERE '.$db->nameQuote('id').'=1';
        $db->setQuery($query);
        $db->query();
        
        $query = 'SELECT MAX(level) AS max FROM '.$db->nameQuote('#__acc_categories');
        $db->setQuery($query);
        $db->query();
        $level = $db->loadObject();
        
        for($l = 1; $l <= $level->max; $l++) {
            $query = 'SELECT id FROM '.$db->nameQuote('#__acc_categories')
                    .' WHERE '.$db->nameQuote('level').'='.$l
                    .' ORDER BY lft asc';
            $db->setQuery($query);
            $db->query();
            $fetch = $db->loadAssocList(); 
            $arr = '';

            for($j = 0; $j < count($fetch); $j++) {
                $id = $fetch[$j]['id'];
                $arr_parent = '';
                $arr_parent[] = $id;
                $total = 0;
                for($i = ($l+1); $i <= $level->max; $i++) {
                    for($k = 0; $k < count($arr_parent); $k++) {
                        $query = 'SELECT id FROM '.$db->nameQuote('#__acc_categories')
                                .' WHERE '.$db->nameQuote('parent_id').'='.$arr_parent[$k]
                                .' ORDER BY lft asc';
                        $db->setQuery($query);
                        $db->query();
                        $rows = $db->loadAssocList();
                        $num = count($rows);
                        $total += $num;
                        $arr_child = '';
                        for($n = 0; $n < $num; $n++) {
                            $arr_child[] = $rows[$n]['id'];
                        }
                    }
                    if($arr_child == '') {
                        continue;
                    }
                    $arr_parent = $arr_child;
                }
                $arr[$id] = $total;
            }
 

Code: Select all

            $lft = 1;
            $rgt = 2;
            $parent_id = '';
            foreach ($arr as $key => $value) {
                if($l >= 2) {
                    $query = 'SELECT parent_id FROM '.$db->nameQuote('#__acc_categories')
                            .' WHERE '.$db->nameQuote('id').'='.$key;
                    $db->setQuery($query);
                    $db->query();
                    $row1 = $db->loadAssoc(); 
                    if($parent_id != $row1['parent_id']) {
                        $query = 'SELECT lft FROM '.$db->nameQuote('#__acc_categories')
                                .' WHERE '.$db->nameQuote('id').'='.$row1['parent_id'];
                        $db->setQuery($query);
                        $db->query();
                        $row2 = $db->loadAssoc(); 
                        $lft = $row2['lft'] + 1;
                        $rgt = $lft + 1;
                        $parent_id = $row1['parent_id'];
                    }
                }
                $rgt = $value != 0? $rgt + (2 * $value) : $rgt;
                $query = 'UPDATE '.$db->nameQuote('#__acc_categories')
                        .' SET '.$db->nameQuote('lft').'='.$lft
                        .' , '.$db->nameQuote('rgt').'='.$rgt
                        .' WHERE '.$db->nameQuote('id').'='.$key;
                $db->setQuery($query);
                $db->query();
                $lft = $rgt + 1;
                $rgt = $lft + 1;   
            }
        }
        $query = 'SELECT id FROM '.$db->nameQuote('#__acc_categories')
                .' WHERE '.$db->nameQuote('id').'>1'
                .' ORDER BY lft asc';
        $db->setQuery($query);
        $db->query();
        $rows = $db->loadAssocList();
        $loop = count($rows);
        for($i = 0; $i < $loop; $i++) {
            $id = $rows[$i]['id'];
            $j = $i + 1;
            $query = 'UPDATE '.$db->nameQuote('#__acc_categories')
                    .' SET '.$db->nameQuote('ordering').'='.$db->quote($j)
                    .' WHERE '.$db->nameQuote('id').'='.$db->quote($id);
            $db->setQuery($query);
            $db->query();
        }        
    } 
The last bug isn't fixed until the last user is dead. (Sidney Markowitz, 1995)

Post Reply

Return to “Joomla Developing Knowledge”

Users browsing this forum: No registered users and 4 guests