file_get_contents, str_replace + php code

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • file_get_contents, str_replace + php code

    Hallo,

    ich hab seit längerer zeit ein problem und irgendwie komme ich net mehr weiter :(!

    und zwar ich binde meine templates mit file_get_contents() ein und ersetzte wörter mit str_replace();.

    nun ja - wenn ich aber an einer stelle komme wo ein Drop Down Menü ist und wo die Auswahloptionen aus der Datenbank kommen sollen komme ich nicht weiter.

    Ich hab zuerst einfach das template nach "<select name="name" class="formular">"
    beendet und dann ein zweites template begonnen wo dann <option value="{ID}"> und so drin steht. und danach hab ich ein 3 erstellt wo das ende vom ersten template drin steht.

    Hier ist der Code:

    1 Template


    <table cellpadding="3" cellspacing="3" width="100%" valign="top" align="left">
    <tr>
    <td align="left" valign="top" class="tablea">
    <span class="Stil2">Benutzer bearbeiten &raquo; Benutzer auswählen</span>
    </td>
    </tr>
    <tr>
    <td align="left" valign="top" class="tableb">
    <span class="Stil1">Bitte wähle ein Benutzer aus, den du bearbeiten willst.</span>
    <br>
    <br>
    <table cellpadding="3" cellspacing="0" border="0" width="100%">
    <tr>
    <td width="10%" valign="top">
    <form method="post" action="admin.php?section=user&user=edit">
    <select name="user_id" class="formular">


    2 Template

    <option value="{ID}">{ID} {USERNAME}</option>


    3 Template


    </select>
    </td>
    <td width="90%" valign="top"><input type="submit" name="submit_user" value="Auswählen" size="25" class="formular"></td>
    </tr>
    </table>
    </form>
    </td>
    </tr>
    </table>



    Ich hoffe das habt ihr bishier her verstanden.

    Naja - dies ist finde ich ziemlich doof und man sieht ja auch in foren templates so das der ganze code von irgendeiner seite da drin steht und jetzt zb bei so nem drop down menü einfach auch ersetzt wird.


    Naja und da ist mir das jetzt auch eingefallen ich kann doch einfach {USEROPTION} auch ersetzten.

    Also wurde mir auch mal gesagt ich könnte in str_replace(); durch eval n php code einsetzen.

    Wie auch immer sagt ja jeder das eval unsicher ist und so richtig klappt es auch nicht wie ich dachte.

    Gibt es da irgendeine möglichkeit das anders hinzukriegen?

    Ich will kein fertiges template system benutzen da ich gerne so ein kleines einfaches eigenes template engine habe wie auch immer ._.!

    Hier ist noch der PHP Code:

    Quellcode

    1. $sql = "SELECT ID, username FROM users ORDER BY ID ASC";
    2. $result = mysql_query($sql) or die(mysql_error());
    3. $row = mysql_fetch_array($result);
    4. $tbuf = file_get_contents( "templates/admin/user_edit_1.tpl" );
    5. $tpl = file_get_contents( "templates/admin/user_edit_2.tpl" );
    6. $id = $row['ID'];
    7. $username = $row['username'];
    8. $tpl = str_replace("{ID}", $id, $tpl);
    9. $tpl = str_replace("{USERNAME}", $username, $tpl);
    10. $sql = "SELECT ID, username FROM users ORDER BY ID ASC";
    11. $result = mysql_query($sql) or die(mysql_error());
    12. while($row = mysql_fetch_array($result)) {
    13. $tbuf = str_replace("{USEROPTION}",eval("echo $tpl;"), $tbuf);
    14. }
    15. echo( $tbuf );
    Alles anzeigen



    Bitte nicht lachen, ich bin halt noch net so groß erfahren in dem allen nicht mal ein PHP Buch hab ich ^^".


    Würde mich aber freuen wenn mir da jemand helfen könnte :)!


    Mit freundlichen Grüßen,

    Illidan
  • hm, ich würd das so machen (wenn ich kein Smarty nutzen würde)

    Quellcode

    1. /*Beispieldaten*/
    2. $data = array(
    3. array('{ID}' => '1', '{USERNAME}' => 'AAAAA'),
    4. array('{ID}' => '2', '{USERNAME}' => 'BBBBB'),
    5. array('{ID}' => '3', '{USERNAME}' => 'CCCCC'),
    6. );
    7. function tplloop($tpl, $arr) {
    8. $return = "";
    9. foreach($arr as $r) {
    10. $return .= str_replace(array_keys($r), array_values($r), $tpl);
    11. }
    12. return $return;
    13. }
    14. echo preg_replace("/<!--anfang:opts!-->(.*)<!--ende:opts!-->/sie", 'tplloop("$1", $data)', $template);;
    Alles anzeigen


    Das Template sähe dann so aus:
    ...<form method="post" action="admin.php?section=user&user=edit">
    <select name="user_id" class="formular">

    <!--anfang:opts!-->
    <option value="{ID}">{ID} {USERNAME}</option>
    <!--ende:opts!-->

    </select>
    </td>
    <td width="90%" valign="top">...
  • Omg - vielen vielen dank O_O!!!

    Endlich kann ich daran jetzt weiter kommen!

    Doch ein Problem hab ich noch, bei mir kommt in dem drop down menü nur ein einziger wert und das ist der letzte wert in der tabelle aber es gibt 3 werte.

    ich hab als code:

    Quellcode

    1. $sql = "SELECT ID, username FROM cms_users ORDER BY ID ASC";
    2. $result = mysql_query($sql) or die(mysql_error());
    3. while($row = mysql_fetch_array($result)) {
    4. $data = array(
    5. array('{ID}' => $row['ID'], '{USERNAME}' => $row['username']),



    Warum wird dann nur der letzte wert aus der tabelle angezeigt?
  • Das hat nix mit dem "Template" Code zu tun.
    Du überschreibst $data innerhalb der Schleife immer wieder durch sich selbst.
    Um das Array $data zu erweitern muss die Zeile so aussehen

    Quellcode

    1. while($row = mysql_fetch_array($result)) {
    2. $data[] = array(...


    Schau dir übrigens mal das SyntaxHighliting des Boards an - oben rechts über dem Eingabefeld.
  • ... und je nach dem, ob du einen Grafiker an deiner Seite hast oder nicht lege ich dir noch einen andere Idee ans Herz.

    In dem Fall, dass du keine zweite Hand als Grafiker dabei hast und du dich selber mit deinen Templates rumschlagen musst, ist es meiner Meinung nach am sinnvollsten, schnellsten und mit der besten möglichen Performance verbunden, wenn du dir das ganze Template getue sparst und PHP das sein lässt, was es sowieso schon ist. Eine "Template"-Sprache, jedenfalls in HTML. Soll heißen:

    PHP wurde ursprünglich sowieso schon darauf konzipiert, in HTML intigriert zu werden. Deshalb gibt es auch schon bereits verkürzte Schreibweisen, die Variablen in Templates überhaupt nicht weit entfernt liegen.
    Beispiele:

    Quellcode

    1. <html><head></head>
    2. <body>
    3. <? if($var < $var2): ?>
    4. <b><?=$var; ?> ist größer als <?=$var2; ?></b>
    5. <? endif; ?>
    6. </body>


    Quellcode

    1. <html><head></head>
    2. <body>
    3. <? foreach($db as $key => $value): ?>
    4. <b>Das Array mit dem Index <?=$key; ?> hat den Wert <?=$value; ?>
    5. <? endforeach; ?>
    6. </body>


    Ich selber hatte mich auch mal mit Smarty versucht und ich möchte auch weis gott nicht anzweifeln, dass es keine mächtige Templateklasse ist, aber wenn du deine Template nicht cached, also von ihnen ein temporäres BackUp hinterlegst, was dann die Ladezeit verringert und das anzeigt, was beim ersten Aufruf angezeigt wurde, ohne neu alles berechnen zu müssen, ist Smarty ein großer Performance Verlust und deshalb meiner Meinung nach, ist man nicht auf eine helfende Hand zB. Grafiker angewiesen, unpraktisch.
  • Letztendlich bleibt das aber ne sehr unsaubere art, die je nach Umfang der Website in ein reines Chaose endet...

    Und nur weil PHP dafür konzipiert worden ist, muss das nicht heißen, dass das auch unbedingt die beste Lösung ist.

    Kann immer wieder nur davon abraten auf solche "Schmuddel"-Lösungen zurückzugreifen.


    Schon allein, wenn du deinen Code anderen Leuten zeigen wilst, zum Beipsiel hier im Forum, schmälert die Chance ne kompetente Antwort zu bekommen.
  • Dem kann ich nicht zustimmen. Würde ich hier und da ein Zeichen weglassen, könnte man sehr gut von hingeschluderte Schreibweise reden, nur weil PHP das Zeichen ignoriert etc. Das ist hier aber nicht der Fall und die Möglichkeiten werden von PHP sehr wohl dokumentiert, warum also nicht darauf zurückgreifen?

    Zweite Sache ist die von dir angesprochene Unübersichtlichkeit. Sicher, dass diese bei Smarty so viel besser ist? Es ist immer eine Sache der Schreibweise. Wenn man zum Beispiel jeden Inhalt einer Bedingung zwei leerzeichen vorsetzt und das auch bei den darauf folgenden Inhalten von Bedingungen, Schleifen, was auch immer, macht ist es genau so übersichtlich - oder halt eben nicht - wie Smarty.

    Also wie schon einmal gesagt, würde ich dringend davon abraten, besonders bei größeren Sachen, oder viel besser, eher bei größeren Projekten, Smarty nebenbei zu lassen. Was Smarty kann ist teilweise echt gigantisch, ich setze dabei aber lieber auf Performance und das ohne Template-Cache.

    Ansichtssache: Lohnt nicht, drüber zu diskutieren. Ich wollte lediglich eine weitere Möglichkeit zeigen, wie man Templates aufbauen kann. Was die Übersichtlichkeit angeht, ist es vielleicht Geschmackssache. Ich für meinen Teil habe schon gelernt damit umzugehen und schreibe entsprechend auch meinen Code hin, sodass er für mich und andere übersichtlich bleibt, denke ich jedenfalls.