2010-10-16 3 views
2

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

Я ранее публиковал это, но я хотел перефразировать вопрос и включить некоторые обновления. Предыдущий вопрос можно увидеть здесь 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'); 
    } 
    } 
    } 
} 


} 

?> 

Вот index.ctp для моего класса Message

<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 опустошено.

Если я обновляю страницу в этот момент, появляется сообщение SECOND flash («Ajax request made»), и содержимое #message_board восстанавливается. Однако новое сообщение не было сохранено, его те же 2 сообщения от ранее.

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

ответ

2

Но не кажется, быть ответа ... и содержания #message_board является опустели.

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

Если у вас есть $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 не пуст, он, возможно, не прошел проверку, и поскольку ваша форма не отображает ошибки проверки; вы, возможно, никогда их не заметили. Один из способов узнать, прошел ли он проверку:

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

    if ($this->Message->validates()) { 
     debug('it validated logic'); 
    } else { 
     debug('didn't validate logic'); 
    } 
0

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

Controller добавить функцию

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'); 
        } 
       } 

      } 
     } 
} 

Heres мнение добавить форму:

<?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> 
0

Я пытался использовать тот же раствор, который вы использовали, но он не работает. 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> 

BTW, я начинаю надоедать отсутствия док в CakePHP и его, не efficacity реализовать задачу более сложной, чем просто размещение пост в блог.Так что спасибо за вашу помощь, прежде чем я начну разрушать свой компьютер;)

0

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

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

Смежные вопросы