#1 11. April 2007 Nach Platzhalter suchen und mit eval() bearbeiten topic + problem haben sich geändert, bitte ab posting: 9+10 weiterlesen!! + Multi-Zitat Zitieren
#2 11. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten $template = str_replace('{blabla}',$blablubb,$template); + Multi-Zitat Zitieren
#3 11. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten ich seh da den zusammenhang zu php noch nicht. ich würd nen text-editor nehmen: 1. ersetze $blahblubb mit $blahtemp 2. ersetze {blahblubb} mit $blahblubb 3. ersetze $blahtemp mit {blahblubb} + Multi-Zitat Zitieren
#4 11. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten so könnte es funktionieren: PHP: <? php // platzhalter und inhalt in array ablegen $vars = array( "BLA" => $bla , "LALA" => $lala ); // template laden $file = file_get_contents ( "templates/tmp.html" );foreach( $vars as $key => $value ) { $s [] = "{" . $key . "}" ; $r [] = $value ;} // ersetzten $html = str_replace ( $s , $r , $file );echo $html ; ?> + Multi-Zitat Zitieren
#5 11. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten ich gehe mal davon aus, dass du eine template engine machen willst daher würde ich dir empfehlen mit preg_match_all() die variabeln rauszusuchen und dann mit eval() zu arbeiten damit kannst du die z.B. direkt ersetzen lassen oder auch vorher testen ob sie überhaupt existieren eine einfacherere lösung wäre mir gerade nicht bekannt genauere infos zu den funktionen findest du bei php.net oder google.de + Multi-Zitat Zitieren
#6 12. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten PHP: ereg_replace ( "{blabla}" , " $blabla " , $gesamtercode ); muesste auch klappen + Multi-Zitat Zitieren
#7 12. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten richtig. hatte auch versucht mit eval zu arbeiten, aber leider hat ich nur probleme damit. und auf php.net hatte ich mich schon stundenlang in eval und preg_[...] reingelesen, aber irgendwie steig ich nicht ganz durch, deswegen der versuch platzhalter zu ersetzen. anfangs hatte ich sowas: $template = $tpl->get("output"); $template = str_replace("{platzhahalter}", $tpl->get("platzhalter"), $template); nur halte ich des ned für sinnvoll, da mehere platzhalter vorhanden sind und das script auch erweiterbar werden soll. (tpl classe ist vorhanden und funkioniert!) + Multi-Zitat Zitieren
#8 12. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten wenn du das so variabel machen willst wirst du um eval nicht drum rum kommen ansonsten gibt es die alternativen die bereits gepostet wurden, wo du allerdings alles vorher zuweisen musst ich hab momentan leider keine zeit, sonst würd ich das ja gerne mal testen aber du könntest ja damit anfangen uns zu sagen was bei dir mit eval() schief gegangen ist + Multi-Zitat Zitieren
#9 12. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten das war mein versuch mit eval: PHP: $template = $tpl -> get ( "output" ); // in "output" steht das: $header $template = eval( "\$header = \"" . $tpl -> get ( "header" ). "\";" );print( $template ); //nix, kein output, kein header wie gesagt, benutze eval() zum erstenmal + Multi-Zitat Zitieren
#10 13. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten push? ich wär super dankbar wenn mir jemand ein "verständliches" einführungstutorial schreiben/zeigen würde, da ich auf php.net und ein wenig google nicht wirklich für meinen erfahrungsstand verständliche erklärungen fand. hat jemand was? + Multi-Zitat Zitieren
#11 13. April 2007 AW: Nach Platzhalter suchen und mit eval() bearbeiten meine aller erste template-class in php: PHP: <? php class tpl { var $dir = "templates/" ; var $end = ".tpl" ; var $file ; var $html ; var $vars = array(); function load ( $file ) { $this -> file = $this -> dir . $file . $this -> end ; if( file_exists ( $this -> file )) { $this -> html = file_get_contents ( $this -> file ); if(isset( $this -> vars )) { $s = array(); $r = array(); foreach( $this -> vars as $key => $value ) { $s [] = "{" . $key . "}" ; $r [] = $value ; } $this -> html = str_replace ( $s , $r , $this -> html ); } return $this -> html ; } else { die( "Template <b>" . $this -> file . "</b> konnte nicht geladen werden!" ); } } function vars ( $vars ) { if(isset( $vars ) AND is_array ( $vars )) { foreach( $vars as $key => $value ) { $this -> vars [ $key ] = $value ; } return $this -> vars ; } } function view () { echo $this -> html ; }} $tpl = new tpl ; // platzhalter mit inhalt setzten und füllen $tpl -> vars (array( "NICK" => "funland" , "SONSTIGES" => $variable , "NEWS_ROW" => $tpl -> load ( "news_row" ) // ein template als platzhalter speichern )); // template laden aus dem ordner templates/ $tpl -> load ( "test_site" ); // template ausgeben $tpl -> view (); ?> leider habe ich kaum zeit um alles zu kommentieren. wenn man aber sich das genauer anschaut, merkt man sofort das es auch nicht so kompliziert ist ^^ + Multi-Zitat Zitieren
#12 13. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten Du weist $header den Wert von $tpl->get("header") zu willst dann aber $template ausgeben? Geht nicht... PHP: eval - Manual Guck dir den Returntype an... + Multi-Zitat Zitieren
#13 13. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten wenn du eval unbedingt haben möchtest...^^ PHP: $title = "News" ; ob_start ();include( "templates/text.html" ); $temp = addslashes ( ob_get_contents ()); ob_end_clean (); // parse the template to replace variables with their values eval( "\$temp=\" $temp \";" );echo $temp ; im template steht $title, das wird nun durch News ersetzt. + Multi-Zitat Zitieren
#14 13. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten aber ich hol mit $tpl->get("das"); ein template in dem einzig und allein (in worten) $header steht. wenn ich das so augeben lasse hab ich $header da stehen. aber da ich will das nicht $header ausgegeben wird solles das $header als echte phpvariable behandeln und der variablen $header den wert: $tpl->get("header"); zuweißen. diese variable steht nun in $template und soll da dann auch ausgegeben werden... aber jetzt steht garnix drinnen. netmal $header + Multi-Zitat Zitieren
#15 13. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten Keine Ahnung wovon du redest. Fakt ist, du gibst wahrscheinlich nichts fuer eval zurueck. Fakt ist auch, dass $header den Wert deines Templates erhaelt. Da $header in deinem Template aber unset ist, ist dieser nichts. + Multi-Zitat Zitieren
#16 14. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten ja sorry^^ is halt sehr zum erklären... also im template "seite" das ich mit $tpl->get("seite") hol steht das: Code: $header und das soll mit: PHP: eval( "\$header = \"" . $tpl -> get ( "header" ). "\";" ); gesetzt werden. stimmt das so? - wenn ja warum geht das nicht? + Multi-Zitat Zitieren
#17 14. April 2007 AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten Somit haettest du $header den Wert des Templates header zugewiesen. Sollte alles stimmen. Aber eval selbst hat keinen Returnwert, ausser du gibst einen zurueck. Mach danach einfach mal var_dump() oder echo mit $header. + Multi-Zitat Zitieren
#18 14. April 2007 AW: Nach Platzhalter suchen und mit eval() bearbeiten Entweder verstehe ich grad dein Problem nicht komplett richtig oder es liegt daran das du die Funktionsweise von eval() nicht richtig kennst Ein Kleines Beispiel: PHP: $foo = true ; if ( $foo ) { $bar = 'function1' ; } else { $bar = 'function2' ; } eval( $bar . '(1, 2, 3);' ); eval() setzt jetzt den übergebenen String zusammen also in dem Fall so: PHP: function1 ( 1 , 2 , 3 ); und jetzt bewertet es diesen String neu (das währe so als wie wenn dieser String ein Teil deines Skriptes ist) d.h. er ruft in dem Fall die Funktion "function1" mit den parametern 1,2 und 3 (tut natürlich nichts zur Sache, dient ja nur als Beispiel) auf. mit PHP: eval( "\$header = \"" . $tpl -> get ( "header" ). "\";" ); würde jetzt der Inhalt von $tpl->get("header") in den String geschrieben und dann würde die variable $header in der anschließenden Bewertung (oder von mir aus: Ausführung) des Strings den inhalt von $tpl->get("header") bekommen. Da es die Varibale $header vorher in deinem Skript aber noch nicht gibt und auch später nicht gebraucht wird wirst du damit wenig erreichen. (Ich glaube das hat weiter oben bereits jemand gemeint) Wenn mich jetzt nicht irre, willst du aber erreichen, das der text "$header" in einem String (oder was auch immer) durch einen anderen (z.b. die html teile für den header) ersetzt werden sollen, das geht so natürlich nicht . Liege ich mit dem was du vor hast richtig? + Multi-Zitat Zitieren
#19 14. April 2007 AW: Nach Platzhalter suchen und mit eval() bearbeiten soweit alles stimmt sollte doch jetzt in $header der wert von $tpl->get("header") stehen, aber wenn ich $header ausgeben will kommt nüscht.. so sieht das jetzt aus: PHP: $template = $tpl -> get ( "seite" ); $template = eval( "\$header = \"" . $tpl -> get ( "header" ). "\";" );echo $template ; ausgegeben wird mir nix. ich schlaf mal drüber! + Multi-Zitat Zitieren
#20 14. April 2007 AW: Nach Platzhalter suchen und mit eval() bearbeiten ?( ?( $template wird natürlich nichts enthalten weil der Code-String nichts enthält was mit einem return zutun hat jetzt verstehe ich aber - endlich - was du mit deinem skript erreichen willst ! :] was du suchst ist das: PHP: $template = $tpl -> get ( 'seite' ); $header = $tpl -> get ( 'header' );eval( '$template = "' . $template . '";' ); echo $template ; Hier habe ich mal ein kleines Beispiel: PHP: $template = '$header $body bla bla bla $footer' ; $header = 'Das ist der Header-Teil !!!' . "\n\n" ; $body = 'Das ist der Body-Teil !!!' . "\n\n" ; $footer = 'Das ist der Footer-Teil !!!' . "\n\n" ;eval( '$template = "' . $template . '";' ); echo $template ; liefert folgendes: Code: Das ist der Header-Teil !!! Das ist der Body-Teil !!! bla bla bla Das ist der Footer-Teil !!! Wichtig: Um Missverständnisse zu vermeiden informiere dich am besten gleich mal was der Unterschied zwischen ' und " ist. lg area-52 + Multi-Zitat Zitieren
#21 14. April 2007 AW: Nach Platzhalter suchen und mit eval() bearbeiten Aber mal eine generelle Frage, leider, wozu? Beim vBull wo zum Beispiel über das PlugIn Modul PHP Code in die Datenbank geschrieben wird, wird eval benutzt um diesesn Code auszuführen, aber wozu sowas in einem Template? Ich persönlich hab auch einige TemplateEngines privat gebaut, aber mal ehrlich. Dann doch lieber smarty, oder professionelle Alternativen nehmen. Wozu sich die Arbeit machen? Um dann nur im Ansatz die Funktionen von sowas wie smarty zu haben? Na klar am Anfang denkt man sich, dass man den ganzen Zeug nicht brauch den z.B. smarty anbietet, aber umso größer die Projekte umso lieber werden einem die Funktionen. + Multi-Zitat Zitieren
#22 14. April 2007 AW: Nach Platzhalter suchen und mit eval() bearbeiten ich hatte vor meiner lanparty leider keine zeit mehr das folgende script zu posten, hoffe das hilft dir noch: PHP: <? php $template = "Test {blub} juhu {lala['test']} rofl {nicht_gesetzt}" ; $blub = "Var" ; $lala [ 'test' ] = 'lol' ; $vars = array(); preg_match_all ( "/\{(.*)\}/siU" , $template , $vars , PREG_SET_ORDER ); foreach ( $vars as $key => $value ) { eval ( 'if (isset($' . $value [ 1 ]. ')) $template = str_replace($value[0], $' . $value [ 1 ]. ', $template);' ); } echo $template ; ?> $template ist ein ganz einfacher string wie du siehst den kannst du wahrscheinlich mit deinem $tpl->get() holen dadrin stehen die variabeln in den geschweiften klammern, die du mal haben wolltest die 2 folgenden variabeln habe ich (wie man aus den namen hoffentlich erkennen kann) einfach mal zum testen angelegt so, nun der interessantere teil des codes ^^ zur sicherheit lege ich das array $vars vorher schoneinmal an dann suche ich mit preg_match_all alle ausdrücke raus, die ein { am anfang und ein } am ende haben diese werden im array $vars gespeichert nun gehe ich mit einer schleife genau dieses array durch $value ist dabei jeweils das aktuelle unter-array, bei dem position 0 den gesamten gefundenen ausdruck mit den klammern enthält, und 1 das was dazwischen steht dann benutze ich eval, und zwar habe ich dort ersteinmal normalen php code reingeschrieben, als wenn ich kein eval hätte dann füge ich einfach an den stellen, wo die entsprechende variable sein soll den string ein dadurch entsteht ein code der in etwa so aussieht: if (isset($blub)) $template = str_replace($value[0], $blub, $template); wobei die 2 blub's grade eingefügt wurden, $value[0] enthält ja sowieso den gesamten ausdruck der ersetzt werden soll dieser code wird jetzt ganz normal ausgeführt, und beim nächsten schleifendurchlauf steht da halt anstelle von $blub ein $lala['test'] hoffe das hilft dir irgentwie weiter eval() zu verstehen + Multi-Zitat Zitieren
#23 14. April 2007 AW: Nach Platzhalter suchen und mit eval() bearbeiten als erstes: vielen vielen dank an alle! die funktion eval() bereitet mir immer noch kopfschmerzen, aber jetzt bin ich dem ziel auf alle fälle näher denn je auch an dich ein dankeschön, smarty hört sich sehr gut an! nach der menge hirnschmalz das bei mir durch eval() verbrannt ist kommst du mit einem "fertig template parser" daher... na danke (soll heissen warum net scho früher) http://smarty.php.net/distributions/manual/de/Smarty-2.5.0-docs.pdf werd mir das in aller ruhe bei ner tasse kaffee durchlesen. mehr als davon lernen kann ich ja nicht. + Multi-Zitat Zitieren
#24 14. April 2007 AW: Nach Platzhalter suchen und mit eval() bearbeiten Ja weil ich denke die ganzen Beispiele die hier gebracht wurden, zum Beispiel der letzte von Schmitz ... da ist eval() einfach überflüssig. Und so eine kompilierende, cachende TemplateEngine wie Smarty, die auch höhere objektorientierte Programmierung mit Entwurfs Mustern und so unterstützt, die viel bietet und eine schöne Api hat ... ist einfach was schönes. Und die engine dann so zu erweitern wie man möchte steht auch effektiv auch jedem frei.. Hier zum Biespiel mal ein Auszug aus einem meiner smarty - templates. HTML: {if $bIsAjax === false} {include file=header.tpl} {/if} <div id="ContentHead"> <p> Portfolio </p> </div><!--Ende #ContentHead--> <div class="clear"></div><!--Ende clearing div for ie bugs--> <div class="ContentMain" id="Portfolio"> {if $bIsEditing} {include file=portfolio-part-edit.tpl} {else} {include file=portfolio-part-content.tpl} {/if} <br /> <br /> <br /> <br /> </div><!--Ende #Portfolio--> <div id="ContentFooter"> {if showAdminLink() === true} <a href="adminportfolio.html" onclick="changeMainContainer(this);return false;">Add</a> | {/if} {if $iPortfolioCount > 3} Gehe zu Seite: {section name=iPortfolioPage start=1 loop=$iPortfolioCount step=3} <a {if ($smarty.get.ipage == $smarty.section.iPortfolioPage.rownum) || ((!$smarty.get.ipage) && ($smarty.section.iPortfolioPage.rownum == 1))}class="active" {/if}href="portfolio_{$smarty.section.iPortfolioPage.rownum}.html" onclick="changeMainContainer(this);return false;">{$smarty.section.iPortfolioPage.rownum}</a>, {/section} {/if} </div> {if (showAdminLink()) && ($iPortfolioCount > 0)} <div id="PortfolioDeleteAdditions"> <label for="MarkAll"><input id="MarkAll" name="all" onclick="select_all(this.checked, '.aPortfolioIds')" type="checkbox" />Mark All</label> <button id="btn_portfoliodelete" name="btn_portfoliodelete" onclick="sendInputToServer('portfoliodelete', 'deleteportfolio_0.html');return false;" type="submit">Löschen</button> </div> {/if} {if $bIsAjax === false} {include file=footer.tpl} {/if} Hier sieht man auch zum Beispiel ne for - schleife und so .... ist einfach ganz angenehm. Die smarty-funktion strip, lege ich dir auch ans herz .... oder oben sieht man auch direkten zugriff auf das get array über smarty ... uvm Aber eins noch, smarty ist natürlich kein allheilmitteln und es gibt noch weitere engines die auch gut laufen. Dann hab ich dir jetzt auch noch ne kleine Doku zu smarty geupped, die auch sehr hilfreich ist und an aktualität nicht verloren hat .... aber dafür aktueller ist als die die du oben verlinkt hast ... Download offline! + Multi-Zitat Zitieren