yii2yii2-model

Yii2 different form fields on create and on update scenario


In my Model I have created different scenarios. I have one form which is rendered bu both create and update method. The form fields are as follows

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(); ?>

On using update scenario I want only my email, firstname and last name to be rendered from the form.

 const SCENARIO_REGISTER = 'signup';
const SCENARIO_CREATE = 'create';
const SCENARIO_UPDATE = 'update';

 public function scenarios()
{
    return [

          self::SCENARIO_REGISTER => ['user_email', 'user_password_hash', 'user_fname', 'user_lname', 'agree','!user_password_hash_repeat','required'],
          self::SCENARIO_CREATE => ['user_email', 'user_password_hash', 'user_fname', 'user_lname','!user_password_hash_repeat','required'],
          self::SCENARIO_UPDATE => ['user_email', 'user_fname', 'user_lname', 'required'],
    ];
}

public static function tableName()
{
    return 'sim_user';
}

And in my controller update method I am using scenario as below code.

 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,
            ]);
        }
    }

I want to get only the email, firstname and lastname form fields to be rendered in the form when I edit. I want to ignore the others fields in the form when I edit. What am I missing here? Thanks!!


Solution

  • You are using an activeForm with all the inputField .. so all the fields are submit .. if you want only email, firstname and lastname you should use another view with onnly these fields

    <?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(); ?>
    

    The scenario then check only the fields you have ruled and the submit return only the data you need