[ weleb @ 08.06.2012. 16:23 ] @
Pozdrav ekipa,

Ovako imam sljedeći problem, radim jednu "aplikaciju" koja ima mogućnost ugnježđenih kategorija iliti djece i roditelja (više razinskih)...vidio sam da WP koristi za to parent element u bazi pa sma ga dodao i razumijem princip funkcioniranja ali ne kako to programski riješiti

npr
Kategorija A
- Kategorija A_1
-- Kategorija A_1_1

Tablice su:
category (id_kat, parent, naziv_kat)
post (id_pos, naziv_pos, kat_pos)

Moje pitanje je kako sada za jedan post (bilo što) ispisat sve razine kategorija?
[ uth0x000092 @ 10.06.2012. 10:54 ] @
Najbolje rješenje za taj problem je da koristiš takozvani "Nested Tree Model". Imaš prilično pojednostavljeno uputstvo ovdje.
[ vatri @ 17.06.2012. 10:14 ] @
Ja sam to rjesio tako sto sam napunio niz kategorija i dodao ovu funkciju:

Code:

private function build_tree()
    {
        $refs = array();
        $list = array();
        $arr = $this->categories;

        foreach($arr as $data)
        {
            $thisref = & $refs[ $data['id'] ];
             
            $thisref['parent_id'] = $data['parent_id'];
            $thisref['name'] = $data['name'];
             
            if ($data['parent_id'] == 0) {
                $list[ $data['id'] ] = &$thisref;
            } else {
                $refs[ $data['parent_id'] ]['children'][ $data['id'] ] = &$thisref;
            }
        }
        return $list;
    }


Zatim primjer upotrebe ovoga:

Code:

public function get_cat_options($selected_id = null)
    {
        $arrTree = $this->build_tree();
        $html = '<option value="">-----</option>';
        foreach($arrTree as $id => $data)
        {
            $html .= $this->print_option($id, $data, 0 , $selected_id );
        }
        return $html;
    }
    
    private function print_option($id , $data, $lvl , $selected_id = null )
    {
        $html = '<option value="' . $id . '" ' . ($selected_id==$id ? 'selected' : '') . '>' . str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;',$lvl ) . $data['name'] . '</option>';
        if( @count($data['children']))
        {
            foreach($data['children'] as $k => $v)
            {
                $html .= $this->print_option($k,$v,$lvl+1 , $selected_id);
            }
        }
        return $html;
    }