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