我的导航是在layout.php模板中编写的
看起来像这样:
<ul id="nav">
<li><a href="item1">Item 1</a></li>
<li><a href="item1">Item 2</a></li>
<li><a href="item1">Item 3</a></li>
<li><a href="item1">Item 4</a></li>
</ul>
在当前所选页面上获取class =“current”的最佳方法是什么?
答案 0 :(得分:2)
使用帮助器和/或部分生成菜单。因此,假设您在模块'default'中有一个部分_navigation.php:
// in layout:
<?php include_partial('default/navigation', array(
'navigation'=>$array,
'active'=>has_slot('navigationActiveUrl')
? get_slot('navigationActiveUrl')
: null)
); ?>
// in modules/default/templates/_navigation.php
<?php if(isset($navigation)): ?>
<ul>
<?php foreach($navigation as $name => $url): ?>
<?php echo content_tag('li', link_to($name, $url), array('class' =>
(isset($active) && $active == $url ? 'active' : null)
)); ?>
<?php endforeach; ?>
</ul>
<?php endif; ?>
// in some template file:
<?php slot('navigationActiveUrl'); ?>/internal/uri<?php end_slot(); ?>
如果你不需要修改它,你也可以使用帮助器并在那里硬编码html。使用partial只是简单地为您提供了一种更改标记而无需更改辅助函数的方法。同样聪明的你可以做一个辅助函数,但仍然会调用相同的部分。
答案 1 :(得分:2)
您应该考虑的另一种方法是尽可能使用JavaScript。我将使用jQuery
给出一个例子$('#nav li a').each(function(){
//You might have to do some string manipulation on the line below, but you get the idea
if($(this).attr('href') == window.location.pathname) { $(this).addClass('current'); };
});
我知道JS并不总是一个选项,但它的设计非常整齐和漂亮。 狂野猜测:你的其余PHP代码不会关心链接是否包含所选类,只有你的css或javascript代码才会。如果是这种情况,上述方法并不是一个糟糕的选择
答案 2 :(得分:1)
我采用更简单的方法(但可能需要更多资源):
<ul id="nav">
<li<?php echo ($this->getActionName('item1')) ? ' class="current"' : ''; ?>><a href="item1">Item 1</a></li>
<li<?php echo ($this->getActionName('item2')) ? ' class="current"' : ''; ?>><a href="item1">Item 2</a></li>
<li<?php echo ($this->getActionName('item3')) ? ' class="current"' : ''; ?>><a href="item1">Item 3</a></li>
<li<?php echo ($this->getActionName('item4')) ? ' class="current"' : ''; ?>><a href="item1">Item 4</a></li>
</ul>
答案 3 :(得分:0)
我始终使用slot()
和is_slot
将标签标记为已选中。
在我在模板中显示的每个页面上,我'标记'带有插槽名称
的插槽的页面/ projects - &gt; slot('toptabs')项目end_slot()和put
if get_slot('toptabs') == 'projects' { class="selected" }
愚蠢的解决方案,但很快,工作正常。