Yii2: как удалить обязательный атрибут в представлении? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть текстовое поле, которое было определено как требуется в его модели.Но представление не требуется.Я пытаюсь таким образом удалить атрибут required , но он не работает:

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

Мне нужно изменить его в view или в его контроллер .Но не в ее модели (потому что другим представлениям необходим обязательный атрибут.).

Я знаю, как это сделать, используя jQuery , но я предпочитаю использовать PHP/ Yii2 .

Обновление (запрошено милой помощью @Muhammad Omer Aslam):

  • Моя модель называется Persons .

  • Мой взгляд называется _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 голосов
/ 08 июня 2018

В модели:

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

}
0 голосов
/ 07 июня 2018

Вы можете использовать сценарии , чтобы сделать поле обязательным или нет для определенного вида.Вы можете назначить активные поля, необходимые для сценария, и эти поля будут подлежать проверке.

Я предполагаю, что модель 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 для того представления, где вы не хотите, чтобы поле 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;
...