Попытка интегрировать CakePHP и jQuery - PullRequest
1 голос
/ 03 марта 2010

Попытка интегрировать CakePHP и jQuery, используя следующий пример

http://bakery.cakephp.org/articles/view/dynamic-select-boxes-with-ajax-jquery

То, что я хочу, это когда пользователь изменяет первый элемент параметра, чтобы автоматически заполнять второе поле выбора соответствующими значениями. Но ничего не происходит, если вы можете мне помочь, почему.

Итак, есть форма добавления счета-фактуры (add.ctp) со следующим кодом ...

<?php echo $form->create('Invoice');?>

<?php echo $javascript->link('jquery.js'); 

$category = array('1' => 'First', '4' => 'Fourth', '7' => 'Seventh');
echo $form->input('client_id', array('options' => $category, 'empty' => 'Choose:'));
echo $form->select('clientBank_id', array("Choose category first"), null, null, false); 
?>


<script>
 $("#InvoiceClientId").change(function () {
    $.post('/invoices/listTitleByCategory/' + $(this).val(), function(data) {
        $("#InvoiceClientBankId").empty().append(data);
    }, 'html'); 
 })
</script>

Также есть контроллер (invoices_controller.php):

<?php
 var $name = 'Invoices';
 var $helpers = array('Html', 'Form', 'Time', 'Number', 'Javascript');
 var $paginate = array('order' => array('Invoice.pinned DESC', 'Invoice.invoiceNumber'));
 var $components = array('RequestHandler');

 function beforeRender(){
  // prevent useless warnings for Ajax
  if($this->RequestHandler->isAjax()){
   Configure::write('debug', 0);
  }
 } 

// etc...

  function listTitleByCategory($category = "") {
   $this->layout = 'ajax';
   $this->beforeRender();
   $this->autoRender = false;

   $data = $this->Invoice->Client->find('list');

   echo "<option value=0>just for testing...</option>";

   foreach($data as $key => $val) {
    echo "<option value=$key>$val</option>";
   }
  }


?>

Пожалуйста, если вы можете помочь мне решить эту проблему. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 02 апреля 2010

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

<?php
    $javascript->codeBlock('
        $(document).ready(function(){
            $("#InvoiceClientId").change(function () {
                // stuff
            });
        });
    ', array('inline'=>false'));
?>

(Я также позволил себе использовать помощник Javascript Cake для вывода вашего JS в <head>.)

0 голосов
/ 03 марта 2010

Вы уверены, что ваш второй выбор имеет идентификатор 'InvoiceClientBankId'?

Также, если вы используете firefox с firebug: вы получаете результат на вкладке сети?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...