У меня есть модель формы (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
}
}
}
Вам не нужно ничего возвращать, достаточно просто добавить ошибку в атрибут.
С версии 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();
Других решений пока нет …