№17 Dars - Yiida model hosil qilish.

Avval forma uchun html kod yozamiz. Biz nimalar kerakligini aniqlashimiz kerak bo`ladiki: qanday ma`lumotlar olish va qanday qoida bo`yicha uni biriktirish bo`yicha.

Model - foydalanuvchi tomonidan kiritilayotgan ma`lumotlarni doimo rolda nazorat qilib boradi. Biz modelni ikki xil ko`rinishda hosil qilishimiz mumkin. Biz ma`lumotlarni olish, qayta ishlash, keyin o`chirish uchun CFormModel dan foydalanamiz; agar ma`lumotni olib uni bazada saqlash bo`ladigan bo`lsa CActiveRecord dan foydalaniladi. Ikkala tur ham bir CModel classi asosida ishlaydi.

" attribute" - termini classning ayrim xususiyatlarini boshqa xususiyatlaridan ajratish uchun yaratilgan. Bunday xususiyat (attribut) asosan o`zida ma`lumotlar omboridan olingan yoki foydalanuvchi tomonidan kiritilgan ma`lumotni saqlashda qo`llaniladi.

Model classini aniqlaymiz:

Quyida biz LoginForm modelidan foydalanib, foydalanuvchining ro`yhatdan o`tish pageni yaratamiz.

class LoginForm extends CFormModel {
public $username;
public $password;
public $rememberMe=false;
}

Biz uchta o`zgaruvchi e`lon qilamizi, bular: $username, $password va $rememberMe. Ular foydalanuvchi nomini, passwordini va shu bilan birgalikda username va passwordni eslab qolish belgisini ($rememberMe). Bu belgi boshida false qiymatga ega bo`lmoqda.

Tekshiruv qoidalarini aniqlash:

Foydalanuvchi formadan ma`lumotlarni yuborganda, model ularni oladi, biz ularni amalga oshirayotganda mal`umotlar to`g`ri ekanligiga ishonch hosil qilishimiz kerak. Bu ishni amalga oshirayotganda qoidalar to`plami bilan ma`lumotlarni tekshiramiz. Tekshirish qoidalarini amalga oshirshda bizga rules() metodi yordam beradi.

class LoginForm extends CFormModel {
public $username;
public $password;
public $rememberMe=false;
private $_identity;
public function rules()
{
return array(
array('username, password', 'required'),
array('rememberMe', 'boolean'),
array('password', 'authenticate'),
);
}
public function authenticate($attribute,$params)
{
$this->_identity=new UserIdentity($this->username,$this->password); if(!$this->_identity->authenticate())
$this->addError('password','Неправильное имя пользователя или пароль.');
}
}

Quyida ko`rsatilgan kodimizda username, password - majburiy to`ldirilishi kerak bo`lgan maydonlar, password maydon yana username ga mos kelishi ham tekshirilmoqda.rememberMe true yoki false qiymat qaytaradigan o`zgaruvchi.

Bu yerda AttributeList da attribute nomlari " , " bilan ajratilib yozilad;

1.1.11 versiyasidan boshlab alohida qoidalarni inkor qilish mumkin. Agar qandaydir qoida va senariya uchun validatsiyadan o`tkazishni hohlamasangiz " except " parametrli senariya nomiga ko`rsatib qo`yishingiz kerak bo`ladi.

Senariyalar ro`yhatidan ikkita ekvivalent usulni ko`rsatishingiz mumkin.

 // senariya nomlari massiv ko`rinishida
 'on'=>array('update', 'create'),
 // nomlar satrlar bilan, " , " ajratilgan holda (probelni qabul qilmaydi, faqat " , " )
 'except'=>'ignore, this, scenarios, at-all',

Qoidalar asosida tekshiruvchi validatorni 3 xil usul bilan ko`rsatish mumkin.

Birinchidan, model classi ichida o`zingiz funksiya yaratib uni validatsiyaga bog`lab qo`yishingiz mumkin, ya`ni bunda o`zingiz qoidalar kiritishingiz mumkin.:

/**
* @param string $attribute maydon nomi, validatsiyadan o`tuvchi qiymatlar
* @param array $params validatsiya qoidasi uchun qo`shimcha parametrlar
**/     
public function ValidatorName($attribute,$params) { … }

Ikkinchi usul bu - xaqiqiy class nomida validatorni ko`rsatish. Bu holatda ma`lumotlarni tekshirish uchun tekshiruvchi class nusxasi hosil qilinishi paytida qoida qabul qilinadi. Uning attribut belgilarini tayyorlash uchun qoidadagi qo`shimcha parametrlardan foydalaniladi. Tekshiruv classini CValidator classi asosida ishlab chiqariladi.

Uchinchi usul - bu yiining maxsus classlaridan bo`lib, ko`p uchraydigan validatorlarni aniqlab qo`ygan. Misol uchun " required " bu - CRequiredValidator classining laqabi bo`lib, shu laqab orqali ishlatilib ketiladi. Bu class kelayotgan ma`lumotni mavjudmi yoki mavjudmasligini aniqlash uchun ishlatiladi. Agar siz " required "ni ishlatsangiz, shunga biriktirilgan hamma attributelarni majburiy to`ldiriladigan maydon qilib chiqadi.

Yii ning qolgan validator classlarini ko`rib chiqaylik.:

  • boolean: CBooleanValidator classning laqabi bo`lib, u teng bo`lishi mumkin true yoki false ga;
  • captcha: CCaptchaValidator classning laqabi bo`lib, kaptchaning belgilari bilan to`g`riligini tekshiradi;
  • compare: CCompareValidator classning laqabi bo`lib, ikkita attributeni solishtiradi;
  • email: CEmailValidator classning laqabi bo`lib, kelayotgan email manzilni haqiqatda email manzilmi yoki yo`qligini aniqlidi;
  • date: CDateValidator classning laqabi bo`lib, joriy attributning dateligini to`g`riligini tekshiradi;
  • default: CDefaultValueValidator classning laqabi bo`lib, joriy tanlangan attributlar bo`yicha belgilarni o`zlashtirish;
  • exist: CExistValidator classning laqabi bo`lib, ko`rsatilgan jadvaldagi ustunning attributida belgi borligini aniqlidi;
  • filter: CFilterValidator classning laqabi bo`lib, o`zgartiriladigan attribut belgisining filtr bilan bajarish;
  • in: CRangeValidator classning laqabi bo`lib, attribut belgisini ko`rsatilgan belgilar to`plamida o`z ichiga olishini tekshiradi;
  • length: CStringValidator classning laqabi bo`lib, attribut belgisining ko`rsatilgan intervaldagi uzunligiga tekshiradi;
  • match: CRegularExpressionValidator classning laqabi bo`lib, attribut belgisini to`g`ri ifodaga muvofiqlikka tekshiradi;
  • numerical: CNumberValidator classning laqabi bo`lib, tekshirilayotgan attribut belgisini sonlikka tekshirish;
  • required: CRequiredValidator classning laqabi bo`lib, attributlar belgisini bo`shlik yoki bo`shmaslikka tekshirish;
  • type: CTypeValidator classning laqabi bo`lib, ko`rsatilgan ma`lumotning ko`rsatilgan tipga to`g`ri kelishini tekshiradi.;
  • unique: CUniqueValidator classning laqabi bo`lib, ko`rsatilgan jadvaldagi ustunda kelayotgan attributning yagona bo`lishini tekshirish;
  • url: CUrlValidator classning laqabi bo`lib, URL to`g`riligini ta`minlaydi.

Quyida biz validatorlarga oid bir qancha misollar ko`rsatamiz:

// name maydon — majburiy maydon
array('username', 'required'),
// foydalanuvchi nomining belgilari soni 3 va 12 orasida bo`lishi kerak.
array('username', 'length', 'min'=>3, 'max'=>12),
// «password» va «password2» maydonlari o`zaro teng bo`lishi kerak.
array('password', 'compare', 'compareAttribute'=>'password2', 'on'=>'register'),
// " password " maydonni ko`rsatilgan foydalanuvchi nomiga muvofiq kelishiga tekshirish, "authenticate " senariyasi bo`yicha.
array('password', 'authenticate', 'on'=>'login'),

Attribut belgilarini xavfsiz o`zlashtirish.

Yangi model nusxasi hosil qilgandan keyin, bizdan tezda to`ldirish talab qilinadi. Bu juda oson qilinadi, xuddi massivdaka o`zlashtirish orqali:

$model=new LoginForm;
if(isset($_POST['LoginForm']))
    $model->attributes=$_POST['LoginForm'];

Misoldagi oxirgi ifoda xuddi massivli o`zlashtirishdir.

Agarda xar bir model attributiga mos $_POST['LoginForm'] dan ma`lumot birma bir o`zlashtirmoqchi bo`lsangiz, unda quyidagicha ish qilasiz.

foreach($_POST['LoginForm'] as $name=>$value)
{
    if($name xavfsiz attribut hisoblanadi)
        $model->$name=$value;
}

Bunday holatda kelayotgan malumotlarni to`g`ridan to`g`ri jadvalga yozishda xatolik bo`lishi mumkin. Agarda biz jadvalimizni bir ustuni tashqi jadvaldagi ustun bilan bog`lansa unda bu jadvaldagi ustunni to`ldirish kerak bo`ladi, ya`ni null bo`lib qolmasligi kerak.

Xafvsiz attributlar tarifi.

Agar validatsiya qoidalaridan foydalanib quyidagi senariyni qo`llasak, attribut xavfsiz sanaladi.

array('username, password', 'required', 'on'=>'login, register'),
array('email', 'required', 'on'=>'register'),

Yuqoridagi kodda username va password login senariyasi uchun ishlatilayotgan attributlar.

username, password va email register senariyasi uchun ishlatilayotgan attributlar.

Login senariyasi uchun faqat username va password attributlari tekshiruvdan (validatsiyadan) o`tadi. Ya`ni bu kelayotgan attributlar (username va password) majburiy to`ldirilishi kerak bo`lgan maydonlar. Register senariyasi uchun email attributi ham majburiy maydon hisoblanadi.

// interface ga kirish senariyasi bo`yicha (login)
$model=new User('login');
if(isset($_POST['User']))
    $model->attributes=$_POST['User'];
// ro`yxatdan o`tish senariyasi bo`yicha (register)
$model=new User('register');
if(isset($_POST['User']))
    $model->attributes=$_POST['User'];

Nima uchun attributlarni xavfsiz yoki yo`qligini aniqlash uchun aynan shu qoidadan foydalanamiz? Agar biz attributga bir qancha validatsiya qoidalarni biriktirsak, nima uchun biz hotirjam bo`lmasligimiz kerak?

To`g`ri user tomondan kiritilayotgan ma`lumotlarni tekshirish uchun validatsiya qoidalarini tushunish biroz qiyin bo`lishi mumkin. Agar siz jadval yaratib, keyin model hosil qilsangiz model ruleslariga jadvalingizga mos validatsiya qoidalari avtomat biriktiriladi.

Bazan biz attributlarni xavfsiz e`lon qilishni hohlaymiz, buni qilish uchun xaqiqatda shu attributlar uchun xech qanday majburiy qoidalar biriktirilmagan bo`lishi kerak. Misol uchun text maydoni, foydalanuvchi tomonidan ixtiyoriy belgini olaveradi. Bu uchun quyidagi maxsus safe qoidasidan foydalanamiz.

array('content', 'safe')
Aniq ko`rsatilgan xavfsiz attributlar uchun unsafe qoidasi ham mavjud.
array('permission', 'unsafe')

Xavfsiz attributlarni avvaldan aniqlashda biz unsafe dan kamdan kam foydalanamiz.Chunki keyinchalik bizga bu halaqit qilishi ham mimkin.

Tekshirishni amalga oshirish.

Foydalanuvchi tomonidan kiritilayotgan ma`lumotlar bilan modelni to`ldirishimiz kerak, tekshiruvni amalga oshiaryotganimizda CModel::validate() metodiga murojaat qilishimiz mumkin. Biz bu ishni amalga oshirganimizdan keyin metod false yoki true natija qaytaradi.CActiveRecord modeli uchun tekshiruvni amalga oshirayotganingizda to`g`ridan to`g`ri CActiveRecord::save() metodiga ham murojaat qilishingiz mumkin.

Tekshiruv uchun qaysidir to`plam qoidasi bajarilishini scenario xossasi orqali berishimiz mumkin.

Tekshiruv amalga oshayotganda qaysi xossa biriktirilgan bo`lsa o`shanga qaram bo`ladi.Ya`ni o`sha qoidalar to`plami bo`yicha bajariladi.

Qaysi validatsiya qoidalari to`plami amalga oshirish uchun biz modelning scenario xossasidan foydalanamiz.

Misol uchun: foydalanuvchining faqatgina username va password maydonlari uchun validatsiya ishlatmoqchi bo`lsak unda login senariyasidan foydalanamiz. Agar biz qo`shimcha maydonlarni ham validatsiyadan o`tkazmoqchi bo`lsak (misol uchun: mail, address kabilar ) unda register senariyasidan foydalanamiz. Agar biz register senariyasiga shu maydonlar uchun qoidalar biriktirgan bo`lsak.

Register senariysi uchun qanday ko`rsatilishini quyida ko`rsatib o`tganamiz.

// Bu yerda User degan model yaratmoqdamiz va register senariyasini o`rnatmoqdamiz. 
 //$model=new User;
 //$model->scenario='register';
 
$model=new User('register');
 
// modelga ma`lumotlarni to`ldirish 
$model->attributes=$_POST['User'];
// tekshiruvni amalga oshirish
if($model->validate())   // agar xaqiqat bo`lsa
    …
else
    …

 public function rules()
{
    return array(
        array('username, password', 'required'),
        array('password_repeat', 'required', 'on'=>'register'),
        array('password', 'compare', 'on'=>'register'),
    );
}

Birinchidagi qoida ixtiyoriy joyda username va password uchun ishlayveradi. Oxirgi ikkita qoida faqat register senariyasi ishlatganimizda ishlaydi.

Xatolar haqida ma`lumot berish.

Tekshiruvdan (validate) keyin model obyektida xamma xatolarni topish mumkin. Biz ularni CModel::getErrors() vaCModel::getError() orqali olishimiz mumkin. Birinchi metod modeldagi ko`rsatilagan attribut uchun xamma xatoliklarni ko`rsatadi, ikkinchisi esa faqat birinchi xatoni ko`rsatadi.

Tekshirish amalga oshayotgan vaqtda qandaydir xato bor yo`qligini CModel::hasErrors() metodi orqali bilishiz mumkin. Bunda bu metod true yoki false qaytaradi. Agarda xatolik bor bo`lsa, xatolikni olish imkoniyatini CModel::hasErrors() metodidan foydalanish mumkin.

Attributlar belgisi.

Formalar bilan ishlaganingizda xar bir maydon uchun uning nomi aks etishini talab qiladi. Shunda bizga u qaysi maydonlarni to`ldirayotganimizni bilishimiz uchun kerak bo`ladi. Ya`ni xar bir maydon uchun shunga mos maydon nomini ko`rsatadi. Buni biz ham berishimiz mumkin lekin avtomatik modelda o`zi nomlab qo`yadi. Nomlarni o`zgartirish uchun attributeLabels() metodidan foydalanamiz. Bu metod modelda joylashgan boladi.

Manba:


JONNY

Muallif haqida

JONNY Arduino, Java, C#, Android, Windows, Linux, Debian, Javascript.


Blogdagi so‘nggi maqolalar:


Birinchi bo‘ling!

Iltimos, fikr bildirish uchun saytga kiring yoki ro‘yxatdan o‘ting!