Laravel 4/Zurb基金会多级动态菜单
问题描述:
我想从数据库中创建一个多级菜单。在数据库中,我有这些collumns:'id','name','parent_id','url'。如果项目没有孩子,“PARENT_ID”设置为0Laravel 4/Zurb基金会多级动态菜单
我已经使用这个教程:Laravel 4 - Eloquent. Infinite children into usable array?,和它的伟大工程,这是结果:
- 首页
- 注册
- 你好
- 登录
- 呀
- 凡
- 是
- 我
- 心灵
的问题是:如何设置所需的类,用于Zurb基金会工作?在这种情况下,我只想看[Home],然后点击它[Register]并且[Login]应该出现,依此类推。
的最后一个功能,打印出HTML是这样的:
private function htmlFromArray($array) {
$html = '';
foreach($array as $k=>$v) {
$html .= "<ul>";
$html .= '<li><a href="#">'.$k."</a></li>";
if(count($v) > 0) {
$html .= $this->htmlFromArray($v);
}
$html .= "</ul>";
}
return $html;
}
这是下拉菜单从Zurb网站的例子:
<a href="#" data-dropdown="drop1">Has Dropdown</a>
<ul id="drop1" class="f-dropdown" data-dropdown-content>
<li><a href="#">This is a link</a></li>
<li><a href="#">This is another</a></li>
<li><a href="#">Yet another</a></li>
</ul>
所以我的HTML看起来应该像这个:
<a href="#" data-dropdown="drop1">Home</a>
<ul id="drop1" class="f-dropdown" data-dropdown-content>
<li><a href="#" data-dropdown="drop2">Register</a></li>
<ul id="drop1" class="f-dropdown" data-dropdown-content>
<li><a href="#">Hello</a></li>
</ul>
<li><a href="#" data-dropdown="drop3">Login</a></li>
<ul id="drop1" class="f-dropdown" data-dropdown-content>
<li><a href="#">Yeah</a></li>
<li><a href="#" data-dropdown="drop4">Where</a></li>
<ul id="drop1" class="f-dropdown" data-dropdown-content>
<li><a href="#">Is</a></li>
</ul>
</ul>
</ul>
而我不知道,如何实现这一点,所以任何帮助,将不胜感激。 或者如果有人有另一种创建动态,多级菜单的方式,请分享!
答
从我可以看到你的原始数组看起来是这样的:
$array = array(
'Home' => array(
'Register' => array(
'Hello' => array()
),
'Login' => array(
'Yeah' => array(),
'Where' => array(
'Is' => array(
'My' => array()
)
),
)
)
);
我选择来处理在一个单独的功能,顶级的链接,这些不会有UL /李包装。
function dropdownList($array) {
$html = "";
$dropDownId = 0;
foreach ($array as $k => $v) {
if(count($v) > 0) {
$hasChildren = true;
$dropDownId++;
} else {
$hasChildren = false;
}
$html = '<a href="#"' . ($hasChildren ? ' data-dropdown="drop' . $dropDownId . '"' : '') . '>' . $k . '</a>';
if($hasChildren) {
$html .= children($v, $dropDownId);
}
}
return $html;
}
function children($array, &$dropDownId) {
$html = '<ul id="drop' . $dropDownId . '" class="f-dropdown" data-dropdown-content>';
foreach($array as $k=>$v) {
if(count($v) > 0) {
$hasChildren = true;
$dropDownId++;
} else {
$hasChildren = false;
}
$html .= '<li><a href="#"' . ($hasChildren ? ' data-dropdown="drop' . $dropDownId . '"' : '') . '>'.$k."</a>\n";
if($hasChildren) {
$html .= children($v, $dropDownId);
}
$html .= '</li>';
}
$html .= "</ul>";
return $html;
}
输出:
echo dropdownList($array);
<a href="#" data-dropdown="drop1">Home</a>
<ul id="drop1" class="f-dropdown" data-dropdown-content>
<li>
<a href="#" data-dropdown="drop2">Register</a>
<ul id="drop2" class="f-dropdown" data-dropdown-content>
<li>
<a href="#">Hello</a>
</li>
</ul>
</li>
<li>
<a href="#" data-dropdown="drop3">Login</a>
<ul id="drop3" class="f-dropdown" data-dropdown-content>
<li>
<a href="#">Yeah</a>
</li>
<li>
<a href="#" data-dropdown="drop4">Where</a>
<ul id="drop4" class="f-dropdown" data-dropdown-content>
<li>
<a href="#" data-dropdown="drop5">Is</a>
<ul id="drop5" class="f-dropdown" data-dropdown-content>
<li>
<a href="#">My</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
即时猜测到你想有一个acutal链接,而不是#的筑巢的地方。这并不能解决这个问题,但你可以检查$ v是否是一个字符串,然后再检查它是否为儿童,并在这种情况下换出#在href中。
那个beeing说,你有没有考虑过在基础上使用顶栏菜单。它似乎更适合:) http://foundation.zurb.com/docs/components/topbar.html
我在Laravel有一套,所以让我知道你是否对这个解决方案感兴趣。