Yii2:如何在视图中删除必需的属性?

时间:2018-06-07 18:03:43

标签: html yii2 required

我有一个在其模型中定义为必需的文本字段。但不需要视图。我尝试这种方法来删除必需的属性,但它不起作用:

<?= $form->field($model, 'city')->textInput(['required' => false]) ?>

我需要在视图控制器中更改它。但不是在模型中(因为其他视图需要必需的属性。)。

我知道如何使用 jQuery 来完成它,但我更喜欢使用 PHP / Yii2

更新(由@Muhammad Omer Aslam的帮助所推崇):

  • 我的模型名为

  • 我的观点称为 _form

  • 我的控制器名为 PersonsControllers 。它具有更新功能:

actionUpdate($ ID):

public function actionUpdate($id)
{
    $model = $this->findModel($id); // How to add my new scenario here?

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id_person]);
    }

    return $this->render('update', [
        'model' => $model,
    ]);

}

2 个答案:

答案 0 :(得分:2)

您可以使用scenarios为特定视图设置是否需要字段。您可以分配方案所需的活动字段,这些字段将成为验证的主题。

我假设模型是Profile。在下面的示例firstname中,默认情况下需要lastnamecity

模型可以在不同的场景中使用,默认情况下使用场景default。假设在您的情况下,我们可以声明仅需要specialfirstname的方案lastname。在模型中,您将为方案名称声明一个常量,然后覆盖scenarios()方法,key=>value对,并将活动字段名称以数组的形式传递给value将被分配。

namespace app\models;

use yii\db\ActiveRecord;

class Profile extends ActiveRecord
{
    const SCENARIO_SPECIAL = 'special';

    public function scenarios()
    {
        $scenarios = parent::scenarios();
        $scenarios[self::SCENARIO_SPECIAL] = ['firstname', 'lastname'];
        return $scenarios;
    }
}

然后在controller/action的{​​{1}}内,在那个您不希望需要city字段的视图中,初始化Profile模型对象,如下所示

public function actionProfile(){
    $model = new \common\models\Profile(['scenario'=> \common\models\Profile::SCENARIO_SPECIAL]);
    return $this->render('profile',['model'=>$model]);
}

现在,如果您在此视图中提交表单,则只会询问firstnamelastname,而在您之前的表单/视图中,如果您尝试提交表单,则会要求您提供city尝试提交时,您无需为其余表单或规则更改或添加任何内容。

当您尝试更新记录并且不希望在更新记录时需要city时,唯一的区别可能是分配如下所示的方案,因为您没有创建新对象对于模型。

$model->scenario=\common\models\Profile::SCENARIO_SPECIAL;

答案 1 :(得分:0)

在模型中:

const SCENARIO_MYSPECIAL = 'myspecial';

public function rules()
{
    return [
        [['id_person', 'city'], 'required', 'on' => self::SCENARIO_DEFAULT], 
        [['id_person'], 'required', 'on' => self::SCENARIO_MYSPECIAL],
    ];
}

在控制器中:

public function actionUpdate($id)
{
    $model = $this->findModel($id);
    $model->scenario = 'myspecial';

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id_person]);
    }

    return $this->render('update', [
        'model' => $model,
    ]);

}