 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
21.09.2007, 14:21
|
#1
|
|
TP-Member
Registriert seit: Apr 2007
Ort: Berlin
|
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ästebuch</title>
</head>
<body>
<h1>Unser Gä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.
|
|
|
21.09.2007, 14:40
|
#2
|
|
TP-Moderator
Registriert seit: Jun 2004
Ort: Hannover
|
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
|
|
|
21.09.2007, 16:24
|
#3
|
|
TP-Veteran
Registriert seit: May 2006
|
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
|
|
|
21.09.2007, 17:03
|
#4
|
|
TP-Member
Registriert seit: Apr 2007
Ort: Berlin
|
Könntest du das für einen Anfänger wie mich anhand des zitierten Codes darstellen?
Danke im voraus.
|
|
|
21.09.2007, 17:51
|
#5
|
|
TP-Moderator
Registriert seit: Jun 2004
Ort: Hannover
|
Zitat:
Zitat von slayer2205
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
|
|
|
21.09.2007, 19:01
|
#6
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
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.
|
|
|
21.09.2007, 20:52
|
#7
|
|
TP-Specialist
Registriert seit: Mar 2005
Ort: Unterfranken
|
Zitat:
Zitat von GerhardS
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ästebuch</title>
</head>
<body>
<h1>Unser Gä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.
|
|
|
21.09.2007, 22:23
|
#8
|
|
TP-Veteran
Registriert seit: Jan 2002
|
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.
|
|
|
21.09.2007, 22:34
|
#9
|
|
TP-Moderator
Registriert seit: Jun 2004
Ort: Hannover
|
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
|
|
|
21.09.2007, 22:59
|
#10
|
|
TP-Veteran
Registriert seit: Jan 2002
|
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...
|
|
|
21.09.2007, 23:15
|
#11
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
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?
|
|
|
22.09.2007, 12:32
|
#12
|
|
TP-Specialist
Registriert seit: Mar 2005
Ort: Unterfranken
|
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.
|
|
|
22.09.2007, 12:52
|
#13
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Weyhe
|
Zitat:
Zitat von rewboss
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."&monat=".$monat."&jahr=".$jahr."&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&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}&monat={MONAT}&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?
|
|
|
22.09.2007, 18:08
|
#14
|
|
TP-Specialist
Registriert seit: Mar 2005
Ort: Unterfranken
|
Zitat:
Zitat von DSB
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.
__________________
| | |