【问题标题】:Action not running with CakePHP Js->submit()动作未与 CakePHP Js->submit() 一起运行
【发布时间】:2011-04-26 05:04:06
【问题描述】:

我正在使用 CakePHP 1.3,并尝试使用 ajax 制作一个简单的留言板。我正在尝试使用 Js 助手在索引页面上提交表单,然后刷新留言板的 div 以包含新消息。这一切都在一个页面上。

我之前已经发布过这个问题,但我想重新表述这个问题并包括一些更新。上一个问题可以看这里How to use Js->submit() in 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');
    }
   }
  }
 }


}

?>

这是我的 Message 类的 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>

单击提交按钮后,我可以在控制台中看到使用正确数据对http://localhost/messages/add 进行了 POST。但似乎没有回应。没有从控制器设置 Flash 消息“调用的添加操作”(或任何 Flash 消息,就此而言),并且 #message_board 的内容被清空。

如果此时我刷新页面,会出现第二条 flash 消息(“Ajax request made”),并恢复 #message_board 的内容。但是新消息没有保存,它与之前的 2 条消息相同。

我被难住了。我有一种感觉,也许有更大的问题导致我的问题,但我看不到它。任何帮助将不胜感激。

【问题讨论】:

    标签: ajax cakephp form-submit helper


    【解决方案1】:

    我知道这是一个老话题,但我在我的应用程序中偶然发现了同样的问题,所以现在我认为 Thrax 做错了什么,即他没有放

    echo $this->Js->writeBuffer(array('inline' => 'true'));
    在视图(或布局)文件中,就像 Logic Artist 所做的那样,所以脚本未生成处理提交按钮的点击。

    【讨论】:

      【解决方案2】:

      我尝试使用与您相同的解决方案,但它不起作用。直接在URL中访问Ajax就可以了,我的印象是点击什么也没做。当我使用

         <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 不是针对此代码部分的。 我确实在 webroot/view 文件夹中复制了 ajax 布局。

      我可以看到格式化源代码中显示的 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 中缺少文档以及它无法实现比仅在博客中发布帖子更复杂的任务。所以在我开始破坏我的电脑之前感谢你的帮助;)

      【讨论】:

        【解决方案3】:

        Ramon 的解决方案对我有用。这是更新后的代码。

        控制器添加功能

        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>
        

        【讨论】:

          【解决方案4】:

          但似乎没有 回应……和 #message_board 的内容是 清空。

          那是因为您还没有设置要渲染的动作/视图。您必须手动执行此操作,因为您已将 $this-&gt;autoRender 设置为 false。您可以使用render() 来执行此操作。更多信息可以在its respective cookbook page找到。

          如果您将$this-&gt;autoRender 设置为true,那么它会将#message_board 的内容替换为add.ctp 的内容


          Flash 消息“已调用添加操作” 不是从控制器(或任何 闪消息,就此而言)

          我认为您必须刷新页面或包含$this-&gt;Session-&gt;flash() 位的部分才能显示闪存消息。

          当您刷新页面时会出现 Flash 消息,这意味着它确实调用并运行了该操作。

          AFAIK,您只能从 Messages 数组中的 flash 键中放置/打印一条消息。 flash 键是默认存储 flash 消息的位置。每次调用 setFlash() 都会覆盖旧调用设置的 flash 消息。

          由于只显示了第二条 flash 消息,我们可以说它在第二次调用控制器中的 setFlash() 后未能通过至少一个条件。您可能希望将debug($this-&gt;data) 语句放在与$this-&gt;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');
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多