モデルがあります:カテゴリ。どのカテゴリにもサブカテゴリがある場合があります。このモデルはツリー ビヘイビア ( Cakephp 2.0 ) を使用します。選択ボックスが 2 つあるフォームを作成したいと思います。1 つはカテゴリ、もう 1 つはサブカテゴリです。1 つのカテゴリを選択すると、選択に応じてサブカテゴリのボックスが動的に入力されます。たとえば、スポーツ、映画のカテゴリと、サッカー、バスケットボール、コメディ、SF のサブカテゴリがある場合、最初のボックスで映画を選択すると、2 番目のボックスにはコメディとSFがオプションとして入力されます。周りを検索して解決策を見つけましたが、うまくいきません。
解決策は、最初のボックスのステータスを監視するスクリプト (Js) をフォームに含めることです。変更されると、コントローラーから関数を呼び出して、2 番目のボックスのオプションを設定する要素に結果をレンダリングします。
それで私がしたこと。
モデル
<?php
class Category extends AppModel {
var $name = 'Category';
var $actsAs = array('Tree');
}
?>
モデル フィールド: id、parent_id、lft、rght、name
コントローラ - メソッド
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()')
)
);
?>
$catsは、カテゴリを含む変数です。
問題は、何も起こらないことです。カテゴリを選択すると、2 番目の選択ボックスが空になります。私は Js ヘルパーと RequestHandler を含めました。もちろん、jquery スクリプトをロードしてバッファを出力します (nappo は私にそれを思い出させました) 私は何が間違っていますか?