我有一个在其模型中定义为必需的文本字段。但不需要视图。我尝试这种方法来删除必需的属性,但它不起作用:
<?= $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,
]);
}
答案 0 :(得分:2)
您可以使用scenarios为特定视图设置是否需要字段。您可以分配方案所需的活动字段,这些字段将成为验证的主题。
我假设模型是Profile
。在下面的示例firstname
中,默认情况下需要lastname
和city
。
模型可以在不同的场景中使用,默认情况下使用场景default
。假设在您的情况下,我们可以声明仅需要special
和firstname
的方案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]);
}
现在,如果您在此视图中提交表单,则只会询问firstname
和lastname
,而在您之前的表单/视图中,如果您尝试提交表单,则会要求您提供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,
]);
}