ЕСТЬ хорошие / простые примеры Ajax в Cake 1.3 без использования устаревших помощников?

#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. Процесс, как правило,:

  1. Создание альтернативного json-ориентированного макета и файлов просмотра
  2. Определение, является ли входящий запрос AJAX
  3. Явный рендеринг альтернативного макета / представления в формате 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, чтобы иметь возможность написать простой скрипт.