使用Yii不会更新下拉列表

时间:2014-11-13 08:38:42

标签: php jquery mysql yii

我正在使用

  

PHP语言,yii-1.1.13框架和MySQL DB。

在我的观点中,我有这段代码:

查看主页代码

/** Start Widget **/
    $this->beginWidget('zii.widgets.jui.CJuiDialog',array(
        'id'=>'dialog',
        'options' => array(
                'title' => 'Locations Management',
                'autoOpen' => false,
                'modal' => true,
                'resizable' => false,
                'dialogClass' => 'managelocation-dialog-class',
                'show'=>array(
                        'effect'=>'drop',
                        'duration'=>500,
                ),
                'hide'=>array(
                        'effect'=>'drop',
                        'duration'=>500,
                ),
        ),

    ));


    /**
     * Render dialog view.
     */
    echo $this->renderPartial('manageLocationDialog', array(
            'model' => $model,
            'locationInfo' => $locationInfo,
    ));


    $this->endWidget('zii.widgets.jui.CJuiDialog');


    /**
     * Filter Dialog widget
     */
    $this->beginWidget('zii.widgets.jui.CJuiDialog',array(
            'id'=>'filter-dialog',
            'options' => array(
                    'title' => 'Filter',
                    'autoOpen' => false,
                    'modal' => true,
                    'resizable' => false,
                    'width' => 350,
                    'dialogClass' => 'location-dialog-class',
                    'show'=>array(
                            'effect'=>'drop',
                            'duration'=>500,
                    ),
                    'hide'=>array(
                            'effect'=>'drop',
                            'duration'=>500,
                    ),
            ),

    ));

    /**
     * Render the filter dialog view.
    */
    echo $this->renderPartial('manageLocationFilter', array(
            'filterFormloc' => $filterFormloc,
            'locationInfo' => $locationInfo,
    ));

    $this->endWidget('zii.widgets.jui.CJuiDialog');?>

添加/编辑对话框的视图代码

  <div id="action-button-div" class="row">
        <?php
            echo CHtml::button('Create New', array(
                'id'=>'action-button',
                'class'=>'submit-button',
                'onclick'=>"{submitActionJs();}",
                'update' =>'#filter_province_name',
            ));
        ?>
        <?php
            echo CHtml::button('Cancel', array(
                'id'=>'cancel-button',
                'onclick'=>'{$("#dialog").dialog("close");}',
            ));
        ?>
    </div>

查看过滤器对话框代码

<div id="dialog-contents-container">
    <div class="row">
        <div id="filter-mode-div">
            <?php
                echo $form->labelEx($filterFormloc, 'filter_mode', array(
                    'label' => 'Filter Mode',
                ));
            ?>
            <div>
            <?php
                echo $form->radioButtonList($filterFormloc, 'filter_mode', array(
                    1=>'ON',2=>'OFF'),array('id'=>'filter_mode'
                ));
            ?>
            </div>
        </div>
        <div id="reset-button-div">
            <?php
                echo CHtml::button('Reset Settings', array(
                    'id'=>'reset-button',
                    'onclick'=>'{$(this.form).find("textarea, :text, select").val("").end().find(":checked").prop("checked", false);$("#ManageLocationFilterForm_filter_mode_1").attr("checked",true);}',
                ));
            ?>
        </div>
    </div>

    <div id="under-container">

        <div class="row">
            <div id="province_name">
                <?php
                    echo $form->labelEx($filterFormloc, 'province_name', array(
                        'label' => 'Province *',
                    ));
                ?>

                <div>
                <?php
                    echo $form->dropDownList($filterFormloc, 'province_name',
                        $locationInfo->getAllProvincesForSelection(true, 'Select Province'),
                        array(
                            'id' => 'filter_province_name',
                            'class' => 'selectbox',
                        )
                    );
                ?>
                </div>
            </div>
        </div>

    </div>


    <div id="action-button-div" class="row">
        <?php
            echo CHtml::button('Apply Filter Settings', array(
                'id'=>'action-button_2',
                'onclick'=>"{submitFilterActionJs();}"
            ));
        ?>
        <?php
            echo CHtml::button('Cancel', array(
                'id'=>'cancel-button_2',
                'onclick'=>'{$("#filter-dialog").dialog("close");}',
            ));
        ?>
    </div>

</div>

在我的控制器中,下面是我的代码:

public function actionRegisterLocation(){

    $model = new ManageLocationForm;
    if (isset($_POST['ManageLocationForm']))
    {

        $model->attributes = $_POST['ManageLocationForm'];

        if (Yii::app()->request->isAjaxRequest)
        {
            if ($model->hasErrors())
            {
                $errors = '';
                foreach ($model->getErrors() as $e) $errors .= implode($e).'<br>';
                echo CJSON::encode(array(
                        'status'=>'failure',
                        'messages'=>$errors
                ));
            }
            else
            {
                $locationInfo = new LocationInfo;
                if ($model->operation_mode === AdminGeneralHelper::OPERATION_MODE_UPDATE)
                {
                    $locationInfo=LocationInfo::model()->findByPk($model->location_id);
                }
                $locationInfo->short_name = $model->short_name;
                $locationInfo->town_name = $model->town_name;
                $locationInfo->province_name = $model->province_name;

                $locationInfo->save();

                if ($model->operation_mode === AdminGeneralHelper::OPERATION_MODE_CREATION)
                    $_message = 'Create operation completed.';
                if ($model->operation_mode === AdminGeneralHelper::OPERATION_MODE_UPDATE)
                    $_message = 'Update operation completed.';


                if ($locationInfo->hasErrors())
                {
                    $errors = '';
                    foreach ($locationInfo->getErrors() as $e) $errors .= implode($e).'<br>';
                    echo CJSON::encode(array(
                            'status'=>'failure',
                            'messages'=>$errors
                    ));
                }
                echo CJSON::encode(array(
                        'status' => 'success',
                        'messages' => $_message,
                ));
            }
            exit;
        }
    }
    else
    {
        echo "FALSE";
    }
    Yii::app()->end();
}

以下是情景:

  1. 我打开添加位置的对话框。 (参数为short_name,town和province)
  2. 位置已成功添加到网格视图和数据库中。
  3. 我打开过滤器对话框。它只能按省份过滤。
  4. 当我查看下拉列表时,已成功添加的位置不在列表中。
  5. 我的问题是在从“添加/编辑”对话框成功添加位置后,如何更新过滤器对话框的下拉列表。替代解决方案是我需要刷新浏览器然后打开过滤器对话框。但它不是用户友好的。它确实是一个错误。

2 个答案:

答案 0 :(得分:0)

updatereplace要求查询的响应为html(有关更多详细信息,请参阅CHtml::ajax()的来源)。您的查询返回json。您有几种选择:

  1. 您可以更改控制器,将下拉菜单的所有选项作为html返回,然后继续使用update
  2. 您可以更改控制器以将整个下拉列表作为html返回,并使用replace代替update
  3. 您可以更改控制器以返回新添加位置的ID和值,并使用自定义javascript函数将此选项添加到下拉列表中。

答案 1 :(得分:0)

我尝试了选项No.3及其工作。

以下是我的Javascript文件中的工作代码。

    function submitActionJs() {
    var fareCat = document.getElementById("name").value;
    var newFareCat = toTitleCase(fareCat);
    $.ajax({
        url: 'registerFareCategory',
        type: 'POST',
        datatype: 'json',
        data: $('form').serializeArray(),
        timeout: 10000,
        beforeSend: function(){
            $('#dialog-msg').html('Processing...');
        },
        success: function(data){
            var res = eval('(' + data + ')');
            $('#dialog-msg').html(res.messages);
            if (res.status == 'success'){
                $("#message-label").html(res.messages);
                $.fn.yiiGridView.update('fare-category-grid');
                $("#dialog").dialog("close");
                window.parent.$('#filter_name').append('<option value = "' + newFareCat +  '">' + newFareCat  + '</option>');
                //sort fare category dropdownlist from filter dialog
                $("#filter_name").html($('#filter_name option').sort(function(x, y) {
                     return $(x).text().toUpperCase() < $(y).text().toUpperCase() ? -1 : 1;
                }));
                $("#filter_name").get(0).selectedIndex = 0;
                e.preventDefault();
            } 

        },
        error: function(){
            $('#dialog-msg').html('Ajax Communication Error.');
        }
    }
    );

}

感谢@topher的建议。