我有一个小问题。
我正在创建一个适用于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
是否已经展开?
或者是否有其他解决方案可以更轻松地解决我的问题?
答案 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');