<Proger/> Про мене
ProProger

Yii2 > Вчимо YII2. #3. Форми

Автор: / Час публікації: 19/08/2017 15:50

Всім привіт! У минулому уроці я розказував про те, як створювати нові сторінки в YII2. Сьогодні я розкажу як робити форми для відправлення даних на сервері! У фреймворці YII2 уже існуєспеціальна бібліотека для валідації і створення форм. Форми можуть знадобитися в багатьох ситуаціях, наприклад, для реалізації входу на сайт або додавання коментарів.

Для початку потрібно створити модель форми. Для цього заходимо в папку 'models' і створюємо там файл з назвою 'MyForm.php'. Відкриваємо цей файл і записуємо у ньому ім'я простору(За стандартом 'app\models')

namespace app\models;

Після чого потрібно підключити, включену у фреймворк, бібліотеку 'Model':

use yii\base\Model;

Тепер потрібно створити клас, який має наслідувати клас 'Model', і ім'я, якого має співпадати з іменем файлу. У тілі цього класу потрібно додати властивості(поля для форми) і публічний метод 'rules()' з правилами для цих полів. Метод 'rules()' має повернути масив з масивами, в яких першим значенням має бути назва поля або масив з назвами полів(якщо правило для цих полів співпадає), а другим значенням - правило для вказаних полів. Ось, як це все має виглядати:

namespace app\models; // Призначаємо ім'я простору

use yii\base\Model;// Підключаємо стандартну модель

class MyForm extends Model{// Створюємо клас форми, який наслідує стандартну модель
    public $name;//| створюємо властивості для класу(З такими іменами, які будуть у полів у формі)
    public $text; 
    public $email;
    public function rules(){// створюємо метод з провилами
        return [ // повертаємо масив з правилами
            [['name','text','email'],'required'], // робимо поля 'name' і 'text' обов'язковими
            ['email','email'], // дані у полі email мають співпадати з форматом усіх email адрес, наприклад, abc@site.com         
        ];
    }
}

Після того, як ми створили модель, потрібно її підключити у контролері:

use app\models\MyForm;

У контролері створюємо нову сторінку разом з представленням(Наприклад, з назвою 'form'). У тілі 'actionForm()' створюємо об'єкт класу 'MyForm' і запишемо його в змінну '$model'. При відправці форми всі дані повернуться на цю ж сторінку, отже, ці дані потрібно опрацьовувати на тій самій сторінці. В YII2 існує масив 'request', в якій зберігаються всі GET- і POST-значення. Щоб отримати всі значення з форми потрібно звернутися до цього масиву:

Yii::$app->request->post('MyForm')

Потрібно перевірити чи є дані з форми. Після чого завантажити дані в форму за допомогою методу 'load()'. Потім потрібно провести валідацію даних форми. І після чого можна використовувати дані з форми, які будуть в об'єкті '$model'. І в дії, в контролері, потрібно повернути у методі 'render()', цей об'єкт. Ось код:

public function actionForm(){
    $model = new MyForm();
    if(Yii::$app->request->post('MyForm')){
        if($model->load(Yii::$app->request->post())){
            if($model->validate()){
                var_dump('Ми пройшли валідацію!');
            }
        }
    }
    return $this->render('form',[
        'model' => $model,
    ]);
}

Тепер переходимо до представлення, у мене це файл 'form.php'. Для початку потрібно підключити віджет 'ActiveForm':

use yii\widgets\ActiveForm;

Усі форми в YII2 мають початок і кінець. І їх потрібно оголосити. Щоб оголосити початок потрібно записати його у змінну і додати цей код:

$form = ActiveForm::begin();

А щоб оголосити кінець потрібно додати цей код:

ActiveForm::end();

Між кінцем і початком потрібно додавати поля. Щоб додати нове поле, потрібно вивести метод цього об'єкта '$form':

echo $form->field($model,'name')->textInput()

У цьому файлі ще виведемо деякі значення форми після отримання. Ось весь код представлення:

<?php
use yii\widgets\ActiveForm;
$this->title = 'Форма';
?>
<? if($model->validate()){ /*Перевіряємо чи дані з форми правильно заповнені*/?>
Користувач <b><?=$model->name?></b> написав: <b>text?></b> 
<? } ?>
<? $form = ActiveForm::begin(); // Початок форми
?>
    <?=$form->field($model,'name')->textInput()/*Додаєм поле*/?>
    <?=$form->field($model,'text')->textarea()?>
    <?=$form->field($model,'email')->textInput()?>
    <input type="submit" value="Відправити">
<? ActiveForm::end();/*Кінець форми*/?>

Якщо Ви не хочете,що біля поля писала його назва або написати щось інше замість неї, то потрібно додати метод 'label()' до лінійки, де створюється поле.

$form->field($model,'text')->textarea()->label('')

Ось і все!

Посилання:

Створення сторінки на YII2 - pproger.com/post/11
Віджет ActiveForm - www.yiiframework.com/doc-2.0/yii-widgets-activeform.html
Клас Model - www.yiiframework.com/doc-2.0/yii-base-model.html
Не забувай написати коментар і поширити посилання в соц. мережах за допомогою кнопок нижче! Дякую за увагу!

Коментарі(0)