【问题标题】:Cakephp 2.0 - Dynamically populate selection box?Cakephp 2.0 - 动态填充选择框?
【发布时间】:2012-08-01 11:05:08
【问题描述】:

我有一个模型:类别。任何类别都可能有子类别。该模型使用树行为 (Cakephp 2.0)。我想创建一个带有两个选择框的表单。一个带有类别,另一个带有子类别。当我选择一个类别时,应根据我的选择动态填充包含子类别的框。例如,如果有体育、电影类别和子类别足球、篮球和喜剧、科幻,如果我在第一个框中选择电影,则第二个应该填充喜剧和科幻作为选项。四处搜索我找到了一个解决方案,但它不起作用。

解决办法是,表单中应该有一个脚本(Js),它观察第一个框的状态。当它发生变化时,它会从控制器调用一个函数,将结果呈现在一个元素中,该元素填充第二个框的选项。

所以我做了什么。

型号

<?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 是一个包含类别的变量。

问题是什么都没有发生。当我选择一个类别时,第二个选择框是空的。我已经包含了 Js 助手和 RequestHandler,当然我加载了 jquery 脚本,输出缓冲区(nappo 提醒我)我做错了什么?

【问题讨论】:

    标签: cakephp cakephp-2.0


    【解决方案1】:

    我发现了错误。它需要一个回声

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

    【讨论】:

    • 您也可以尝试使用writeBuffer,而不是在View文件末尾回显每个Js方法结果echo $this-&gt;Js-&gt;writeBuffer();
    猜你喜欢
    • 2016-10-16
    • 2019-07-13
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多