Многоуровневое меню из базы данных в codeigniter
У меня есть таблица в моей базе данных, содержащая все мои категории базы данных, которые мне нужно преобразовать в многоуровневое меню. Структура таблицы ниже:
product_category_id | product_category_name | product_category_description | product_category_parent_id
--------------------------------------------------------------------------------------------------------
1 test ulghjbjjjh NULL
2 test2 yruktghkug NULL
3 test sub 1 yr5y346uij 1
4 test sub sub 1 yfghvbnhtd 3
Используя функции, которые я адаптировал из онлайн-урока ( здесь) и часы исследований, полученный код будет отображать только верхний уровень (те, у которых родительский идентификатор равен нулю). Я уверен, что это проблема с функцией sortMenu, однако я не могу решить ее.
Вот моя модельная функция, которая извлекает данные:
public function getProductCategories()
{
$query = $this->db->get("tbl_product_categories");
return $query->result_array();
}
Вот контроллер, который вызывает приватную функцию из индексной функции, которая, в свою очередь, вызывает приватную функцию create_list:
class products extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model("products_model");
}
public function index()
{
$categories = $this->products_model->getProductCategories();
echo $this->sortMenu($categories);
//print_r($this->products_model->getProductCategories());
}
private function sortMenu($items)
{
// create an array to hold the references
$refs = array();
// create and array to hold the list
$list = array();
// loop over the results
//while($data = @mysql_fetch_assoc($result))
foreach($items as $data)
{
// Assign by reference
$thisref = &$refs[ $data['product_category_id'] ];
// add the the menu parent
$thisref['product_category_id'] = $data['product_category_parent_id'];
$thisref['product_category_title'] = $data['product_category_title'];
// if there is no parent id
if (is_null($data['product_category_parent_id']))
{
$list[ $data['product_category_id'] ] = &$thisref;
}
else
{
$refs[ $data['product_category_id'] ]['children'][ $data['product_category_id'] ] = &$thisref;
}
}
print_r($list);
return $this->create_list($list);
}
/**
*
* Create a HTML list from an array
*
* @param array $arr
* @param string $list_type
* @return string
*
*/
private function create_list( $arr )
{
$html = "\n<ul>\n";
foreach ($arr as $key=>$v)
{
$html .= '<li>'.$v['product_category_title']."</li>\n";
if (array_key_exists('children', $v))
{
$html .= "<li>";
$html .= create_list($v['children']);
$html .= "</li>\n";
}
else{}
}
$html .= "</ul>\n";
return $html;
}
}
Это полностью сбило меня с толку: У кого-нибудь есть идеи?
1 ответ
Решение
Из того, что я понимаю,
Эта строка:
$refs[ $data['product_category_id'] ]['children'][ $data['product_category_id'] ] = &$thisref;
должно быть так:
$refs[ $data['product_category_parent_id'] ]['children'][ $data['product_category_id'] ] = &$thisref;