php嵌套集,在导航菜单中构建链接



我的数据库中有几个类别,我正在使用嵌套集模型进行检索,如下所示(括号中的数字表示深度):

新建(1)
-常规(2)
-控制台(2)

游戏(1)
-pc(2)
-模拟器(3)-ps3(2)

然后我有一个函数来处理多维数组并生成导航菜单

--模型
这将从数据库
返回以下数组

Array (
[0] => Array ( [name] => News [depth] => 1 ) 
[1] => Array ( [name] => General [depth] => 2 ) 
[2] => Array ( [name] => Console [depth] => 2 ) 
[4] => Array ( [name] => Games [depth] => 1 ) 
[5] => Array ( [name] => PC [depth] => 2 ) 
[6] => Array ( [name] => emulator [depth] => 3 ) 
[8] => Array ( [name] => ps3 [depth] => 2 ) 
) 

--控制器

public function index()
{
$navTree = $this->getNavTree(); //gets array from model
$createNavTree = $this->_renderTree($navTree); //pass array to function
$this->load->view('testnavigation.php', $createNavTree);
}

function _renderTree($tree){    
$current_depth = 0;
$counter = 0;
$result = '';
foreach($tree as $node){
$node_depth = $node['depth'];
$node_name = $node['name'];
$node_id = $node['categoryid'];
if($node_depth == $current_depth){
if($counter > 0) $result .= '</li>';            
}
elseif($node_depth > $current_depth){
$result .= $counter == 0 ? '<ul id="nav">' : '<ul>';
$current_depth = $current_depth + ($node_depth - $current_depth);
}
elseif($node_depth < $current_depth){
$result .= str_repeat('</li></ul>',$current_depth - $node_depth).'</li>';
$current_depth = $current_depth - ($current_depth - $node_depth);
}
$result .= '<li><a href="#">'.$node_name.'</a>';
++$counter;
}
$result .= str_repeat('</li></ul>',$node_depth).'</li>';
$result .= '</ul>';     
return $result;
}

--查看

echo $createNavTree;

列表是按正确的缩进顺序创建的,但我遇到的问题是为每个项目生成链接例如,模拟器的链接应该是mysite.com/games/pc/emulator

我将如何实现这一点,如有任何帮助,不胜感激,谢谢?

我会采取简单的方法,为每个级别构建一个缓存级别数组和以前计算的路径。当再次看到1的"基本级别"时,清除缓存,这样就不会有任何无效条目:

这个示例代码应该与您当前拥有的代码一起使用(只需将这个代码放在当前布局呈现代码的上方,并使用$path作为URL):

function _renderTree($tree) {
$depths = array();
foreach ($tree as $node) {
// build the current path
$path = (($node['depth'] > 1) ? $depths[$node['depth'] - 1] : '') . $node['name'];
// set the current path as the current depth's path (to be used for any deeper-nodes)
$depths[$node['depth']] = $path . '/';
... layout rendering code ...
}
}

它所做的是,如果当前路径的depth高于1(这意味着存在父级深度),它将采用父级的计算路径(父级的路径应该是完整路径,而不仅仅是父级的名称),然后将当前名称添加到其中-这将为您提供完整的嵌套路径。然后,它将生成的路径存储到$depths数组中(用当前深度索引),供任何子级使用。

在您的示例中,您指定希望Emulator的路径为mysite.com/games/pc/emulator,强调小写和域名。由于我们在路径中使用$node['name'],因此您需要使用strtolower():

$path = (($node['depth'] > 1) ? $depths[$node['depth'] - 1] : '') . strtolower($node['name']);

我建议在<a></a>标签的实际行中添加域名:

$result .= '<li><a href="http://mysite.com/' . $path . '">'.$node_name.'</a>';

相关内容

  • 没有找到相关文章

最新更新