Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 19 апр 2024, 04:04

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Древовидное меню в Kohana
СообщениеДобавлено: 11 июл 2012, 15:36 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 11 июн 2012, 12:31
Сообщения: 46
Подскажите, как реализовать динамическое древовидное меню с неограниченным количеством вложенностей.
У меня есть таблица с тремя полями:
| id | p_id | name_cat |
Насколько я понял, то это реализуется с одним запросом к БД
Вообщем, ломаю голову, все никак не могу сообразить. Дошел до того, что вывел все записи из БД и занес их в массив
Код:
public function action_index()
    {
   $categories = ORM::factory('categorie')
      ->find_all();
        $count = ORM::factory('categorie')
                ->count_all();
       
        /*Создаем многомерный массив с данными из БД для древовидного меню
         * $tree_menu = array(
         *      0 => array(
         *          'id' => 1,
         *          'p_id' => 0,
         *          'name_cat' => name
         *          ),
         *      1 => array(
         *          'id' => 2,
         *          'p_id' => 0,
         *          'name_cat' => name
         *          ),
         *      ...
         * )
         */
        $tree_menu = array();
        foreach($categories as $category)
        {
            $category_array = array(
                'id' => $category->id,
                'p_id' => $category->p_id,
                'name_cat' => $category->name_cat,
            );
            array_push($tree_menu, $category_array);
        }

        $this->template->tree_menu = $tree_menu;
    }

А вот как дальше выводить из этого массива, я что то не соображу...
Если есть какие то другие решения, то буду рад выслушать)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Древовидное меню в Kohana
СообщениеДобавлено: 11 июл 2012, 15:38 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 11 июн 2012, 12:31
Сообщения: 46
Вот получаемый мною массив
Код:
array(12) {
  [0]=>
  array(3) {
    ["id"]=>
    string(1) "1"
    ["p_id"]=>
    string(1) "0"
    ["name_cat"]=>
    string(21) "Уровень 1 №1"
  }
  [1]=>
  array(3) {
    ["id"]=>
    string(1) "2"
    ["p_id"]=>
    string(1) "0"
    ["name_cat"]=>
    string(21) "Уровень 1 №2"
  }
  [2]=>
  array(3) {
    ["id"]=>
    string(1) "3"
    ["p_id"]=>
    string(1) "0"
    ["name_cat"]=>
    string(21) "Уровень 1 №3"
  }
  [3]=>
  array(3) {
    ["id"]=>
    string(1) "4"
    ["p_id"]=>
    string(1) "0"
    ["name_cat"]=>
    string(21) "Уровень 1 №4"
  }
  [4]=>
  array(3) {
    ["id"]=>
    string(1) "5"
    ["p_id"]=>
    string(1) "1"
    ["name_cat"]=>
    string(40) "Уровень 2 Родитель 1 №1"
  }
  [5]=>
  array(3) {
    ["id"]=>
    string(1) "6"
    ["p_id"]=>
    string(1) "2"
    ["name_cat"]=>
    string(40) "Уровень 2 Родитель 2 №1"
  }
  [6]=>
  array(3) {
    ["id"]=>
    string(1) "7"
    ["p_id"]=>
    string(1) "1"
    ["name_cat"]=>
    string(40) "Уровень 2 Родитель 1 №2"
  }
  [7]=>
  array(3) {
    ["id"]=>
    string(1) "8"
    ["p_id"]=>
    string(1) "3"
    ["name_cat"]=>
    string(40) "Уровень 2 Родитель 3 №1"
  }
  [8]=>
  array(3) {
    ["id"]=>
    string(1) "9"
    ["p_id"]=>
    string(1) "5"
    ["name_cat"]=>
    string(41) "Уровень 3  Родитель 5 №1"
  }
  [9]=>
  array(3) {
    ["id"]=>
    string(2) "10"
    ["p_id"]=>
    string(1) "5"
    ["name_cat"]=>
    string(40) "Уровень 3 Родитель 5 №2"
  }
  [10]=>
  array(3) {
    ["id"]=>
    string(2) "11"
    ["p_id"]=>
    string(1) "0"
    ["name_cat"]=>
    string(21) "Уровень 1 №5"
  }
  [11]=>
  array(3) {
    ["id"]=>
    string(2) "12"
    ["p_id"]=>
    string(1) "3"
    ["name_cat"]=>
    string(40) "Уровень 2 Родитель 3 №2"
  }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Древовидное меню в Kohana
СообщениеДобавлено: 11 июл 2012, 17:03 
Не в сети
Зеленый
Аватара пользователя

Зарегистрирован: 11 июл 2012, 17:01
Сообщения: 2
Код:
function get_tree($tree, $pid)
{
    $html = '';
 
    foreach ($tree as $row)
    {
        if ($row['pid'] == $pid)
        {
            $html .= '<li>' . "\n";
            $html .= '    ' . $row['name'] . "\n";
            $html .= '    ' . get_tree($tree, $row['id']);
            $html .= '</li>' . "\n";
        }
    }
 
    return $html ? '<ul>' . $html . '</ul>' . "\n" : '';
}

$tree = array(
    array('name' => 'Уровень 1',     'id' => 1,  'pid' => 0),
    array('name' => 'Уровень 1.1',   'id' => 2,  'pid' => 1),
    array('name' => 'Уровень 1.2',   'id' => 3,  'pid' => 1),
    array('name' => 'Уровень 1.3',   'id' => 4,  'pid' => 1),
    array('name' => 'Уровень 2',     'id' => 5,  'pid' => 0),
    array('name' => 'Уровень 2.1',   'id' => 6,  'pid' => 5),
    array('name' => 'Уровень 2.2',   'id' => 7,  'pid' => 5),
    array('name' => 'Уровень 3',     'id' => 8,  'pid' => 0),
    array('name' => 'Уровень 3.1',   'id' => 9,  'pid' => 8),
    array('name' => 'Уровень 3.1.1', 'id' => 10, 'pid' => 9),
    array('name' => 'Уровень 3.1.2', 'id' => 11, 'pid' => 9),
);
 
echo get_tree($tree, 0);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Древовидное меню в Kohana
СообщениеДобавлено: 17 июл 2012, 14:44 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 11 июн 2012, 12:31
Сообщения: 46
Реализовал следующим образом
Код:
public function action_index()
    {
        $this->template->scripts = array(
         'media/js/jquery.js',
         'media/js/jquery.cookie.js',
                        'media/js/jquery.treeview.js',
   );
       
        $this->template->styles = array(
                        'media/css/style-admin.css',
                        'media/css/jquery.treeview.css',
   );
        $categories = ORM::factory('categorie')
      ->find_all();
        $count = ORM::factory('categorie')
                ->count_all();
       
        /*Создаем многомерный массив с данными из БД для древовидного меню
         * $tree_menu = array(
         *      0 => array(
         *          'id' => 1,
         *          'p_id' => 0,
         *          'name_cat' => name
         *          ),
         *      1 => array(
         *          'id' => 2,
         *          'p_id' => 0,
         *          'name_cat' => name
         *          ),
         *      ...
         * )
         */
       
        $tree = array();
        foreach($categories as $category)
        {
            $category_array = array(
                'id' => $category->id,
                'parent_id' => $category->p_id,
                'name' => $category->name_cat,
            );
            array_push($tree, $category_array);
        }
       
        $tree_real = $this->array2tree($tree, 0);
       
        $content = NULL;
   $content = View::factory('admin/a_categories/va_categories_index')
      ->bind('tree_real', $tree_real);
               
        // Выводим в шаблон
        $this->template->page_title = 'Продукты';
        $this->template->block_center = array($content);
       
    }
   
    /**
    * Converts an associative array into tree
    * @author Anton Makarenko php[at]ripfolio[dot]com
    * @copyright GPL
    *
    * @param array $source_arr
    * @param mixed $parent_id
    * @param string $key_children
    * @param string $key_id
    * @param string $key_parent_id
    * @return array $tree
    *
    * @example :
    * $source = array(
    *         array('id'=>1, 'parent_id'=>0, 'foo'=>'bar'),
    *         array('id'=>2, 'parent_id'=>1, 'foo'=>'barr'),
    *         array('id'=>3, 'parent_id'=>1, 'foo'=>'barrr')
    *         );
    * $tree = array2tree($source, 0);
    */
    public function array2tree($source_arr, $parent_id, $key_children='child_nodes', $key_id='id', $key_parent_id='parent_id')
    {
            $tree=array();
            if (empty($source_arr))
                    return $tree;
            $this->_array2treer($source_arr, $tree, $parent_id, $parent_id, $key_children, $key_id, $key_parent_id);
            return $tree;
    }
    /**
    * A private function. Background for array2tree. It is unnecessarily to use this function directly
    * @author Anton Makarenko php[at]ripfolio[dot]com
    * @copyright GPL
    *
    * @param array $source_arr
    * @param array &$_this
    * @param mixed $parent_id
    * @param mixed $_this_id
    * @param string $key_children
    * @param string $key_id
    * @param string $key_parent_id
    * @return null
    */
    public function _array2treer($source_arr, &$_this, $parent_id, $_this_id, $key_children, $key_id, $key_parent_id)
    {
            // populate current children
            foreach ($source_arr as $value)
                    if ($value[$key_parent_id]==$_this_id)
                            $_this[$key_children][$value[$key_id]]=$value;
            if (isset($_this[$key_children]))
            {
                    // populate children of the current children
                    foreach ($_this[$key_children] as $value)
                            $this->_array2treer($source_arr, $_this[$key_children][$value[$key_id]], $parent_id, $value[$key_id], $key_children, $key_id, $key_parent_id);
                    // make the tree root look pretty (more convenient to use such tree)
                    if ($_this_id==$parent_id)
                            $_this=$_this[$key_children];
            }
    }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Древовидное меню в Kohana
СообщениеДобавлено: 29 июл 2012, 07:20 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
demyan112rv писал(а):
Реализовал следующим образом


Иерархическое меню


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Древовидное меню в Kohana
СообщениеДобавлено: 29 июл 2012, 14:35 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 12 фев 2012, 01:02
Сообщения: 462
Sergey - вы кстати не проверяли, будет ли работать ваше меню, если категории и подкатегории будут идти не по порядку ? Что-то у меня на этот счет большие сомнения.

_________________
kohanaframework.su - обучение фреймворку Kohana


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Древовидное меню в Kohana
СообщениеДобавлено: 29 июл 2012, 14:53 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
admin писал(а):
Sergey - вы кстати не проверяли, будет ли работать ваше меню, если категории и подкатегории будут идти не по порядку ? Что-то у меня на этот счет большие сомнения.


Чорд побери :evil:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Древовидное меню в Kohana
СообщениеДобавлено: 29 июл 2012, 16:26 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
admin писал(а):
Sergey - вы кстати не проверяли, будет ли работать ваше меню, если категории и подкатегории будут идти не по порядку ? Что-то у меня на этот счет большие сомнения.


А вот и проверил! :P

Правда по началу и сам впал в сомнения как и вы, изменив произвольный ID на нечто большое.
Но потом вспомнил, что ID менять то надо не только в таблице categories, но и во всех связанных таблицах.

Всё работает как надо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Древовидное меню в Kohana
СообщениеДобавлено: 29 июл 2012, 17:01 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 12 фев 2012, 01:02
Сообщения: 462
Т.е. даже, если подкатегории идут "выше", чем их категории ?
Хотя в принципе при получении можно сортировать...

_________________
kohanaframework.su - обучение фреймворку Kohana


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Древовидное меню в Kohana
СообщениеДобавлено: 29 июл 2012, 17:45 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
admin писал(а):
Т.е. даже, если подкатегории идут "выше", чем их категории ?
Хотя в принципе при получении можно сортировать...


Признаюсь, сортировку таки добавил. На всякий случай


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group