Widget ActiveForm - uniqcle/Yii2 GitHub Wiki
Во вью добавляем ActiveForm frontend/views/employee/register.php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
//Если есть ошибки
if( $model->hasErrors() ){
//Если валидация не прошла. В модель записываются ошибки валидации
//Эти ошибки можно вызвать методом getErrors() это массив
$errors = $model->getErrors();
foreach($errors as $error):
foreach($error as $item):
echo $item.'</br>';
endforeach;
endforeach;
}
?>
<h3>Register employee</h3>
<?php $form = ActiveForm::begin([
'options'=>[
'id' => 'testForm',
'class'=>'form-horizontal']
]);
); ?>
<?php echo $form->field($model, 'firstName'); ?>
<?php echo $form->field($model, 'lastName'); ?>
<?php echo $form->field($model, 'middleName')->passwordInput(); ?>
<?php echo $form->field($model, 'email'); ?>
<?php echo $form->field($model, 'salary')->hint('Подсказка...'); ?>
<?php echo $form->field($model, 'bday'); ?>
<?php echo $form->field($model, 'startday'); ?>
<?php echo $form->field($model, 'position'); ?>
<?php echo $form->field($model, 'city')->dropDownList($cities); ?>
<?php echo $form->field($model, 'idcode'); ?>
<?php echo Html::submitButton('Отправить', ['class' => 'btn btn-primary']); ?>
<?php ActiveForm::end(); ?>
В контроллере frontend/controllers/EmployeeController.php
загружаем данные в модель
namespace frontend\controllers;
use Yii;
use yii\web\Controller;
use frontend\models\Employee;
use frontend\models\City;
class EmployeeController extends Controller
{
public function actionRegister(){
$model = new Employee();
//Получаем данные городов
$cities = City::getCities();
$model->scenario = Employee::SCENARIO_EMPLOYEE_REGISTER;
$formData = Yii::$app->request->post();
if( Yii::$app->request->isPost ){
//Безопасное массовое присваивание. Согласно сценариям
//1. Вариант
//$model->attributes = $formData['Employee'];
//2. Вариант
$model->load( $formData );
if( $model->validate() && $model->register() ){
Yii::$app->session->setFlash('success', 'Вы успешно зарегестрированы');
}
}
return $this->render('register', [
'model' => $model,
'cities' => $cities
]);
}
}
По модели проходит валидация frontend/models/Employee.php
namespace frontend\models;
use Yii;
use yii\base\Model;
class Employee extends Model
{
//Имя сценариев - их лучше поместить в константы
const SCENARIO_EMPLOYEE_REGISTER = 'employee_register';
const SCENARIO_EMPLOYEE_UPDATE = 'employee_update';
public $firstName;
public $lastName;
public $middleName;
public $salary;
public $email;
public $bday;
public $startday;
public $city;
public $position;
public $idcode;
//Возвращает массив, в котором перечислены сценарии и атрибуты, которые в них используются
public function scenarios(){
return [
self::SCENARIO_EMPLOYEE_REGISTER => ['firstName', 'lastName', 'middleName', 'salary', 'email', 'bday', 'startday', 'city', 'position', 'idcode'],
self::SCENARIO_EMPLOYEE_UPDATE => ['firstName', 'lastName', 'middleName', 'salary']
];
}
public function rules(){
return [
[['email'], 'email'],
[['firstName', 'lastName', 'salary', 'email', 'startday', 'position', 'idcode'], 'required'],
['firstName', 'string', 'min' => 2],
[['lastName', 'middleName'], 'string', 'min' => 3],
[['salary'], 'number', 'min' => 20000, 'max' => 100000],
[['bday', 'startday'], 'date', 'format' => 'php:Y-m-d'],
['middleName', 'required', 'on' => self::SCENARIO_EMPLOYEE_UPDATE]
];
}
public function register(){
$sql = "INSERT INTO employee (id, firstName, lastName, middleName, salary, email, bday, startday, city, position, idcode ) VALUES (null, '{$this->firstName}', '{$this->lastName}', '{$this->middleName}', '{$this->salary}', '{$this->email}', '{$this->bday}', '{$this->startday}', '{$this->city}', '{$this->position}', '{$this->idcode}'); ";
return Yii::$app->db->createCommand($sql)->execute();
}
}
Получаем данные о городах из модели frontend/models/City.php
namespace frontend\models;
use Yii;
use yii\helpers\ArrayHelper;
use yii\base\Model;
class City extends Model
{
public static function getCities(){
$sql = "SELECT * FROM cities; ";
$result = Yii::$app->db->createCommand( $sql )->queryAll();
return ArrayHelper::map( $result , 'id', 'city');
}
}