2010-03-03 2 views
1

Попытки интегрировать CakePHP и JQuery, используя следующий примерПопытка интегрировать 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>"; 
    } 
    } 


?> 

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

+0

Я еще не достаточно хорошо в Firebug чтобы предложить этот маршрут, но то, что я сделал бы, это разместить предупреждения в вашем коде, отображая каждое из значений в последовательности. Когда вы перемещаете предупреждение на каждую следующую следующую строку, вы будете знать, где выполняется выполнение (строка перед вашим предупреждением). Если все это, кажется, выполняется чисто, я бы использовал LiveHTTPHeaders (FF addon), чтобы узнать, действительно ли отправляется вызов ajax. –

+0

firebug не сложно, и с помощью console.log (// ваше сообщение здесь) вместо alert() намного удобнее –

ответ

0

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

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

+0

Да, идентификатор 2-го блока выбора: InvoiceClientBankId Кроме того, я отправляю как запрос: http: // localhost/myapp/invoices/listTitleByCategory/1 Для меня это похоже на то, что я не вызываю метод listTitleByCategory ... Может быть, есть проблема? – user198003

+0

Я проверил немного больше, и метод контроллера возвращает хорошие значения. Проблема в том, что переменные данные возвращают примечание (или какую-то ошибку?), Или я не знаю, как использовать значение, которое оно возвращает .... Пожалуйста, помогите: - ((( – user198003

+0

хм .. все выглядит ok. Что произойдет, если вы вызовете действие неаааксом (путем вызова localhost/myapp/invoices/listTitleByCategory/1)? Есть ли онлайн-демо? – harpax

0

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

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

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