php - 如何设置 codeigniter 多级菜单的样式?

标签 php css codeigniter

我想用 codeIgniter 创建一个多级菜单。

我的表结构是这样的:

id -- category -- parent_id

我在我的模型中使用这段代码:

function all_category_ordered($level = 0, $prefix = '<li>') {
    $rows = $this->db
        ->select('id,category,parent_id')
        ->where('parent_id', $level)
        ->order_by('id','asc')
        ->get('category')
        ->result();

    $category = null;

    if (count($rows) > 0) {

        foreach ($rows as $row) {
            $category .= $prefix . $row->category . "\n";
            // Append subcategories
            $category .= "</li>".$this->all_category_ordered($row->id, $prefix . '*') ;
        }
    }
    return $category;
}

它工作正常,代码的输出是这样的:

<li>menu 1</li>
<li>menu 2</li>
<li>menu 3</li>
<li>*submenu 1</li>
<li>menu 4</li>
<li>*submenu 2</li>

但我想将模型更改为输出 ulli 正确的顺序以正确设置样式。

首选顺序:

<ul>
<li>menu 1</li>
<li>menu 2</li>
<li>menu 3
<ul>
<li>*submenu 1</li>
</ul>
</li>
<li>menu 3
<ul>
<li>*submenu 1</li>
</ul>
</li>
</ul>

如有任何帮助,我们将不胜感激。

最佳答案

您正在使用递归函数 - 很好。您应该坚持使用这种方法,但您无法控制何时应该打开和关闭特定的 ul,而这正是缺少的。

下面你会发现我非常非常非常古老的废话,它应该给你一个关于在每个级别控制打开/关闭列表的过程的提示。

<?php

$query = mysql_query('SELECT menu.id, menu.id_parent, menu.link, menu.alt, library.title FROM library library, menu menu WHERE menu.link = library.id ORDER BY menu.level ASC');
while($row = mysql_fetch_array($query))
{

    $menu_array[] = array('id'=>$row['id'], 'id_parent'=>$row['id_parent'], 'link'=>$row['link'], 'alt'=>$row['alt'], 'title'=>$row['title']);
}

function menu($id) 
{   
    global $menu_array;

    $has_childs = false;
    $result = array();

    // nothing if empty
    if (empty($menu_array))
    {
        return;
    }

    foreach ($menu_array as $value)
    {
        if ($value['id_parent'] == $id)
        {
            $result[] = $value;
        }
    }

    foreach ($result as $value)
    {
        if ($has_childs === false)
        {
            $has_childs = true;

            if ($value['id_parent'] == 0)
            {
                echo ('<ul id="root">'); // root level
            }
            else
            {
                echo ('<ul>'); // sub levels
            }
        }

        echo ('<li><a href="#">'.$value['title'].'</a>');

        menu($value['id']);

        echo ('</li>');
    }

    if ($has_childs === true)
    {
        echo ('</ul>');
    }
}

menu(0);

再次调整。删除查询并将其替换为您的 CI 模型返回的内容。看看结构是否相似。这是你给你的示例函数 menu()

编辑:

这是数据库结构。

CREATE TABLE IF NOT EXISTS `menu` (
  `id` int(11) NOT NULL,
  `id_parent` int(11) NOT NULL DEFAULT '0',
  `link` int(11) NOT NULL DEFAULT '0',
  `level` int(11) NOT NULL DEFAULT '0',
  `alt` varchar(255) COLLATE utf8_polish_ci NOT NULL DEFAULT ''
) ENGINE=MyISAM AUTO_INCREMENT=74 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

--
-- Zrzut danych tabeli `menu`
--

INSERT INTO `menu` (`id`, `id_parent`, `link`, `level`, `alt`) VALUES
(66, 0, 197, 3, 'Strona główna'),
(3, 2, 199, 1, 'Kanał RSS'),
(4, 2, 200, 2, 'Archiwum newsów'),
(5, 0, 24, 6, 'Depeche Mode'),
(6, 5, 1, 1, 'Biografia grupy'),
(7, 10, 26, 1, 'Biografia'),
(8, 15, 94, 1, 'Biografia'),
(9, 19, 107, 1, 'Biografia'),
(10, 5, 25, 2, ''),
(11, 10, 27, 2, 'Albumy'),
(12, 10, 29, 3, 'Single'),
(13, 10, 30, 4, 'Video'),
(14, 10, 31, 5, 'Teksty'),
(15, 5, 93, 3, ''),
(16, 15, 95, 2, 'Albumy'),
(17, 15, 102, 3, 'Single'),
(18, 15, 103, 4, 'Teksty'),
(19, 5, 104, 4, ''),
(20, 19, 108, 2, 'Wytwórnia płytowa Toast Hawaii'),
(21, 19, 109, 3, 'Tost Hawajski'),
(22, 5, 105, 5, ''),
(23, 22, 111, 1, 'Biografia'),
(24, 22, 110, 2, 'Odejście z Depeche Mode'),
(26, 22, 221, 3, 'Albumy'),
(27, 22, 219, 4, 'Single'),
(28, 22, 220, 5, 'Teksty'),
(29, 5, 106, 6, ''),
(30, 29, 112, 1, 'Biografia'),
(31, 29, 113, 2, ''),
(32, 0, 55, 7, 'Dyskografia'),
(33, 32, 164, 1, 'Albumy'),
(34, 32, 165, 2, 'Single'),
(35, 32, 166, 3, 'Video'),
(36, 0, 17, 8, 'Teksty utworów'),
(37, 0, 53, 9, 'Trasy koncertowe'),
(38, 37, 76, 1, ''),
(39, 37, 77, 2, ''),
(40, 37, 78, 3, ''),
(41, 37, 79, 4, ''),
(42, 37, 80, 5, ''),
(43, 37, 81, 6, ''),
(44, 37, 82, 7, ''),
(45, 37, 83, 8, ''),
(46, 37, 84, 9, ''),
(47, 37, 85, 10, ''),
(48, 37, 86, 11, ''),
(49, 37, 87, 12, ''),
(50, 37, 88, 13, ''),
(51, 37, 89, 14, ''),
(52, 37, 90, 15, ''),
(53, 37, 91, 16, ''),
(54, 0, 201, 10, 'Ciekawostki'),
(55, 0, 202, 11, 'Fani'),
(56, 0, 203, 12, 'Forum'),
(57, 0, 42, 13, ''),
(58, 0, 196, 14, ''),
(59, 0, 41, 15, ''),
(60, 59, 204, 1, 'Kontakt'),
(61, 59, 277, 2, ''),
(62, 37, 282, 17, ''),
(63, 62, 280, 1, ''),
(67, 0, 198, 5, 'Aktualności'),
(68, 67, 199, 1, 'Kanał RSS'),
(69, 67, 200, 2, 'Archiwum newsów'),
(70, 62, 289, 2, ''),
(71, 55, 292, 1, ''),
(72, 56, 293, 1, '');

当然可以,请随意使用。 :) 就像我说的。这是非常旧的代码,但它可以正常工作。您可以看到准确粘贴的示例 here . Id 和 Id_parent - 这两个相互之间保持关系,将指向您的 href 的链接更改为您将放入 href 中的内容,级别是深度,而 alt 是菜单项的标题。所以你有一些东西要清理,但它会 100% 工作。在 CI 中创建一个 Controller ,将查询部分移动到模型中的新方法,然后就可以了。生成列表后,您可以在 View 中设置它的样式。 :)

关于php - 如何设置 codeigniter 多级菜单的样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31406358/

相关文章:

php - 如何从自定义路由的 Laravel 5.7 发送电子邮件验证电子邮件

C#加密到PHP解密

php - 如何在html上使用php数组变量输出一个ul列表?

javascript - CSS:子div重叠父

css - IE 和 Edge 中的文本区域边框

CodeIgniter 和 Doctrine 模型

android - Android 版 Firebase 云消息传递中的无效注册错误

javascript - 使用ajax通过javascript提示验证密码

php - 将数组从 Controller 传递到 codeigniter 中的模型

javascript - 如何在智能手机浏览器中获取表格 html 的全宽?