Как использовать Js-> submit () в CakePHP? - PullRequest
4 голосов
/ 10 октября 2010

Я пытаюсь создать простую форму Ajax для доски объявлений в приложении CakePHP, но я не могу понять, как правильно использовать функцию Js-> submit () для отправки формы через Ajax.

Вот код формы в моем представлении:

<?php

 echo $this->Form->create('Message',array(
  'type' => 'post', 
  'action' => 'add',
  'onSubmit' => 'return false;'
 ));

 echo $this->Form->input('name', array('label' => 'From:'));
 echo $this->Form->input('text', array('label' => 'Message:'));

 echo $this->Js->submit('Post Your Message', array(
  'action' => 'add',
  'update' => '#message_board'
 ));

 echo $this->Form->end();

?>

<div id="message_board">
    ...
</div>

А вот действие контроллера:

function add() {
 $this->autoRender = false; 
 if($this->RequestHandler->isAjax()) {
     $this->layout = 'ajax'; //THIS LINE NEWLY ADDED
     if(!empty($this->data)) {
         if($this->Message->save($this->data)) {
             $this->Session->setFlash('Your Message has been posted');
         }
     }
 }
}

Как ни странно, что происходит, когда я отправляю формуточная копия формы и содержащая ее div дублируется ВНУТРИ div_board сообщения.Weird.

Очевидно, я что-то упускаю (или несколько вещей).Если у кого-то есть идея или кто-то знает хороший источник информации о том, как ее использовать, это будет очень цениться.

Спасибо.

ОБНОВЛЕНИЕ: Я попытался добавить новую строку $this->layout = 'ajax'; к контроллеру (см. выше), но это не имело никакого эффекта.Вот вывод jquery от CakePHP, который может рассказать кому-то, что происходит.

$(document).ready(function () {
    $("#submit-707957402").bind("click", function (event) {
        $.ajax({
            action:"add", 
            data:$("#submit-707957402").closest("form").serialize(), 
            dataType:"html", 
            success:function (data, textStatus) {
                $("#message_board").html(data);
            }, 
            type:"post", 
            url:"\/messages"
        });
        return false;
    });
});

Ответы [ 2 ]

5 голосов
/ 11 октября 2010

В результате загружается макет default.Вам придется изменить макет на ajax со следующей строкой:

$this->layout = 'ajax';

Вы вставляете эту строку в ваше isAjax() условие.

Также ваш массив optionsнеправильный формат.Клавиша action должна находиться внутри клавиши url.

$this->Js->submit('Post Your Message', array(
        'url' => array(
            'action' => 'add'
        ),
        'update' => '#message_board'
    )
);
0 голосов
/ 14 марта 2014

Я очень поздно на вечеринку!Но некоторое время назад, около 3 месяцев назад, я столкнулся с этой проблемой.И оказалось, что я не давал пользователю разрешение на доступ к этому действию.Решением было добавить некоторый код в AppController beforeFilter (), что-то вроде:

function beforeFilter(){
    $this->Auth->allow('my_actions_name');
}

Однако я не совсем уверен, почему он повторно отображает родительский div или иногда всю страницу, но я думаю,в том, что торт настроен так, что всякий раз, когда действие недоступно / разрешено, выполняется некоторая маршрутизация и, возможно, выполняется индекс или другие действия по умолчанию, что приводит к его отображению в вашем представлении ajax.

Если вы проверяете ответ на запрос на вкладке сети браузера (в chrome), становится очень ясно, что возвращаемый ответ - это тот же контент, который отображается.Тем не менее, я новичок, и ответ на этот вопрос основан на предположениях.

Если кто-нибудь может дать лучшее объяснение (пожалуйста, научите нас), я буду первым, кто скажет:)

До тех пор, Счастливое кодирование

...