Tuesday, December 28, 2010

Auto TDD avagy PHPUnit magától

Ez a kis tipp nemcsak Yii fejlesztőknek ajánlott, hanem akárkinek aki a PHPUnit-ot használ Linux-os környezetben. (elvileg Apple-lel is működnie kell, de nem próbáltam!) -- Javítás: NEM MŰKÖDIK Apple-lel!

A következő egyszerű utasítással 15 másodpercenként lefuttathatjuk egységtesztjeinket. (protected/tests)

watch -n 15 -d phpunit unit/
Az én képernyőm valahogy így néz ki (bal sarokban fut a teszt!)


Katt nagyobb képhez!

Nagyobb tesztek esetén persze lehet finomítani, hogy csak 1 teszt file fusson .., stb.

Az eredeti cikk itt található: http://www.yiiframework.com/wiki/124/auto-tdd-how-to-auto-run-phpunit/

Tuesday, December 21, 2010

A ChromePHP használata Yii alatt

Ha valakinek valamilyen oknál fogva nem tetszene a Yii által kínált naplózási (logging) rendszer, annak jól jöhet ez a kis kiegészítő. Kifejezetten a Chrome böngészőre készült és ChromePHP a neve.

Először is installáljuk a magát a ChromePHP kiegészítőt a böngészőnkre innen. Majd töltsük le a ChromePHP osztályt és másoljuk be a ZIP tartalmát a protected/vendors alá. Miután ezzel megvagyunk, módosítsuk a konfigurációs file-unkat (protected/config/main.php)



És készen is lennénk. A Log (bejegyzés), Warning (figyelmeztetés) és Error (hiba) utasításokat pedig a következő képpen futtathatjuk:

  • ChromePHP::log('Hello Virág!');
  • ChromePHP::warn('Figyelmeztetés!');
  • ChromePHP::err('Hiba!');


Jó naplózgatást ;)

Az eredeti cikket itt olvashatjátok: http://www.yiiframework.com/wiki/119/chromephp-for-yii/

ui: persze csak fejlesztés közben ajánlatos használni!

Tuesday, December 14, 2010

Yii Radiio 37. adás

Idei utolsó (37.) adásunk, valamikor Január közepe-vége fele jövünk vissza, az 1.1.6-os változat megjelenése után.

Nagyon szépen köszönjük minden hallgatónknak, hogy havonta kétszer figyelmet és időt szentelnek a műsornak, külön köszönet a magyar Larry Hangman zenekarnak, akik a műsor zenéjét "kölcsönözték" nekünk.

Ezen kívül természetesen a Yii keretrendszer fejlesztőinek és szponzorainknak jár köszönet, akik nélkül nem lenne ilyen sikeres a műsor.

Szponzorunk ebben a hónapban az Ext4Yii, akik az ExtJS modul segítségével a Yii rendszert a "nagycéges-fellegek" közé segítik.

Nos, tehát, namégegyszer:

Simon Fraser élményei a és csalódásai avagy CodeIgniter a Yii ellen.

MongoDB-ről már jónéhányszor esett szó, ez egy újabb, talán a legkiforrottabb, kiegészítő a Yii-hez, Canni által, YiiMongoDBSuite.

Jeffrey Winesett újabb videója, a klasszikus "Hello World!" megvalósítása.

TipsTank mutatja be, hogyan gyorsítsuk fel HTML és CSS kódolási technikánkat a PHaml segítségével.

Megjelent az Ext4Yii 0.7-es verziója.

8 szakember véleménye (jó és rossz!) a PHP-ről általában.

Ugye milyen jó lenne, ha minden böngészővel lehetne HTML5 tag-eket (audio, video) használni? Na, most már lehet: http://mediaelementjs.com

A hét oldalahttp://www.realself.com.

Na, és talán a legizgalmasabb dolog ami történt az elmúlt két hétben (szintén a hét oldalával kapcsolatos) ... 1.5 millió látogató egy hónap alatt, avagy 7 indok, miért váltsunk Drupal-ról Yii-re, Eric Kennedy-től.

Jó olvasgatást, és kellemes Ünnepeket :)

--
http://yiiradiio.mehesz.net

Tuesday, December 7, 2010

Felhasználó kezelés a Yii-User modullal

Alap esetben Yii egy olyan felhasználó (user) rendszerrel lát el bennünket, amit éles helyzetben nem nagyon ajánlatos használni. (pl.: felhasználónév = jelszó). (Persze ez csak példaként van a rendszerben)

Ha szeretnénk valami komolyabb, biztonságosabb és adatbázissal támogatott megoldást használni, kétféle lehetőségünk van. Vagy magunk írjuk meg a szükséges kódot, vagy letöltünk egy modult. Ebben az írásban a Yii User modult szeretném ismertetni. (Tudom, hogy van egy másik Yii User Management, de Yii User-nek nemrég jött ki egy újabb verziója Mishamx klaviatúrájából. Ja, és még egy remek kis logója is van ;) )

A modul segítségével felhasználóink regisztrálását és kezelését könnyíthetjük meg. Jelenleg a következő funkciók támogatottak:


  • Felhasználó beléptetése email-lel vagy névvel
  • Registráció
  • Felhasználói fiók aktiválással (email-en keresztül)
  • Saját felhasználói oldal (profile page)
  • Adminisztrátorkodás
  • Mezők kezelése a felhasználói form-on
  • Popup Dátum kezelő widget (jQueryUI datepicker-rel)
  • File feltöltő widget
  • Felhasználók kapcsolatai widget
  • API

Installálás

Csomagoljuk ki a letöltött file-t az <project>/protected mappába.

Állítsuk be a modult a config/main.php file-ban a következő képpen:



Beállítások

Az adatbázisunkban készítsük el a modulhoz szükséges táblákat. (a dump file-ok segítségével: schema.mysql.sql és schema.sqlite.sql)

És végül változtassuk meg a menüt a protected/views/layouts/main.php file-ban:



A részletes leírást és a paraméterek listáját itt találjátok: http://code.google.com/p/yii-user/w/list

Az eredeti oldalt pedig itt: http://www.yiiframework.com/extension/yii-user/

Tuesday, November 30, 2010

Yii Radiio 36. adás

Bob Belderbos mondja el saját szavaival, hogy miért is tetszik neki a Yii ennyire.

Talán egy éve már, hogy említettük a Chive-ot, ami a PHPMyAdmin-t próbálja letaszítani a MySQL-kezelőfelületek trónjáról, persze mindenki döntse el saját maga. Nemrég jelent meg a 0.4-es változat, ha másért nem is, azért érdemes kipróbálni, mivel Yii-fel készült.

A ScrollingNews segítségével készíthetünk jQuery-vel hajtott tartalom lapozgató finomságokat.

Aztech próbálkozik egy új(abb) fajta SPAM megelőzéssel, illetve az ötlet nem új, de Yii alá most került ilyesmi először. (megj: én mondjuk személy szerint a ReCaptcha-t használgatom, viszont ehhez nem kell semmit betölteni.)

A Free Open Source Magazine-ban jelent meg egy cikk a Yii-ről.

Ryan Lahue megoldása a "{Model} cannot be blank" hiba üzenetre.

Jeff Winesett, a Yii könyv írója, indított útjára egy VIMEO sorozatot: 1. rész, Előkészületek.

Larry Ullman neve már remélem sokaknak ismerősen cseng, a kezdőknek szánt sorozata egyre népszerűbb a Yii-t használó programozók táborában. Gyakran kérdezgetik is, miért éppen a Yii-t használja. Most végre elmonta :) (megj: a kedvencem - "A keretrendszerek olyanok mint az autók. Mindegyikkel eljutsz ahová menni akarsz, csak az a kérdés, melyikben érzed jól magad.")

Végre sikerült az OpenSearch kereső alkalmazást a yiiframework.com-ra "telepíteni". Ez annyit jelent, hogy egyszerűen a böngészőnkből kereshetünk Yii oldalon található dolgokat.

WebEnabled támogatja a Yii-t (1.1.5).  Az oldal segítségével néhány klikkolással készíthetünk Yii alapokra épülő alkalmazást, SVN forráskezelővel (a Git az úton van), SSH hozzáféréssel és egy linkel, amit a felhasználóinknak tudunk adni, tesztelésre. Ja, és mindezt ingyenesen! (egyébként Yii az első keretrendszer, eddig többnyire CMS-eket és CRM-eket támogattak)

Hogy lehetne még  gyorsabban és eredményesebben dolgozni? Mi az a Kanban?

A hét oldala: egy brazil horgász oldal: http://revistapescaesportiva.com.br

Monday, November 22, 2010

Adatbázis migrációk a Yii-vel

A Rails keretrendszernek köszönhetően az elmúlt pár évben nagy teret hódított az Adatbázis Migrációk (Migrations) használata, még PHP-s környezetben is. Személyesen hallottam olyanról, hogy míg az egész rendszer PHP alatt futott, a programozók a Rails-t használták táblák és kapcsolatok készítésére.

Persze több kevesebb sikerrel megjelentek PHP-vel hajtott alkalmazások is, az egyik ilyen pl. a Doctrine Project. Ebben a cikkben azonban a Pieter Claerhout által publikált, és a Yii alá készített Yii-DbMigrations-t fogjuk ismertetni.

Mire jó ez egyáltalán?

Felmerülhet a kérdés, hogy miért is van szükség ilyen rendszerek használatára. A felvetés jogos, hiszen sima SQL-t használva is készíthetünk táblákat és kapcsolatokat. Valóban, viszont az így készített ún. tábla leírások (schema) kifejezetten az adott adatbásban működnek.

Képzeljük el például, hogy a fejlesztés kezdetén SQLite-ot használtunk és késöbb szeretnénk az adatbézisunkat MySQL alá tenni (mondjuk a LIVE szerveren). Sajnos ilyen esetben az összes tábla leírást újra kell készítenünk, mivel a két adatbázis motorban használt SQL nem kompatibilis. Itt jön a képbe az Adatbázis Migráció.

A lényeg az, hogy adtabázisleíró nyelvtől függetlenül tudunk táblákat és kapcsolatokat készíteni a PHP segítségével. Az így elkészített tábla osztályokat pedig nagyon egyszerűen a kívánt (és támogatott!) adatbázis alá be lehet illeszteni. Külön hab a tortán, hogy arra sem kell emlékeznünk, hogy melyik volt az utolsó lefuttatott tábla osztály, mindezt a Yii-DbMigartions elvégzi helyettünk. Úgy is gondolhatunk rá, mint egy adatbázisra szabott Forráskezelő program (pl: SVN vagy GIT)

Hátrányok

A modul még csak alpha állapotban van.
Jelenleg csak SQLite és MySQL támogatott.
    Installálás és Beállítás

    Miután kicsomagoltuk a zip file-t a szokásos helyre - protected/extensions, győződjünk meg arról, hogy az adatbázissal kapcsolatos beállítások megfelelőek a protected/config/main.php-ben.

    MySQL:


    SQLite:


    A Parancssor beállítása

    Alap esetben természetesen a yiic nem tud a migrate utasításról, hiszen még csak most telepítettük a modult. Ezért be kell állítanunk egy új commandMap-et  a protected/config/console.php file-ban:




    Beállítások tesztelése

    Ha minden jól sikerült, egyszerűen futtassuk le a yiic parancsot a parancssorból:


    Reméljük így a migrate parancs már elérhető.

    Migrációk készítése

    Nevvekkel kapcsolatos korlátozások

    A migrációs file-okat a protected/migrations vagy a migrations mappába (a modul könyvtárába) helyezhetjük el. Az file-ok neveit pedig a következő képpen ajánlatos elnevezni:

    m20090614213453_MigracioNeve.php

    A névnek mindig egy 'm' betűvel kell kezdődnie, utána egy 14 karakter hosszú dátumot meghatározó string, egy aláhúzásjel '_' és végül pedig egy szabadon választható MigrációNév.

    Persze, szerencsénkre, ezt automatikusan is megtehetjük a protected/yiic migrate create <MigracioNev> lefuttatásával:



    Táblaleírások készítése

    Magában a tábla leíró file-ban létre kell hoznunk egy osztályt, aminek a szülő osztálya a CDbMigration, és két kötelező metódusunk az up és down lesz. Reméljük a következő példa kicsit segíteni fog:



    Tehát az up() segítségével elkészítjük az új táblát, a down()-nal pedig töröljük.

    Támogatott funkciók

    A migráció osztályban a következő funkciók érhetők el:


    • execute: sima SQL futtatása, ami nem ad vissza értéket.
    • query: sima SQL futtatása, ami értékkel tér vissza.
    • createTable: új tábla készítése
    • newTable: új tábla leírás készítése
    • addTable: táblaleírás hozzáadása a migrációhoz
    • renameTable: tábla átnevezése
    • removeTable: tábla törlése
    • addColumn: oszlop hozzáadása a táblához
    • renameColumn: oszlop átnevezése
    • changeColumn: oszlop változtatása
    • removeColumn: oszlop törlése
    • addIndex: index hozzáadása táblához vagy adatbázishoz
    • removeIndex: index törlése táblából vagy adatbázisból.

    Mezőleíró beállításoknál pedig a következő változók használhatók:


    • primary_key
    • string
    • text
    • integer
    • float
    • decimal
    • datetime
    • timestamp
    • time
    • date
    • binary
    • boolean
    • bool

    Persze ezen kívül lehet adatbázis specifikus mezőket is készíteni, viszont úgy nem tudjuk a programot más adatbázis alá (könnyedén) átemelni.

    Táblák készítése másként



    Migrációk futtatása

    Csak azért mert elkészítettük a tábla-leírásokat, az nem azt jelenti, hogy a táblák már készen is vannak az adatbázisban. A migrate parancs lefuttatásával történik meg mindez:



    Még itt a végén annyit érdemes megjegyezni, hogy ha most lefuttatnánk a migrate parancsot mégegyszer, semmi nem történne, hiszen a modul megjegyzi, hogy melyik volt az utolsóként lefutott migráció.

    És ennyi! Mindenképpen javaslom az eredeti cikk elolvasását is, mert ott még van egy-két utasítás amire nem tértünk itt ki, de remélem ezek után mindenkinek megjön a kedve egy kis adatbányászáshoz :)



    Tuesday, November 16, 2010

    Yii Radiio 35. adás

    Megjelent a Yii 1.1.5-ös, sok javítással és mégtöbb újdonsággal. A változtatások listája ezen a linken található meg.

    Nagy port kavart fel Qiang azon bejelentése, miszerint a Yii 2.0-át a PHP 5.3 alapjaira építve teljesen újraírják, és nem lesz kompatibilis a régebbi (1.1, 1.2) ágakkal. (mondjuk szvsz ez teljesen egyértelmű). A kiabálókhoz a fórumon lehet csatlakozni.

    Ramirez Cobos mutatja be, hogyan használhtajuk az SWFUpload-ot, ami egy Flash meghajtott file-feltöltő rendszer.

    Christian Montoya irása a BluePrint CSS rendszer-ről, amit egyre gyakrabban választanak designerek, weboldalak (pl: http://mint.com, http://stay.com vagy a http://dailymotion.com).

    Az 5 (6-7-8) legfőbb ok a Yii mellett (ChruchCO szerint: Demók, Tesztelés, Közösség, Kiterjesztések, Dokumentáció, Forrás (egyszerűen jó ránézni), Active Record és Scope-ok kezelése )

    Larry Ullman ismerteti a Zend keretrendszerben már jól ismert (Apache) Lucene kereső Yii-re történő implementálását.

    Üdvözlünk két újabb bloggert a Yii torpedó-hajó fedélzetén (KyokasuigetsuMushfiq) akik többek között azt is megírják miért váltottak egyéb rendszerekről (pl. CodeIgniter és Symfony). A blogokat itt meg itt olvashatjátok.

    Ha valaki már kicsit járatos a Yii felépítésében az biztosan tudja, hogy hol található (és mire való) az assets mappa. Néhány kivételes esetben azonban szükség lehet rá, hogy ezt máshova tegyük. Ezt magyarázzal el Dana Luther ebben a blog post-ban.


    Ha valakinek (még mindig) gondot okozna, hogy melyik MVC-re alapuló PHP keretrendszert válassza, annak hasznos lehet Jorges Albaladejo tesztje, aki több más rendszert is megvizsgál és próbál segítséget nyújtani a PHPs közösségnek.


    SamDark mutatja be, hogyan lehet cron alkalmazásokat futtatni Yii-n keresztül.

    Ha valakinek sürgős segítségre van szüksége valamilyen Yii-vel kapcsolatos problémara, és nincs ideje (türelme?) a fórum látogatóinak válaszára várni, annak érdemes kipróbálnia a #yii IRC csatornát, ahol naponta több mint 30-40 lelkes Yii programozó próbál egymásnak segítséget nyújtani.

    Semmiképp nem szeretnénk pletykát indítani, de egyre többet hallani a MySQL és Oracle háza táján történő bizonytalanságokról. Az adatbázis motor lecserélését segítheti elő a MariaDB, amit egy az egyben arra találtak ki, hogy a MySQL-t leváltsa. (állítólag néhai MySQL programozók találták ki). Mindenképp érdemes rá odafigyelni.

    A hét oldala: bumperize.com, akik arra vetemednek, hogy a már jól megszokott szöveges alapó email-jeinket felcsinosítsák.

    ----------------------------------------------------------------------------------------------------------
    eredeti: http://yiiradiio.mehesz.net/episode-35

    Tuesday, November 9, 2010

    Hogyan fűszerezzük Yii proginkat a már jól bevált ImageCache-sel

    Ha valaki már régóta tevékenykedik a "szakmában" az biztosan tudja, hogy egy oldalon megjelenő képeknek az átméretezését még azelött jó megtenni, mielött a kép a böngészőbe kerül. Például, mi történik akkor, ha a képünk 3000x2000 pixeles, és azt 300x200-as méretben szeretnénk megjeleníteni:

    <img src="valami.jpg" width="300" height="200" />

    A fenti sorral többek között az a gond, hogy az ember azt gondolná (reméljük nem, de lehet), hogy a böngésző ilyenkor csak egy ekkorka képet tölt le. Sajnos ez nem igaz, tehát a felhasználóinkat (és a szerverünket) büntetjük azzal, hogy a böngésző egy hatalmas, alkalmanként több MB-os képet tölt le. A Drupal CMS rendszerben van egy úgy nevezett ImageCache modul, ami pontosan erre kínál megoldást.

    Hwangar-nak köszönhetően ez a modul már elérhető a Yii rendszerben is, így néhány "képmegváltoztató" funkcióval lényegesen felgyorsíthatjuk oldalaink betöltését. Ez a cikk azt próbálja bemutatni, hogy hogyan is tehetjük meg mindezt.

    Az ImageCache modul segítségével (GD2 szükséges hozzá!) többek között átméretezhetjük, elforgathatjuk és vízjeggyel láthatjuk el képeinket. Maga a beállítás egyszerűen megtehető az alkalmazásunk konfigurációs file-jában. (protected/config/main.php)



    Beállítás:

    Annyi féle preset-et készíthetünk, amennyit csak akarunk. A fenti példában, a 640x480-nak nevezett preset segítségével például először átméretezzük és vágjuk a képet (scaleAndCrop) majd pedig vízjegyet teszünk a képre (watermark). Az elkészített képeket a modul a webroot/<akarmi> könyvtárba helyezi el. Jelenleg a következő képmódosító funkciók támogatottak: újraméretezés (resize), zsugorítás (scale), zsugorítás és vágás (scaleAndCrop), elforgatás (rotate), vágás (crop) és vízjegy (watermark).

    Használat:

    Magát a képkészítő programot vagy a Kontrollerben (Controller) vagy a Nézetben (View) szokás meghívni a következő módon:

    <?php
    $thumb = Yii::app()->image->createUrl( '640x480',YiiBase::getPathOfAlias('webroot.files').'/valami.jpg'); // An image file!!! 

    if ($thumb) print $thumb; else print "bad";
    ?>
    Még annyit érdemes megjegyezni, hogy amikor először jelenítjük meg a képet a modul segítségével (tehat a cache könyvtár üres!), akkor fut le maga a képszerkesztő program és készül el az új kép. A következőkben már ezt a képet töltjük be és jelenítjük meg, remélhetőleg gyorsabban.

    Az eredeti leírás és maga a modul itt található: http://www.yiiframework.com/extension/image-cache/

    (Egyébként ha valakinek van ötelete arra, hogy magyarul hogyan lehetne érzékeltetni a különbséget a resize és a scale között (lehetőleg egyszóval), azt szívesen venném ... köszi)

    Tuesday, November 2, 2010

    Yii Radiio 34. adás

    Sikerült néhány újabb template-t készítenünk és fel is tettük őket a Yii Themes oldalra. Reméljük tetszik az új lapozgató is.

    Na, de nézzük mi történt az elmúlt hetekben a Yii körül:

    • BHushan részletezi több PHP keretrenszer előnyeit és hátrányait, köztük persze a Yii-t is.
    • Hasonló kategóriába tartozik az include-once.org által közzétett PHPs keretrendszer összehasonlító program, aminek segítségével könnyen fej-fej mellé tehetjük az összes jelenleg elérhető keretrendszert.
    • MongoDB-ről már esett szó párszor a Yii Radiio adásaiban, röviden egy Kulcs-Érték (Key-Value) alapokra épülő adatbázismotorról van szó. Ehhez próbál segítséget nyújtani a Tyohan által elkészített modell osztály, MongoRecord.
    • Ha valaki már többször járt a Yii oldalon, talán ismerősnek tűnhet Larry Ullman neve, aki a kezdetektől fogva támogatja a rendszert és népszerű sorozatát nagyon sokan elismerik. Végre sikerült frissítenie a leírásokat, a jelenlegi legújabb, Yii 1.1.4-re.
    • Remélem nem vagyok egyedül, de velem többször előfodult már, hogy az agyamban felmerülő megoldást probáltam kód formájában begépelni, de az ujjaim lassabak voltak mint maga a gondolat. Mit lehetne még kitalálni, azon kívül, hogy megtanulunk baromi gyorsan gépelni? A Tutsplus hasábjain probáltak 9 olyan dolgot összeszedni, ami a segítségünkre lehet. (pl: Zen kódolás, Osztott képernyő (Vim - hehe), LESS.js stb)
    • Talán szükségünk lehet arra, hogy az amúgy jól bevált Yii lapozgató rendszert átalakítsuk. (vagy csak egyszerűen tudni akarjuk, hogyan is működik). Ramirez Cobos kalaúzol el bennünket a Yii rejtett világába és mutatja be, hogyan tudjuk ezt megtenni.
    • Ha még csak most kezdünk ismerkedni a Yii rendszerrel, gyakran előfordul, hogy a Modell kapcsolatok megértése homályos lehet. Hungred.com próbálja mindezt elmagyarázni ezzel a post-tal.
    • WordPress a Yii-vel! Baptek meséli el nekünk miért is kellett nekik egy ilyen megoldás és milyen egyszerűen oldotta meg ezt a feladatot.
    • WillowDan2009 mutatja be, hogyan kell Windows alá a Yii 1.1.4-est feltelepíteni.
    • A Yii csapatának végre sierült befejeznie a már régóta esedékes új arculatot, új logóval és funkciókkal. A kedvenceink a Hall of Fame, és Badges (kitüntetések) :)
    • A hét oldala: Ha az interneten szeretnénk valamit eladni, néha jó tudni, mi mennyit ér. WothMonkey.com





    Tuesday, October 26, 2010

    Hogyan kezdjük?

    A Yii rendszert a kezdetektől fogva úgy tervezték, hogy WEB alapú alkalmazások készítését megkönnyitse. Ebben a postban megmutatjuk, hogyan lehet a legegyszerűbb egy alap, adatbázissal összekapcsolt programot elkezdeni.

    0. lépés - Előkészítés

    A Yii rendszer letöltése és installálása után, egyszerűen futtassuk le azt a konzol parancsot, ami elkészíti a WEB-es alkalmazásunk vázát. A program már ekkor is működőképes, olyan finomságokkal fűszerezve mint felhasználó beléptetés vagy kapcsolat felvételi űrlap. Ezekre az alapokra már szépen építhetünk bonyolultabb funkciókat a programunk számára.

    Blogger Logo Grey

    1. lépés - Az adatbázis létrehozása

    Amig Yii jelentősen lecsökkenti ismétlődő forráskód írását, az izgalmas rész, a kreatív munka ránk marad. Ez gyakran kezdődik adatbázis és táblák tervezésével.

    Blogger Logo Grey

    2a. lépés - Yii elkészíti a Modell Osztályokat

    Most a Yii rendszeren van a sor, hogy az előkészített adatbázis táblából használható PHP kódot készítsen. Ezt könnyen megtehetjük a rendszerbe épített, böngésző alapú kód generálóval (gii), aminek segítségével pillanatok alatt működő modell osztályokat készíthetünk, anélkül, hogy egy sort is gépelnünk kéne. Modell osztályokat használva az adatbázis táblák érhetők objektum osztályként.


    Blogger Logo Grey

    2b. lépés - Yii elkészíti a CRUD kód alapokat

    Az előzőekben említett kód generáló segítségével készíthetjük el a nagyon gyakran használatos CRUD funkciókat a kiválasztott adatbázis táblához. (Create azaz Létrehoz, Read - Beolvas, Update - Frissít, Delete - Töröl ).

    Az elkészített forráskód természetesen személyre szabható, a jól ismert MVC (Model - Modell, View - Nézet, Controller - Vezérlő) szabályait betartva. Egyelőre eddig minden sort a Yii rendszer készített, még billentyűzethez nem kellett nyúlnunk.


    Blogger Logo Grey

    3. lépés - Az elkészített kód testreszabása, finomítása

    Az utolsó lépés, a Yii által elkészített forrás kód testreszabása. Például, hogy ne jelenítsük meg a jelszó oszlopot a listában, egyszerűen töröljük a jelszó mezőt az alábbi adminisztrációs nézet file-ban:



    Blogger Logo Grey

    Hogyan tovább?

    A fenti leírás persze csak egy nagyon kicsi bepillantást enged a Yii csodálatos világába. A következő logikus lépés lenne, hogy letöltsük a Yii keretrendszert, probáljunk ki egy vagy két példa programot, és csatlakozzunk a többiekhez a fórumon.

    Két kis magyar példa:

    Yiiki avagy WIKI a'la Yii - egy nagyon egyszerű, Yii alapokat bemutató alkalmazás, vagy
    Környezetbarát Egységtesztelés Meztelencsigákkal - egy kicsit komolyabb példaprogram.


    Sok sikert!

    Tuesday, October 19, 2010

    Yii Radiio 33. adás

    Végre itt van a már rég óta beharangozott interjú a Yii könyv szerzőjével, Jeff Winesettel. (maga az anyag angolul van, itt csak nagyjából összefoglaltam, miről beszélgettünk.)

    Ez egy elég érdekes adás (#33), ugyanis mind terjedelmében, mind tartalmában eltér a megszokott formától, de nem kell aggodni, nem marad így ;)

    Összefoglaló:

    Többek között arról beszélgetünk, hogy Jeff és csapata (Control Group Inc.) miért választotta a Yii rendszert, hiszen nagyon sok hasonló PHPs progamozási megoldás (keretrendszer) található manapság az interneten. Jövendőbeli könyvíróknak talán hasznos lehet, hogy hogyan sikerült megbírkózni a gyorsan megjelenő verziókkal, hiszen egy programozási könyvet azért (is) nehéz megírni, mert maga a rendszer (is) gyakran változhat és bizony vátozik is. (A Yii elég fiatalnak számít a "nagyágyúk" mellett).

    Említésre kerül továbbá TrackStar, azaz alkamazás amit a könyv alapján készítünk, a Teszt Alapú Fejlesztés fontossága, és néhány szó a különböző forrás kezelő megoldásokról (SVN, GIT).

    Meglepetés:


    Jelenlegi szponzorunk (Packt Publishing) felhatalmazott bennünket, hogy elajándékozzunk 3 db elektromos Yii könyvet INGYÉ.

    Ha még nincs meg (vagy jó lenne az eredeti ...) csak annyit kell megtennetek, hogy küldtök egy email-t a yiiradiio [kukac] mehesz.net -re, amiben néhány mondatban leírjátok, miért is lenne jó nektek ez a könyv.  A jelentkezési határidő Október 31!

    (Sajnos nem mi döntjük el, hogy kik lesznek a nyertesek, ezért fontos, hogy az emil tartalma angolul legyen!!!)

    Köszi és sok sikert!

    Wednesday, October 13, 2010

    Twitter Madár

    !!! Kövessetek !!!



    Elindítottuk a YiiHun Twitter madarát az alábbi címen:

    http://twitter.com/yiihun

    Ezen olyan, a Yii keretrendszerrel kapcsolatos, kisebb híreket fogunk közölni, amik nem érik el egy blog bejegyzés méretét.

    Tuesday, October 5, 2010

    Yii Radiio - 32. adás


    Hello,

    Itt a Yii Radiio 32. adása ...

    Új szponzorunk ebben a hónapban a Packt Publishing, akik rengeteg más programozói és designer könyv mellett a nemrég megjelent Yii könyv-et is publikálták.

    A következő adásban egyébként egy új, eddig még ismeretlen területre merészkedünk, ugyanis interjú alanyunk lesz a Yii könyv írója (Jeffrey Winesett). Az adás végén pedig egy meglepetés vár a hallgatókra :)

    Na nézzük, mizu ezen a héten:

    - Bater Makhabel elkészítette a Yii UML leírását, biztos nagy segítséget fog nyújtani a programozóknak.
    http://www.yiiframework.com/forum/index.php?/topic/11677-yii-architecture-with-uml-model-details/

    - Willowdan meséli el nekünk, hogy miért választották a Yii-t más PHP-s keretrendszerek helyett.
    http://putvaluefirst.info/tech-news/yii-my-chosen-php-framework/

    - PRLog.org említi a Yii könyvet, és hogy hogyan lehet vele felgyorsítani a programozás.
    http://www.prlog.org/10935481-accelerate-web-application-development-using-packts-new-yii-php-framework-book.html

    - Hogyan készítsünk könnyedén Yii Form Varázslókat, ebbe tekint bele Nautilebleu írása.
    http://nautilebleu.tumblr.com/post/1131788452/easy-form-wizards-with-yii

    - Hogyan hajtsunk végre 180 fokos fordulást a Titanic-kal (még süllyedés előtt). Ez egy nagyon jó kis cikk sorozat arról, hogy egy cég hogyan próbál egy hatalmas online alkalmazást új alapokra helyezni, Yii-vel.
    http://jacquesmattheij.com/Turning+around+the+Titanic,+part+1,+triple+the+signup+rate

    PostgreSQL-el ritkán foglalkoznak a blogok, pedig sokan azt rebesgetik, hogy mivel az Oracle tavaly(?) bekebelezte a MySQL-t, Postgres lesz az új nyílt forrású relációs adatbázisok királya. Addig is, itt egy jó kis leírás, hogyan is kell mindezt beállítani Yii-vel.
    http://blog.93-interactive.com/wordpress/2010/09/using-the-yii-php-framework-with-postgresql/

    - Egyre népszerűbb a NetBeans kód szerkesztő a PHP programozók körében. Marcov Twout bemutatja, hogyan lehet vele még elegénsabban dolgozni  PHPUnit és Selenium RC-vel keverve.
    http://www.yiiframework.com/doc/cookbook/83/

    - A hét oldala: http://ikl.me, egy feltörekvő URL rövidítő és analizáló rendszer.


    ( még itt a magyaroknak annyit, hogy az adásban hallható intro és outro zenét a magyar Larry Hangman zenekartól kaptuk, akiknek nemrég jelent meg az első nagylemeze: http://www.myspace.com/larryhangman )

      Tuesday, September 28, 2010

      Könyvajánló: Agile Web Application Development with Yii 1.1 and PHP5

      A következő könyvajánló a Weblabor hasábjain jelent meg pár nappal ezelőtt, Orionstar klaviatúrájából:



      A könyv azon haladó PHP fejlesztők számára készült, akik otthonosan mozognak az objektumorientált programozás világában, és felgyorsítanák munkájukat egy keretrendszer használatával. A könyv e fejlesztőket vezeti be a Yii keretrendszer alapszintű használatába pár egyszerű és egy komplex példán keresztül, agilis fejlesztési módszertant alkalmazva. Habár a tudásanyag nagy része könnyedén elérhető a keretrendszer weblapján illetve fórumában kutakodva, ezt a keresést helyettesíti részben a könyv kibővítve az agilis szempontból történő fejlesztéssel.
      A könyv egy rövid összefoglalóval indít, hogy miért a Yii keretrendszert válasszuk. Röviden bemutatja a Yii által alkalmazott tervezési mintát, az MVC-t. Ez tényleg csak egy rövid összefoglaló, aki nincs tisztában ezzel, annak először ajánlott utána járni, majd ezt követően jönnek az egyszerű példák. A későbbi fejezetek során szoftverfejlesztési életciklus követésre képes alkalmazás lépésenkénti fejlesztését mutatja be a szerző a főbb funkciók megvalósításon keresztül, a témakezelésen át az RSS hírlevél és cachelésig. Maga a példa rendkívül hasonló a keretredszer oldalán megtalálható blog példához.
      Miért érdemes hát elolvasni a könyvet, ha szinte minden elérhető az interneten is? Azért, mert a kezdéshez szükséges több helyen felhalmozott tudást a szerző összefoglalja, és mindezt olyan módszertan segítségével teszi, amiből az olvasók profitálhatnak. Engem személy szerint arra ösztökélt, hogy jobban utánajárjak az agilis módszertannak, amit noha korábban elvetettem a vízesés modellre esküdve. Továbbá nagy hangsúlyt fektet a(z) (egység)tesztelés részletes bemutatására is, amiről hajlamosak vagyunk olykor elfeledkezni.
      Hogyan tovább, mi hiányzik? A könyv csak bevezető a Yii világába, ezért nem találhatók meg benne jQuery-vel, Ajaxszal, web service-okkal kapcsolatos példák, amik viszont a Yii igazi erejét adják, de az interneten sok példakód, tutorial elérhető melyek segítenek továbbfejleszteni tudásunk.

      Az eredeti cikk itt található: http://weblabor.hu/konyvek/agile-yii-11-and-php5

      Tuesday, September 21, 2010

      Yii Radiio - 31. adás

      MZ/x MZ/x,

      Itt a Yii Radiio 31. adása, nézzük mik a legújabb hírek a Yii háza táján:

      - Hosszas fontolgatás után úgy döntöttünk, hogy a Facebook 'csoport' helyett egy 'oldal'-t készítünk amivel talán egyszerűbben tudunk kapcsolatot teremteni az érdeklődőkkel. Csupán LIKE-olni kell és kész is :) http://facebook.com/yiiradiio.

      - Frank Kleine még 2008-ban írt egy cikket az 'annotations' és a PHP kapcsolatáról, és most újraelemzi a helyzetet, és egy megoldásra is rámutat a Yii segítségével.
      http://www.stubbles.org/archives/79-State-of-annotations-in-the-PHP-world,-revisited.html

      - A HAML and SASS kiterjesztésnek jelent meg  egy újabb változata. Aki nem ismerné, a Ruby környezetben már régóta használt HTML és CSS "csonka kód" megoldásról van szó, aminek segítségével sokkal gyorsabban tudunk program kódot írni, hiszen nem kell annyit gépelnünk ...
      http://www.yiiframework.com/extension/haml-and-sass/

      - Végre a Yii-hez is elért a már rengeteg helyen használt OAuth. Köszönet CGeorge-nak.
      http://www.yiiframework.com/extension/eoauth/

      - Megjelent a Yii 1.1.4-es változata, közel 60 hibajavítással és újításokkal. A teljes listáért ide klikkoljatok:
      http://www.yiiframework.com/files/CHANGELOG-1.1.4.txt

      - Az MVC (Modell - Nézet - Vezérlő) elterjedésével egyre többen próbálják újraértelmezni a már jól bevált technológiát, de még mindig MVC-nek álcázva. A "Nézet az nem Template" -
      http://r.je/views-are-not-templates.html

      - Ha már nem lenne elég, itt egy újabb NoSQL szerű adatbázis motor, de azt mondják jobb minden eddiginél. Majd meglátjuk: Pomegranate.

      - A hét oldala: PicLyf képmegosztó szolgáltatás és közösségi oldal a Twidl Inc.-től.

      Wednesday, September 15, 2010

      Temesvári Imre: Online informatikai tudásbázis Yii alapokon

      Az interneten böngészgetve akadtam erre a remek kis szakdolgozatra, amit Temesvári Imre publikált:

      "Szakdolgozatom célja és témája egy olyan informatikai tudásbázis elkészítése, amely az informatika minden területéről összegyűjti a szakszavakat, fogalmakat, kifejezéseket – abból a célból, hogy az érdeklődőnek pontos információt adhasson. Jellege tudásbázis – ami annyival több, mint egy adatbázis vagy informatikai szótár, hogy nem egy valaki, vagy egy zárt csoport fejleszti - bővíti, hanem mindenki, aki az oldalt felkeresi, és érdemben tud rajta javítani, hozzá tenni. A cél egy minél bővebb tudásbázis létrehozása, ahol az érdeklődő gyorsan megtalálhatja a magyarázatot az általa nem ismert szóra, fogalomra.

      A tudásbázis Yii alapokon fog működni, ami egy nem túl régi és még nem annyira elterjedt PHP keretrendszer. A keretrendszer jelentősen meggyorsíthatja a fejlesztés menetét, és az előre elkészített osztályok, kódok felhasználásával segíti a fejlesztő munkáját. Így a szakdolgozat másik célja a Yii bemutatása, megismertetése."
      A szakdolgozat (PDF)

      (az eredeti cikk itt található: http://nagygusztav.hu/temesvari-imre-online-informatikai-tudasbazis-yii-alapokon)

      Saturday, September 11, 2010

      Környezetbarát Egységtesztelés Meztelencsigákkal


      avagy, hogyan gyártsunk Egységtesztelős programot a Yii-vel.

      Mi ez?

      Ha netán a címből nem lenne eléggé egyértelmű, a következőkben Egységteszetkről (Unit Test) lesz szó PHP-s környezetben. Ha a nyájas olvasó még nem olvasta a korábban megjelent Yiiki al'a Yii cikket, és semmilyen tapasztalata nincs a Yii keretrendszerrel, mindenképp érdemes rajta átfutni ugyanis itt nem fogunk belemenni az alapvető, -Na most akkor, hogy is kezdjem? kérdésekbe.

      Mi lesz ez?

      Egy nagyon egyszerű URL rövidítőt fogunk késziteni, mint pl a http://tinyurl.com vagy a http://vurl.me. Ha valaki nem ismerné, a lényeg az, hogy marha hosszú URL-eket lekicsinyítünk, és ha valahol egy felhasználó az általunk lekicsinyített linkre (slug) kattint, azt továbbítjuk a megfelelő oldalra.

      Bevezetés

      Környezet:

      • PHP 5.2.x
      • Apache (a PHP futtatásához)
      • SQLite (az egyszerűség kedvéért használjuk ezt, lehetne MySQL is)
      • Yii 1.1.3 (de elvileg működik az 1.1-es ág bármelyik csomagjával)
      • PHPUnit (tesztelést végrehajtó program: http://www.phpunit.de )

      Fogalmak:

      Test Driven Development (TDD) - Tesztelésen alapuló fejlesztés.
      Ezt talán úgy lehetne a legegyszerűbben bemutatni, hogy képzeljünk el egy adott problémát és próbáljuk meg visszafelé megoldani. Oké, lehet, hogy ez így elsőre hülyén hangzik, de talán ez az ábra segíthet.
      1. Írjunk tesztet
      2. Ellenőrizzük, hogy a tesztünk hibázik (FAIL)
      3. Írjuk meg (a legegyszerűbben!) a kívánt kódot úgy, hogy a tesztünk sikeres legyen.
      4. Ellenőrizzük, hogy a tesztünk sikeres e (PASS)
      5. Módosítsuk a kódunkat (úgy, hogy a teszt még mindig sikeres maradjon!)
      6. Kezdjük előlről az egészet.
      Unit Test - Egységteszt.
      Az egységek, komponensek tesztelése, hogy megbizonyosodjunk a működésének helyességéről. Cél, hogy feltárja nincsenek-e tévműködések, feltáratlan hibák a belső algoritmusban, adatkezelésben. A komponensek más rendszer komponensektől függetlenül vannak tesztelve. (http://www.dcs.vein.hu/)
      Ez így elsőre, másodikra de talán még harmadikra is érdekesen hangozhat, de reméljük a cikk végén minden világos lesz.
      (ja, itt ajánlanám Erenon írását.)

      Adatbázis

      Mint korábban említettük, SQLite3-at fogunk használni, de gyakorlatilag bármilyen adatbázis motorral is műküdik a dolog.

      Táblák

      protected/data/rovidke.db
      ++++++++++++++++++++++++++
      + urls                   +
      ++++++++++++++++++++++++++
      + id INT (auto_increment)+
      + url TEXT               +
      + slug VARCHAR(50)       +
      + created INT            +
      ++++++++++++++++++++++++++
      SQLite3
      CREATE TABLE urls (created INTEGER, id INTEGER PRIMARY KEY AUTOINCREMENT, slug varchar(50), url TEXT);
      Na, ennyi pepecselés után ugorjunk is bele a programozásba. Miután sikeresen létrehoztuk az alap alkalmazásunkat (pl: yiic webapp rovidke). Állítsuk is be egyből az adatbázis kapcsolatot.
      protected/config/main.php
      ...
        'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/rovidke.db',
      ...
      Itt szeretném megjegyezni, hogy többször is belefutottam a következő hibaüzenetbe (SQLite esetén, Linux-szal, lehet, hogy ez MS környezetben nem gond)
      CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
      Ez annyit jelent, hogy az adatbázis file-t a program nem tudta írásra megnyitni, tehát át kell állítanunk a jogokat (ha csak a saját gépemen programozok, és nem foglalkozok a biztonsággal, egyszerűen 777-et adok neki :) )

      Itt a MVC

      Modell

      Első lépésként hozzuk is létre a Url modellünket. Ha valaki nagyon bátor, az használhatja az új csodafegyvert: Gii, amit a yiic utódjának szán a Yii fejlsztői csapat. Tulajdonképpen egy grafikus, bongészőbarát kódgeneráló eszköz. (a cikkben a yiic-et fogjuk használni)
      ./protected/yiic shellYii Interactive Tool v1.1 (based on Yii v1.1.3)
      Please type 'help' for help. Type 'exit' to quit.
      >> _
      >> model Url urls
         generate models/Url.php
         generate fixtures/urls.php
         generate unit/UrlTest.php
      The following model classes are successfully generated:
          Url
      If you have a 'db' database connection, you can test these models now with:
          $model=Url::model()->find();
          print_r($model);
      >>
      Akiknek jobb a szeme, azok nyilván észrevették a teszt csomagot, amit a Yii alapból elkészít minden modellhez a protected/tests/unit mappa alatt. Gyakorlás képpen Futtassuk is le "tesztjeinket" (protected/tests/) ...
      $phpunit unit...
      There was 1 error:
      1) testCreate(UrlTest)
      CDbException: The table "urls" for active record class "Url" cannot be found in the database.
      ...
      Hoppá, hát az meg mi? Mi az, hogy nincs ilyen tábla az adatbázisban?
      Azt fontos megjegyezni, hogy tesztelés közben nem egy, csak és kizárólag, a teszthez írt funkciót futtatunk, hanem az éles alkalmazás kódját. Ami azt jelenti, hogy a funkció az mindig ugyanaz marad és mindig ugyanúgy fut le. Hova is akarok ezzel kilyukadni? A lényeg, hogy amikor a teszteket futtatjuk, a program egy előre legyártott adat-tömbből (fixtures) veszi az adatokat, ezeket egy adatbázisba teszi, lefutattja a tesztet, és törli a DB táblákban tárolt bejegyzéseket. Tehát fontos, hogy az éles adatbázis és a teszt adatbázis különböző legyen!
      Innen jött a hibaüzenet, ugyanis a teszt adatbázisunk még nem létezik. Csináljunk is egyet ...
      protected/data/rovidke_test.db
      ++++++++++++++++++++++++++
      + urls                   +
      ++++++++++++++++++++++++++
      + id INT (auto_increment)+
      + url TEXT               +
      + slug VARCHAR(50)       +
      + created INT            +
      ++++++++++++++++++++++++++
      SQLite3
      CREATE TABLE urls (created INTEGER, id INTEGER PRIMARY KEY AUTOINCREMENT, slug varchar(50), url TEXT);
      ... és módosítsuk a teszt(!) konfigurációs file-t az alábbiak szerint
      protected/config/test.php
      ...
       'connectionString'=>'sqlite:' . dirname(__FILE__).'/../rovidke_test.db',
      ...
      ha, most lefuttatjuk a tesztünket ... protected/tests/
      $phpunit unitPHPUnit 3.3.16 by Sebastian Bergmann.
      .
      Time: 0 seconds
      
      OK (1 test, 0 assertions)
      minden OK! Birkabőr (Juhéjj)!
      Kedvenc szövegszerkesztőnkkel nyissuk meg a UrlTest? a protected/tests/unit/ könyvtárból (aki VIM-et hasznal +1 piros pontot kap). Ez elvileg üres, illetve, az osztályt a Yii már létrehozta, és talán akad is egy példa teszt. Ha van, ha nincs, a lényeg, hogy minden teszt funkciónak a testcimkével kell kezdődnie. Nem történik semmi baj, ha nem kezdjük ezzel a tesztünket, de nem fog lefutni. A gyakorlás kedvéért csináljunk is két tesztet ...
      protected/tests/unit/UrlTest?.php
      ...
          public function testTrue()
          {
              $this->assertTrue( false );
          }
      
          public function testTrue2()
          {
              $this->assertTrue( true );
          }
      ...
      Ez talán elég világos, de ha nem, akkor röviden annyi történik, hogy elsőben megvizsgáljuk, hogy az IGAZ az HAMIS e, a másodikban pedig, hogy az IGAZ az IGAZ e. Futtasuk is le ...
      protected/tests/
      $phpunit unit
      PHPUnit 3.3.16 by Sebastian Bergmann.
      
      F.
      Time: 0 seconds
      There was 1 failure:
      1) testTrue(UrlTest)
      Failed asserting that <boolean:false> is true.
      /var/www/rovidke/protected/tests/unit/UrlTest.php:18
      
      FAILURES!
      Tests: 2, Assertions: 2, Failures: 1.
      Jajj de remek, láthatjuk is, hogy egy darab (F) betűt kaptunk, ami a tévhitekkel ellentétben, az jelenti, hogy FAIL (ja, a pont . meg azt, hogy a teszt PASS(ED), azaz sikeresen lefutott.) Ha jobban megvizsgáljuk az üzenetet, akkor még az is kiderül, hogy Failed asserting that <boolean:false> is true, ami a Google fordító szerint annyit jelent, hogy Elmulasztotta azt állítja, hogy hamis igaz. Remélem lejön a lényeg :)
      Rengeteg ilyen "a teszt azt állítja, hogy" funkció létezik, ebben a példában mi csak néhányat fogunk bemutatni/használni. A teljes listáért ide klikkoljatok.

      Fixtures - Minta Adat

      Mint már korábban említettem, a "teszt csomag" egy úgynevezett adat-tömbből veszi a teszthez szükséges adatokat, most itt erről lesz szó (egy kicsit). Szerencsénkre Yii már létrehozta az alap könyvtárrendszert és a file-okat, sőt még néhány példa tömbböt is készített aprotected/tests/fixtures/urls.php file-ban. Pompás.
      Módosítsuk is az értékeket, valahogy így:
      return array(
              'sample1'=>array(
                      'created' => '1234567890',
                      'slug' => 'AA',
                      'url' => 'http://weblabor.hu',
              ),
              'sample2'=>array(
                      'created' => '1234567890',
                      'slug' => 'AB',
                      'url' => 'http://google.com',
              ),
      );
      Ugyan ezek az adat-tömbök elhanyagolhatóak, a gyakorlatban szinte mindig hasznaljuk őket.

      Megint Tesztelünk

      Nyissuk meg a URL teszt file-unkat és írjunk gyorsan egy számláló tesztet, ami megszámolja az összes linket a táblában:
      protected/tests/unit/UrlTest?.php
      ...
          public function testCountAll()
          {
              $urls_count = sizeof(Url::model()->findAll());
              $this->assertEquals( 2, $urls_count );
          }
      ...
      A példa kedvéért itt az assertEquals()-t mutatom be, ami azt "Feltételezi", hogy a két megadott érték megegyezik. Ezzel lehet játszadozni, ha valami nem stimmel a tesztünk úgyis elbukik. PL:
      protected/tests
      $phpunit unit/
      ...
        Failed asserting that <integer:2> matches expected value <integer:1>.
      ...
      Ugye milyen egyszerű? Az assertEquals()-ba nem csak szám értéket passzolhatunk ám, hanem akár szöveges változót is:
      protected/tests/unit/UrlTest?.php
      ...
          public function testActionView()
          {
              $url = Url::model()->findByAttributes( array( 'id' => 1 ) );
      
              $this->assertTrue( $url instanceof Url );
              $this->assertEquals( $url->url, 'http://altavizsla.hu' );
          }
      ...
      ez nyilván elbubik, de ...:
      protected/tests/
      $phpunit unit...
      There was 1 failure:
      
      expected string <http://weblabor.hu>
      difference      <       xxxxxxxxxxx??>
      got string      <http://altavizsla.hu>
      ...
      Itt a PHPUnit ügyesen megmutatja nekünk, hogy pontosan hol is tértek el a szöveges változók. jajj, de jó :)
      Na most nézzünk egy kicsit komolyabb tesztet. A urls táblába csak olyan rekordot szertnénk elmenteni, aminek mind a url, mind a slug értéke be van állítva, tehát nem lehet üres. Írjuk meg a tesztet:
      protected/tests/unit/UrlTest?.php
      ...
          public function testUrlRequired()
          {
              $this->assertTrue( Url::model()->isAttributeRequired( 'url' ) );
          }
      ...
      Ha most lefuttatnánk a tesztünket, akkor nyilvánvalóan elbukna. Szerencsénkre a Yii modell osztálynak van egy ún. rules() (szabályok) funkciója, amivel többek között azt is beállíthatjuk, hogy mely értékek nem lehetnek üresek. Ezt a required-del határozhatjuk meg.
      protected/models/Url.php
      ...
        public function rules()
        {
          return array(
             ...
             array( 'url', 'required' ),
             ...
          );
        }
      ...
      A tesztünk már majdnem sikeres ;) Hasonlóan az előző példához, most állítsuk be a slug-ot is ...
      protected/tests/unit/UrlTest?.php
      ...
          public function testSlugRequired()
          {
              $this->assertTrue( Url::model()->isAttributeRequired( 'slug' ) );
          }
      ...
      TESZT: FAIL!
      protected/models/Url.php
      ...
          return array(
             ...
             array( 'url,slug', 'required' ),
             ...
          );
      ...
      Itt még azt is észrevehetjük, hogy milyen szépen lehet több értéket is megadni a Yii rules()-ban.
      TESZT: PASS!
      Most nézzünk egy olyan példát, ahol a tesztelésre szánt funkció még nem létezik. Például mi történik akkor, ha egy új URL-t (inkább slug-ot) szeretnénk készíteni. Ha most próbálnánk ki a programot, akkor kézzel kéne beállítanunk a lerövidített URL-t. Na ne má ... Tehát ha az adatbázisunk üres (nincs 1 darab URL sem) akkor az első slug legyen: AA. Na hogy is néz ez ki pontosan?
      protected/tests/unit/UrlTest?.php
      ...
          public function testCreateUrl()
          {
              $url = new Url();
              $url->setAttribute( 'url', 'http://altavizsla.hu' );
              $this->assertTrue( $url->save(), 'URL tarolas tesztelese' );
              $this->assertEquals( $url->slug, 'AA' );
          }
      ...
      A tesztünk az feltételezi, hogy egy új URL esetén az új URL slug-ja az AA értékkel fog visszatérni. A teszt itt nyilván elbukik. (azt érdemes megjegyezni, hogy több feltételezést is meg lehet adni 1 teszten belül).
      Itt jön segítségünkre, a beforeValidate() beépített függvény, ami arra szolgál, hogy még a mezők ellenőrzése előtt(!) futtassunk le valamit ...
      protected/models/Url.php
          public function beforeValidate()
          {
              $this->slug = $this->createSlug();
              return parent::beforeValidate();
          }
      
          public function createSlug()
          {
             return 'AA'; 
          }
      Azért nem tudtuk itt a beforeSave()-et használni, mert az ellenőrző szabályunk (rule) elbukna, ugyanis a slug nem lehet üres. Most csak azt akarjuk elérni, hogy a tesztünk sikeresen lefusson, ugyanis a createSlug() nem adhat mindig AA értéket, pl. ha több URL-t is szeretnénk tárolni az adatbázisunkban ;). Ha most lefuttatjuk a tesztünket akkor sikeresen lefut. Jajj, de jó. Na most módosítsuk a kódunkat úgy, hogy az tényleg azt csinálja amit akarunk ...
          public function createSlug()
          {
              $slug = Url::model()->find( array( 'order' => 'slug DESC' ) )->slug;
      
              if( ! $slug )
              {
                  $slug = 'AA';
              }
              else
              {
                  ++$slug;
              }
      
              return $slug; 
          }
      Futtassuk a tesztet ...
      protected/tests/
      $phpunit unit/
      ...
      Failed asserting that two strings are equal.
      expected string <AC>
      difference      < x>
      got string      <AA>
      ...
      Ez meg hogy lehet, az előbb még minden jó volt ;) Persze a fentiekből egyből kiderül, hogy a teszt az AA értéket várta és AC-t kapott. Tehát módosítanunk kell a tesztünket. Itt jogosan merülhet fel a kérdés, hogy mi a ráknak ez a kerülőút? De ne feletjtsük el, tesztelünk.
      protected/tests/unit/UrlTest?.php
      ...
          public function testCreateUrl()
          {
              $url = new Url();
              $url->setAttribute( 'url', 'http://altavizsla.hu' );
              $this->assertTrue( $url->save(), 'URL tarolas tesztelese' );
              $this->assertEquals( $url->slug, 'AC' );
          }
      ...
      Még itt gyorsan, mielőtt elfelejtem, a createSlug()-ot rövidíthetjük így is.
      protected/models/Url.php
      ...
          public function createSlug()
          {
              $slug = Url::model()->find( array( 'order' => 'slug DESC' ) )->slug;
              return $slug ? ++$slug : 'AA';
          }
      ...

      Vezérlő és Nézet Cucc - CRUD - Létrehoz, Megjelenít, Frissít, Töröl

      Az azért remélem feltűnt, hogy még egyszer sem ellenőriztük a programot a böngészőben. Mert nincs is rá szükség. Abban azonban biztosak lehetünk, hogy a URL modellre vonatkozó funkcióink majdnem 100%-osak. Azért nem mondom, hogy majdnem, mert több mindent lehetne, sőt, kellene(!) még tesztelnünk. Pl. mi van akkor, ha frissítünk, vagy törlünk egy linket az adatbázisból stb. Ezeket a fentiek alapján, remélem, kis gondolkodás után meg lehet csinálni. De még van néhány egyéb teendőnk is mielőtt a programunkat a felhasználók karmai közé eresztenénk.
      Készítsük el az alap felhasználói interfészt (formok, nézetek és egyebek) a yiic segítségével.
      protected/yiic shell
      >> crud Url
         generate UrlController.php
         generate UrlTest.php
            mkdir /var/www/rovidke/protected/views/url
         generate create.php
         generate update.php
         generate index.php
         generate view.php
         generate admin.php
         generate _form.php
         generate _view.php
         generate _search.php
      Ha egy új felhasználó érkezik az oldalra, azt szeretnénk, hogy minden klikkolgatás nélkül készíthessen egy rövidített linket (monnyuk ez nem csakúj felhasználókra vonatkozik). Módosítsuk az alap kontrollerünket:
      protected/config/main.php
      ...
          'defaultController'    => 'url/create',
      ...
      Amikor a Yii a hozzáférési szabályokat készíti, alapból a létrehozás funkció (create) csak belépés után lehetséges. Ami jelen esetben nem elfogadható, hiszen mi azt szeretnénk, hogy a felhasználóink a lehető leggyorsabban létrehozhassanak rövidített linkeket. Módosítsuk tehát a
      protected/controllers/UrlController?.php
      ...
         public function accessRules()
      ... 
         array('allow',  // allow all users to perform 'index' and 'view' actions
              'actions'=>array('index','view', 'create'),
              'users'=>array('*'),
         ),
         array('allow', // allow authenticated user to perform 'create' and 'update' actions
              'actions'=>array('update'),
              'users'=>array('@'),
         ),
      ...
      Ha most megnéznénk a kis programunkat, akkor mindenféle egyéb form mezőket látnánk, amit az okos (már tesztelt) Modell funkcióink szépen kitöltenek a URL mentése előtt. (pl. dátum mező, a rövidített URL azaz slug mező). Tulajdonképpen csak egyetlen mezőre van szükségünk, a URL-re:
      protected/views/url/form.php
      ...
          <?php /*
              <div class="row">
                      <?php echo $form->labelEx($model,'created'); ?>
                      <?php echo $form->textField($model,'created'); ?>
                      <?php echo $form->error($model,'created'); ?>
              </div>
      
              <div class="row">
                      <?php echo $form->labelEx($model,'slug'); ?>
                      <?php echo $form->textField($model,'slug',array('size'=>50,'maxlength'=>50)); ?>
                      <?php echo $form->error($model,'slug'); ?>
              </div>
          */ 
          ?>
      
              <div class="row">
                      <?php echo $form->labelEx($model,'url'); ?>
                      <?php echo $form->textField($model,'url', array( 'size' => 50 )); ?>
                      <?php echo $form->error($model,'url'); ?>
              </div>
      ...
      Miután programunk elmenti az új Url-t, Yii automatikusan betölti a megjelenítő kódot (viewAction()). Mi azt szeretnénk, ha a felhasználónk valami ilyesmit látnának: http://rovidke.hu/QWD, és erre klikkelve (vagy a böngészőbe másolva) jutnának el az igazi URL-hez.
      Először módosítsuk a megjenítő nézetet:
      protected/views/url/view.php
      ...
      <?php 
          echo 
              CHtml::link( 
                  $_SERVER['SERVER_NAME'] . '/' . $model->slug, 
                  $this->createUrl( '/' . $model->slug ) 
              );
      ?>
      ...
      <?php /*
      $this->widget('zii.widgets.CDetailView', array(
              'data'=>$model,
              'attributes'=>array(
                      'created',
                      'id',
                      'slug',
                      'updated',
                      'url',
              ),
      )); 
      */
      ?>
      No, és itt jön az alkalmazás egy másik érdekessége, az átirányítás vagy redirect. Alapértelmezésben a rendszer a kapott URL alapján megpróbál egy Vezérlőt (Controller) keresni és átpasszolni neki a kapott változókat. Nekünk viszont az kéne, hogy ha valami ilyesmit kapunk (/QWD) akkor a program ne keresse a QWD-t (nem találna!) hanem hívja meg a Url vezérlőt és adja át QWD-t mint egy változó értéket. (ugyebár a slugazonosítója.) Ezt az alap konfigurációs file-ban tehetjük meg, a következő képpen (a szabályok sorrendje fontos):
      protected/config/main.php
      ...
              'urlManager'=>array(
                   'urlFormat'=>'path',
                   'showScriptName' => false,
                   'rules'=>array(
                       '/<slug:[A-Z]+>' => 'url/redirect',
                       '<controller:\w+>/<id:\d+>'=>'<controller>/view',
                       '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                       '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
                   ),
               ),
      ...
      Persze mindez nem jöhetne létre ha nics apache (.htaccess). Ha az alkalmazás ROOT könyvtárában valami oknál fogva nem lenne meg ez a file, akkor az alábbiak alapján kíszítsünk egyet.
      .htaccess
      Options +FollowSymLinks
      IndexIgnore */*
      RewriteEngine on
      
      #Uncomment "RewriteBase /" when you upload this .htaccess to your web server, and comment it when on local web server
      
      #NOTE: 
      
      #If your application is in a folder, for example "application". Then, changing the "application" folder name, will require you to reset the RewriteBase /[your app folder]
      
      #RewriteBase /[your app folder - optional]
      
      # if a directory or a file exists, use it directly
      RewriteCond %{REQUEST_FILENAME} -s [OR]
      RewriteCond %{REQUEST_FILENAME} -l [OR]
      RewriteCond %{REQUEST_FILENAME} -d
      
      # otherwise forward it to index.php 
      RewriteRule ^.*$ - [NC,L]
      RewriteRule ^.*$ index.php [NC,L]
      Na, most már tényleg csak egy dolog van hátra, megírni magát az átirányító funkciót actionRedirect()
      protected/controllers/UrlController?.php
      ...
          public function accessRules()
          {
             ...
                array('allow',  // allow all users to perform 'index' and 'view' actions
                        'actions'=>array('index','view','create','redirect'),
                        'users'=>array('*'),
                      ),    
             ...
          }
      ...
          public function actionRedirect()
          {
              $slug = Yii::app()->request->getParam( 'slug', null );
              if( $slug )
              {
                  $url = Url::model()->findByAttributes( array( 'slug' => $slug ) );
                  if( $url )
                  {
                      $this->redirect( Url::model()->findByAttributes( array( 'slug' => $slug ) )->url );
                  }
              }
      
              throw new CHttpException( '404', 'hmmm ... slug not found!' );
          }
      ...

      Még nagyon sok mindent lehetne finomítani a programunkon, de szerintem kezdetnek ez is elég. Azt pedig nagyon remélem, hogy a PHP közösség (végre) felébred és használni fogja a Teszt Alapú (TDD) programozást.
      Yii legyen veletek.

      "Ismeret az nem cselekedet, csakis cselekedet a cselekedet" - tdc10