power-box.de
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 21.09.2007, 14:21   #1
TP-Member
 
Registriert seit: Apr 2007
Ort: Berlin
GerhardS macht alles soweit korrekt

PHP von HTML trennen


Hallo,
ich möchte gern in einem Skript den PHP-Code sauber vom HTML-Code trennen. Beispiel:
Code:
<html>
<head>
<title>G&auml;stebuch</title>
</head>
<body>
<h1>Unser G&auml;stebuch</h1>
<?php
require "config.php";
if($_POST[flag]==1)
{
//do this
//do that
}
if(!$_POST[flag])
{
?>
<form action="<?php echo $PHP_SELF; ?>" method="post">  
//usw.
<?php
} //if (!$_POST[flag])
?>
</body></html>
Wie man sieht, besteht die letzte PHP-Notierung allein in einer schließenden geschweiften Klammer. Lässt sich das auch anders lösen? Ich habe schon etwas herumprobiert, aber ohne Erfolg.
GerhardS ist offline   Mit Zitat antworten


Alt 21.09.2007, 14:40   #2
TP-Moderator
 
Benutzerbild von Adromir
 
Registriert seit: Jun 2004
Ort: Hannover
Adromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKE
Um das sauber zu trennen, wäre vieleicht ein Templatesystem wie Smarty nicht verkehrt..
__________________
Je größer der Deppenfaktor, desto gigantischer das Bescheidwissergefühl
-Dieter Nuhr
Adromir ist offline   Mit Zitat antworten
Alt 21.09.2007, 16:24   #3
TP-Veteran
 
Registriert seit: May 2006
marc22 bringt sich richtig ein
Template-Engines sind ein Thema für sich... Ich halte nicht viel davon. PHP ist eigentlich selber eine Templatesprache.

Wieso legst Du nicht die komplette Logik in eine Datei, die zum Schluss eine andere Datei mit dem HTML-Code inkludiert. Diese andere Datei enthält einen (oder mehrere) Platzhalter, die dann gegen die jeweiligen Inhalte getauscht werden.

Dazu braucht man keine Template-Engines..
__________________
...Meine Meinung

1984
marc22 ist offline   Mit Zitat antworten
Alt 21.09.2007, 17:03   #4
TP-Member
 
Registriert seit: Apr 2007
Ort: Berlin
GerhardS macht alles soweit korrekt
Könntest du das für einen Anfänger wie mich anhand des zitierten Codes darstellen?
Danke im voraus.
GerhardS ist offline   Mit Zitat antworten
Alt 21.09.2007, 17:51   #5
TP-Moderator
 
Benutzerbild von Adromir
 
Registriert seit: Jun 2004
Ort: Hannover
Adromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKE
Zitat:
Zitat von slayer2205 Beitrag anzeigen
PHP ist eigentlich selber eine Templatesprache.
Na das ist mal ne interessante These
__________________
Je größer der Deppenfaktor, desto gigantischer das Bescheidwissergefühl
-Dieter Nuhr
Adromir ist offline   Mit Zitat antworten
Alt 21.09.2007, 19:01   #6
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
ja, und sinnfrei noch dazu.

Selbstverständlich ist es sinnvoll, HTML und Programmlogik zu trennen.
Ob man nur mit Markern arbeitet, die man selber ersetzt oder mit Templateengines wie smarty ist Geschackssache - smarty hat sich als mächtige TE durchgesetzt und wird von den meisten benutzt.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 21.09.2007, 20:52   #7
TP-Specialist
 
Benutzerbild von rewboss
 
Registriert seit: Mar 2005
Ort: Unterfranken
rewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKE
Zitat:
Zitat von GerhardS Beitrag anzeigen
Wie man sieht, besteht die letzte PHP-Notierung allein in einer schließenden geschweiften Klammer. Lässt sich das auch anders lösen? Ich habe schon etwas herumprobiert, aber ohne Erfolg.
Aber klar doch:

Code:
<head>
<title>G&auml;stebuch</title>
</head>
<body>
<h1>Unser G&auml;stebuch</h1>
<?php
require "config.php";
if($_POST[flag]==1)
{
//do this
//do that
}
if(!$_POST[flag])
{
echo "<form action=\"$PHP_SELF\" method=\"post\">";
} //if (!$_POST[flag])
?>
</body></html>
Ob das nun wirklich sauberer ist, ist natürlich eine andere Frage.

Zweite Möglichkeit: den Code fürs Formular auslagern und mit include() einbinden.
rewboss ist offline   Mit Zitat antworten
Alt 21.09.2007, 22:23   #8
seb
TP-Veteran
 
Registriert seit: Jan 2002
seb bringt sich richtig einseb bringt sich richtig ein
Zitat:
Na das ist mal ne interessante These ... ja, und sinnfrei noch dazu.
Ich glaube, Slayer meint das so, dass man eine HTML-Datei mit eingebetteten PHP-Abschnitten als Template betrachten kann. Die PHP-Abschnitte sind die Platzhalter, und der PHP-Interpreter tauscht sie durch was konkretes aus - wie ein Template-System. An seiner Bemerkung ist also nichts falsch. Seine Meinung, dass include() der beste Template-Mechanismus ist, teile ich auch. Schneller und flexibler gehts nicht.
seb ist offline   Mit Zitat antworten
Alt 21.09.2007, 22:34   #9
TP-Moderator
 
Benutzerbild von Adromir
 
Registriert seit: Jun 2004
Ort: Hannover
Adromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKEAdromir ist ein richtiges Arbeitstier - DANKE
Natürlich hat er recht, daß PHP Mechanismen aufweißt, die ein einfaches Erstellen von eigenen Templatesystemen ermöglicht.. Das PHP deswegen eine Templatesprache sei ist quatsch. Genausowenig ist es durch die GD- Funktionalitäten eine "Bilderstellungssprache" oder so..
__________________
Je größer der Deppenfaktor, desto gigantischer das Bescheidwissergefühl
-Dieter Nuhr
Adromir ist offline   Mit Zitat antworten
Alt 21.09.2007, 22:59   #10
seb
TP-Veteran
 
Registriert seit: Jan 2002
seb bringt sich richtig einseb bringt sich richtig ein
Ich denk er bezieht sich nicht darauf, was man mit PHP machen kann, sondern darauf, wie der PHP-Interpreter arbeitet. Eine PHP-Datei ist eine Text- (bzw. meistens, aber nicht zwangsläufig HTML-) Datei mit -Platzhaltern- (<?php code... ?>). Die werden durch das ersetzt, was der PHP-Code zwischen ihnen produziert, und das Ergebnis wird abgeschickt. Wesentlich ist das Konzept des Austauschens der Platzhalter durch was konkretes. Dieses Verhalten ist voll und ganz "Template-System-mäßig", und das meinte er wahrscheinlich.

Aber egal...warum erklär ich das eigentlich, und nicht er selbst?
Und letztlich isses ja auch wurscht. Lieber back to topic, ich wollt das nicht breittreten...
seb ist offline   Mit Zitat antworten
Alt 21.09.2007, 23:15   #11
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
mal kurz dazwischen: Interpretieren macht der Apache und bei script-tags wird der PHP-Interpreter aufgerufen, hat also nix mit php zu tun.

Und es ging doch um die Trennung und nicht um die Vermischung, oder?
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 22.09.2007, 12:32   #12
TP-Specialist
 
Benutzerbild von rewboss
 
Registriert seit: Mar 2005
Ort: Unterfranken
rewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKE
PHP steht für "PHP Hypertext Preprocessor". Das heißt, es geht um Daten, die "vorverarbeitet" werden, bevor sie an den Browser geschickt werden.
PHP ist so eine Mischung aus Template und Skripting-Sprache.

In wie weit es sinnvoll ist, "Programmlogik" vom HTML zu trennen, hängt von vielen Faktoren ab, aber eine wirklich saubere Lösung, wie bei einer echten Programmiersprache, gibt es wohl nicht.

Bei einem größeren Projekt, wie etwa die Software für dieses Forum, ist es schon sinnvoll, die wirklich umfangreiche Funktionen als Programmierlogik anzusehen und sie auszulagern -- besonders, wenn sie zudem auch noch an mehreren Stellen benötigt werden. Aber bei der Ausgabe des HTML wird man eine Mischung HTML und PHP nicht vermeiden können -- das geht überhaupt nicht. Versuch mal eine PHP-Seite zu basteln, die Daten aus einer DB abfragt und sie in HTML umwandelt, ohne dass PHP-Code und HTML in mindestens einer Datei gemischt werden.

Bei kleineren Projekten ist es weniger sinnvoll, alles auszulagern und zu includieren, nur um eine "saubere Trennung" zu erzielen (die sowieso unmöglich ist). Vor allen Dingen muss der Server härter arbeiten, was überhaupt nicht sinnvoll ist.

PHP ist eigentlich eine Skripting-Sprache, und der Code eigentlich auch nur Daten. PHP-Code wird nicht ausgeführt, sondern der PHP-Parser wird ausgeführt, verarbeitet den PHP-Code und gibt Daten aus.
rewboss ist offline   Mit Zitat antworten
Alt 22.09.2007, 12:52   #13
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Weyhe
DSB hilft, wo's gehtDSB hilft, wo's gehtDSB hilft, wo's gehtDSB hilft, wo's geht
Zitat:
Zitat von rewboss Beitrag anzeigen
Versuch mal eine PHP-Seite zu basteln, die Daten aus einer DB abfragt und sie in HTML umwandelt, ohne dass PHP-Code und HTML in mindestens einer Datei gemischt werden.
Klar geht das. Das ist doch der Sinn von Templates - man trennt Programmablauflogik und Design völlig voneinander. Man muss das nur völlig konsequent durchziehen und darf sich nicht aus Bequemlichkeit dazu verleiten lassen HTML-Code in die, an das Template zu übergebende Variablen, einzubauen.

Beispiel (Auszug aus dem Adminbereich meines Referer-Loggers):
index.php
PHP-Code:
include("../functions.php");
include(
"inc/template.php");
...
$sql="SELECT *,`v_viewed` AS gesichtet, max(`v_time`) AS letzter_zugriff, sum(`v_count`) AS summe, count(DISTINCT `v_referer`) AS seiten FROM ".REFERER
    
." WHERE `v_time`>=".$time_start." AND `v_time`<=".$time_end
    
." GROUP BY `v_domain`";
$klicks_gesamt=0;
$anzahl_seiten=0;
$res=sql_query($sql);
if (
$res)
{
    WHILE (
$row=mysql_fetch_object($res))
    {
        
$visits[]=$row;
        
$klicks_gesamt+=$row->summe;
        
$anzahl_seiten+=$row->seiten;
    }
}

$template=new template;
$template->set_filenames(array('show' => './templates/referer.tpl'));

for (
$i=0$i<sizeof($visits);$i++)
{

    
$bgcol= ($i 2) ? "bgtr":"bgtr-alt";
    if (
$visits[$i]->gesichtet==0$bgcol="bgtr-unwatched";
    else
    {
        
// gewaehlte Domain hervorheben
        
if ($visits[$i]->id==$id$bgcol="bgtr-cur";
    }

    
$template->assign_block_vars('VISIT',array(
        
'NR' => $i+1,
        
'BG_COL' => $bgcol,
        
'DOMAIN' => $visits[$i]->v_domain,
        
'DETAIL' => "show_detail.php?id=".$visits[$i]->id."&amp;monat=".$monat."&amp;jahr=".$jahr."&amp;order=".$order,
        
'PAGE' => nr($pages),
        
'ZEIT' => date("d\.m\.Y H:i",$visits[$i]->letzter_zugriff)." Uhr",
        
'KLICKS' => nr($visits[$i]->summe),
        
'SEITEN' => nr($visits[$i]->seiten)
        ));
}
...
$template->assign_vars(array(
        
'KLICKS_GESAMT' => nr($klicks_gesamt),
        
'ANZAHL_SEITEN' => nr($anzahl_seiten),
        
'S_DOMAIN' => $link.$order_domain,
        
'S_KLICKS' => $link.$order_klicks,
        
'S_TIME' => $link.$order_time,
        
'S_PAGE' => $link.$order_page,
        
'SEL_MONAT' => $sel_monat,
        
'JAHRE' => $sel_jahr,
        
'MONAT' => $monat,
        
'JAHR' => $jahr,
        
'ORDER' => $order,
        
'MARKIEREN' => $link.'mark=1&amp;order='.$order,
        
'LOGGERVERSION' => $loggerversion
        
));
if (
sizeof($msg)>0$template->assign_block_vars('MSG',array('TEXT' => implode('<br />',$msg)));

$template->pparse('show'); 
Und das Template dazu:
referer.tpl
PHP-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<
head>
<
title>Referer</title>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
link rel="stylesheet" type="text/css" href="screen.css" media="screen,projection" charset="utf-8" />
<
script type="text/javascript" language="javascript">
function 
mark_domain(domain)
{
    
document.datefilter.mark_domain.value=domain;
    
document.datefilter.submit();
}
function 
block_domain(domain)
{
    
document.datefilter.block_domain.value=domain;
    
document.datefilter.submit();
}
function 
del_domain(domain)
{
    
document.datefilter.del_domain.value=domain;
    
document.datefilter.submit();
}
</script>
</head>
<body>
<div id="overall">    
    <h1>Referer <sup>Logger Ver. {LOGGERVERSION}</sup></h1>
    <div id="content">
        <ul id="options">
            <li><a href="javascript:self.location.reload();" title="Diese Seite aktualisieren" onclick="self.location.reload();">Aktualisieren</a></li>
            <li><a href="javascript:self.location='{MARKIEREN}';" title="Alles Seiten als gelesen markieren" onclick="self.location='{MARKIEREN}'">Alle als gelesen markieren</a></li>
            <li><a href="blacklist.php?jahr={JAHR}&amp;monat={MONAT}&amp;order={ORDER}" title="Blacklist pflegen">Blacklist pflegen</a></li>

        </ul>
        <form action="index.php" method="post" name="datefilter">
            <fieldset>
                <legend>Filter:</legend>
                <label for="month">Monat:</label>
                <select name="monat" id="month" onchange="document.datefilter.submit();">
                    {SEL_MONAT}
                </select>
                <label for="year">Jahr:</label>
                <select name="jahr" id="year" onchange="document.datefilter.submit();">
                    {JAHRE}
                </select>
                <input type="hidden" name="mark_domain" value="" />
                <input type="hidden" name="block_domain" value="" />
                <input type="hidden" name="del_domain" value="" />
                <input type="hidden" name="order" value="{ORDER}" />
            </fieldset>    
        </form>
        <!-- BEGIN MSG -->
            <div id="message">{MSG.TEXT}</div>
        <!-- END MSD -->
        <table cellpadding="0" cellspacing="4">
            <caption>Domains:</caption>
            <thead>
                <tr>
                    <th scope="col" style="width:2em">#</th>
                    <th scope="col" style="width:2em"><a href="{S_KLICKS}" title="sortieren nach Klicks">Klicks:</a></th>
                    <th scope="col" style="width:2em"><a href="{S_PAGE}" title="sortieren nach Seitenanzahl">Seiten:</a></th>
                    <th scope="col"><a href="{S_DOMAIN}" title="sortieren nach Domain">Domain:</a></th>
                    <th scope="col"><a href="{S_TIME}"title="sortieren nach Zugriff">Letzter Zugriff:</a></th>
                    <th scope="col" colspan="3">Aktion:</th>
                </tr>
            </thead>
            <tbody>
                <!-- BEGIN VISIT -->
                <tr class="{VISIT.BG_COL}">
                    <td><a href="{VISIT.DETAIL}">{VISIT.NR}</a></td>
                    <td><a href="{VISIT.DETAIL}">{VISIT.KLICKS}</a></td>
                    <td><a href="{VISIT.DETAIL}">{VISIT.SEITEN}</a></td>
                    <td><a href="{VISIT.DETAIL}">{VISIT.DOMAIN}</a></td>
                    <td><a href="{VISIT.DETAIL}">{VISIT.ZEIT}</a></td>
                    <td align="center"><a href="javascript:mark_domain('{VISIT.DOMAIN}');">
                        <img src="inc/mark.gif" title="Alle Seiten dieser Domain als gelesen markieren" alt="" />
                        </a>
                    </td>
                    <td align="center">
                        <a href="javascript:del_domain('{VISIT.DOMAIN}');">
                        <img src="inc/mark.gif" title="Alle Einträge dieser Domain löschen" alt="" />
                                                </a>
                    </td>
                    <td align="center">
                        <a href="javascript:block_domain('{VISIT.DOMAIN}');">
                        <img src="inc/block.gif" title="Diese Domain künftig nicht mehr loggen" alt="" />
                        </a>
                    </td>
                </tr>
                <!-- END VISIT -->
            </tbody>
        </table>
        <p class="countall">
        Insgesamt wurden <strong>{KLICKS_GESAMT} Klicks</strong> auf <strong>{ANZAHL_SEITEN} Seiten</strong> geloggt.
        </p>
        <p id="footer">Programmierung: <a href="http://www.daniel-schlichtholz.de">Daniel Schlichtholz</a> | Optik: <a href="http://www.vorderdeck.de">vorderdeck. neue medien</a></p>

        <br style="clear:left;" />
    </div>
</div>
</body>
</html> 
Hier sind doch HTML- und PHP-Teile komplett voneinander isoliert.
Oder habe ich Dich falsch vertanden?
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 22.09.2007, 18:08   #14
TP-Specialist
 
Benutzerbild von rewboss
 
Registriert seit: Mar 2005
Ort: Unterfranken
rewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKE
Zitat:
Zitat von DSB Beitrag anzeigen
Hier sind doch HTML- und PHP-Teile komplett voneinander isoliert.
Oder habe ich Dich falsch vertanden?
OK, daran habe ich natürlich nicht gedacht. Aber dafür brauchst du zusätzlich zum PHP selbst auch noch eine Bibliothek, die die Templates parst. Smarty zum Beispiel macht aus den Templates PHP-Code, der dann durch den PHP-Parser geschickt werden muss -- d.h., im Endeffekt hast du dann doch PHP und HTML gemischt, aber du kriegst es nicht mit.
__________________