0

在一个视图中,我有一个 html 选择元素,例如

<select id="g" name="g" style="width: 160px; height: 26px; background-color: white; border: 2px solid silver; padding: 0px 4px 0px 4px; box-shadow: 4px #333333;">
    <option value="value1">Value1</option>
    <option value="value2">Value2</option>
    <option value="value3">Value3</option>
    <option value="value4">Value4</option>
</select>

在控制器中我有一个动作如下

    public function actionGetCategories($genre) {
    if(isset($genre)) {

        $c = new Category();            

        return CJSON::encode($c->findAll(array(
            'select'=>'category',
            'condition'=>'genre = \'' . $genre .'\''
        )));
    } else {
        return 0;
    }

所以,我希望当用户更改选择元素时,应用程序会自动更改另一个名为“c”的选择元素的元素列表。我试图通过以下 JS 代码来做到这一点:

    <script type="text/javascript">
    $(function () {
        $("#g").change(function () {
            var items = "<option>All categories</option>";
            var self = $(this);

            $.getJSON("<?php echo $this->createUrl('site/getcategories', array('genre'=>'value')) ?>", 
                function (data) {
                    $.each(data, function (index, item) {
                        items += "<option>" + item + "</option>";
                    });
                $("#c").html(items);
            });
        });
    });
    </script>

但不工作!我还尝试使用完整的根 URL 将 .getJSON url 参数更改为“http://localhost/project/index.php?r=site/getcategories&genre=value”,但没有。可以帮助别人吗?

谢谢。

4

1 回答 1

1

如果您使用 CActiveForm 小部件来构建表单或 CHtml 帮助程序,您可以在没有任何 javascript 代码的情况下执行此操作,请查看此示例:

echo $form->dropDownList($model, 'company_id', $model->getCompanyProjectOptions(),array('empty'=>'--select company--','ajax'=>array
                    (
                        'url' => CController::createUrl('/project/updateProjects'),   //only if you want an action here
                        'type' => 'get',
                        'data' =>  array('id' => 'js:$(this).val()'),
                        'update' => '#projects-list',   //or any other jQuery selector
                    )));

控制器中的 updateProjects 操作可以是这样的:

public function ActionUpdateProjects($id) {
        $model = new Project;
        $criteria = new CDbCriteria();
        $criteria -> addCondition('company_id=' . (int)$id);
        $criteria -> scopes = array('noRemove', 'noArchive');
        $criteria -> order = 'prj_nom';
        $data = Project::model() -> findAll($criteria);
        if (is_array($data) && !empty($data)) {
            echo CHtml::activeLabel($model, 'prj_parent_id');
            echo $data = CHtml::activeDropDownList($model, 'prj_parent_id', CHtml::listData($data, 'prj_id', 'prj_name'), array('empty' => '-- Select parent --'));
        }
    }

并且不要在 accessRule 函数中授予此操作权限。

http://www.yiiframework.com/wiki/24/

希望这可以帮助

于 2012-12-26T19:17:16.977 回答