Symfony:模板化,检查base.html.php是否已经扩展

时间:2014-08-29 12:56:05

标签: php ajax symfony templating

我有一个小问题。

我正在创建一个适用于ajax调用的Menu,它应该只替换特定的路径部分。

我的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() ?>

我的问题是,当我通过ajax调用加载新页面并替换contentWrapper时,它又将整个base.html.php再次放入我的contentWrapper。 问题是,我使用当前的方式,因为它也应该可以使用单个URL访问整个base.html.php的文件,而无需先点击。

有没有办法检查base.html.php是否已经展开? 或者是否有其他解决方案可以更轻松地解决我的问题?

1 个答案:

答案 0 :(得分:1)

您应该检查它是否是控制器中的ajax请求,然后有条件地延伸到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内容(这不是自你撤回无用内容以来最干净的方式)。假设您使用jQuery作为您的ajax请求:

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