使用JQuery + JSON + Symfony使用HTML更新页面元素

时间:2011-03-02 10:14:54

标签: jquery ajax symfony1

我正在尝试使用从symfony partial生成的HTML更新DOM元素。我正在使用Symfony 1.3.8

这是(简化的)Symfony / PHP部分:

public function executeFoobar(sfWebRequest $request)
{
   $results = $this->renderPartial('foo/bar');
   $this->getResponse()->setContentType('text/json');
   return $this->renderText(json_encode(array('data' => $results)));
}

这是(简化的)HTML / jQuery部分

<html>
<head><script type="text/javascript" src="/js/jquery.js"></script>
<body>
<a id='foo' href='#'>Click foo</a>
<div id="sink"></div>
</body>
<script type="text/javascript">
$(document).ready(function(){
   $('#foo).click(function(){
       $.ajax( {
         type: 'POST',
         url: '/ajax-example'
         dataType: 'json',
         success: function(result){ $('#sink).val(result.data); }
         error: function(xhr, ajaxOptions, thrownError){ alert('Error: ' + thrownError); }
       });
   });
});
</script>
</html>

当我提交AJAX帖子时,html是在服务器端生成的,但是我在浏览器上收到错误消息:

 Error: Invalid JSON: <table>
       <tr><!-- Rest of generated HTML follows .... -->
        {"data": GENERATED_HTML }

其中GENERATED_HTML是在服务器端生成的HTML - 即:

 <table>
       <tr><!-- Rest of generated HTML follows .... -->

所以似乎HTML被包含两次或者什么。有没有人来过这个 - 我做错了什么?

3 个答案:

答案 0 :(得分:3)

renderPartial回显要显示的文字。您需要使用get_partial

中的PartialHelper
public function executeFoobar(sfWebRequest $request)
{
     $this->getContext()->getConfiguration()->loadHelpers('Partial');

     $results = get_partial('foo/bar');
     $this->getResponse()->setContentType('text/json');
     return $this->renderText(json_encode(array('data' => $results)));
}

这是loadHelpers的{​​{1}}我不记得我的头脑,对不起。

答案 1 :(得分:1)

虽然xzyfer的答案有效,但您应该尽量避免在操作中加载助手。它破坏了MVC。助手是视图级别,操作是控制器级别的。您可以使用操作和模板获得相同的结果。

<强>动作:

public function executeFoobar(sfWebRequest $request)
{
  $this->getResponse()->setContentType('text/json');
  $this->setLayout(false);
}

模板(foobarSuccess.php):

<?php echo json_encode(array('data' => get_partial('foo/bar')) ?>

注意:这假设PartialHelper是您的全局帮助者之一。大多数人都是这种情况,但如果情况并非如此,请在模板顶部添加use_helper()调用。

答案 2 :(得分:0)

这是xzyfer答案的缩短版本:

public function executeFoobar(sfWebRequest $request) {
   $results = $this->getPartial('foo/bar');
   $this->getResponse()->setContentType('text/json');
   return $this->renderText(json_encode(array('data' => $results)));
}