1

我已经在这个问题上工作了几天,但没有运气。我正在尝试在 CakePHP 2.0 中实现一个简单的 ajax 调用,它将根据另一个选择列表的选择填充一个选择列表。在我的数据库中,我有汽车品牌和车型。模型有一个 make_id 字段。当用户选择品牌时,我希望模型选择列表仅填充具有先前选择的 make_id 的模型。当我在 Firebug 中查看请求时,无论 make_id 是什么,它都会发回所有模型。我发现这个小教程试图解释如何根据另一个选择填充一个选择,但我仍然没有运气。 http://bakery.cakephp.org/articles/Calderoy/2011/01/18/how_to_create_an_observefield_equivalent_in_the_new_jshelper

这是我的 JsHelper 代码,在我的视图文件中找到:

$this->Js->get('#CarMakeId')->event(
'change',
$this->Js->request(
    array('controller' => 'CarModels', 'action' => 'get_model'),
        array(
            'async' => true, 
            'update' => '#CarCarModelId',
            'dataExpression' => true, 
            'method' => 'post', 
            'data' => $this->Js->serializeForm(array('isForm' => true, 'inline' => true))
        )
    )
);

这是我的控制器方法:

public function get_model() {   
        $models = $this->CarModel->find(
            'all', 
                array('conditions', 
                    array('CarModel.make_id' => $this->data['Car']['make_id'])
                )
            );
        $this->set('car_models', $models);
}

最后,这是我的 get_model 视图文件:

if($car_models) {
echo "<option value=''>-- Select --</option>\n";
foreach($car_models as $model) {
echo "<option value=".$model['CarModel']['id'].">".$model['CarModel']['name']."</option>\n";
}

}

这是通过 JsHelper 创建的 javascript:

<script type="text/javascript">
//<![CDATA[
$(document).ready(function () {$("#CarMakeId").bind("change", function (event)     {$.ajax({async:true, data:$("#CarMakeId").serialize(), dataType:"html", success:function (data, textStatus) {$("#CarCarModelId").html(data);}, type:"post", url:"\/Dropbox\/CartrackerV3\/CarModels\/get_model"});
return false;});});

//]]>

我在我的控制器中包含了 RequestHandler 助手。还值得注意的是,我收到了来自 ajax 调用的响应。在我选择了一个 make 之后,models 中的第一个选项从一个空白选项变为 -- Select -- 选项,它来自 get_model 视图文件,但是它仍然列出了数据库中的每个模型,而不仅仅是那些带有正确的make_id。

4

1 回答 1

1

根据 OP 的评论,这个问题只是一个语法问题 - 逗号在:

array('conditions', array('CarModel.make_id

应该是=>

array('conditions' => array('CarModel.make_id
于 2012-04-18T20:00:17.103 回答