Yii2创建和更新场景中的不同表单字段

Yii2创建和更新场景中的不同表单字段,yii2,yii2-model,Yii2,Yii2 Model,在我的模型中,我创建了不同的场景。我有一个表单,它是通过create和update方法呈现的。表单字段如下所示 Form.php <?php $form = ActiveForm::begin(); ?> <?= $form->errorSummary($model, $options = ['header'=>'', 'class'=>'pull-left errorDiv']); ?> <?= $form->

在我的模型中,我创建了不同的场景。我有一个表单,它是通过create和update方法呈现的。表单字段如下所示

Form.php

 <?php $form = ActiveForm::begin(); ?>

 <?= $form->errorSummary($model, $options = ['header'=>'', 'class'=>'pull-left errorDiv']); ?>

            <?= $form->field($model, 'user_fname')->textInput(['class'=>'form-control']);?>
            <?= $form->field($model, 'user_lname')->textInput(['class'=>'form-control']); ?>
            <?= $form->field($model,'user_email')->textInput(['class'=>'form-control']); ?>
            <?= $form->field($model, 'user_password_hash')->passwordInput([]); ?>
            <?= $form->field($model, 'user_password_hash_repeat')->passwordInput(['class'=>'form-control']); ?>
            <?php  $items = ArrayHelper::map(SimAuthAssignment::find()->all(),'item_name' ,'item_name');?>
            <?= $form->field($mode, 'item_name')->dropDownList($items,[]);?>

<div class="form-group">
    <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>

<?php ActiveForm::end(); ?>
在我的控制器更新方法中,我使用的场景代码如下

 public function actionUpdate($id)
    {
        $model = $this->findModel($id);
        $model->scenario = SimUser::SCENARIO_UPDATE;
       // var_dump($model->scenario); exit();
        $mode = \app\modules\auth\models\SimAuthAssignment::find()->where(['user_id' => $id])->one();


        if ($model->load(Yii::$app->request->post())&& $mode->load(Yii::$app->request->post())) {
            $model->save();

            return $this->redirect(['view', 'id' => $model->user_id]);
        } else {
            return $this->renderAjax('update', [
                'model' => $model,
                'mode' => $mode,
            ]);
        }
    }

我只想在编辑表单时获取要呈现在表单中的email、firstname和lastname表单字段。我想在编辑时忽略表单中的其他字段。我错过了什么?谢谢

您正在将activeForm与所有inputField一起使用。。因此,所有字段都已提交。。如果您只需要电子邮件,请输入firstname和lastname 您应该使用仅包含这些字段的另一个视图

<?php $form = ActiveForm::begin(); ?>

 <?= $form->errorSummary($model, $options = ['header'=>'', 'class'=>'pull-left errorDiv']); ?>

            <?= $form->field($model, 'user_fname')->textInput(['class'=>'form-control']);?>
            <?= $form->field($model, 'user_lname')->textInput(['class'=>'form-control']); ?>
            <?= $form->field($model,'user_email')->textInput(['class'=>'form-control']); ?>

<div class="form-group">
    <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>

<?php ActiveForm::end(); ?>


然后,该方案只检查您已裁决的字段,提交只返回您需要的数据。您可以使用$model->isNewRecord功能

    if(!$model->isNewRecord) {
          echo $form->field('Your-field')->textInput(['class' => 'form-control');
    }

如果我没弄错的话,你想隐藏一些输入元素,这取决于你的表单场景

因此,这可以使用以下代码轻松实现:

<?php if ($model->isUpdating()) { ?>
    <?= $form->field($model, 'user_fname')->textInput(['class' => 'form-control']); ?>
    <?= $form->field($model, 'user_lname')->textInput(['class' => 'form-control']); ?>
    <?= $form->field($model, 'user_email')->textInput(['class' => 'form-control']); ?>
<?php } ?>

<?php if ($model->isRegistration()) { ?>
    <?= $form->field($model, 'user_password_hash')->passwordInput([]); ?>
    <?= $form->field($model, 'user_password_hash_repeat')->passwordInput(['class' => 'form-control']); ?>
    <?php $items = ArrayHelper::map(SimAuthAssignment::find()->all(), 'item_name', 'item_name'); ?>
    <?= $form->field($mode, 'item_name')->dropDownList($items, []); ?>
<?php } ?>

什么意思是“更新时只获取电子邮件、名字和姓氏表单字段”。。哪里在控制器中。提交后?你还有其他文件吗?请更好地解释。我的意思是,当我编辑用户时,它应该只呈现表单中的email、firstname和lastname字段。您正在使用一个模型。。模型包含了所有的字段你发布的答案对我有用。。这就是我想要的,非常感谢!你指的是评论还是答案?如果你的答案是正确的,请给它打分。。
<?php if ($model->isUpdating()) { ?>
    <?= $form->field($model, 'user_fname')->textInput(['class' => 'form-control']); ?>
    <?= $form->field($model, 'user_lname')->textInput(['class' => 'form-control']); ?>
    <?= $form->field($model, 'user_email')->textInput(['class' => 'form-control']); ?>
<?php } ?>

<?php if ($model->isRegistration()) { ?>
    <?= $form->field($model, 'user_password_hash')->passwordInput([]); ?>
    <?= $form->field($model, 'user_password_hash_repeat')->passwordInput(['class' => 'form-control']); ?>
    <?php $items = ArrayHelper::map(SimAuthAssignment::find()->all(), 'item_name', 'item_name'); ?>
    <?= $form->field($mode, 'item_name')->dropDownList($items, []); ?>
<?php } ?>
public function isUpdating() : bool {
    return $this->scenario === self::SCENARIO_REGISTER;
}

public function isRegistration() : bool {
    return $this->scenario === self::SCENARIO_UPDATE;
}