Проверка пользовательских атрибутов в Yii2

У меня есть модель формы (SomeForm) и пользовательская функция проверки там:

use yii\base\Model;
class SomeForm extends Model
{
public $age;
public function custom_validation($attribute, $params){
if($this->age < 18){
$this->addError($attribute, 'Some error Text');
return true;
}
else{
return false;
}
}
public function rules(){
return [
['age', 'custom_validation']
];
}
}

Я использую это custom_validation в rules() функция, но форма даже представляя любое значение age приписывать.

Вот форма:

age.php

<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'age')->label("Age") ?>
<div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>

и контроллер:

use yii\web\Controller;

class SomeController extends Controller
{
//this controller is just for rendering
public function actionIndex(){
return $this->render('age');
}
public function actionSubmit(){
$model = new SomeForm();
if($model->load(Yii::$app->request->post()){
//do something here
}
}
}

0

Решение

Вам не нужно ничего возвращать, достаточно просто добавить ошибку в атрибут.

С версии 2.0.11 ты можешь использовать yii\validators\InlineValidator::addError() для добавления ошибок вместо использования $this, Таким образом, сообщение об ошибке может быть отформатировано с помощью yii\i18n\I18N::format() сразу.

использование {attribute} а также {value} в сообщении об ошибке указывать на метку атрибута (не нужно получать его вручную) и значение атрибута соответственно:

Я подозреваю, что проблема в вашем случае в том, что вы упускаете $formModel->validate() как в приведенной выше модели расширяет yii\base\Model и не \yii\db\ActiveRecord и вы должны сохранять некоторые другие ActiveRecord модель и хочу подтвердить это FormModel перед сохранением ActiveRecord модель, вы должны позвонить $formModel->validate() проверить, предоставлен ли действительный ввод, и запустить проверку модели после загрузки массива post в модель.

Еще одна вещь, на которую следует обратить внимание, это то, что по умолчанию встроенные валидаторы не будут применяться, если их связанные атрибуты получат пустые входные данные или если они уже нарушили некоторые правила валидации. Если вы хотите убедиться, что правило всегда применяется, вы можете настроить skipOnEmpty и / или skipOnError свойства быть false в декларации правил.

Ваша модель должна выглядеть так: namespace в определении вашей модели, если это не просто преднамеренно или из-за примера кода. просто обновите свое пространство имен в соответствии с тем, где оно находится.

namespace frontend\models;

use yii\base\Model;
class SomeForm extends Model
{
public $age;
const AGE_LIMIT=18;

public function rules(){
return [
['age', 'custom_validation','skipOnEmpty' => false, 'skipOnError' => false]
];
}

public function custom_validation($attribute, $params,$validator){
if($this->$attribute< self::AGE_LIMIT){
$validator->addError($this, $attribute, 'The value "{value}" is not acceptable for {attribute}, should be greater than '.self::AGE_LIMIT.'.');
}
}
}

ваш controller/action должен выглядеть так

public function actionTest()
{
//use appropriate namespace
$formModel = new \frontend\models\SomeForm();
$model= new \frontend\models\SomeActiveRecordModel();

if ($formModel->load(Yii::$app->request->post()) && $model->load(Yii::$app->request->post())) {
if ($formModel->validate()) {
// your code after validation to save other ActiveRecord model
if($model->save()){
Yii::$app->session->setFlash('success','Record added succesfully.')
}
}
}

return $this->render('test', ['model' => $model,'formModel'=>$formModel]);
}

Поле ввода age в файле представления следует использовать $formMoedl объект

echo $form->field($formModel, 'age')->textInput();
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]