Вариация модели формы Yii - требуется одна из них
У меня есть два поля в форме (имя забытого пароля), имя пользователя и адрес электронной почты. Пользователь должен ввести один из них. Я хочу, чтобы получить пароль, пользователь может ввести имя пользователя или идентификатор электронной почты. Может ли кто-нибудь указать мне правило валидации для этого?
Есть ли встроенное правило, которое я могу использовать?
(Извините, если это уже обсуждалось или я пропустил)
Спасибо за помощь
Привет
Киран
Ответы
Ответ 1
Я пытался решить ту же проблему сегодня. У меня есть код ниже.
public function rules()
{
return array(
// array('username, email', 'required'), // Remove these fields from required!!
array('email', 'email'),
array('username, email', 'my_equired'), // do it below any validation of username and email field
);
}
public function my_required($attribute_name, $params)
{
if (empty($this->username)
&& empty($this->email)
) {
$this->addError($attribute_name, Yii::t('user', 'At least 1 of the field must be filled up properly'));
return false;
}
return true;
}
Общая идея состоит в том, чтобы перенести "требуемую" проверку на пользовательский метод my_required(), который может проверить, заполнено ли какое-либо поле.
Я вижу этот пост с 2011 года, но я не нашел другого решения для него. Я надеюсь, что это сработает для вас или других в будущем.
Enjoy.
Ответ 2
Что-то вроде этого немного более общее и может быть повторно использовано.
public function rules() {
return array(
array('username','either','other'=>'email'),
);
}
public function either($attribute_name, $params)
{
$field1 = $this->getAttributeLabel($attribute_name);
$field2 = $this->getAttributeLabel($params['other']);
if (empty($this->$attribute_name) && empty($this->$params['other'])) {
$this->addError($attribute_name, Yii::t('user', "either {$field1} or {$field2} is required."));
return false;
}
return true;
}
Ответ 3
Я не думаю, что есть предопределенное правило, которое будет работать в этом случае, но было бы достаточно легко определить ваши собственные, где для полей имени пользователя и пароля правило было "если пусто ($ username. $password) {return error}" - вы можете также проверить минимальную длину или другие требования на уровне поля.
Ответ 4
Yii2
namespace common\components;
use yii\validators\Validator;
class EitherValidator extends Validator
{
/**
* @inheritdoc
*/
public function validateAttributes($model, $attributes = null)
{
$labels = [];
$values = [];
$attributes = $this->attributes;
foreach($attributes as $attribute) {
$labels[] = $model->getAttributeLabel($attribute);
if(!empty($model->$attribute)) {
$values[] = $model->$attribute;
}
}
if (empty($values)) {
$labels = '«' . implode('» or «', $labels) . '»';
foreach($attributes as $attribute) {
$this->addError($model, $attribute, "Fill {$labels}.");
}
return false;
}
return true;
}
}
в модели:
public function rules()
{
return [
[['attribute1', 'attribute2', 'attribute3', ...], EitherValidator::className()],
];
}
Ответ 5
Вы можете использовать закрытое свойство внутри класса модели для предотвращения ошибок отображения ошибок два раза (не присваивайте ошибку атрибуту модели, а добавляйте только к модели, не указав ее):
class CustomModel extends CFormModel
{
public $username;
public $email;
private $_addOtherOneOfTwoValidationError = true;
public function rules()
{
return array(
array('username, email', 'requiredOneOfTwo'),
);
}
public function requiredOneOfTwo($attribute, $params)
{
if(empty($this->username) && empty($this->email))
{
// if error is not already added to model, add it!
if($this->_addOtherOneOfTwoValidationError)
{
$this->addErrors(array('Please enter your username or emailId.'));
// after first error adding, make error addition impossible
$this->_addOtherOneOfTwoValidationError = false;
}
return false;
}
return true;
}
}
Ответ 6
не забывайте "skipOnEmpty" attr. Это стоило мне нескольких часов.
protected function customRules()
{
return [
[['name', 'surname', 'phone'], 'compositeRequired', 'skipOnEmpty' => false,],
];
}
public function compositeRequired($attribute_name, $params)
{
if (empty($this->name)
&& empty($this->surname)
&& empty($this->phone)
) {
$this->addError($attribute_name, Yii::t('error', 'At least 1 of the field must be filled up properly'));
return false;
}
return true;
}
Ответ 7
Это работает для меня:
['clientGroupId', 'required', 'when' => function($model) {
return empty($model->clientId);
}, 'message' => 'Client group or client selection is required'],