2010-04-29 68 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(),但這是隻有我發現的方式。

相關問題