#php #ajax #cakephp #cakephp-1.3
#php #ajax #cakephp #cakephp-1.3
Вопрос:
Я часто использовал AJAX в PHP, но сейчас я пытаюсь изучить CakePHP, и мне не удалось найти ни одного хорошего / простого примера того, как использовать AJAX с CakePHP 1.3. Единственные примеры, которые я смог найти, предназначены для подкачки (не то, что мне нужно), или использовать устаревшие помощники, заставляя вас включать scriptaculous или prototype.
Есть ли какие-нибудь хорошие / простые примеры того, как использовать AJAX с CakePHP 1.3? Или это что-то, что кто-нибудь мог бы объяснить здесь?
Все, что я хочу сделать, это попросить пользователя щелкнуть ссылку, которая извлекает содержимое php-файла и вставляет его в div. Содержимое php-файла будет изменено на основе некоторых переменных POST или GET, отправленных с помощью вызова ajax. Кажется достаточно простым: (
Ответ №1:
Это шаблон, который я использую в CakePHP 1.3.x. Процесс, как правило,:
- Создание альтернативного json-ориентированного макета и файлов просмотра
- Определение, является ли входящий запрос AJAX
- Явный рендеринг альтернативного макета / представления в формате json вместо текста / html
Обязательно включите компонент RequestHandler и JsHelper в контроллер вашего приложения.
В данном контроллере:
function test() {
if($this->RequestHandler->isAjax()) {
$this->set('data', $this->data);
// Explicit call to render an ajax response, using a layout and view made specifically for ajax
$this->layout = 'json';
$this->render('ajax_test');
}
// else render views/controllername/test.ctp like normal
}
Ваше приложение / просмотры / макеты / файл json.ctp:
<?php
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
header('Content-Type: text/x-json');
header("X-JSON: ".$content_for_layout);
echo $content_for_layout;
?>
Ваш файл app / views / controllername / ajax_test.ctp должен содержать только:
<?php echo $js->object($data); ?>
Теперь, на вашей странице, которая на самом деле собирается выполнить вызов ajax, это может выглядеть примерно так, с кодом jQuery:
<div id='status'></div>
<?php echo $form->create('Test', array('id'=>'testForm')),
$form->input('message'),
$form->end();
?>
<script type='text/javascript'>
$('#testForm').submit(function(event) {
event.preventDefault(); // interrupt form submission
$.ajax({
type: "POST",
url: "/controllername/test",
data: $('#testForm').serialize(),
success: function(data, textStatus, xmlHttpRequest) {
$("#status").html(data.Test.message);
},
error: function(jqXHR, textStatus, errorThrown) {
alert("There was a problem processing the request: " jqXHR);
}
});
});
</script>
Комментарии:
1. Это то, что вы называете простым, а? 🙂 Я никогда не использовал JSON — просто надеялся на простой пример AJAX — даже если он может быть не самым идеальным. В этом примере — если бы я создал файл, содержащий мой динамический контент, который я хотел бы извлечь — как бы я его отобразил? Я не хочу менять весь макет — я просто хочу добавить содержимое в div, который уже существует на странице.
2. Приведенный выше код возвращает json, который может быть проанализирован вызывающим javascript на данной странице. json — это распространенный формат передачи для ajax, альтернативами которому являются необработанный html (не рекомендуется) и xml. Из вашего ответа звучит так, как будто вам не хватает базового понимания ajax в целом. Возможно, вам лучше ознакомиться с некоторыми базовыми руководствами по ajax и получить лучшее представление, прежде чем пытаться интегрировать ajax в ваше приложение Cake.
3. Хорошо — значит, игнорируя JSON vs HTML (я могу заглянуть в JSON как можно скорее) — ваш пример потребовал бы от меня переписать весь мой файл представления макета y / n? И если я проанализирую данные JSON — как я добавлю это в свой div? Опять же — возможно, я использую AJAX не лучшим образом — но это не должно переходить от возможности выполнять двухстрочный вызов jquery в обычном PHP к перезаписи целых страниц в Cake. Возможно, я предполагаю неправильно, но — jsut не думал, что cake усложнит выполнение обычного простого вызова AJAX.
4. Вы путаете то, что я предоставил выше, с рендерингом полной страницы. Это не влияет на ваши существующие представления и макеты. Приведенный выше код используется, когда вызов ajax выполняется только в вашем приложении Cake, поскольку вы не хотите отображать полную страницу и возвращать ее в этом случае. Вы хотите отправить что-то обратно, что JS может легко обработать. Я дополню приведенный выше пример тем, как может выглядеть javascript на вашей странице.
5. Очень хороший Тайлер. Просто хотел добавить / подтвердить, что вы должны работать с относительными ссылками.
url: "/controllername/test"
вероятно, можно было бы сгенерировать с помощьюHelper::url(array('controller' => 'controllername', 'action' => 'test'));
? Извините, если я ошибаюсь, я новичок в CakePHP. Тайлер, твой ответ был очень полезен. 1.
Ответ №2:
Вы можете проверить http://wakeusup.com/2011/06/kkajaxify-plugin-cakephp / для отличного плагина ajax
Ответ №3:
Обычно я включаю файл js в требуемый вид $this->Html->script('file', false);
. Затем в этом файле я выполняю все необходимые действия AJAX (создаю данные для отправки, отправляю их на другую страницу, возвращаю данные обратно и, наконец, показываю их в требуемом div).
Но имейте в виду, что файл, в который отправляются данные, должен быть относительно корневого каталога приложения. Это единственный способ заставить его работать ( $.get('/users/view/5');
— в jQuery)
Комментарии:
1. Итак, в основном вы используете AJAX обычно, без использования каких-либо специальных CakePHP-материалов?
2. Нет, совсем нет. Я использую Cake только для включения файла JS в представление. Таким образом, я могу кодировать на JavaScript, как делал раньше, что является, по крайней мере для меня, большим преимуществом, потому что мне не нужно изучать что-либо дополнительное из Cake, чтобы иметь возможность написать простой скрипт.