2010-04-29 29 views
2

对于我的网站导航,我想指出当前页面。如果导航中的每个页面都有自己的路线,那么有办法查看当前请求是否与路线匹配?喜欢的东西:将路线与Symfony中的当前请求进行比较

$request->getRoute() == '@my_route'

,或者更一般地说,有没有在Symfony的创建网站导航时设置在活动页面的惯用方式是什么?

回答

5

或者更普遍的是,在Symfony中创建站点导航时,是否有一种设置活动页面的惯用方式?

请不要使用sfContext :: getInstance(),路由名称或内部uris。有几种方法可以实现导航菜单,Symfony的突出,personnaly我喜欢设置一个请求属性,像这样的(例如,在控制器):

<?php 
// ... 
    public function executeFoo(sfWebRequest $request) 
    { 
    $request->setAttribute('section', 'blah'); 
    } 
在你的模板

然后:

<ul> 
    <li class="<?php echo 'blah' === $sf_request->getAttribute('section') ? 'active' : '' ?>"> 
    <a href="<php echo url_for('@my_route') ?>">Blah</a> 
    </li> 
</ul> 

你甚至可以从你的路由在routing.yml文件中添加section参数:

my_route: 
    url: /foo 
    param: { module: foo, action: bar, section: blah } 

然后在你的模板,如果你这样做,小心地检查是否有热曲est参数代替属性:

<ul> 
    <li class="<?php echo 'blah' === $sf_request->getParameter('section') ? 'active' : '' ?>"> 
    <a href="<php echo url_for('@my_route') ?>">Blah</a> 
    </li> 
</ul> 

简单而高效,对不对?但是如果你需要更复杂的导航(尤其是嵌套菜单),你应该考虑使用一些更加全功能的插件或基于symfony的CMS,比如Sympal,Diem或者ApostropheCMS。

1

您可以尝试工作,执行以下操作:

In template: 
$route = $sf_context->getInstance()->getRouting()->getCurrentRouteName(); 

In action: 
$route = sfContext::getInstance()->getRouting()->getCurrentRouteName(); 

什么返回是因为你在路由已经定义了路由名称。例如,如果您有一个名为“@search_results”的路由规则,则上述方法将返回“search_results”。

也许有更好的方法,但我也用它来设置我的布局中的当前活动页面...如果当前路由名称匹配“xxx”,则向导航元素添加“selected”类。

0

我创建了一个帮手,把它添加到standard_helpers参数和我创建一个使用这个代替的link_to的导航链接:

function thu_menu($name, $uri, $options = array()) 
{ 
    return link_to_unless(strpos(sfContext::getInstance()->getRouting()->getCurrentInternalUri(true), $uri) !== false, $name, $uri, $options); 
} 

我不喜欢sfContext ::的getInstance(),但这是只有我发现的方式。

相关问题