2011-03-02 37 views
2

我想用symfony部分生成的HTML更新DOM元素。我使用的Symfony 1.3.8使用JQuery + JSON + Symfony更新HTML頁面元素

這裏是(簡化)的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

renderPartial回顯文字到屏幕。您需要使用get_partialPartialHelper

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))); 
} 

它要麼的loadHelperloadHelpers我不記得了。上面有我的頭,抱歉。

+0

現在你指出來。它的那麼明顯,以使我要掛我的恥辱頭;) – skyeagle 2011-03-02 10:58:57

+0

NP,我做我的最好幫助解決SO – xzyfer 2011-03-02 11:00:06

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()調用。

+0

@Iyoshenka上發佈的symfony問題:嗯。謝謝,這很有趣。我從來沒有真正想過這樣做。我必須承認,這比我目前正在做的更接近MVC的理想。感謝您的反饋意見。 – skyeagle 2011-03-03 11:10:34

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))); 
}