Reikia pripažinti, jog žmonių požiūris keičiasi ir kartais labai drastiškai. Atsimenu prieš porą metų aš niekaip negalėjau suprasti kam reikalingi template, juk jie stabdo. Dabar aš negaliu suprasti, kaip galima sukurti tinklalapį nenaudojant template, juk maišyti html ir php kodą yra šlykštu.
Vedamas savo naujausių religinių įsitikinimų (jeigu dar nesupratote šis straipsnis apie religiją, dogmas ir kitus panašius dalykus) vos tik pabandęs Zend framework supratau ko man trūksta, labai trūksta - Smarty. Iš karto pradėjau melstis interneto dievui, taip, taip - Google, kad nušviestų mano protą ir nuvestų dora nuoroda. Ir man beveik pasisekė. Radau netgi keturis straipsnius: Template Systems Using Zend_View_Interface, Integrating Smarty with the Zend Framework, Zend Framework: Using Smarty as template engine, Using Naneau_View_Smarty with RC1, tačiau nei vienas straipsnis man nepatiko, dėl labai paprastos priežasties: man kaip ateistui svarbiausia veikiantis kodas, o kitas dogmas aš išsiaiškinsiu pats. Taigi…
Aš tikrai čia nesukūriau dar vieno super magiško geresnio būdo integruoti Zend framework bei Smarty, aš tiesiog remdamasis tuo, ką perskaičiau pabandžiau sukurti puslapį, kad nereiktų sukti galvos kokį tinklalapį kurti, pasinaudojau mūsų anksčiau sukurtu notebook, apie kurį buvo rašyta čia ir čia.
Ilgai negalvodamas griebiau pirmą pavyzdį ir pabandžiau pritaikyti. Kas gavosi? Ne kas…
Pirmiausia tai norit daryti include reikia nurodyti absoliutų kelią, kas atrodytų maždaug taip:
require_once("./application/smarty_view.php");
Taip greičiausiai atsitiko dėl to, kad aš kažko prikodinau kurdamas notebook projektą. Toliau pastebėjau, jog metodo setScriptPath neužtenka, pasirašiau tokį patį kuris nustato kelią iki compile_dir. O pats įdomiausias dalykas, kad po to jis vis tiek kreipiasi į view/index.phtml… Ką aš dar galiu pasakyti…
Patyrinėjęs atidžiau tą pavyzdį supratau vieną dalyką, pažiūrėkite patys:
Pirma dalis
$rendered = $view->render('bookinfo.tpl');
Antra dalis
public function render($name) { return $this->_smarty->fetch($name); }
Kaip jūs manote kokia bus $rendered reikšmė? O gi visas išspausdintas template ir ką man su juo daryti?
Tiesa, return galima pakeisti į echo, arba fetch į display. Bet šitas pakeitimas vis tiek neišsprendžia vieno dalyko: vis tiek reikia kiekvienam controler‘ui kurti po vaizdinį, nors ir tuščią. Koks mulkis, kurtų daug tuščių view failų, tam kad jo sistema veiktų?
Po ilgų instrukcijų skaitymo pagaliau įrašiau tokią eilutę:
$this->_helper->viewRenderer->setNoRender();
Ir mano nuostabai jinai suveikė, nors nelabai supratau kodėl. Tiesa, remiantis instrukcija, ta eilutė išjungia view failo generavimą tik vienam action, bet tai jau pradžia, kas nors žino geresnį variantą?
Apibendrinkime, ką per ilgas kančias pavyko pasiekti: mes galim pakeisti vieną action ir vietoj standartinio zend_view, visa bėda, kad jeigu norėsime pakeisti vietoj visų, teks kopijuoti daug kodo, kas man visai nėra miela… Pabandysiu padaryti kas išeis, bet labai tikiuosi ir jūsų pagalbos.
Dabar susimąsčiau, o kam man tas smarty… Matote iki šiol dirbom teoriniame lygyje tikėdamiesi, jog praktikoje viskas su realiais duomenimis veiks puikiai… Nė velnio! Pasirodo, anksčiau parašytas projektas notebook duomenis grąžina Zend_Db_Table_Rowset, kuris paprastai nenori būti masyvu.
Tiek to sureagavau per daug karštai, tiesiog jau nusibodo knistis po instrukcijas, problema išsisprendžia gana lengvai:
$note->fetchAll()->toArray();
Kaip matote paversti į masyvą viską labai lengva.
Kad nereiktų šimtus kartų kurti objekto, kuris dirba su smarty, visą kūrimą iškeliam į index.php failą, o sukurtą objektą užregistruojam.
$view = new Zend_View_Smarty(); $view->setScriptPath('./smarty/templates'); $view->setCompilePath('./smarty/templates_c'); Zend_Registry::set('view', $view);
Toliau kiekviename action tereikia išsitraukti $view iš registro ir galima su juo dirbti
$view = Zend_Registry::get('view');
Kažkoks Emo įrašas gavosi, bet, rodos, tai svarbiau negu ką norėjau pasakyti, daugiau pamatysite parsisiuntę kodą.
Tiesa, originalus notebook projektas buvo sukurtas ant zend framework 1.0.3 versijos, ar jis veiks ant naujesnės 1.5.1? Patikrinkim.
Deja, atrodo atsirado kai kurių pakeitimų, bibliotekų užkrovime. Hm… kažkaip einam tolyn, bet gaunasi ne progresas, o regresas. Anksčiau visas direktorijas buvo galima nurodyti su komanda set_include_path, tačiau 1.5.1 versija kažkaip įsigudrino ignoruoti šį parametrą, todėl dabar prie savo sukurtų klasių reikia nurodyti ir direktoriją, kuriose jos yra, atrodo šitaip
Zend_Loader::loadClass('Zend_View_Smarty','./library/');
Kodas su viena pataisyta eilute.
Ką manote apie tokį Zend framework ir Smarty apjungimą? Ar galite pasiūlyti ką patobulinti esamame būde, ar geriau pabandyti kurį nors kitą?
2008-04-11 | 15:29
O aš vis dar nesuprantu kam reikalingas smarty, gi PHP is pretty good templating language itself ;)
2008-04-11 | 15:51
Artūrai, visiškai tau pritariu ;) Vienintelis vertas dėmesio dalykas Smartyje - kešavimas.
2008-04-11 | 16:26
Man jau seniai template visiskai nereikalingi, kuriu galu sito marozo reik? Tiem kas nesupranta, pasakykit kuo jau skiriasi tai:
{$tekstas} nuo
Template yra skirti tik web dizaineriams kurie nemoka php, nors kaip mano pavyzdyje - nieko nesudetingo
2008-04-11 | 16:56
ZendFW galėtų integruoti galimybę pajungti savo “View” dalies handlerį. Tokiu atveju galima būtų naudoti ir phemplate variklį ,)
2008-04-14 | 7:09
kas cia per pornografija :D smarty tik pradinukams, kaip sake pirmi 3 komentatoriai php pats geriausias template engine :) o kas del kesavimo yra daug paprastu isseiciu :D kad ir pasirasyt savo kesavimo klasyte o tai nera labai sudetinga vos keleta funkciju…
2008-04-17 | 20:30
Niekas nedraudžia naudoti phemplate. Pajungimo procesas būtų analogiškas smarty.
Beje, smarty gerai tada, kai yra krūva privelto kodo, ir norima įvesti bent šiek tiek tvarkos bent atvaizdavimo logikoje. O kitas pliusas, kad smarty sintaksė html kode yra žymiai labiau skaitomi nei html’o mišinys su php. Be abejo, tai galbūt čia ir subjektyvu.
2008-04-21 | 15:54
Smarty neparašysi nieko, ko negalėtum parašyti php. Jis yra daug lėtesnis ir ryja daugiau procesoriaus bei RAM’o, tačiau kartais juo parašytas kodas aiškesnis.
(http://www.nomorepasting.com/getpaste.php?pasteid=14846)
Kiekvienam pagal skonį.
2008-06-14 | 9:48
[quote]
Artūrai, visiškai tau pritariu ;) Vienintelis vertas dėmesio dalykas Smartyje - kešavimas.
[/quote]
Gal paaiškntum kas yra “kešavimas” ?
2008-06-14 | 22:54
“kešavimas” - tai barbarizmas. Teisingai butu podėliavimas (ar podėlevimas).
2008-07-04 | 15:23
Smarty yra pats greičiausias phpinis template variklis. Visad jį naudoju, nes html maišyti su php yra Šlykštu, painu ir renkama ranka daugiau kodo! Smarty viską vistiek paverčia į php+html mišinį ir išsaugo savo templates_c direktorijoje tik tas brudas jau nuspeliamas nuo programuotojo. Smarty ryja daug proco ir ramų?? nejuokinkit žmonės, gyvenam su XXIa serveriais ;} ir templates_c failai sukompiliuoti tikrai gerai.
Man nepatiko šiame straipsnyje aprašytas Smarty įdiegimas į ZendFramework. Nepatiko ir kiti straipsniai. Tiesa sakant reikia pašalinti tik vieną problemą: išjungti defaultini Zend_View. Galima daryti taip:
// kažkur index.php
// …
$front = Zend_Controller_Front::getInstance();
//…
$front->setParam(’noViewRenderer’, true);
//…
dabar galima apsirašyti kažką tokio: (View/Template.php faile)
class View_Template extends Smarty implements Zend_View_Interface
{
//…
Galima to ir nedaryti. Jei nėra reikalo naują view derinti su Zend, galime ir nieko neimplementuoti.
Paskui kažkur indexe galima užkurti ir patį smarty objektą jei norim jį pasiekti su global $tpl; Jei nenorim, to nedarom.
//…
$tpl = View_Template::getInstance();
//…
O va dabar duosim kontroleriui naują view
// kitus kontrolerius patartina išvesti iš PageController - mažiau darbo.
class PageController extends Zend_Controller_Action
{
/**
* Instaliuojam nauja view
*
*/
function init()
{
$this->view = View_Template::getInstance();
}
/**
* Veiksmai po Action
*
*/
function postDispatch()
{
View_Template::getInstance()->display(”index.tpl”);
}
function indexAction()
{
$this->view->cap = “pavadinimas”;
$this->view->text = “cia smarty”;
}
//…
/…
Jei kažkur index.php padarėm $tpl = View_Template::getInstance(); tai postDispatch atrodys taip: (atitinkamai ir init())
function postDispatch()
{
//View_Template::getInstance()->display(”index.tpl”);
global $tpl;
$tpl->display(”index.tpl”);
}
2008-08-15 | 19:37
Norit pasakysiu kas iš tiesų yra šlykštu? NENAUDOTI PHP KAIP IDEALAUS TEMPLEITŲ ENGINO YRA ŠLYKŠTU. NAUDOTI VISOKIUS SMARTY YRA ŠLYKŠTU.
Well, panagrinėkim PHP. Kam galvojat php buvo sukurtas? Kartais ne tam, kad palengvintų web-saitų kūrimą? PHP, JSP, ASP.NET, Ruby on Rails buvo sukurti TEMPLEITAMS ir TIK TEMPLEITAMS. Nemanot?
Ko jums maišo pavyzdžiui vat va toks parašymas:
Manot visoks atrodo gražiau? Dėl to ir naudojat visokius smarty? Negana to kad yra absoliutus šlamštas, bet dar ir kraus puslapį žiauriai lėtai.
Jei PHP nenorit vartot pagal jo paskirtį, tai ko blemba nenaudojat kokio Delphi, C/C++ tiesiog pasidarydami paprastą socketą ir jam siųsdami XML ar HTML duomenis:
( ( IPage* )MyPage )->DoSomeActions();
if ( that_and_that )
HTTPServer->Send( ‘Error! Blah blah’ );
C++ netgi dešimtimis kartų greičiau atliktų! Ir puslapį greičiau užkrautų, nes jokio kodo nereiktų siųst jokiam interperatoriui, nieko nereiktų parsint, tereiktų tik naršyklei HTML failą parsisiųst.
Taigi apsispręskit, arba naudojat PHP ne tik frameworkams bet ir templeitams, arba naudojat C / C++ frameworkams ir XML ar HTML outputo siuntimams ir taip dešimtimis kartų pasparinsite puslapio krovimą. Apsispręskit ir supraskit paskirtis pagaliau!
2008-08-15 | 19:40
Manot visoks smarty gražiau*