TheClown Skrevet 4. mai 2008 Del Skrevet 4. mai 2008 (endret) Heisann Diskusjon.no. Jeg trenger litt hjelp. Jeg har sett meg dritt lei på PHP koder med masser av HTML output, så jeg har nå bestemt meg for å begynne å lage et skikkelig templatesystem istede. Jeg fant en fin kode som jeg endret litt på, og den funker fantastisk bra Function.php <?php // Function function Template($file, $array) { if (file_exists($file)) { $output = file_get_contents($file); while (list($key, $val) = each($array)) { $replace = '{'.$key.'}'; $output = str_replace($replace, $val, $output); } return $output; } } ?> index.php $tpl = Template('index.tpl', array ( 'fruit' => $fruit, 'color' => $color, )); index.tpl <b>Your Favorite Food Is: {fruit}</b> <b>Your Favorite Color Is: {color}</b> Alt den gjør er å ersatte { & } og echoe variablen. Men noen ganger trenger jeg å bruke litt mer komplisserte ting, som en loop eller MySQL spørring. Jeg har funnet ut at den enkleste metoden her er å skrive PHP koden i .tpl fila. Men da kommer vi til problemet. Åssen kan jeg skrive en funksjon som tillater PHP i template-fila? Slik det er nå funker ikke PHP i det heletatt. Noen som har noen gode ideer? Jeg har bestemt meg for å lage eget system istede for å bruke noe ferdiglagd fordi de er alt for omfattende for mitt bruk. Endret 4. mai 2008 av TheClown Lenke til kommentar
Jonas Skrevet 4. mai 2008 Del Skrevet 4. mai 2008 Halve poenget med templates er jo nettop å separere PHP fra HTML, så å implentere PHP-støtte inni templaten er ingen super-ide, men absolutt mulig. Ta en titt på eval(). Når det gjelder arrays, så er det også mulig. Krever dog litt mer avansert kode, ettersom man må søke rekursivt, med mindre du kun ønsker arrays av to dimensjoner. <table> {rows="<tr>{array=\"<td>{element}</td>\"}</tr>"} </table> Kan se om jeg finner igjen et par eldre regex-uttrykk jeg har liggende for nettopp dette. Lenke til kommentar
Thullball Skrevet 4. mai 2008 Del Skrevet 4. mai 2008 Uten at jeg vet helt sikkert så tror jeg du kan legge inn php kode ved å bruke {php} tags. Er ikke sikker på om det fungerer men.. Lenke til kommentar
TheClown Skrevet 4. mai 2008 Forfatter Del Skrevet 4. mai 2008 Jeg kom akkurat på en ting til; hva med if og else? if ($user = "offline") osv. noen som har en løsning på det også? Lenke til kommentar
Jonas Skrevet 4. mai 2008 Del Skrevet 4. mai 2008 (endret) Som sagt, bruk evail() dersom du ønsker å kjøre PHP-kode. Fant for øvrig frem noe du kanskje kan bruke for arrays. Koden printer ut følgende tabell. <table> <caption>Groceries</caption> <tr> <th>Name</th> <th>Price</th> <th>Status</th> </tr> <tr> <td>Apple</td> <td>5$</td> <td>On sale!!</td> </tr> <tr> <td>Juice</td> <td>10$</td> <td>Not on sale ..</td> </tr> <tr> <td>Milk</td> <td>100$</td> <td>Definitely not on sale!</td> </tr> </table> <?php $test = array ( array ( 'Apple', '5$', 'On sale!!' ), array ( 'Juice', '10$', 'Not on sale ..' ), array ( 'Milk', '100$', 'Definitely not on sale!' ) ); // Heredoc, dersom du ikke er kjent med dette. // http://no.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc $template = <<<EOF <table> <caption>{tablecaption}</caption> <tr> {tableheadings="<th>\{element\}</th>"} </tr> {tablerows="<tr>\{array=\"<td>\\{element\\}</td>\"\}</tr>"} </table> EOF; echo Template ( array ( 'tablecaption' => 'Groceries', 'tableheadings' => array ( 'Name', 'Price', 'Status' ), 'tablerows' => $test ), $template ); // Her begynner template-funksjonene. function Template ( $args, $template ) { foreach ( $args as $arg => $value ) { if ( is_array ( $value ) ) { if ( preg_match ( '/\{' . $arg . '\=\"(.*?)\"\}/', $template, $matches ) ) { $template = str_replace ( $matches[0], FormArrayFromTemplate ( stripcslashes ( $matches[1] ), $value ), $template ); } else { die ( 'ERROR: Given array-data without any array-tags. Unvalid template!' ); } } else { $template = str_replace ( '{' . $arg . '}', $value, $template ); } } return $template; } function FormArrayFromTemplate ( $matches, $values ) { foreach ( $values as $value ) { if ( is_array ( $value ) ) { if ( preg_match ( '/\{array\=\"(.*?)\"\}/', $matches, $submatches ) ) { $formedArray .= str_replace ( $submatches[0], FormArrayFromTemplate ( stripcslashes ( $submatches[1] ), $value ), $matches ); } else { die ( 'ERROR: Given array-data without any array-tags. Unvalid template!' ); } } else { $formedArray .= str_replace ( '{element}', $value, $matches ); } } return $formedArray; } ?> Du kan se scriptet in-action her. Endret 4. mai 2008 av Jonas Lenke til kommentar
TheClown Skrevet 4. mai 2008 Forfatter Del Skrevet 4. mai 2008 Hm, jo. Du har rett. Det er flere løsninger. Men i mitt tilfelle skal jeg bruke mange SQL spørringer og looper som gjenntar seg selv mange ganger. Er dettescriptet egnet til det? Også er det det med if & else. Hvis en verdi ikke er satt eller ikke har en bestemt verdi ser templaten forskjellig ut. Er det mulig å lage på en enkel måte? Lenke til kommentar
Jonas Skrevet 4. mai 2008 Del Skrevet 4. mai 2008 Nå begynner du å blande inn presentasjon med applikasjon igjen, da har du misforstått hele poenget med en template-motor. Å skille mellom autentiserte brukere og vanlig besøkende gjør du ikke inni templates. if ( $user == "offline" ) echo Template (); else die('Vennligst logg inn.'); Lenke til kommentar
TheClown Skrevet 4. mai 2008 Forfatter Del Skrevet 4. mai 2008 Vel, nå sitter jeg og leser phpBB 3 templatefilene. Og så vidt jeg sier at de masser av IF og ELSE i .tpl filene sine: <h2><!-- IF LOGIN_EXPLAIN -->{LOGIN_EXPLAIN}<!-- ELSE -->{L_LOGIN}<!-- ENDIF --></h2> Lenke til kommentar
Jonas Skrevet 4. mai 2008 Del Skrevet 4. mai 2008 Hvis du ønsker akkurat hva phpBB3 har, hvorfor ikke bare se hvordan de har gjort det? Du må ikke tro det blir mye mindre komplekst bare fordi du lager det selv, tvert imot - gutta bak der har nok lang erfaring. Lenke til kommentar
TheClown Skrevet 4. mai 2008 Forfatter Del Skrevet 4. mai 2008 Joda, jeg syntes phpBB3's løsninger ser veldig fine ut. Og jeg kikker i functions_template.php som er fila hvor alt dette gjøres. Men de har mange ekstremt inviklede og komliserte løsninger på ting. Jeg vil bare ha et system som funker og som ikke er utenfor det jeg kan. Derfor prøver jeg meg litt frem og spør forskiktig om hjelp Lenke til kommentar
TheClown Skrevet 4. mai 2008 Forfatter Del Skrevet 4. mai 2008 Sånn, nå har jeg jobbet litt vidre på functions.php og lagt til IF, ELSE og INCLUDE støtte. Det funker helt fint, men outputen blir i HTML og ikke PHP. Dersom noen kunne hjelpe meg med bare dette tror jeg at problemet er løst. Litt PHP i templatefila får jeg bare drite i. <?php // Tags $tags = array( // PHP start/stop "<!-- PHP -->" => "<?php", "<!-- /PHP -->" => "?>", // Include start/stop "<!-- INCLUDE -->" => "include '", "<!-- /INCLUDE -->" => "';", "<!-- INCLUDE -->" => "include '", "<!-- /INCLUDE -->" => "';", // If "<!-- BEGIN-IF -->" => "if (", "<!-- IF -->" => ") {", "<!-- /IF -->" => "}", // Else "<!-- ELSE -->" => "else {", "<!-- /ELSE -->" => "}", ); // Function function Template($file, $array) { if (file_exists($file)) { $output = file_get_contents($file); while (list($key, $val) = each($array)) { $replace = '{'.$key.'}'; $output = str_replace($replace, $val, $output); } global $tags; return str_replace(array_keys($tags), array_values($tags), $output); } } ?> Eksempel: <!-- INCLUDE -->header.tpl<!-- /INCLUDE --> <!-- PHP --> <!-- BEGIN-IF -->$2 + $2 == 4<!-- IF --> sånn og slik! <!-- /IF --> <!-- /PHP --> Output: <?php if ($2 + $2 == 4) { sånn og slik! } ?> Lenke til kommentar
MadMe Skrevet 4. mai 2008 Del Skrevet 4. mai 2008 Hvorfor ikke bruke PHP templatesystemet Smarty? Har alt du trenger http://www.smarty.net/ Lenke til kommentar
TheClown Skrevet 4. mai 2008 Forfatter Del Skrevet 4. mai 2008 Joda, jeg kunne bruke Smarty. Har sett litt på det. Men jeg har mest lyst til å lage noe selv, som ikke er for omfattende. Dersom bare fikser PHP output istede for HTML tror jeg at jeg har alt jeg trenger Lenke til kommentar
Lokaltog Skrevet 4. mai 2008 Del Skrevet 4. mai 2008 Haha, jeg synes den rene PHP-koden var hundre ganger mer ryddig enn templateopplegget ditt. Lenke til kommentar
Jonas Skrevet 4. mai 2008 Del Skrevet 4. mai 2008 (endret) Si meg, hva i all verden er vitsen med i skrive PHP-kode innkapslet i HTML-kommentarer, når du allikevel bare erstatter det med ordentlig kode? :!: Hvorfor da ikke bare skrive PHP i ordinære PHP-filer? Som sagt, to ganger allerede, du kan evaluere PHP-kode fra string med eval(). Enkleste ville nok være å bare bruke include() i en kombinasjon med Output Control Functions, for å kunne erstatte {tags} med ordinær data. Endret 4. mai 2008 av Jonas Lenke til kommentar
Runar0 Skrevet 4. mai 2008 Del Skrevet 4. mai 2008 (endret) Kvifor vil du ha eit eige template språk som du parser i php? Er da ikkje verre enn å gjøre noe slik: /** * Ein veldig enkel php template funksjon * * @param string $fil Navn på fila du vil parse * @param array $argumenter Eventuelle variabler du trenger i template fila */ function tpl($fil, $argumenter = array()) { if(is_array($argumenter)) { extract($argumenter); } include $fil; } /* * Eksempel template fil: index.phtml * * Legg merke til den alternative synkaksen på foreach blokka, du kan gjøre * tilsvarende på if, while, do-while, for, etc */ Hei og velkommen, <?php echo $navn ?><br> <br> Du har følgende produkter i handlekurven: <ul> <?php foreach($produkter as $produkt): ?> <li><?php echo $produkt ?></li> <?php endforeach; ?> </ul> /* * Index.php * */ tpl('index.phtml', array('navn' => 'Runar', 'produkter' => array('Melk', 'Brød'))); I mine auger er dette minst like 'fint' som template spåk, og ytelsen er uslålig. (Med mindre du bruker ein template motor som mellomlagrer template filene i php da) * Leif Endret 4. mai 2008 av Runar0 Lenke til kommentar
Ueland Skrevet 4. mai 2008 Del Skrevet 4. mai 2008 http://www.smarty.net/ Enkelt og greit Lenke til kommentar
TheClown Skrevet 4. mai 2008 Forfatter Del Skrevet 4. mai 2008 Prøvd Smarty nå. Funka greit. Tror jeg skal bruke det på dette prosjektet. Problemet mitt, Runar er at jeg har enorme HTML koder med tables, CSS osv. Hvis jeg skal begynne å endre designet mitt kommer det til å ta veldig lang tid dersom jeg skal bla igjennom alle PHP kodene og loopene og endre alt. Lenke til kommentar
Runar0 Skrevet 4. mai 2008 Del Skrevet 4. mai 2008 (endret) Jo det skjønner eg. Vist du ser på koden min, så vil du se at du vil oppnå akkurat det du ønsker og foreslår tidligere i tråden uten bruk av egene template tags. Endret 4. mai 2008 av Runar0 Lenke til kommentar
TheClown Skrevet 4. mai 2008 Forfatter Del Skrevet 4. mai 2008 (endret) Joda, det sier seg selv Da kan jeg opplyse at jeg har begynt å kode om et ganske stort system til template m/Smarty. Ser forløpig ut til å funke fint Loops funker også meget bra Endret 5. mai 2008 av TheClown Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå