2014-08-29 31 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');