我知道如何使用HTML和CSS创建一个多级下拉菜单,这不是问题。但是,我需要一个简单的cms,最终用户很容易,完全没有技术技能,并且很容易为我创建网站。它也应该是轻量级的。
Concrete5是最终用户简易用户界面的一个很好的例子,直到它的最后版本。它现在太乱了。所以我无法找到一个,并开始创建自己的。
所以,我重新发明轮子(而且我已经完成了一半)来创建我自己的cms。但是,我遇到了一个我自己可以解决的问题,但我想确保一切都很快,并尽可能以最好的方式完成。
问题从这里开始。
如何设计我的数据库以允许下拉导航菜单?考虑到这些:
我的pages
表看起来像这样:
pID | pName | pIsChildTo
1 Front 0
2 Page2 0
3 SubTo2 2
正如你所看到的,我认为我可以列出当一个页面是另一个页面的子页面时,但是当我开始编写用于导航菜单创建的代码时,我意识到它并不是那样的简单。我不知道,当我在数据库中循环并创建一个子菜单时,我可以检查子页面(请注意我使用bootstrap进行导航)。
当然,如果我很懒,我可以在表格中添加一列,使其看起来像这样:
pID | pName | pIsChildTo | pHasChildren
1 Front 0 0
2 Page2 0 1
3 SubTo2 2 0
在创建导航时循环浏览导航时,我只需检查pIsChildTo
值,如果是1
,就可以执行此操作。
foreach($db->fetchAll() as $r){
if($r['pHasChildren'] != 0){ ?>
<!-- insert dropdown logic here -->
<?php }
else{ ?>
<li class=""><a href="?id=<?php echo $r['pID']; ?>"><?php echo $r['pName']; ?></a></li>
<?php }
}
但这似乎是肮脏的方式。我应该改变一下我的数据库设计,如果是的话,我还需要做什么?
答案 0 :(得分:0)
加长版:
你的数据库正确。但你可以解决你的需求,你需要知道一个声音是否有孩子? ok =)
假设您已获得此查询以获取所有菜单:
SELECT * FROM pages ORDER BY ....
你可以知道每个声音都是这样的:
SELECT p.*, (SELECT COUNT(*) FROM pages WHERE pIsChildTo = p.pID) as children FROM pages p
编辑: 没有实际需要,最好不要更改正在运行的数据库。很多人使用大量数据作为菜单,你也可以使用短数据下拉菜单,但你需要确切知道你想要的东西=)
EDIT2:
SELECT p.*, //Select all pages field
(SELECT COUNT(*) FROM pages WHERE pIsChildTo = p.pID) as children //This is a subquery
//i'm counting all the records that have the actual id on pIsChildTo field and putting the result
//into a field called children (you will find one for each row).
FROM pages p //p is a table alias.
如果我单独启动子查询,我将找到所有记录,其中示例2为“父”,即如果我们使用子查询,我们可以获得您所需要的东西。