Php Yii2:Kartik Depdrop小部件更新时的默认值?
我正在使用Kartik Depdrop小部件 除了我在创建新记录时没有选择值的情况外,一切正常。在更新时,相关字段应显示Php Yii2:Kartik Depdrop小部件更新时的默认值?,php,yii2,Php,Yii2,我正在使用Kartik Depdrop小部件 除了我在创建新记录时没有选择值的情况外,一切正常。在更新时,相关字段应显示,请选择,而它在下拉列表中显示第一个值,并在更新时保存,然而,我希望“请选择”的值(即null)即使在根据情况进行更新时也能保存 示例-我选择一个房间类别-依赖值为packages,也可以为null。所以我没有在dependent字段包中选择任何值。但是当我更新表单时,下拉列表中的第一个值默认显示,而我希望请选择作为默认值 如何纠正这一点 $form->field($mo
,请选择,而它在下拉列表中显示第一个值,并在更新时保存,然而,我希望“请选择”的值(即null)即使在根据情况进行更新时也能保存
示例-我选择一个房间类别-依赖值为packages,也可以为null。所以我没有在dependent字段包中选择任何值。但是当我更新表单时,下拉列表中的第一个值默认显示,而我希望请选择作为默认值
如何纠正这一点
$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']),
]
])
注意:如果我在创建时的Dependent下拉列表中选择了一个值,则更新时的值将正确显示。好的,这是您要执行的解决方案:
// 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'=>'']);
}
确保在页面完全加载时执行此过程。对我来说效果很好
查看文件
<?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'],
],
]); ?>
我认为您的问题可能是您已经为依赖项下拉列表设置了数据。据我所知,这个小部件只为第一个下拉菜单设置数据,然后它使用ajax调用获取后续下拉菜单的数据。嗨,Joe Miller,正如我所说的,如果我在创建时选择数据,依赖下拉菜单工作正常。唯一的问题是,如果我在创建时没有从依赖下拉列表中选择任何数据,那么在更新屏幕中会显示所有数据,并且第一个字段占用了值并在更新时保存,而可接受的行为应该是它应该在更新屏幕中显示select
,如果在创建时未选择任何数据。
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' => '']);
}