In der index.php prüfe ich (anhand von GET- und POST-Parametern), auf welcher Unterseite ich mich befinde. Für jeden Gliederungspunkt gibt es einen eigenen Ordner, der eine controller.php (mit der Programmlogik: Daten aus GET/POST lesen, mit Datenbank arbeiten, Template-Files inkludieren). Dazu gibt es diverse .js, .css und .php Dateien (letztere für "Templates"). Um den JavaScript-Code so knapp wie möglich zu halten, setze ich auf jQuery und ein paar eigene kleine Funktionen. Trotzdem bereitet mir der Aufbau meiner Templates Kopfzerbrechen. Für gemeinsame Template-Teile (Header, Navigation usw.) verwende ich bereits ausgelagerte Templates. Meine eigentlichen Templates sind aber trotzdem ein Gewirr aus öffnenden und schließenden PHP-Tags, massenhaft Schleifen, Verzweigungen und Print-Anweisungen, und stellenweise (außerhalb der PHP-Tags) auch normaler HTML-Code.
Ich befürchte zwar, dass das das gängige Problem bei der Webentwicklung mit PHP ist, habe aber trotzdem noch einen letzten Funken Hoffnung

Zum Glück sind meine Templates nicht zu lang (i.d.R. <200 Zeilen). Trotzdem ärgerlich

Vor einiger Zeit hatte ich mit Python "webentwickelt" (Bottle Framework). Da waren die Templates irgendwie wesentlich übersichtlicher. Hier mal ein Beispiel:
Von meiner Bandhomepage (PHP)
Code: Alles auswählen
<div class="center">
<?php
$value = $data['date'];
if ($data['sid'] != null) {
print '<div style="float:right;"><input type="button" onClick="javascript:redirect(\'/dates/'.$data['sid'].'/add/\');" value="Termin hinzufügen" /></div>';
}
print '<div class="dates_view">';
print '<div class="head transparent rounded"><div class="title">'.$data['title'].'</div>';
print '<div class="date">'.$data['timestring'].' Uhr</div>';
print '<div class="place">'.($data['date']->place).'</div>';
print '<div class="bands"><b>Bands:</b><br />'.$data['date']->bands.'</div>';
if ($data['sid'] != null) {
print '<div class="author">von '.$data['author'][0] . ' <a href="/dates/'.$data['sid'].'/edit/';
print ($value->id).'/"><img src="/core/edit.png" class="icon" /></a>';
print '<a href="javascript:del(\''.$data['sid'].'\', '.($value->id).'">';
print '<img src="/core/delete.png" class="icon" /></a></div>';
}
print '</div>';
print '<div class="detail_description rounded">';
$flyerAlign = "flyerLeft";
if (rand(0, 1) == 1) {
$flyerAlign = "flyerRight";
}
if (isset($data['date']->flyer) && ($data['date']->flyer != "")) {
print '<a href="'.$data['date']->flyer.'" target="_blank"><img class="'.$flyerAlign.'" src="'.$data['date']->flyer.'" /></a>';
}
print $data['description'] . '</div>';
?>
</div>
</div>
Code: Alles auswählen
%include header
%include game/banner player=player, ingame_time=ingame_time, sid=sid, app_version=app_version
%include game/menu player=player, sid=sid
<script type="text/javascript">
<!--
function teleport() {
var target = $('#teleport-target').val();
$('#response').html('<img src="/static/load.gif" alt="Laden ..." />');
$.post('/game/pentagram/{{sid}}/', {
current: '{{player.character.place}}',
target: target
}, function(data) {
if (data == '') {
window.location.reload();
} else {
$('#response').html(data);
}
});
}
//-->
</script>
%from random import randrange
%filename = 'day' if ingame_time.daytime() else 'night'
<div class="left" id="wrapper" style="background-image: url('/static/{{player.character.place}}/{{filename}}{{randrange(5)+1}}.jpg');"><div id="scrollable">
<div class="left" id="overview">
<h1>— Pentagramm ({{player.character.place}}) —</h1>
<!-- Pentagramm -->
<fieldset class="radiused left" id="normal">
<p class="center"><span class="capital">E</span>s ist {{ingame_time.time()}}. {{player.name}} kann heute noch {{player.character.actions}} Aktionen durchführen.</p>
<p class="center">
<span class="capital">I</span>hr seht ein Pentagramm auf dem Steinboden. Als Ihr näher tretet, beginnen seine Linien zu leuchten. Mithilfe des Pentagrams könnt Ihr ohne Zeitverlust zu bereits besuchten Orten zurückkehren.</p>
<fieldset class="radiused center" style="width: 250px;">
<select id="teleport-target" tabindex="1">
%for p in player.character.pentagram_list:
%if p.region != player.character.place:
<option value="{{p.region}}">{{p.region}}</option>
%end if
%end for
</select>
</fieldset>
<br />
<div id="response"></div>
<br />
<a class="button" href="javascript:teleport()" tabindex="2">Teleportieren</a>
<a class="button" href="/game/overview/{{sid}}/" tabindex="3">Verlassen</a>
</fieldset>
</div>
</div></div>
%include footer