Действие не выполняется с CakePHP Js-> submit () - PullRequest
2 голосов
/ 16 октября 2010

Я использую CakePHP 1.3 и пытаюсь создать простую доску сообщений с помощью ajax.Я пытаюсь использовать помощник Js для отправки формы на страницу индекса, а затем обновить div доски объявлений, чтобы включить новое сообщение.Это все на одной странице.

Ранее я писал об этом, но я хотел перефразировать вопрос и включить некоторые обновления.Предыдущий вопрос можно увидеть здесь Как использовать Js-> submit () в CakePHP?

Когда я вернулся в этот проект через пару дней, я сразу же проверил, и форма сработала(вроде, как бы, что-то вроде).Отправка формы добавила сообщение в базу данных (оно не отображало сообщение, но я еще не атаковал эту часть).Сработало 2 раза, добавив 2 сообщения.Затем я открыл файл контроллера и закомментировал некоторый отладочный код, и он перестал работать.Похоже, действие не вызывается.

Вот мой messages_controller.php:

<?php

class MessagesController extends AppController {

 function index() {
  $messages = $this->Message->find('all');
  $this->set('messages',$messages);
 }

 function add() {

  $this->autoRender = false; 
  $this->Session->setFlash('Add action called');

  if($this->RequestHandler->isAjax()) {

   $this->Session->setFlash('Ajax request made');
   $this->layout = 'ajax';

   if(!empty($this->data)) {

    if($this->Message->save($this->data)) {

     $this->Session->setFlash('Your Message has been posted');
    }
   }
  }
 }


}

?>

Вот index.ctp для моего класса сообщений

<div id="guestbook" class="section_box">

 <h3  id="toggle_guestbook"><div class="toggle_arrow"></div>Sign our Guestbook</h3>

 <?php

 echo $this->Form->create('Message');
 echo $this->Form->input('name', array('label' => 'From:'));
 echo $this->Form->input('text', array('label' => 'Message:'));     
 echo $this->Js->submit('Post Your Message', array(
  'url' => array(
   'controller' => 'messages',
   'action' => 'add'
  ),
  'update' => '#message_board'
 ));
 echo $this->Form->end();

 echo $this->Js->writeBuffer(array('inline' => 'true')); 
 ?>

 <div id="message_board">

  <?php foreach($messages as $message) { ?>

   <div class="message">

    <p class="message_txt">
     <?php echo $message['Message']['text']; ?>
    </p>

    <div>

     <div class="message_name">
      <?php echo $message['Message']['name']; ?>
     </div>

     <div class="message_date">
      <small>
       <?php echo $message['Message']['date']; ?>
      </small>
     </div>

    </div>

   </div>

  <?php } ?>

 </div>

</div>

Когда нажата кнопка отправки, я вижу в консоли, что POST настроен на http://localhost/messages/add с правильными данными.Но, похоже, нет ответа.Флэш-сообщение «Добавить действие вызвано» НЕ устанавливается из контроллера (или любого из флеш-сообщений, в этом отношении), и содержимое #message_board очищается.

Если я обновлю страницу в этот момент,появляется ВТОРОЕ флэш-сообщение («Ajax request made»), и содержимое #message_board восстанавливается.Однако новое сообщение не было сохранено, это те же 2 сообщения, что и раньше.

Я в тупике.У меня есть чувство, может быть, есть более серьезные проблемы, вызывающие мою проблему, но я не вижу этого.Любая помощь будет оценена.

Ответы [ 4 ]

2 голосов
/ 16 октября 2010

Но, похоже, нет ответ ... и содержимое #message_board опорожняется.

Это потому, что вы не установили, какое действие / представление визуализировать. Вы должны сделать это вручную, так как $this->autoRender установлен на false. Вы можете использовать render() для этого. Больше информации можно найти на соответствующей странице кулинарной книги .

Если для $this->autoRender установлено значение true, то содержимое #message_board будет заменено содержимым add.ctp


Флэш-сообщение «Добавить действие называется» НЕ устанавливается с контроллера (или любого другого флэш-сообщений, в этом отношении)

Я думаю, вам нужно обновить страницу или часть, содержащую бит $this->Session->flash(), чтобы появлялись флеш-сообщения.

Тот факт, что при обновлении страницы появилось флэш-сообщение, означает, что он вызвал и выполнил действие.

AFAIK, вы можете поместить / напечатать только одно сообщение с флэш-ключа в массиве Messages. Клавиша флеш-памяти - это место, где флеш-сообщения хранятся по умолчанию. Каждый вызов setFlash() будет перезаписывать флэш-сообщение, установленное для более старых вызовов.

Поскольку отображалось только второе флэш-сообщение, мы могли бы сказать, что оно не прошло при прохождении хотя бы одного из условий после второго вызова setFlash() в контроллере. Возможно, вы захотите поставить операторы debug($this->data) рядом с условиями, относящимися к $this->data, чтобы помочь себе в отладке вашей проблемы.

Вы также можете использовать debug(), чтобы узнать, прошло ли ваше приложение определенное действие или путь, так как оно почти всегда будет отображаться.

Таким образом, вы можете сделать следующее, чтобы проверить, прошло ли это условие:

    if(!empty($this->data)) {
        debug('Passed!');

Если «Пройдено!» будет напечатан после отправки формы, мы будем знать, что он прошел это условие.


Однако новое сообщение не было сохранено

Это может быть из-за того, что $ data пуст или не прошел проверку. Если ваш $data не пустой, возможно, при проверке произошел сбой, и поскольку ваша форма не отображает ошибки проверки; Вы, возможно, никогда не заметили их. Один из способов узнать, прошел ли он проверку, заключается в следующем:

    $this->Message->set($this->data);

    if ($this->Message->validates()) {
        debug('it validated logic');
    } else {
        debug('didn't validate logic');
    }
0 голосов
/ 01 декабря 2012

Я знаю, что это старая тема, но я наткнулся на ту же проблему в моем приложении, поэтому теперь я думаю, что Thrax делал неправильно, а именно, он не поместил

echo $this->Js->writeBuffer(array('inline' => 'true'));
в файл представления (или в макет)Как и в случае с Logic Artist, сценарии для обработки нажатия кнопки отправки не были созданы.
0 голосов
/ 18 августа 2011

Я пытался использовать то же решение, что и вы, но оно не работает. С Ajax все в порядке, когда я обращаюсь к нему напрямую через URL, и у меня складывается впечатление, что клик ничего не делает. Когда я использую

   <fieldset><legend><?php __(' Run 1');?></legend>
<div id="formUpdateID"><div id="#error-message"></div>
<?php 
$orders=array_merge($emptyarray,$orders['r1']['Order']); 
   echo $this->Form->create('Order');
   echo $this->Form->input('id', array('value'=>$orders['id'],'type' =>'hidden'));
    echo $this->Form->input('race_id', array('value'=> $orders['race_id'],'type' =>'hidden'));
    echo $this->Form->input('driver_id', array('value'=>$session->read('Auth.User.driver_id'),'type' =>'hidden'));

    echo $this->Form->input('run', array('value'=>$run,'type' =>'hidden'));
    echo $this->Form->input('pm', array('value'=>$orders['pm'],'error'=>$err[$run]));
    echo $this->Form->input('pr', array('value'=>$orders['pr'],'error'=>$err[$run]));
    echo $this->Form->input('fuel', array('value'=>$orders['fuel'],'error'=>$err[$run]));
    echo $this->Form->input('pit', array('value'=>$orders['pit'],'label' => __('Pit on lap '),'error'=>$err[$run]));
    echo $this->Form->input('tyre_type', array('value'=>$orders['tyre_type'],'error'=>$err[$run]));
echo $this->Js->submit('Modify', array(
'url' => array(
    'controller' => 'orders',
    'action' => 'ajax_edit'
),
'update' => '#error_message'
));
echo $this->Form->end();

     ?>
     <?php pr($this->validationErrors); ?>
     </div></fieldset>

в поле зрения и в контроллере "заказов":

   function ajax_edit($id=null){

        $this->autoRender = false;

       if($this->RequestHandler->isAjax()) {
    die(debug('In Ajax'));

        $this->layout = 'ajax';

    debug('didn\'t validate logic');
    }
    echo 'hi';
}

Ни одно из сообщений не отображается.

У меня есть какой-то жестко закодированный JS / ajax, который раньше не предназначался для этой части кода. Я скопировал макет ajax в папку webroot / view.

Я вижу код AJAX, отображаемый в отформатированном исходном коде

<div class="submit"><input id="submit-1697561504" type="submit" value="Modify" /></div>     </form><script type="text/javascript"> 
//<![CDATA[
$(document).ready(function () {$("#submit-1697561504").bind("click", function (event)     {$.ajax({data:$("#submit-1697561504").closest("form").serialize(), dataType:"html",    success:function (data, textStatus) {$("#error_message").html(data);}, type:"post", url:"\/Webmastering\/form1C\/frame\/orders\/ajax_edit\/1"});
return false;});});
//]]>
</script>

Кстати, мне становится скучно из-за отсутствия документации в cakephp и ее неэффективности для выполнения более сложной задачи, чем просто публикация сообщения в блоге. Поэтому спасибо за вашу помощь, прежде чем я начну уничтожать мой компьютер;)

0 голосов
/ 19 октября 2010

Решения Рамона работали на меня. Вот обновленный код.

Функция добавления контроллера

function add() {

        $this->autoRender = false;  

        if($this->RequestHandler->isAjax()) {

            $this->layout = 'ajax';

            if(!empty($this->data)) {

                if ($this->Message->validates()) {

                    if($this->Message->save($this->data)) {

                         $this->render('/elements/message_board');
                    } else {

                      debug('didn\'t validate logic');
                    }
                }

            }
       }
}

Вот вид добавления формы:

<?php

echo $this->Form->create('Message');
echo $this->Form->input('name', array('label' => 'From:'));
echo $this->Form->input('text', array('label' => 'Message:'));                  
echo $this->Js->submit('Post Your Message', array(
    'url' => array(
        'controller' => 'messages',
        'action' => 'add'
    ),
    'update' => '#message_board'
));
echo $this->Form->end();

echo $this->Js->writeBuffer(array('inline' => 'true')); 
?>
<?php pr($this->validationErrors); ?>

<div id="message_board">

    <?php echo $this->element('message_board'); ?>

</div>
...