Обновление элемента страницы с помощью HTML с использованием JQuery + JSON + Symfony - PullRequest
2 голосов
/ 02 марта 2011

Я пытаюсь обновить элемент DOM с помощью HTML, созданного из части Symfony. Я использую 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 ]

3 голосов
/ 02 марта 2011

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 из loadHelper Я не могу вспомнить с головы до головы, извините.

1 голос
/ 03 марта 2011

Пока работает ответ 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 голосов
/ 15 августа 2011

Это более короткая версия ответа xzyfer:

public function executeFoobar(sfWebRequest $request) {
   $results = $this->getPartial('foo/bar');
   $this->getResponse()->setContentType('text/json');
   return $this->renderText(json_encode(array('data' => $results)));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...