在Symfony中,如何将“选定”类添加到导航中当前选定的页面?

时间:2010-03-24 15:26:36

标签: php symfony1

我的导航是在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”的最佳方法是什么?

4 个答案:

答案 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" }

愚蠢的解决方案,但很快,工作正常。