2013-09-15 2 views
2

Я только что обновил до cakephp 2.4.1, поскольку теперь он поддерживает JsonP. Раньше я получал недостающую ошибку обратного вызова в моем кодовом коде ajax. Однако в документации не упоминаются какие-либо дополнительные шаги, необходимые для ее реализации, поэтому я подумал бы, что это нужно, но я получаю ту же ошибку, что и раньше.Как реализовать JsonP в cakephp 2.4

Нужен ли мне дополнительный кусок кода для отправки звонка обратно?

Моего контроллер

public function api($mem_id = null) { 
    $options = array(
     'fields' => array('Member.total_points'), 
     'conditions' => array('Member.member_no' => $mem_id), 
     'recursive' => -1 
    ); 
    $members = $this->Member->find('first', $options); 
    $this->set(array(
     'member' => $members, 
     '_serialize' => array('member') 
    )); 
} 

}

Ajax код

$('document').ready(function() { 
    $.ajax({ 
     url: 'http://mydomain.com/loyalty/members/api/5749.json', 
     dataType: 'jsonp', 
     success: function(response) { 
      console.log(resonse); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      console.log(errorThrown); 
     } 
    }); 
}); 
+1

Для всех, кто попадает на эту страницу, которая не имеет полного понимания того, как 'JSONP' работает с CakePHP, я написал [полный пример/ответ здесь] (http://stackoverflow.com/a/ 28963737/366529) – dKen

ответ

5

Она должна прекрасно работала с более старой версией торта тоже, так же, как я описал в вашем другом вопросе;)

В любом случае, посмотрите код в /lib/Cake/View/JsonView.php или в API documentation. Вы должны определить переменную вида с именем _jsonp, которая может быть либо строкой, определяющей имя переменной запроса, которая содержит имя функции обратного вызова, либо true, что означает, что просматривается переменная запроса по умолчанию с именем callback.

Итак, как JQuery использует запрос имя переменной callback по умолчанию, определяя true для _jsonp должны это сделать:

$this->set(array(
    'member' => $members, 
    '_serialize' => array('member'), 
    '_jsonp' => true 
)); 

В случае отсутствия переменной запроса имени callback не может быть найден в запросе URL (т.е. ?callback=whatever) , вместо этого вы получите обычный ответ JSON.

Смотрите также

+0

Огромное спасибо, я думал, что по умолчанию это было уже так. –

+0

Спасибо - кое-что, что мне не хватало, было расширение .json в URL-адресе моего вызова ajax. Без расширения .json я получал ошибку сервера. Не проведя большого расследования, я думаю, что это имеет какое-то отношение к значениям, переданным в заголовках/accept, если в URL не добавлено расширение. – Todd

-1

Если это просто не работает, попробуйте изменить значение $ jsonpParam от "обратного вызова" до "jsoncallback "(в lib/Cake/View/JsonView.php). Я должен был сделать это для того, чтобы он работал, потому что имя переменной в запросе jsonp равно jsoncallback, это содержит строку обратного вызова.

+0

Не изменяйте файлы в каталоге 'lib', которые не относятся к вам. Когда вы обновляете или восстанавливаете Cake или делитесь своим репо с кем-то другим, файлы, которые вы изменили, будут перезаписаны, и вы почти наверняка не помните, какие изменения вы внесли в них, чтобы заставить их работать.Я не уверен, что ваш подход к изменению 'callback' в' jsoncallback' правильный, но если вам нужно это сделать, расширьте класс Cake, который вы хотите изменить, и внесите изменения в свой класс. – dKen

Смежные вопросы