Smarty hogyan használjam
2008-10-20T20:24:50+02:00
2009-10-01T23:12:11+02:00
2022-07-19T04:28:08+02:00
  • Olyan enginet írni nem kunszt, ami csak változókat olvas be.


    Ja, hogy úgy! Értem...
    Mutasd a teljes hozzászólást!
  • Nem egy könnyű olvasmánynak szántam. Olyan enginet írni nem kunszt, ami csak változókat olvas be. A problémák a függvényhívásoknál, és a függvény egymásba ágyazásoknál kezdődnek.
    Mutasd a teljes hozzászólást!
  • Megnéztem a cikkedet.

    Érdekesnek tűnik, de "túl okos" a bemutatott engine.

    Sokkal könnyebben lenne emészthető a téma, ha első körben azt mutattad volna be, hogyan működik egy olyan engine, ami nem tud mást csak assign-olni értékeket, és az assign-olás után kiértékelni a template-et (display).

    Mutasd a teljes hozzászólást!
  • create_function segítségével sikerült közben megoldani...
    Mutasd a teljes hozzászólást!
  • Bocs, hogy ilyen pihent vagyok, de nem értem; és mivel nem az én sztring konstansaimat használtad, le sem tudom tudom tesztelni, hogy azt csinálja-e, amire rákérdeztem.

    Mutasd a teljes hozzászólást!
  • Az alapelgondolást én is használom, de nem Smartyban.

    Egyelőre azon agyalok, hogy hogy oldjam meg Pluginekkel ugyanezt. A lényeg, hogy a php-ra fordított kódban egy függvény megadásnak és sok függvény hívásnak kellene lennie. Helyette most az van, hogy a függvény tartalmát bemásolom minden egyes hívás helyére. Ez persze nem túl takarékos.


    Valami ilyesmire gondolok:

    tpl:
    {$res_body|table:$res_head}

    compiled:
    <?php function modifier_table($head,$body) { $keys=array_keys($head); ?><table> <thead> <tr><?php foreach($keys as &$key) { ?><td><?php echo $head[$key]; ?></td><?php } ?></tr> </thead> <tbody><?php foreach ($body as &$row) { ?><tr><?php foreach ($keys as &$key) { ?><td><?php echo $row[$key]; ?></td><?php } ?></tr><?php } ?></tbody> </table><?php } modifier_table($this->params['res_head'],$this->params['res_body']); ?>

    A gond az, hogy ez így nem stimmel. Az eval-al nyilván egy osztály belsejéből hívom meg, azért $this->params. Viszont ahol meghívom, ott nem tudom létrehozni a modifier_table függvényt. A plugin fájlt pedig nem fogom a kiértékelésnél is betölteni, mert az nagyon gáz lenne. Szóval valahogyan a plugin fájlból át kéne tenni a compiledbe egy függvényt, és a kiértékelésnél pedig használni azt.
    Ez nem egy egyszerű feladat.
    Mutasd a teljes hozzászólást!
  • Hát én regex nélkül szoktam splittelni, aztán az első két paraméter alapján a frontController megmondja, hogy milyen osztály melyik függvényét kell meghívni. A többi pedig paraméter lesz. (Nem olvastam végig, hogy miről van szó, szóval lehet félreértettem valamit. )
    Mutasd a teljes hozzászólást!
  • Örülök, hogy érted.

    De a kérdés fenn áll:
    kíváncsi lennék, hogy kinek vannak hasonló komplexitású függvényei Smarty-val implementálva
    Mutasd a teljes hozzászólást!
  • Köszi, most már értem
    Mutasd a teljes hozzászólást!
  • Arra mutattam példát, hogy hogy kell meghívni a függvényt.
    Egy string-et ad vissza, amit pl. így lehet megjeleníteni.
    <?=RenderListIntoTable(...)?>

    Pl. így is meghívhatod:
    RenderListIntoTable( 3, // column count '{name}&nbsp;{address}', // template array( array('name'=>'Levente','address'=>'Budapest'), array('name'=>'Zita','address'=>'Budapest'), array('name'=>'Gábor','address'=>'Pécs'), array('name'=>'Tímea','address'=>'Budapest'), array('name'=>'Anita','address'=>'Miskolc') ) // dataset );

    Eredmény:
    <table> <tr><td>Levente Budapest</td><td>Zita Budapest</td><td>Gábor Pécs</td></tr> <tr><td>Tímea Budapest</td><td>Anita Miskolc</td><td>&nbsp;</td></tr> </table>

    De ez igazából egy függvény a sok közül. Csak a problématípusra akartam rámutatni.
    Mutasd a teljes hozzászólást!
  • Sok mindent nem értek a kódodban
    Lenne még egy kis segítség? Esetleg egy rövid példaprogram
    Mutasd a teljes hozzászólást!
  • Hát nekem vannak frankó template-ezhető függvényeim.
    Pl.:
    RenderListIntoTable( $columnCount = 4, $cellTemplate = ' <table> <tr><td>ID:</td><td>{id}</td></tr> <tr><td>Név:</td><td>{name}</td></tr> </table>', $data = array( array( 'id' => 1, 'name' => 'Katalin' ), array( 'id' => 2, 'name => 'Róbert' ), ) );
    Ez PHP-ban van megírva, és egy tömbben definiált dataset-et jelenít meg tetszőleges oszlopszámú táblázatban. Képgalériákhoz jó igazán.

    Namost. Én kíváncsi lennék, hogy kinek vannak hasonló komplexitású függvényei Smarty-val implementálva. (Mert ugye ez a megjelenítéshez tartozik, tehát Smarty-ban kellene implementálni.) Szerintem sok Smarty-t használó fejlesztő minden egyes feladatot minden űrlapon újra megold ahelyett, hogy függvényeket hozna létre.
    Mutasd a teljes hozzászólást!
  • Hát, pedig más megoldás nem igen van. Vagy tudsz jobbat? Teljesen mindegy hgy a cake vagy az apache végzi el helyetted. Ha eleve nem jó neveket találtál ki mire/kire számíthatsz?
    A controller nevet ki lehet hagyni a dologból, de a második objektumnál bajba leszel. Mert valahogy meg kell adnod, hogy mivel mit csinálsz. Így az "edit" kulcsszó a második objektumnál már nem használhatod, ha az "edit"-tel az elsőt szerkeszted.
    Van megoldás ha az összes táblád egyedi kulcsa globálisan is egyedi. Csak nem valószínű hogy az gyorsabb lesz

    Mutasd a teljes hozzászólást!
  • Valahogy így:
    Router::connect('controller1/action1/parameter1/parameter2/*', array('controller' => 'vezerlo', 'action'=>'akcio', 'P1', 'P2'));
    Mutasd a teljes hozzászólást!
  • Én is sokat rágódtam már ezen, hogy mi szükség van erre a smarty-ra, de ez most eléggé meggyőzőnek tűnik:

    Van X ceg, es alkalmazza, A-t, B-t es C-t. A, B es C megegyeznek, hogy smarty-t/PDO-t/mysql-t/<barmilyen mas altalaban elfogadott, jol dokumentalt alrendszer>-t hasznalnak, es csak azt. Jon D, aki ugy dont, hogy szerinte a smarty/PDO/mysql/etc. hulyeseg, es inkabb hasznalja a sajat dokumentalatlan, vilagmegvalto megoldasat. A, B es C jo fej emberek, es hagyjak, had csinalja...



    Így aztán teszek még egy kört vele, hátha be tudom illeszteni a saját, világmegváltó, dokumentálatlan rendszerembe
    Mutasd a teljes hozzászólást!
  • Meg lehet oldani az ilyesmit regex-el, csak elég lassú, ha több ilyen mintát használsz fel.
    Mutasd a teljes hozzászólást!
  • Arra gondolsz, hogy ezt az URL-t

    http://localhost/valami1/valami2/valami3/valami4/action1/parameter1/parameter2

    (a felhasználó számára láthatatlanul) át lehet irányítani ide

    http://localhost/controller1/action1/parameter1/parameter2

    ennek a segítségével?

    Router::connect( 'URL', array('paramName' => 'defaultValue'), array('paramName' => 'matchingRegex') )

    Ha ez működne, akkor a

    http://localhost/controller1/action1/parameter1/parameter2

    közvetlen elérésének a letiltásával tökéletes lenne a megoldás.

    De ötletem sincs, hogy a Router::connect metódusát, hogy kell beparaméterezni.
    Mutasd a teljes hozzászólást!
  • Amit meg Te akarsz, az az első példa, nem?
    Miért ne lehetne az url:
    valami/valami/valami/valami/akármi/megintakarmi

    Ez vigyen a controller=egyescontroller és action=egyesaction -höz.
    Vagy nem ilyet akarsz?
    Mutasd a teljes hozzászólást!
  • Szívesen találkoznék olyan emberrel, aki elhatárolódik a PHP-től - azt mondja, hogy ő designer, de a Smarty template szintaxist ellenben kenivágja.

    Nincs és ne is legyen :D

    Mi értelme a template engine-nek, ha a desginernek kell ciklusokat meg formázásokat meg plugineket meg miegymást belehergelni a cuccba? Szerintem a designer/sitebuilder ne formázzon meg egy semmit és ne írjon program vezérlést. Itt az ilyenekre gondolok (innen):
    {$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}


    Engem még az is zavar...

    CodeIgniter-ben szerintem lehet ilyet.
    Mutasd a teljes hozzászólást!
  • Amit te említesz a URL-lel kapcsolatban az ezen az oldalon a 3. példának felel meg.

    Nekem nem ilyenre lenne szükségem.

    Nekem prefix routingra lenne szükségem, de az "rosszul" van kitalálva a CakePHP-ban, mert a CakePHP-ban a prefixet az action (azaz függvénynév) elé kell tenni a controller (azaz mappanév) helyett.

    Mutasd a teljes hozzászólást!
  • Ez szerintem nem igaz.
    Van neki olyan hogy routig.php a config könyvtáron belül.
    Olyat már biztosan csináltam, hogy a
    /nev
    linket jelenítse meg
    cegek/mutat/name:nev
    (
    controller/action/parameter
    )-ként

    Egyébként nem is értem ezt a smarty dolgot. Hogyan lehet ennél egyszerűbben eltárolni egy input taget?

    <?php $form->input('Modelname.Fieldname') ?>

    ez ügye kiteszi a divet, benne a labelt és a megfelelő tipusú mezőt.

    <div class='input text'> <label for='name'>Név:</label> <input type='text' id='ModelnameFieldname' name='data[Modelname][Fieldname]' blablaa> </div>
    Mutasd a teljes hozzászólást!
  • Néhány gondolat még.

    Szívesen találkoznék olyan emberrel, aki elhatárolódik a PHP-től - azt mondja, hogy ő designer, de a Smarty template szintaxist ellenben kenivágja. (Tudom, ezt már más is írta a topic-ban.)

    A Symfony is PHP szintaxist használ a template-eken belül.

    Engem még az is zavar a CakePHP-ben, hogy tudomásom szerint az űrlapokat (műveleteket) csak első szintű kategóriába lehet bele tenni:
    /kategoria1/muvelet1 /kategoria1/muvelet2 /kategoria2/muvelet3
    Tehát ilyesmit nem lehet csinálni:
    /tudastar/php/smarty/listTopics (/kategoria1/kategoria2/kategoria3/muvelet1)
    Mutasd a teljes hozzászólást!
  • Igen, tudom, most próbálkozom a Cakephp fortélyait elsajátítani, azért is szúrta a szemem ez a dolog, mert igazából ugyan azt tudja és nem kell megerőszakolni még egy nyelvvel.

    Nekem még nem kellett több view egy functionhoz, de most, hogy mondod esetleg különböző termékeknél kellhet, bár igazán ott sem érzem annyira


    Akartam is kérdezni, neked, nektek mennyire gyors egy oldalgenerálás? (cakephp, smarty) Mert nekem iszonyatosan lassú néha ( van amikor 8 sec, localhoston, igaz ez egy xar gép, de néha túlzásnak érzem azért. , van amikor 0,4 sec )
    Mutasd a teljes hozzászólást!
  • annak mondjuk mi értelme, hogy a smartynak ha jól tudom saját "nyelve" van


    Jogosultság-kezelés. Megakadályozza a fejlesztőt/designer-t attól, hogy hülyeséget csináljon.
    Alternatívaként tehettek volna a php.ini-be valami olyasmi beállítást, hogy only_allow_array_processing_operations.


    A CakePHP keretrendszerben egyébként a template-eket PHP nyelven kell megírni. Tehát nem minden template-ező rendszernek van saját szintaxisa.
    A CakePHP-ben számomra pozitívum a Smarty-val szemben, hogy alapból van URL-rewriting, és ha az URL mezőbe beírjuk pl. hogy localhost/viewProduct/4, akkor egy ilyen függvényre van rá állítva a hívás automatikusan:
    function viewProduct($customVarName)
    Számomra negatívum viszont, hogy a műveletek és view-k között egy-egy kapcsolat van (nem úgy mint Smarty esetén).
    Mutasd a teljes hozzászólást!
  • Ez a része jó, igen, de annak mondjuk mi értelme, hogy a smartynak ha jól tudom saját "nyelve" van.

    Szal van egy elég jó templatező nyelvünk (php) és azt még leterheljük, hogy a smartyt is dolgozza fel. Ennek értelmét nem látom, bár én még sosem használtam smartyt, lehet az a foreach jobb
    Mutasd a teljes hozzászólást!
  • A "Smarty-val vagy Smarty-nélkül" című vitában egy dolgot még megemlítenék, mivel nem láttam, hogy valaki írta-e.

    Bár hagyományos PHP alkalmazásokban is szét lehet választani a logikát és a megjelenítést, Smarty segítségével a logikától függővé lehet tenni, hogy egyáltalán melyik template-et akarjuk megjeleníteni.

    Így nem kell állandóan session-be szerializálni a hibaüzeneteket, és redirect-tel telenyomni a kódot.

    Példa a Smarty-s megközelítésre (nagyvonalakban):
    if($_GET['action']=='addProduct') { // ha hibát találunk az űrlap validáció során, kiírjuk a hibát if($error) { $smarty->assign('errorMessage','Product name is mandatory.'); $smarty->display('AddProduct.tpl'); } else { SaveProduct($_POST); $smarty->assign('data', ListProducts()); $smarty->display('ProductList.tpl'); } }
    Mutasd a teljes hozzászólást!
  • Na akkor kell a template nyelv :)
    Nem ismerem a php-s keretrendszereket, csak érdekességképpen írtam le, hogy néz ki ez asp.net-ben :)
    Mutasd a teljes hozzászólást!
  • Csinalsz izemize kontrollt.

    Irsz load_control nevu plugint (egy tok primitiv fuggveny) a smarty-hoz. Delimitert lecsereled '<$', '$>' jelekre mondjuk, ha annyira idegesit a {}.

    <$load_control name='IzeMize' [tobbi parameter]$>

    vagy ha nem idegesit a delimiter:

    {load_control name='IzeMize' [tobbi paramter]}
    Mutasd a teljes hozzászólást!
  • ooo... Rapyd?

    Rapyd crud widgets for laravel 4
    http://test.rapyd.com/sa/demo/

    Oke, letoltod. De a takolmany kicsit nekem eros. :]
    Mutasd a teljes hozzászólást!
  • Ha jól tévedek a prado tud ilyet. (nem tempalte rendszer hanem teljes framework)

    <cc1:IzeMize ID="..." [többi parameter]>
    helyett lehet ilyet:
    <?=cc1::IzeMize(parameterek)?>

    Az aspx-es verzióval jobban szét van választva a kód a megjelenítéstől?

    szerk: nem ismerem az aspxet, lehet hogy többre képes a kontroller mint az a php kód amit fent írtam, de megjelenítés-szétválasztás szempontjóból nem hiszem hogy jobb
    Mutasd a teljes hozzászólást!
abcd