Schlechte Lösung?

sente

Erfahrenes Mitglied
Hallo,
ich habe mir gerade Gedanken gemacht, wie ich am besten den Inhalt eines CMS realisiere.

start.php
PHP:
<?php	
	require_once($_SERVER['DOCUMENT_ROOT'].$_WORKSPACE."/functions/functions.php"); //includes the file with the functions
	if(!auth()){ //checks if the user is authorized
		echo "You do not have the permission to call this site!";
		exit; //doesnt parse the following code
	}
	else{ //if the user is authorized
	$page = "start";
		if($_POST['start']){
			$page = "start";
		}
		else if($_POST['projects']){
			$page = "projects";
		}
		else if($_POST['logout']){
			logout();
			exit;
		}
		//items left
	}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- Meta tags coming soon -->
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" type="text/css" href="./stylesheets/style.css" />
<title><?php echo $HP_TITLE ?></title>
</head>

<body>
<div id="TopNavi" class="clearfix">
			<div id="InnerTopNavi">
				<ul id="TopNaviText" class="left">
					<li>
						<form action="./start.php" method="post">
						<input type="submit" name="start" value="Start" /> 
						<input type="submit" name="add projects" value="Projekte anlegen" /> 
						<input type="submit" name="edit projects" value="Projekte editieren" /> 
						<!--<input type="submit" name="delete projects" value="Projekte löschen" /> -->
						<input type="submit" name="add pics" value="Bilder hinzuf&uuml;gen" /> 
						<input type="submit" name="edit jobs" value="Jobs bearbeiten" /> 
						<input type="submit" name="logout" value="Abmelden" /> 
						</form>
					</li>
				</ul>
				<div class="right">
					<img src="http://www.tutorials.de/forum/images/TopLILeft.gif" alt="Adress Image" />Sie sind als <?php session_start(); echo $_SESSION['username']; ?> angemeldet.
				</div>
			</div>
		</div>
<div>
<!-- Site Headline -->
<div class="content">

<?php
	switch($page){
		case "start":
			include("./sites/def.php");
		break;
		case "projects":
		break;
		//items left
	}
?>
</div>
</body>
</html>

Kann man die Lösung so lassen, oder ist das irgendwie grausam unschön? :)

Danke vielmals,
mfG
Chris
 
Nun was du hast, ist wohl eher nur ein CS (Content-System) statt ein CMS (Content-Management-System), falls es ersteres überhaupt gibt. Denn der verwaltende Teil fehlt völlig. Jede Änderung der Inhalte muss im Quelltext fest programmiert werden.
 
Ich bin Verfechter des Eingabe-Verarbeitung-Ausgabe Prinzips, da durch diese gedankliche Strukturierung auch die Abarbeitung klar und strukturiert bleibt.
Zu Beginn werden die Eingaben abgeholt, was PHP zum Glück in den meisten Fällen selbsständig tut (Stichwort globale Requestvariablen). Des Weiteren werden essentielle Daten geladen und bereitgestellt, wie etwa eine Datenbankschnittstelle, Benutzermanagement, etc. Anschließend könnte zB ein Controller das angesprochene Modul zur Verfügung stellen oder es initialisieren. Dieses Modul verarbeitet dann die für die Anfrage relevante Informationen und stellt diese der Ausgabe bereit. Die Ausgabeschicht letztendlich liefert dann die bereitgestellten Informationen in einem für den Laien ersichtlichen Format an den Client. So viel zur Theorie - Was bringt mir oder dir oder jmd. anderem das? Eine bereits angeführte Struktur, die die Wartung leichter macht und vor allem aber auch die Möglichkeit, zu einem fortgeschrittenen Zeitpunkt des Scriptablaufs grundlegende Änderungen durchzuführen, wie zB Cookies in den Response-Header schreiben, Ausgaben verwerfen, etc.

Die bereits angesprochene Modularisierung hilft des Weiteren, strukturiert und klar zu programmieren - So hat zB die Authentifizierungsschicht kaum etwas in der eigentlichen Inhaltsschicht zu suchen (Es sei denn, diverse Inhalte erfordern bestimmte Berechtigungen).

Wie man gut und sauber programmiert, dafür gibt es zum Glück keine Universallösung - Wichtig ist, dass du selbst damit klarkommst, was du schreibst. Deine Formatierung zB gefällt mir in keiner Weise, aber wenn du selbst damit klarkommst, ist es weder schlecht für dich, weil ich der Meinung bin, noch gut für andere, weil du es denkst.
Konstanten kann man in PHP übrigens im Global Scope via [phpf]define[/phpf] definieren - Großgeschriebene Variablennamen sagen nicht aus, dass die Variable global und final ist.
 
Hallo,
danke für die raschen Antworten.

@Gumbo:
Natürlich soll es ein CMS werden. Ich hatte nur geplant einfach unten beim inlcude z.B. das projekt-bearbeiten file zu laden in welchem dann der Benutzer per input-forms Projektbezeichnung, Details, Bilder etc. eintragen kann (und das dann in eine SQL DB kommt).

@maeTimmae:
Vorweg: Bin eigentlich Programmierer von OO Sprachen (Java, C++,...) und schnuppere jetzt bisschen in die dynamische Webprogrammierung (was mir in PHP nicht sehr schwer gefallen ist, da PHP C sehr ähnelt. :-)).
Bin eigentlich auch totaler Verfechter von der strikten Trennung zwischen input - processing und output, nur steh ich in PHP ein bisschen an und mir fehlt irgendwie der Ansatz, wie ich das implementieren soll.

Das oben genannte könnte ich ganz simpel verwirklichen, indem ich einfach ein File für die Eingabe, ein File für die Verarbeitung und dann Eines für die Ausgabe mache - die sich nacheinander aufrufen. Schön und gut, aber mein Problem ist, dass ich ein Menü brauche, dass immer (ob jetzt Oben oder Links ist egal) vorhanden ist. Und natürlich kommt das stupide copy&paste Verfahren auf jeder Seite das Menü rein zu kopieren für mich definitiv nicht in Frage. ;)

Also kurz zusammengefasst ist das Problem, wie ich die Seite mit Inhalt (wo Eingabe u. Ausgabe eingebunden wird) und Menu strukturieren soll. :confused:

Danke u.
mfG
Chris
 
Vorweg: Bin eigentlich Programmierer von OO Sprachen
Leider mangelt es PHP an einigen Stellen an festen Datentypen und einigen wichtigen Merkmalen einer oo Sprache - Dennoch möchte ich dir gerne für einen doch fachgerechten Einstieg zum Zend Framework raten. Schau dir mal die View-Klasse an - Mit dieser könnte zB das globale Template so aussehen:
Frame.tpl
HTML:
<html>
  <head>
    <title>Testcase - <?php echo $this->escape( $this->sectionTitle ); ?></title>
  </head>
  <body>
    <!-- ... -->
    <div id="menu">
      <?php echo $this->render( "Frame.Menu.tpl" ); ?>
    </div>
    <div id="content">
      <?php echo $this->mainContent; ?>
    </div>
    <!-- ... -->
  </body>
</html>

Es ist also eigentlich nichts anderes als die etwas abstrakte Konstruktion eines GUI, wie man es zB mit Swing macht - Nur die Art und Weise ist dann ein wenig anders: Eine Mischung aus free Type PHP und HTML-Schreiberei. Wenn das zu konkret ist, kannst du auch mal einen Blick auf die Helferlein werfen und das nach deinem Belieben weiter ausbauen auf sämtliche HTML-Elemente - So dass dann folgendes möglich sein könnte:
PHP:
$html = new HtmlDocument( $doctype );
$html->append( new HtmlElement( "body", null ) );
$html->body[0]->append( new HtmlElement( "div" array('class' => "menu") );
// ...
Mal frei geschrieben und total funktionsunfähig - Geht ja nur um das Prinzip, was möglich wäre.

Bin eigentlich auch totaler Verfechter von der strikten Trennung zwischen input - processing und output, nur steh ich in PHP ein bisschen an und mir fehlt irgendwie der Ansatz, wie ich das implementieren soll.
Eigentlich vertrete ich die Meinung, dass sich das MVC als DesignPattern nicht in PHP ordentlich umsetzen lässt, jedoch habe ich für mich auch ein paar Grundgedanken daraus übernommen. So hält zB ein Controller-artiges Gebilde wichtige Grundinformationen und Referenzen auf zB die Datenbankschnittstelle, Standardinformationen (Konfiguration), ... Auf diesen kann via Singleton Pattern immer wieder auch in einem inner Scope zugegriffen werden.
Die einzelnen Module füllen praktisch gesehen immer ihre eigenen View-Blaupausen aus, übergeben dann den erhaltenen View wiederrum an die View-Instanz, welche dann zum Ende der Scriptausführung nochmals vom Controller aufgerufen wird um das oben abstrahierte Frame-Template auszuwerten und zurückzugeben.

Also kurz zusammengefasst ist das Problem, wie ich die Seite mit Inhalt (wo Eingabe u. Ausgabe eingebunden wird) und Menu strukturieren soll. :confused:
Die Kapselung von Daten sollte dir durch C++ und Java bekannt sein. Dieses Prinzip nutzt du aus und verarbeitest entsprechende Daten. Anschließend speicherst die für den View relevanten Daten irgendwie bis mindestens zur letzten Renderaktion der View-Instanz. Über diese lässt du die von dir angelegten Templates wie du es brauchst auswerten und ausgeben.
 
Hallo,

danke maeTimmae, das Beispiel ist (für mich) verständlich und zeigt auch eindeutig die Vorteile auf, jedoch hab ich mich da jetzt ein bisschen rein gelesen (bei diesem Zend Framework) und bin leider auf das "PHP5.x required" gestoßen.
Ich selbst habe PHP5 installiert, nur haben leider die meisten Webspaceanbieter noch PHP4 und somit auch die meisten Mieter nur PHP4. :(

Wie sind denn die großen CMS Systeme die überall verstreut sind aufgebaut?
Einfach ein Layoutfile und dann im Contentteil die einzelnen Inhalte inkludiert? :confused:

MfG
Chris
 
Uff, also PHP 5.1 sollte heutzutage Standard sein, da der Support von PHP 4 offiziell eingestellt wurde, und das vor schon etwas längerer Zeit, wenn ich mich nicht irre.

Als Alternative bieten sich compilierende oder zumindest evaluierende Template-Engines an, wie zB Smarty, wozu du einiges über die hiesige Suchfunktion finden wirst. Ich persönlich mag Smarty nicht so, da langsam und kompliziert, aber es eignet sich gut als Benchmark Tool ^^ Scherz beiseite: Probieren und selbst ein Bild von machen.
Alternativ kann man sich schon hübsche Resultate mit [phpf]str_replace[/phpf] oder komplexer [phpf]preg_replace[/phpf] erzielen. Die vBulletin Forensoftware macht es nochmal (in Teilen) anders und benutzt (in etwas komplexerer Form) ein geniales PHP-Feature aus, welches in einer Form so aussieht:
PHP:
$string = "Yellow";
echo "We all live in a {$string} Submarine";
// ergibt "We all live in a Yellow Submarine"
Das lässt sich ausnutzen, indem man die Variablen im Global Scope aufbewahrt und in den Templates dann mit diesen Variablen arbeitet. So ließe sich zB folgendes anstellen:
PHP:
echo eval('return "' . addslashes(filegetcontents($filepath)) . '";');
Was bringt das? Man nutzt eine relativ langsame Funktion um die Datei unter $filepath zu evaluieren. Das ginge im Allgemeinen auch mit [phpf]include[/phpf] oder [phpf]require[/phpf], aber die angeführte Version gestattet weitere Manipulationen, wenn erforderlich oder gewünscht, wohingegen das sonst statisch in der entsprechenden Datei schon eingebunden sein müsste.

Templating ist allgemein ne lustige Sache, zumal PHP schon selbst Templatemaschine sein soll - Wie du es nun anstellst, sei dir überlassen. Würde zu einer Variante à la Zend::View raten. Wenn der Hoster kein PHP5 installiert hat, würde ich einfach mal anfragen, ob da was zu machen wäre, denn die 5te Version ist wesentlich performanter und sicherer als PHP4, und mittlerweile lange genug stabil.
 
Zurück