2014-08-29 66 views
0

我有一個小問題。Symfony:模板,檢查base.html.php是否已經擴展

我目前正在創建一個適用於ajax調用的菜單,並且應該只替換特定的路徑部分。

base.html.php是這樣的:

<html> 
    <head> 
    </head> 
    <body> 
    <nav> 
    </nav> 
    <div id="contentWrapper"> 
     <div id="sidebar"> 
     <?php if ($view['slots']->has('sidebar')): ?> 
      <?php $view['slots']->output('sidebar') ?> 
     <?php endif; ?> 
     </div> 
     <div id="content"> 
     <?php $view['slots']->output('content') ?> 
     </div> 
    </div> 
    </body> 
</html> 

我的網頁都建立這樣的:

<?php $view->extend('Bundle::base.html.php') ?> 
<?php $view['slots']->start('sidebar') ?> 
<ul> 
</ul> 
<?php $view['slots']->stop() ?> 
<?php $view['slots']->start('content') ?> 
    some content 
<?php $view['slots']->stop() ?> 

我的問題是現在,當IM加載通過AJAX調用一個新的頁面,並更換contentWrapper,它還把整個base.html.php放到我的contentWrapper中。 問題是,即時通訊使用當前的方式,因爲它也應該可以通過單個URL訪問整個base.html.php的文件,而無需先單擊。

有沒有辦法檢查base.html.php是否已經擴展? 還有另一種解決方案可以解決我的問題嗎?

回答

1

你應該檢查它是否在您的控制器的AJAX請求,然後conditionnally延長或不給base.html.php模板:

控制器:

public function someAction() 
{ 
    $request = $this->getRequest(); 

    // ... 
    return $this->render(
     'MyBundle:Controller:action.html.php', 
     array('isAjax' => $request->isXmlHttpRequest()) 
    ); 
} 

模板:

<?php 
if ($isAjax) { 
    $view->extend('Bundle::base.html.php'); 
} 
// ... 
?> 

或者您也可以直接在模板中查詢:

<?php 
if ($app->request->xmlHttpRequest) { 
    $view->extend('Bundle::base.html.php'); 
} 
// ... 
?> 

最後,您只能從響應中獲取所需的html內容(而不是您檢索無用內容後最乾淨的方式)。假設您爲您的ajax請求使用jQuery

$.get('/url', function(html){ 
    $('#contentWrapper').html($(html).find('#contentWrapper').html()); 
}); 
// or 
$('#contentWrapper').load('/url #contentWrapper');