2012-08-01 167 views
0

我有一個模型:分類。任何類別都可能有子類別。該模型使用樹行爲(Cakephp 2.0)。我想創建一個帶有兩個選擇框的表單。一個帶有類別,另一個帶有子類別。當我選擇一個類別時,應根據我的選擇動態填充包含子類別的框。例如,如果我在第一個框中選擇電影,體育,電影和子類別足球,籃球和喜劇,科幻類別,第二個應該充滿喜劇和科幻作爲選項。搜索我找到了一個解決方案,但它不起作用。Cakephp 2.0 - 動態填充選擇框?

解決方法是在窗體中應該是一個腳本(Js),它觀察第一個框的狀態。當它改變時,它從控制器調用一個函數,將結果渲染到填充第二個盒子選項的元素中。

所以我做了什麼。

型號

<?php 
class Category extends AppModel { 
var $name = 'Category'; 
var $actsAs = array('Tree'); 
} 
?> 

模型字段:ID,PARENT_ID,LFT,rght,名

控制器 - 法

function ajax_categories() { 

$this->set('options', 
    $this->Category->find('list', 
     array(
      'conditions' => array(
       'Category.parent_id' => $_GET['data']['Category']['id'] 
      ) 
     ) 
    ) 
); 


$this->render('/elements/ajax_dropdown', 'ajax'); 
} 

應該找到的所有記錄表作爲父親選擇的選項(這意味着它找到美食的子類別血淋淋的從第一個框選擇)

元(ajax_dropdown)

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

查看 - 表格

<?php 
$this->Html->script('prototype', array('inline' => false)); 
echo $this->Form->create('Category'); 

echo $this->Form>input('Category.id',array('id'=>'Category.id','label'=>'Parent', 
'empty' => '-- Pick a category --' ,'options' => $cats)); 

echo $this->Form->input('Subcategory',array('id' => 
'Subcategory','label'=>'Subcategory', 'empty' => '-- Pick a subcategory --')); 

echo $this->Form->input('name',array('label'=>'Name')); 

echo $this->Form->end('Add'); 

$this->Js->get('#Category.id')->event(
'change', $this->Js->request(
    array('controller'=>'categories','action'=>'ajax_categories'), 
    array('update' => '#Subcategory', 'dataExpression' => true, 'data' 
      => '$("#Category.id").serialize()') 
) 
); 
?> 

其中$貓是包含一類變種。

問題是沒有任何反應。當我選擇一個類別時,第二個選擇框是空的。我已經包含了Js helper和RequestHandler,當然我加載了jquery腳本,輸出緩衝區(nappo提醒了我)我做錯了什麼?

回答

0

我發現了錯誤。它需要一個呼應

echo $this->Js->get('#Category.id')->event(
'change', $this->Js->request(
array('controller'=>'categories','action'=>'ajax_categories'), 
array('update' => '#Subcategory', 'dataExpression' => true, 'data' 
     => '$("#Category.id").serialize()') 
) 
); 
+0

您也可以嘗試使用writeBuffer,而不是每相呼應的js方法結果'回聲$這個 - > Js-> writeBuffer();'中查看文件的末尾。 – xeranas 2012-08-02 03:48:52