【问题标题】:Yii2:Kartik Depdrop Widget default value on update?Yii2:Kartik Depdrop Widget 更新时的默认值?
【发布时间】:2015-03-08 10:58:47
【问题描述】:

我正在使用 Kartik Depdrop 小部件。

除了在创建新记录时我没有选择值的情况外,一切正常在更新时保存,而我希望根据情况在更新时保存“请选择”的值,即 null。

示例 - 我选择了一个房间类别 - 依赖值是包,它也可以为空。所以我没有在依赖字段包中选择任何值。但是当我来更新表单时,下拉菜单中的第一个值默认显示,而我希望 please select 作为默认值。

如何解决这个问题?

$form->field($model, 'package')->widget(DepDrop::classname(), [                            
   'data'=>ArrayHelper::map(\app\models\Package::find()->all(), 'id', 'package_name' ),
   'pluginOptions'=>[
   'depends'=>['room_category'], 
   'placeholder'=>'Select...',
   'url'=>  \yii\helpers\Url::to(['patient-detail/subcat']),               
    ]
    ])

注意:如果我在创建时的相关下拉列表中选择一个值,则更新时的值显示正确。

【问题讨论】:

  • 我认为您的问题可能是您已经为依赖下拉菜单设置了数据。据我了解,您只需为第一个下拉菜单设置数据,然后它使用 ajax 调用来获取后续下拉菜单的数据。
  • 嗨乔·米勒,正如我所说,如果我在创建时选择数据,依赖下拉菜单工作正常。唯一的问题是,如果我在创建时没有从相关下拉列表中选择任何数据,那么在更新屏幕中会显示所有数据,并且第一个字段会占用该值并在更新时保存,而可接受的行为应该是如果在创建时没有选择数据,它应该在更新屏幕中显示select

标签: php yii2


【解决方案1】:

它对我很有效。

查看文件

<?php echo $form->field($model, 'area_parent_id')->dropDownList(AreaCode::getProvinceOption(), ['prompt' => 'select...', 'id' => 'parent_id']); ?>

<?php echo Html::hiddenInput('selected_id', $model->isNewRecord ? '' : $model->area_id, ['id'=>'selected_id']); ?>

<?php echo $form->field($model, 'area_id')->widget(\kartik\depdrop\DepDrop::classname(), [
    'options' => ['id' => 'area_id', 'class' => '', 'style' => ''],
    'pluginOptions' => [
        'depends' => ['parent_id'],
        'placeholder' => 'select...',
        'initialize' => $model->isNewRecord ? false : true,
        'url' => Url::to(['/area-code/subcat']),
        'params'=> ['selected_id'], 
    ],

]); ?>

控制器文件

public function actionSubcat()
{
    $out = [];
    if (isset($_POST['depdrop_all_params'])) {
        $parent_id = $_POST['depdrop_all_params']['parent_id'];
        $selected_id = $_POST['depdrop_all_params']['selected_id']; 
        $out = AreaCode::find()->select(['id', 'name'])->where(['parent_id' => $parent_id])->asArray()->all();
        return \yii\helpers\Json::encode(['output' => $out, 'selected' => $selected_id]);
    }

    return \yii\helpers\Json::encode(['output' => '', 'selected' => '']);
}

【讨论】:

    【解决方案2】:

    好的,这就是你想要做的解决方案:

    // THE VIEW
    use kartik\widgets\DepDrop;
    
    // Top most parent
    echo $form->field($account, 'lev0')->widget(Select2::classname(), [
    'data' => ArrayHelper::map(Account::find()->where('parent IS NULL')->asArray()->all(), 'id', 'name')
    ]);
    
    //ADDITIONAL PARAM ID YOU MAY USE TO SELECT A DEFAULT VALUE OF YOUR MODEL IN YOUR DEPDROP WHEN YOU WANT TO UPDATE:
    echo Html::hiddenInput('model_id1', $model->id, ['id'=>'model_id1' ]);
    
    // Child level 1
    echo $form->field($account, 'lev1')->widget(DepDrop::classname(), [
    'data'=> [6 =>'Bank'],
    'options' => ['placeholder' => 'Select ...'],
    'type' => DepDrop::TYPE_SELECT2,
    'select2Options'=>['pluginOptions'=>['allowClear'=>true]],
    'pluginOptions'=>[
        'depends'=>['account-lev0'],
        'url' => Url::to(['/account/child-account']),
        'loadingText' => 'Loading child level 1 ...',
        'params'=>['model_id1'] ///SPECIFYING THE PARAM
    ]
    ]);
    
    // CONTROLLER
    public function actionChildAccount() {
    $out = [];
    if (isset($_POST['depdrop_parents'])) {
        $id = end($_POST['depdrop_parents']);
        $list = Account::find()->andWhere(['parent'=>$id])->asArray()->all();
        $selected  = null;
        if ($id != null && count($list) > 0) {
            //EXACTLY THIS IS THE PART YOU NEED TO IMPLEMENT:
            $selected = '';
            if (!empty($_POST['depdrop_params'])) {
                $params = $_POST['depdrop_params'];
                $id1 = $params[0]; // get the value of model_id1
    
                foreach ($list as $i => $account) {
                    $out[] = ['id' => $account['id'], 'name' => $account['name']];
                    if ($i == 0){
                        $aux = $account['id'];
                    }
    
                    ($account['id'] == $id1) ? $selected = $id1 : $selected = $aux;
                }
            }
            // Shows how you can preselect a value
            echo Json::encode(['output' => $out, 'selected'=>$selected]);
            return;
        }
    }
    echo Json::encode(['output' => '', 'selected'=>'']);
    }
    

    确保在页面完全加载时执行此过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 2023-03-22
      相关资源
      最近更新 更多