spájame
slovenskú
IT komunitu
pridaj sa
Registrácia · Login

Matúš Koprda 21.12.2010, článok je súčasťou seriálu Ako sa stať PHP ninja s Yii Frameworkom
Hodnoť článok:
2 0

Ako sa stať PHP ninja s Yii Frameworkom (2)

V predchádzajúcej lekcii sme si povedali ako rýchlo sa dá vygenerovať základ aplikácie. Ako z neho spraviť niečo užitočné a ako funguje MVC v Yii frameworku si povieme v tomto tutoriále.

« Predchádzajúci diel

Ako vytvárať vlastné aplikácie a ako funguje Yii si ukážeme na jednoduchom príklade systému, v ktorom evidujeme jeho používateľov a chceme ich vedieť pridávať, mazať, editovať a vypísať ich v zozname. Aby to bolo kompletnejšie, každý používateľ bude mať v systéme svoju rolu, na základe ktorej bude mať oprávnenia vykonávať činnosti, heslá budeme ukladať hashované a vo formulároch používať jQuery UI widgety.

Nezľaknite sa dĺžky, väčšina kódu je vygenerovaného a v podstate treba prepísať len pár riadkov. Na pochopenie stačí vedieť čo je MVC a že Yii je PHP framework. ;)

Budeme vychádzať toho, že máte vytvorenú prázdnu aplikáciu ako sme si ukázali v predchádzajúcom návode. Ak nemáte, stačí stiahnuť a rozbaliť Yii (http://www.yiiframework.com/download/), v príkazovom riadku spustiť:

cd "C:\Program Files\wamp\www"
"C:\Program Files\wamp\bin\php\php5.3.0\php.exe" yii/framework/yiic.php webapp .

a v nastaveniach (protected/config/main.php) zapnúť generátor kódu Gii plus nastaviť pripojenie do databázy. (alebo si rovno stiahnuť vzorový config súbor)

Začneme databázou, ktorá tvorí jadro každej webovej aplikácie a na základe ktorej si môžete vygenerovať hotový kód namiesto nudného ručného písania.


Tu si stiahnete SQL kód tabuliek, ktoré budeme používať: pouzivatelia+role.sql

Po naimportovaní databázy môžeme vygenerovať modely pre tabuľku s používateľmi a tabuľku s rolami. V Gii (http://localhost/?r=gii - heslo sa nastavuje v konfiguračnom súbore) spustite generátor modelov, napíšte názov tabuľky a kliknite na preview a generate (pre obe tabuľky). Podobne pre ne vygenerujte aj CRUD.

Naším cieľom bude trocha učesať vygenerovaný kód - napríklad aby sa na zozname používateľov (http://localhost/index.php?r=user/admin) nezobrazoval hash hesiel, aby sme videli názov role namiesto jej IDčka, pridáme Datepicker na vyberanie dátumu, dropdown na stav konta a zabezpečíme, aby sa automaticky ukladal hash hesla.

Model používateľa

Ako prvý upravíme model používateľa - protected/models/User.php. V ňom bude síce najviac roboty, ale potom ho môžeme všade veselo používať s minimom námahy.

class User extends CActiveRecord {
Model odvodzujeme od triedy CActiveRecord, čo znamená, že ho chceme prepojiť s tabuľkou v databáze a tiež, že sme (ako správni programátori) leniví a nechceme sa obťažovať písaním SQL (pokiaľ to nie je nutné).
protected $_oldPassword;
Tu sa bude uchovávať staré heslo - vrátime za k tomu za chvíľku..
public static function model($className=__CLASS__) { return parent::model($className); } public function tableName() { return 'user'; }
Statická metóda model() vracia nový model danej triedy, čo predstavuje takú výhodu, že môžete napísať User::model()->findAll() a s minimom námahy dostanete zoznam všetkých používateľov. PHP totiž nesparsuje niečo ako new User()->findall(). tableName() vracia iba meno tabuľky, ktorú model reprezentuje. Ak by ste zmenili názov tabuľky v DB, treba ho update-núť aj tu.
public function rules() { $rules = array( array('id_role, email, password, name, member_since', 'required'), array('id_role', 'in', 'range'=>array_keys(CHtml::listData(Role::model()->findAll(), 'id', 'name')), 'allowEmpty'=>false), array('status', 'in', 'range'=>array('blocked', 'active'), 'allowEmpty'=>false), array('email', 'email'), array('email, password, name', 'length', 'max'=>32), array('id, id_role, email, password, name, member_since, status', 'safe', 'on'=>'search'), ); if ($this->getIsNewRecord()) $rules[] = array('password', 'required'); return $rules; }
rules() obsahuje zoznam pravidiel podľa ktorých sa pri ukladaní do databázy overí, či sú dáta v poriadku. Validáciu má teda na starosti model. S overovaním sa nemusíte obmedzovať iba na dáta vkladané do databázy, kľudne si môžete vytvoriť model pre formulár (ako je to aj vo vzorovom kontaktnom formulári). V tejto metóde som použil iba pravidlá required (políčko musí byť vyplnené), in (obsah políčka nesmie mať inú hodnotu ako zoznam, ktorý poskytneme), email a length (dĺžkové obmedzenie - môžete použiť aj 'min', 'is' alebo kombináciu 'min'=>2, 'max'=>5). Kompletný zoznam pravidiel nájdete tu. Tiež si môžete vytvárať vlastné vo formáte: array('name', 'mojaMetoda'), kde mojaMetoda by bola metóda v danom modeli. Aby nejaký beťár nemohol vybrať neexistujúcu rolu, pomocou validátoru "in" zistíme, či sa vybraná rola nachádza v tabuľke. Role načítame z ich modelu a CHtml::listData z nich vytvorí pole formátované ako 'id' => 'nazov role', ktoré použije validátor "in". Na záver sa pridá požiadavka na heslo LEN ak vytvárame nového používateľa - pri existujúcich predpokladáme, že keď nechajú prázdne políčko, nechcú nič meniť.
public function relations() { return array( 'role' => array(self::BELONGS_TO, 'Role', 'id_role'), ); }
V metóde relations definujeme vzťahy k iným tabuľkám. Na čo je to dobré? Aby sme mohli jednoducho pristupovať k súvisiacim tabuľkám - v tomto konkrétnom prípade môžete zavolať $this->role->name a získate názov role používateľa namiesto obyčajného IDčka. Zoznam dostupných vzťahov je vypísaný v manuále.
public function attributeLabels() { return array( 'id' => 'ID', 'id_role' => 'Role', 'email' => 'Email', 'password' => 'Password', 'name' => 'Name', 'member_since' => 'Member Since', 'status' => 'Status', ); }
Tu sa definujú názvy jednotlivých stĺpcov, ktoré sa budú zobrazovať vo formulároch a v tabuľkovom zozname - predbežne som nechal pôvodné anglické, aby sme si nabudúce mohli ukázať ako sa robí viacjazyčná stránka. :) Pokiaľ robíte iba jednojazyčnú aplikáciu, kľudne ich môžete poprepisovať priamo na tomto mieste.
public function search() { $criteria=new CDbCriteria; $criteria->compare('id',$this->id); $criteria->compare('id_role',$this->id_role); $criteria->compare('email',$this->email,true); $criteria->compare('password',$this->password,true); $criteria->compare('name',$this->name,true); $criteria->compare('member_since',$this->member_since,true); $criteria->compare('status',$this->status,true); return new CActiveDataProvider(get_class($this), array( 'criteria'=>$criteria, )); }
Vyhľadávacia funkcia vracia "data providera" (ten poskytuje údaje, triedi ich a stránkuje), do ktorého dávame kritériá pre vyhľadávanie. Kritériá sa zadávajú mierne obskúrnym spôsobom a to tak, že pridáte všetky a tie, ktoré majú hodnotu NULL sa odignorujú. Vďaka tomuto systému zostáva kód prehľadný a ľahko môžete vyhľadávať podľa ľubovoľne veľa kritérií naraz. T.j. aj podľa žiadneho, kedy sa vrátia všetky záznamy. Hodnota true na konci compare() znamená, že chceme hľadať všetky záznamy obsahujúce danú hodnotu (LIKE '%hodnota%'). Pri false by sa naopak hľadala iba exaktná hodnota ( = 'hodnota').
protected function getHash($password) { return md5("sem dajte vlastny nahodny string" . $password); }
Generátor hash-u hesla. Kvôli bezpečnosti hashujeme heslá a ako ďalšiu ochranu pridáme salt, čo je náš tajný reťazec znakov, vďaka ktorému sa heslo už vôbec nedá spätne zistiť.
function afterFind() { if ($this->member_since == '0000-00-00') $this->member_since = ''; else $this->member_since = date("j.n.Y", strtotime($this->member_since)); $this->_oldPassword = $this->password; $this->password = ''; return parent::afterFind(); } function beforeSave() { if (strtotime($this->member_since)) $this->member_since = date("Y-m-d", strtotime($this->member_since)); else $this->member_since = '0000-00-00'; if (!$this->password) $this->password = $this->_oldPassword; else if ($this->_oldPassword != $this->password) $this->password = $this->getHash($this->password); return parent::beforeSave(); }
V týchto metódach transformujeme údaje po načítaní z databázy a pred zápisom do nej. Konkrétne nám ide o to, aby sa používateľovi zobrazoval pekne naformátovaný dátum (v tvare 23.12.2010, prípadne prázdny namiesto defaultného 0000-00-00) a do databázy ukladal vo formáte aký pozná SQL. Heslo si po načítaní odložíme (do premennej spomenutej úplne na začiatku) a pri ukladaní skontrolujeme, či ho používateľ zmenil. Ak áno, zakódujeme ho hashovacou funkciou; ak nie, vrátime naspäť pôvodné heslo.
}

Tak a máme celkom slušný model používateľa, ktorý sa nenechá len tak ľahko ojebabrať a vyhľadáva všetko možné! :)
Model pre role je v poriadku už tak, ako bol vygenerovaný, takže môžeme prejsť na view-y.

View - Zoznam používateľov

Triediteľný zoznam používateľov je asi najpodstatnejšou obrazovkou v našej aplikácii, takže si ho z view-ov rozoberieme ako prvý -

<?php
$this->breadcrumbs=array(
	'Users'=>array('index'),
	'Manage',
);
Obľúbená "omrvinková navigácia™" (inak breadcrumb;) sa nastavuje pomocou obyčajného asociatívneho poľa. Kľúče poľa predstavujú názvy linkov a hodnoty sú zase cestami (pozor, musia byť obalené v poli, inak by boli brané ako absolútne URL).
$this->menu=array( array('label'=>'Create User', 'url'=>array('create')), ); ?>
Menu je položka definovaná v layoute (rozmiestnení stránky). Ako uvidíte ďalej, controller je nastavený tak, že má použiť layout s bočným menu, ktorý sa nachádza v protected/views/layouts/column2.php. Ten generuje menu pomocou widgetu CPortlet. Oproti vygenerovanému kódu tu chýba advanced search. Odstránil som ho preto, že neposkytuje nič navyše oproti normálnemu vyhľadávaniu, akurát zaberá miesto.
<h1>Manage Users</h1> <?php $this->widget('zii.widgets.grid.CGridView', array(
CGridView je widget generujúci tabuľku s triediteľnými stĺpcami.
'id'=>'user-grid', 'dataProvider'=>$model->with('role')->search(), 'filter'=>$model,
Nastavili sme id (obyčajný atribút HTML); ako poskytovateľa údajov použijeme vyhľadávaciu funkciu modelu a filtre sa vytiahnu takisto z modelu (to sú, zjednodušene povedané, vyhľadávacie políčka na vrchu tabuľky). Všimnite si, že pred search som dal ešte metódu "with". Tak sa zabezpečí, aby sa na začiatku vykonal JOIN s tabuľkou rolí a nemuselo sa meno role vyťahovať z databázy zvlášť pre každého používateľa. Toto sa v manuále bohvie prečo vôbec nespomína.
'columns'=>array( 'id', array( 'name'=>'id_role', 'filter'=>CHtml::listData(Role::model()->findAll(), 'id','name'), // tu chceme dropdown 'value'=>'$data->role->name', ), array( 'name'=>'email', 'type'=>'email', ), //'password', 'name', 'member_since', array( 'name'=>'status', 'filter'=>array('active'=>'Active', 'blocked'=>'Blocked'), // aj tu chceme dropdown ), array( 'class'=>'CButtonColumn', ),
Tu si vyberáte ktoré stĺpce sa majú zobraziť a AKO sa majú zobraziť. Na základné zobrazenie stačí napísať meno stĺpca (prípadne dlhší zápis array('name'=>'nazov_stlpca') ) a pokiaľ máte špeciálne požiadavky, pripíšete ich do poľa - v tomto príklade som použil: Filter - mení vyhľadávací box na dropdown s možnosťami, value - s ním môžete presne formátovať hodnotu (string, ktorý uvediete sa eval-ne a máte v ňom k dispozícií premennú $data, ktorá obsahuje model s údajmi aktuálneho riadku) a type - mení druh stĺpca (text - filtrovaný text, raw - nefiltrované HTML, email - podčiarknutý email, atď.). Posledný stĺpec nemá meno, keďže to je špeciálny druh stĺpca s tlačidlami. Kľudne si taký môžete spraviť aj vy, ale obávam sa, že to je na ďalší tutoriál. :)
), )); ?>

View - Formulár

V súbore protected/views/user/_form.php nájdete formulár, ktorý slúži na editovanie ako aj vytváranie nových používateľov. Formulár je v podstate "pod-view" a sa vykresľuje iba z iných view-ov. Keďže v ňom máme dátum, zišiel by sa naň kalendárik a výber role a stavu konta si tiež pýtaju dropdowny, tak ich tam pekne pridáme.

<?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'user-form', 'enableAjaxValidation'=>false, )); ?> <p class="note">Fields with <span class="required">*</span> are required.</p> <?php echo $form->errorSummary($model); ?> <div class="row"> <?php echo $form->labelEx($model,'id_role'); ?> <?php echo $form->dropDownList( $model,'id_role', CHtml::listData(Role::model()->findAll(), 'id', 'name'), array('' => '') ); ?> <?php echo $form->error($model,'id_role'); ?> </div>
Dropdown naplníme z tabuľky rolí, podobne ako v predchádzajúcich prípadoch. Ako posledný atribút dropDownListu môžete použiť zaužívaný prázdny prvok ako napríklad "Vyberte rolu..." prípadne prázdny string.
<div class="row"> <?php echo $form->labelEx($model,'email'); ?> <?php echo $form->textField($model,'email',array('size'=>32,'maxlength'=>32)); ?> <?php echo $form->error($model,'email'); ?> </div> <div class="row"> <?php echo $form->labelEx($model,'password'); ?> <?php echo $form->passwordField($model,'password',array('size'=>32,'maxlength'=>32)); ?> <?php echo $form->error($model,'password'); ?> </div> <div class="row"> <?php echo $form->labelEx($model,'name'); ?> <?php echo $form->textField($model,'name',array('size'=>32,'maxlength'=>32)); ?> <?php echo $form->error($model,'name'); ?> </div> <div class="row"> <?php echo $form->labelEx($model,'member_since'); ?> <?php echo $this->widget('zii.widgets.jui.CJuiDatePicker', array('model'=>$model, 'attribute'=>'member_since', 'options'=>array('dateFormat'=>'dd.mm.yy')), true) ?> <?php echo $form->error($model,'member_since'); ?> </div>
Na výber dátumu použijeme klasický jQuery UI DatePicker. Okrem formátu dátumu sa prakticky o nič netreba starať a ešte aj potrebné Javascripty načíta Yii samé. Tu by sa možno zišlo spomenúť, že pokiaľ budete potrebovať na nejakej stránke jQuery, musíte zavolať Yii::app()->clientScript->registerCoreScript('jquery');. Widgety ho načítajú automaticky.
<div class="row"> <?php echo $form->labelEx($model,'status'); ?> <?php echo $form->dropDownList($model, 'status', array(''=>'', 'active'=>'Active', 'blocked'=>'Blocked')); ?> <?php echo $form->error($model,'status'); ?> </div> <div class="row buttons"> <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?> </div> <?php $this->endWidget(); ?> </div><!-- form -->

Controller

A nakoniec controller, ktorý dáva dokopy všetky veci, s ktorými sme sa doteraz babrali. Pre istotu pripomeniem, že controller, ktorý sa spustí a akcia, ktorá sa v ňom zavolá, sa vyberá podľa URL. To znamená, že ak by sme mali adresu http://localhost/index.php?r=user/create, zavolal by sa controller UserController a spustila by sa akcia actionCreate().

class UserController extends Controller {

public $layout='//layouts/column2';
Dve lomítka na začiatku znamenajú, že view sa má hľadať z adresára protected/views, inak by sa hľadal z protected/views/user !
public function filters() { return array('accessControl'); }
Filter, ktorý sa má použiť. Dostupné sú horeuvedený accessControl, ajaxOnly a postOnly. AccessControl kontroluje práva používateľa (popísané pri funkcii nižšie), ajax a postOnly prepúšťajú iba ajax/post požiadavky.
public function accessRules() { return array( array('allow', 'actions'=>array('index','view','create','update','delete'), 'users'=>array('@'), ), array('deny', // deny all users 'users'=>array('*'), ), ); }
Tu môžeme definovať prístupové práva používateľov pre jednotlivé akcie alebo celý controller. Pravidlá som oproti pôvodným mierne upravil a zjednodušil - prvé pravidlo umožnuje prístup k uvedeným akciám všetkým prihláseným používateľom (@ - prihlásený, ? - neprihlásený, * - ktokoľvek). Okrem stavu prihlásania sa dajú používatelia filtrovať aj podľa rolí (preto sme ich v tomto tutoriále toľko riešili), ale o nich si povieme až nabudúce. ^^ Pravidlá fungujú tak, že akonáhle používateľ pod nejaké spadá, ostatné sa prestanú vyhodnocovať. Ak by nevyhovoval žiadnemu, bol by mu prístup povolený. A to je dôvod prečo je druhé pravidlo 'deny' pre všetkých - aby sme iných ako (prvým pravidlom) oprávnených používateľov zablokovali.
public function actionView($id) { $this->render('view', array('model'=>$this->loadModel($id)) ); }
Vykreslí view protected/views/user/view.php. Tu si dovolím malú poznámku, že Yii nedodržuje úplne striktné MVC, kde by sa nemohol dávať do view-u model ako parameter. Osobne mi tento štýl ale vyhovuje a zdá sa, že nestráca ani na prehľadnosti.
public function actionCreate() { $model=new User; if(isset($_POST['User'])) { $model->attributes=$_POST['User']; if($model->save()) $this->redirect(array('view','id'=>$model->id)); } $this->render('create',array('model'=>$model)); } public function actionUpdate($id) { $model=$this->loadModel($id); if(isset($_POST['User'])) { $model->attributes=$_POST['User']; if($model->save()) $this->redirect(array('view','id'=>$model->id)); } $this->render('update',array('model'=>$model)); }
Všimnite si, že kód pre vytváranie a editovanie je skoro identický - líši sa prakticky iba inými parametrami modelu. Takto má vyzerať správne recyklovanie kódu. :)
public function actionDelete($id) { if(Yii::app()->request->isPostRequest) { $this->loadModel($id)->delete(); if(!isset($_GET['ajax'])) $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin')); } else throw new CHttpException(400,'Invalid request. Please do not repeat this request again.'); } /*public function actionIndex() { $dataProvider=new CActiveDataProvider('User'); $this->render('index', array('dataProvider'=>$dataProvider)); }*/ public function actionIndex() { $model=new User('search'); $model->unsetAttributes(); // clear any default values if(isset($_GET['User'])) $model->attributes=$_GET['User']; $this->render('admin', array('model'=>$model)); }
Pôvodnú akciu "index", ktorá zobrazuje čudný zoznam, som zakomentoval a nahradil ju pohľadom s tabuľkou, kedže mi príde oveľa praktickejší, ako som spomínal už v prvom Yii tutoriále.
public function loadModel($id) { $model=User::model()->findByPk((int)$id); if($model===null) throw new CHttpException(404,'The requested page does not exist.'); return $model; }
Pri načítavaní modelu sa používa táto funkcia, ktorá zabezpečí, že sa vygeneruje error 404, ak používateľ s daným ID neexistuje.
}

Download tejto aplikácie:

Komplet celú aplikáciu (vrátane Yii) si môžete stiahnuť tu [RAR].

Ďalším fajn zdrojom informácií je demo aplikácia priložená k Yii (nájdete ju v yii/demos/blog).

V najbližších tutoriáloch dorobíme prihlasovanie a prístup používateľov podľa rolí a povieme si ako na lokalizáciu/internacionalizáciu - asi ste si všimli, že všetky texty v aplikácii boli zatiaľ len po anglicky, čo je v týchto končinách nie tak celkom vyhovujúce. :)

Yii Achievement Unlocked:

Každopádne, ak ste sa dostali až sem, získavate:
Yii Achievements

Ďalšie časti seriálu Ako sa stať PHP ninja s Yii Frameworkom nájdeš tu:
dev > Yii

P.S.: Ak sa ti tento framework zdá veľmi zložitý, pozri si naše video lekcie k frameworku CodeIgniter na Zajtra.sk.
Matúš Koprda Matúš Koprda

Momentálne robím internety a keď budem veľký, snáď sa dostanem aj k hrám alebo niečomu zmysluplnému. :) Mám rád minimalizmus, obskúrnu hudbu, všetko geeky a rýpanie sa v detailoch. Ďalšie kecy odo mňa nájdeš na brm.sk a na Twitteri @blade_sk.


Hodnoť článok:
2 0

6 komentárov k článku:

Komentovať môžu iba prihlásení

Zaregistruj sa cez bezplatnú registráciu alebo použi login cez Facebook (FB Connect)

Prihlás sa tu, ak už máš profil na Zajtra.sk:


Zabudol som heslo

0 0 Martin 5.12.2013 20:52:15
Super serial, ale už nefungujú linky na súbory :(((
0 0 Jana Mičeková 17.2.2012 10:53:12
Toto je skvelý seriál, asi aj vďaka nemu som sa nakoniec rozhodla pre yii a pomaly sa trápim. V tomto konkrétnom článku mi chýba blokovanie vymazania role, ak je použitá v users - existuje viac možností ako napísať metódu beforedelete a mňa by zaujímala tá správna pre yii.
Ďalej mi tu chýbala ukážka ako správne urobiť prepnutie z jednej tabuľky do druhej (v role kliknem na trainer a chcem aby sa mi zobrazili príslušní užívatelia) - potrebovala som to pri ľavom menu ťahanom z databázy, kde každá položka volá model s iným parametrom. Zase existuje niekoľko riešení, nie všetky fungovali, ale poradila som si. Len by ma zaujímalo, ako sa to má robiť správne s max. využitím toho, čo yii ponúka.
Jeduje ma, že mi IE nesprávne zobrazuje zii.widgets.grid.CGridView - overila som to aj na 6 deme z tohto seriálu, robí to to isté - a zatiaľ neviem, čo s tým.
Vynikajúca práca, kiežby takých bolo viac. Dokonca aj tie anglické väčšinou skončia pri vytvorení aplikácie a MVC.
0 0 Trz Ztr (fb) 3.1.2011 00:00:00
Ještě bych měl jeden dotaz. Jak to vidíš s frekvencí tutoriálů Yii? Protože na internetu moc tutoriálů není a tak váhám zda nebude lepší přejít na nějaký jiný FW např. KO3. Yii se mi líbí svou rychlostí a strukturou atd. ovšem nedostatek dokumentace/tutoriálů mě stále více odrazuje. Díky za info.
0 0 Matúš Koprda (fb) 29.12.2010 00:00:00
Chcel som sa venovať radšej "problematickejším" (alebo zle zdokumentovaným) častiam ako celej aplikácii, aby som zbytočne nevysvetľoval to, čo už všetci pravdepodobne vedia. Ak by si chcel, tu http://www.yiiframework.com/doc/blog/ je návod ako vytvoriť blog, ktorý je v demo aplikáciách Yii.

CGridView je ako hotový widget, z ktorého si môžeš odvodzovať vlastné modifikácie - napríklad MojUplneVybornyGridView extends CGridView { ... }, kde si už môžeš poriešiť stránkovanie alebo čokoľvek.

Čo sa týka AppControllera, podobná trieda (Controller) je vytvorená v protected/components/Controller.php . Mimochodom do tohoto adresára sa dávajú všetky rozšírenia tried, čiže aj ten vlastný GridView.

CActiveDataProvider, resp jeho rodič CDataProvider je taká obaľovacia trieda, ktorá obsahuje CPagination, model a nejaké funkcie navyše (napr. na triedenie), takže by mala poskytovať zjednodušený prístup ku všetkému. Ale možno si sa pýtal na konkrétne príkazy.

Článok o auth práve píšem a rozhodne mám v pláne rozobrať aj vytváranie modulov a iné záležitosti, s ktorými sa v praxi stretáme.

Inak dík za konštruktívne otázky, ak by ste chceli čítať o nejakej konkrétnej problematike, sem s tým :)
0 0 Trz Ztr (fb) 28.12.2010 00:00:00
Zdravim, rozhodl jsem se také pustit do zkoumání tohoto FW.
Články jsou super, ale radši bych místo úprav uvítal např. návrh a realizaci konkrétní aplikace.
- např. vytovoříme si vlastní malý portál (novinky, galerie, vlastní administrace, atd.)

Také bych uvítal konkrétní rady které v guide nenajdeme.
- např jsem teď řešil jak vypnout AJAX u CActiveProvideru resp. CGridView
- jak dostat stránkování i nahoru u CGridView ()
- jaký je rozdíl mezi získáním dat CPagination(CDbCriteria) vs. CActiveDataProvider
- je nějaký APP_controller jako je v Cakephp?
- existuje nějaký prefix pro administraci (v Cakephp je to např. v konfiguraci, stačí nastavit a je oddělená administrace od frontEndu)
- jak na vlastní Auth/Jakékoliv Moduly
- ...

Omlouvám se za tyto trapné dotazy, ale myslím že tyhle základní věci bude řešit více lidí, kteří s tímto fw budou začínat. A ve srovnání s Cakephp je dokumentace o dost horší a tyto základní věci je nutné hledat ve fóru/googlu. Cakephp je v tomto sice super, niméně rychlost tohoto fw je opravdu ohromná´.
0 0 Juraj Bencúr (fb) 22.12.2010 00:00:00
Teším sa na ďalší diel :)
Zajtra.sk > Programovanie > PHP > Ako sa stať PHP ninja s Yii Frameworkom (2)


Kritika

Vieš ako robiť veci lepšie? Pomôž našim odvážnejším členom a skritizuj im projekty!

Reklama

Seriály zo Zajtra.sk

Reklama