# Shaklar bilan ishlash ¶

Ushbu bo'limda biz foydalanuvchidan ma'lumotlarni qabul qilishni o'rganamiz. Sahifada ma'lumotlarni kiritish uchun ism va emailni kiritish uchun shakl bor. Sahifada kiritilgan ma'lumotlar tasdiqlanishi uchun ko'rsatiladi.

Shu maqsadga erishish uchun biz bitta amal va ikkta ko'rinish yasashdan tashqari model yaratasiz.

Ushbu qo'lanmada siz quydagilarni o'rganasiz:

- Qandey qilib foydalanuvchi tomonidan kiritilgan ma'lumotlar uchun modelni yaratish mumkin;
- Qandey qilib ma'lumotlarni tekshirish uchun mantiq yozishimiz mumkin;
- Qandey qilib HTML-shaklni ko'rinish ichida yaratishimiz mumkin.

## Model yaratilishi ¶

Fayl `models/EntryForm.php`da `EntryForm` pastda ko'rsatilganidek klassini yarating. U foydalanuvchidan kelgan ma'lumotlar saqlash uchun ishlatiladi. Klasslarni nomlari haqida siz «Klasslarni avtoyuklanishi» bo'limida o'qishingiz mumkin.

    <?php

    namespace app\models;

    use yii\base\Model;

    class EntryForm extends Model
    {
        public $name;
        public $email;

        public function rules()
        {
            return [
                [['name', 'email'], 'required'],
                ['email', 'email'],
            ];
        }
    }

Ushbu klass quydagi klassni kengaytiradi yii\base\Model, u esa frameworkni bir qismi hisoblanadi va oddatda shakl ma'lumotlari bilan ishlaydi.

Klass 2-ta ochiq hossa `name` va `email` iborat, ular foydalanuvchilar ma'lumotlarni saqlash uchun ishlatiladi. uni yana `rules()` usuli bor, u esa ma'lumotlarni saqlash qoidalarini (tartibini) yozib o'tadi. Yuqorida yozilgan qoidalar quydagicha ta'riflasa bo'ladi:

- Xossalar `name` va`email` to'ldirilishi shart;
- Xossa`email` ma'lumoti email bo'lishi shart.

Agar `EntryForm` nusxasi (obyekt) ma'lumotlar bilan to'ldirilgan bo'lsa, kiritilgan ma'lumotlarni kiritilgan ma'lumotlar ma'lumot qoidalari talabiga to'g'ri kelishini validate() tekshirishingiz mumkin. Agar ma'lumotlar tekshirishdan o'tmasa hasErrors xossasi `true` ga teng bo'lib qoladi. Ushbu xossa: errors orqali siz qanaqa xatolar borligini ko'rishingiz mumkin.

## Amal yaratilishi ¶

Endi esa huddi pastda ko'rsatilganidek `site` nazoratchisi ichida `entry` amalini yarating.

    <?php

    namespace app\controllers;

    use Yii;
    use yii\web\Controller;
    use app\models\EntryForm;

    class SiteController extends Controller
    {
        // ...yaratilgan kod...

        public function actionEntry()
        {
            $model = new EntryForm();

            if ($model->load(Yii::$app->request->post()) && $model->validate()) {
                // $model ichidagi ma'lumotlar tekshirishdan muvaffaqiyatli o'tgan

                // endi esa biror $model bilan mantiq...

                return $this->render('entry-confirm', ['model' => $model]);
            } else {
                // Sahifaga kirilgan holatda yoki hato mavjud bo'ganida
                return $this->render('entry', ['model' => $model]);
            }
        }
    }

Amal `EntryForm` nusxasini yaratadi. Keyin esa u `$_POST` dan kelgan ma'lumotlar bilan modelni to'ldirayapti, u ma'lumotlar Yiida yii\web\Request::post() usulu orqali olinadi. Agar model muvaffaqiyatli to'ldirilsa, foydalanuvchi ma'lumotlarni shakldan foydalanib jonatib ma'lumotlar shu orqali kelganini nazarda tutayapmiz, keyin ma'lumotlar tekshirish uchun validate() usuli ishlatilayapti.

Agar hammasi yaxshi o'tsa, amal `entry-confirm` ko'rinishini qaytaradi, u esa foydalanuvchi tomonidan kiritilgan ma'lumotlarini ko'rsatadi. Aks holda esa `entry` ko'rinishi qaytariladi, u esa HTML-shaklni va xatolarni chiqarib beradi, agar ular bor bo'lsa.

> Ma'lumot uchun: `Yii::$app` yagona global xossasi Yiining nusxasini o'z ichiga oladi ilova (singleton). Bir vaqtni o'zida u Service Locator ham hisoblanadi, undan esa quydagi komponentlar bilan foydalanish mumkin `request`, `response`, `db` va boshqa. Yuqorida ko'rsatilgan kodda `$_POST` massivini qabul qilish uchun biz `request` komponentini ishlatdik.

## Ko'rinish yaratilishi ¶

Yakunda biz `entry-confirm` va `entry` ko'rinishlarini yaratamiz, ular esa yuqorida yozilgan `entry` amali orqali ma'lum bir xolatlarda qaytariladi.

Ko'rinish `entry-confirm` kiritilgan email va ismni ko'rsatadi. U `views/site/entry-confirm.php` fayli ichiga saqlangan bo'lishi kerak.

    <?php
    use yii\helpers\Html;
    ?>
    <p>Siz quydagi ma'lumotlarni kiritingiz:</p>

    <ul>
        <li><label>Name</label>: <?= Html::encode($model->name) ?></li>
        <li><label>Email</label>: <?= Html::encode($model->email) ?></li>
    </ul>

Ko'rinish `entry` HTML-shaklni yasaydi. U quydagi faylga saqlangan bo'lishi kerak `views/site/entry.php`.

    <?php
    use yii\helpers\Html;
    use yii\widgets\ActiveForm;
    ?>
    <?php $form = ActiveForm::begin(); ?>

        <?= $form->field($model, 'name') ?>

        <?= $form->field($model, 'email') ?>

        <div class="form-group">
            <?= Html::submitButton('Jonatish', ['class' => 'btn btn-primary']) ?>
        </div>

    <?php ActiveForm::end(); ?>

HTML-shaklni yasash uchun juda mukammal vidjet ActiveForm ishlatilmoqda. Quydagi usular `begin()` va `end()` shaklni ochilish va yopilish teglarini yasaydi. Bular orasida esa ma'lumotlar kiritilishi uchun kerak bo'lgan maydonlar field() yaratilmoqda . Birinchi "name", ikkinchisi esa "email". Keyin esa shaklni ma'lumotlarni jonatish uchun tugma yasalishiga javob beradigan usul yii\helpers\Html::submitButton() chaqirilmoqda.

## Keling, sinab ko'raylik ¶

Ish jarayonida yaratilgan bor narsani ko'rish uchun, browserni ochib quydagi URLni kiritaylik:

    http://hostname/index.php?r=site%2Fentry

Siz ikkta maydoni o'z ichiga olgan shaklni ko'rishingiz mumkin. Har bir maydon oldida esa yorlig' bor, u yorlig'lar, qanaqa ma'lumotlar kiritilishi kerak bo'lishi haqida ma'lumot saqlaydi. Agar siz ma'lumotlarni kiritmasdan jonatish tugasiga bosangiz yoki email noto'g'ri kiritsangiz, siz har bir maydon oldida hatolarni ko'rishingiz mumkin bo'ladi.

Ma'lumot kiritilib jonatilgandan so'ng esa, siz hozirgina kiritilgan ma'lumotlar sahifasini ko'rasiz.

### Bu qandey ishlayapti? ¶

Siz, bu HTML-shakl aslida qandey qilib ishlayotganini haqida savollar borligi bo'lishi mumkin. Butun jarayon ozgina murakkab ko'rinishi mumkin: maydonlar oldida yorlig'lar, ma'lumotlar noto'g'ri kiritilganda hatolar va bularni hammasi sahifa qayta yuklanmasdan ishlayotganiga ajablanishingiz mumkin.

Ha albatta, ma'lumotlar tekshirishi aslida Javascript tarafida ham Serverda ham amalga oshirilmoqda. yii\widgets\ActiveForm judda yaxshi o'langan, siz `EntryForm`da kirigan qoidalarni olish uchun. Ularni Javascript kodga aylantirib va tekshirish jarayonida ishlatiladi. Agar browserda Javascript o'chsa tekshirish server tarafda ham `actionEntry()` usulida ko'rsatilganidek o'tmoqda. Bu esa foydalanuvchi tomonidan kiritilgan ma'lumotlar ishonchli ekanliginini ko'rishimiz mumkin.

Moydonlar uchun yasalgan yorlig'lar xossalar nomlari assosida quydagi usul `field()` orqali yaratilmoqda. Misol uchun, yasalgan `Name` yorlig'i `name` xossasi uchun shaklangan. Siz yorlig'larni quydagicha o'zgartirishingiz mumkin:

    <?= $form->field($model, 'name')->label('Sizning ismingiz') ?>
    <?= $form->field($model, 'email')->label('Sizning elektron qutingiz') ?>

> Ma'lumot uchun: Yiida juda ham ko'p vidjetlar bor, ular sizga tez va murakkab ko'rinishlarni yasashga yordam beradi. Vijetlarni yasash judda oson va sodda ekanligini keyin (oldinda) bilishingiz mumkin. Ko'rinishdagi narsalarni ko'p narsani vijetlarga chiqarsa bo'ladi, nimaga? keyinchalik ham boshqa joylarda ishlatish uchun, bu esa ishni soddalashtiradi.

## Xulosa ¶

Bu bo'limda siz MVC-arxitekturasidagi xar bir qismini ishlatib ko'rdingiz.Siz foydalanuvchidan kelgan ma'lumotlarni qabul qilib tekshirish uchun, model klasslarini yaratishni o'rgandingiz.

Shuningdek, siz foydalanuvchidan ma'lumotlarni qabul qilish va ularni ko'rsatishni o'rgandingiz. Aslida bu ish jarayonida ma'lum bir vaqtni talab qilishi mumkin. Yii esa juda mukammal vidjetlarni taqdim qiladi, ular esa sizga ish jarayonini tezlashtirishni yordam beradi.

Keyingi bo'limda siz ma'lumotlar ombori bilan ishlashni o'rganasiz, bu esa juda ko'p ilovalarda talab qilinadi.