NePo
Balandis 11, 2008

Zend Framework + Smarty

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 , juk jie stabdo. Dabar aš negaliu suprasti, kaip galima sukurti tinklalapį nenaudojant , 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 supratau ko man trūksta, labai trūksta - . 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 bei , 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 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 … 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 , 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 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į ir apjungimą? Ar galite pasiūlyti ką patobulinti esamame būde, ar geriau pabandyti kurį nors kitą?

Panašūs straipsniai


“Zend Framework + Smarty” komentarų: 12

  1. Artūras Šlajus

    O aš vis dar nesuprantu kam reikalingas smarty, gi PHP is pretty good templating language itself ;)

  2. asterisk

    Artūrai, visiškai tau pritariu ;) Vienintelis vertas dėmesio dalykas Smartyje - kešavimas.

  3. desper4do

    Man jau seniai template visiskai nereikalingi, kuriu galu sito marozo reik? Tiem kas nesupranta, pasakykit kuo jau skiriasi tai:
    {$tekstas} nuo

    <?=$tekstas?>

    Template yra skirti tik web dizaineriams kurie nemoka php, nors kaip mano pavyzdyje - nieko nesudetingo

  4. Eimantas

    ZendFW galėtų integruoti galimybę pajungti savo “View” dalies handlerį. Tokiu atveju galima būtų naudoti ir phemplate variklį ,)

  5. Irmantas

    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…

  6. Spec.Efektas

    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.

  7. Algimantas Stancelis

    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.

    {head}<script></script>{/head}
    <? ob_start(); ?><script></script><? $content['head'] = ob_get_clean(); ?>
     
    {link action=client.showInvoice number=$invoice.number}
    <?= link(array('action' => 'client.showInvoice', 'number' => $invoice['number'])) ; ?>
     
    {foreach item=image from=$images}
    <div>....</div>
    {foreachelse}
    <div>You have no uploaded images.</div>
    {/foreach}
     
    <? if ($images): ?>
    <? foreach ($images as $image): ?>
    <div>....</div>
    <? endforeach; ?>
    <? else: ?>
    <div>You have no uploaded images.</div>
    <? endif; ?>

    (http://www.nomorepasting.com/getpaste.php?pasteid=14846)
    Kiekvienam pagal skonį.

  8. SwataZ

    [quote]
    Artūrai, visiškai tau pritariu ;) Vienintelis vertas dėmesio dalykas Smartyje - kešavimas.
    [/quote]

    Gal paaiškntum kas yra “kešavimas” ?


  9. “kešavimas” - tai barbarizmas. Teisingai butu podėliavimas (ar podėlevimas).

  10. Rimvydas

    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”);
    }

  11. NightVisio

    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:

    <div class="page_list">
    <?php foreach ( $Registry->Links as $Key => $Link ) { ?>
    <a href="<?php echo $Link; ? rel="nofollow">" title="">[ <?php echo $Key; ?> ]</a>
    <?php } ?>
    </div>

    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!

  12. NightVisio

    Manot visoks smarty gražiau*

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.