Willkommen in der Webstatt Zum Webstatt Blog und Stories
Rebel4s Rebel4s am 15.01.07 15:55

Hallo,
Ich will/muss mir ein eigenes CMS coden, die Sachen die es schon gibt, reichen meinen Bedürfnissen nicht aus, oder ich muss sie dann erweitern, und dann kann ich auch gleich eine eigenes coden.

Also es soll schnell und sicher sein und da kam ich auf die Idee, dass ja eigentlich nichts schneller und sicherer sein kann als html.

Also alles was die Besucher sehen soll in html sein, der Admin Bereich dann natürlich PHP.

Also wenn man im Admin Bereich eine Seite erstellt per Formular, sollen die Felder in die Datenbank gespeichert werden (falls man was bearbeiten will) und eine html Datei erstellt werden, die die Besucher dann sehen können.

Ich hab schon eine Vorstellung von der realisierung, nur ich frag mich noch, ob das wirklich so praktisch ist. Das fertige CMS stell ich mir dann sehr cool vor.

Natürlich fallen dann beim erstellen viel Arbeit für den Server an, da dann praktisch alle Seiten, wo die Seite verlinkt oder angezeigt werden soll auch automatisch aktualisiert werden. Aber für die Besucher wär es sicherlich schneller.

Also was ist eure Meinung zu dieser Idee.

netcup.de Warum gibt es hier Werbung?
Michael Michael am 16.01.07 16:53

Ein sinnvolle wenn auch nicht neue Idee.
Um die Serverauslastung würde ich mir keine Sorgen machen. Auf der einen Seite sparst du auch viel Rechenleistung, dadurch, dass die Seiten nicht mehr on-the-fly generiert werden auf der anderen Seite ist Rechenleistung in heutigen Zeiten allgemein kein Problem mehr. Dennoch ist es guter Stil, unnötigen Aufwand zu vermeiden.

Rebel4s Rebel4s am 16.01.07 19:35

Der Nachteil wäre natürlich, dass es dynamische Sachen nur per Javascript gäbe.
Eine Suchfunktion (in Datenbank suchen) ist dann glaube ich nicht zu realisieren.
Also die Grenzen sind schon da und ich frag mich noch, ob es sinnvoll ist sich da so zu begrenzen.

Jedoch ist es für einfachen Inhalt eigentlich Ideal.

Michael Michael am 16.01.07 20:05

Natürlich funktioniert eine Suche nicht ohne dynamische Skripte (und sei es das Auslesen einer vorher angelegten Indexdatei). Das ist aber kein fundamentaler Widerspruch, man kann ja auch auf statischen Seite ein Suchscript verlinken.

Dennoch hast du Recht: es gibt Grenzen, ein sinnvolles Sessionmanagement ist beispielsweise nur mit HTML Dateien einfach nicht möglich.
Viele Seiten brauchen es aber auch gar nicht.

Nur noch ein theoretischer Einwurf: ich kann mir konzeptionell durchaus vorstellen, beide Arten zu kombinieren. Also ein CMS, das gleichermaßen statische Inhalte erzeugt aber auch dynamische Teile

Rebel4s Rebel4s am 16.01.07 20:28

Das wäre aber nur ein Kompromiss.
Ich denke ich werde es erstmal nur für statische Seiten machen, da es dort auch am meisten Sinn macht.

Dynamisch ist es dann ja quasi schon, da man ja Seiten u.a. beliebig hinzufügen kann.

Michael Michael am 16.01.07 20:33

Eine Suchfunktion erfordert keinen Kompromiss.
Alles andere ist auch kein wirklicher ein Kompromiss sondern erfordert nur umfangreichere Planung und Konzeption.

Postest du einen Link zu einer Demo-Version wenn du das CMS fertig hast?

Rebel4s Rebel4s am 16.01.07 20:43

Also momentan sammle ich erstmal Ideen, plane und überlege wie es denn überhaupt möglich ist.
Eine grobe Idee hab ich schon, aber da fehlt noch jede Menge.
Am Wochenende versuch ich dann mal etwas Handfestes zu erstellen. Jedoch bis zu einer fertigen Version wird es vorraussichtlicht min 1 Monat dauern (ohne Gewähr). Aber ihr werdet dann von mir hören^^.

Zur Suchfunktion:
Die Daten werden auch in der Datenbank gespeichert, also könnt man auch danach suchen. Jedoch wie will man das dann ausgeben?
a) Natürlich als php Datei.
b) Für jede Suche eine html Datei erstellen, dann anzeigen lassen und später wieder löschen!? Klingt nicht grade schnell.

The Master am 16.01.07 20:57

also eine such würde ich immer über php laufen lassen ohne die seiten zu generieren und zu speichern bzw. zu cachen, denn zum einen werden wahrscheinlich viele verschiedene kombinationen von suchwörtern benutzt und zum anderen könnten sich die daten in der zwischenzeit schon geändert haben...
ich würde mich auch über einen link freuen^^ hab schon selbst überlegt sowas zu machen.

Michael Michael am 16.01.07 21:35

HTML Dateien erstellen, anzeigen und danach wieder löschen ist keine sinnvolle Idee.
Es ginge doch beispielsweise auch so:

1) Im CMS generierst du eine .html als Rahmen. Inhaltlich nur ein Platzhalter, wo später die Suchergebnisse auftauchen sollen
2) Die Suche ist natürlich ein (PHP) Script; kannst du ja ggf mit mod-rewrite als HTML tarnen. Allerdings ist es ja keine ideologische Frage HTML Dateien zu benutzen sondern praktikabel. Bei einer Suche hingegen nicht.
3) Für die Ausgabe wird der Rahmen geladen und der Platzhalter mit den dynamischen Suchergebnissen ersetzt.

Noch sinnvoller wäre keine Datenbank basierte Suche sondern ein Spider, der eine Art Wort-Index erstellt.

Rebel4s Rebel4s am 21.01.07 17:30

Ist es eigentlich mögliche durch extend mehrere Klassen zu vererben?

momentan muss ich das nämlich so machen

class a extends b
class b extends c
usw.

gibt es ungefähr so eine möglichkeit (?):

class a extends b, c

Michael Michael am 21.01.07 23:26

Das schimpft sich Mehrfachvererbung und ist nur in ganz wenige Fällen gewollt.
Welche Problemstellung erfordert das denn?

Rebel4s Rebel4s am 22.01.07 15:36

Quote
Original von Michael
Das schimpft sich Mehrfachvererbung und ist nur in ganz wenige Fällen gewollt.
Welche Problemstellung erfordert das denn?


Also ich hab ne mysql-, template- usw. klasse und die funktion davon will ich in meiner hauptklasse nutzen.

Michael Michael am 22.01.07 18:56

Dann ist das ja "benutzt" Verbindung, dafür ist Vererbung ungeeignet.
Ich würde einfach je eine Instanz der drei Klassen in Attributen speichern. Und dann mit $this->db oder $this->template ... auf die anderen Klassen zugreifen

Rebel4s Rebel4s am 22.01.07 20:54

aso ok, werd ich das mal ausprobieren.

Ist es eigentlich "fein" wenn man in einer klasse andere Klassen included?

Michael Michael am 22.01.07 21:14

Mit include? Nein.
Aber es spricht nichts dagegen die Klassen einfach zu Beginn einzubinden, und dann mittels new an der entsprechenden Stelle zu erstellen.

Rebel4s Rebel4s am 23.01.07 14:08

Quote
Original von Michael
Mit include? Nein.
Aber es spricht nichts dagegen die Klassen einfach zu Beginn einzubinden, und dann mittels new an der entsprechenden Stelle zu erstellen.


Was heisst zu beginn?

Michael Michael am 29.01.07 14:49

<?php

// hier bindest du sinnvollerweise benutzte Klassen ein
require_once('eineklasse.php');
require_once('nocheine.hastdunichtgesehen');

// dann die Klassendefinition, die eventuell diese bentutzt

class eineandereklasse {

// ...

}

?>


Wenn du PHP5 benutzt, ist [dok]autoload[/dok] einen Blick wert. Insbesondere bei festen Strukturen - die man bei größeren Projekten haben sollten - kann man sich so viel Arbeit sparen.
Von anderen Vorteilen wie zentraler Fehlerbehandlung usw ganz abgesehen.

Rebel4s Rebel4s am 29.01.07 19:08

http://www.professionelle-softwareentwicklung-mit-php5.de/erste_auflage/oop.interceptors.autoload.html

Heisst das, wenn ich eine klasse starte, die es nicht gibt, dass dann autoload ausgeführt wird? Was bringt da der array?

der_nic der_nic am 29.01.07 19:37

in deinem Beispiel sieht die Funktion so aus:
<?php
$GLOBALS['klassen'] = array(
'Projekt_Klasse' => 'Projekt/Klasse.php'
);

function __autoload($klasse) {
if (isset($GLOBALS['klassen'][$klasse])) {
require_once $GLOBALS['klassen'][$klasse];
}
}

$objekt = new Projekt_Klasse;
?>

da hat es am Anfang ein Array mit alles Klassen die existieren (für dieses Projekt).
Und unten wird ein neues Objekt von der Klasse Projekt_Klasse erstellt. Diese Klasse ist aber nirgends definiert, also wird die Funktion __autoload gestartet. In dieser Funktion wird dann überpfrüft ob im Array mit den gültigen Klassen die zu erstellende Klasse existiert und diese dann eingebunden.

Rebel4s Rebel4s am 29.01.07 19:42

ah, verstanden, danke!

Michael Michael am 29.01.07 22:35

Ich würde den $GLOBALS Scheiss aber weglassen. Globale Variablen sind von vorgestern, bisher dachte ich, diese Tippsammlung würde sich endlich einmal durch Niveau von den vielen anderen abheben. Tja getäuscht.

Den $GLOBALS Array einfach vergessen und anstelle dessen eine sinnvolle Klassenhierarchie benutzen.

der_nic der_nic am 29.01.07 22:40

mh... keiner ist perfekt;)

theoretisch könnte man auch eine spezielle Klasse nur fürs einbinden von anderen Klassen erstellen

Michael Michael am 29.01.07 22:47

Das wäre eine schicke Sache, allerdings müsste dies eine statische Sache sein, damit nicht bei jedem Aufruf von autoload die Instanz neu erstellt werden müsste.

Tatsächlich würde ich zu einer pragmatischen Lösung raten, den Pfad einfach von dem Namen abhängig zu machen - vielleicht kommt dort auch der Perl Stempel durch.

der_nic der_nic am 29.01.07 22:57

joa statisch klar

ich würde persönlich auch zu einer Lösung über die Namen greifen (unsereins ist sich das ja von Flash gewöhnt)... vllt noch in Verbindung mit einem Suffix zb. bla-klasse.class.php

Rebel4s Rebel4s am 08.02.07 09:48

Ich hab mir überleg die Daten udn informationen in XML Dateien zu speichern.
Hatte bis jetzt noch nicht viel mit XML am Hut und da stell ich mir die Frage:
Soll ich dann jeden Inhalt in eine eigene XML Datei speichern, z.B. alle News zu einem Thema in eine XML Datei oder jede News in eine eigene XML Datei.
Ich könnt mir vorstellen,dass dann bei einer XML Datei, die ganz schön groß und vielleicht unübersichtlich werden könnte.


EDIT:
Hab mich dazu entschlossen, Z.B. alle News in eine Datei zu speichern, da man dann einfacher und schneller mit den Daten arbeiten kann.

Michael Michael am 08.02.07 19:25

XML-Dateien als Speichermedium ist nur sinnvoll, wenn diese dann auch entsprechend mit XSLT etc verwendet werden. Aber nur die Inhalte...

Auch wenn die Dateiendung .xml ist, bleibt eine selbst implementierte Dateiverwaltung veraltet und langsam. Zum Glück gibt es auch eine einfache und bequeme Lösung: Datenbanken.

Rebel4s Rebel4s am 08.02.07 21:21

Quote
Original von Michael
XML-Dateien als Speichermedium ist nur sinnvoll, wenn diese dann auch entsprechend mit XSLT etc verwendet werden. Aber nur die Inhalte...

Auch wenn die Dateiendung .xml ist, bleibt eine selbst implementierte Dateiverwaltung veraltet und langsam. Zum Glück gibt es auch eine einfache und bequeme Lösung: Datenbanken.


Will mal was neues ausprobieren. Der Vorteil von xml ist, dass man es einfach per simplexml auslesen kann:
http://www.professionelle-softwareentwicklung-mit-php5.de/erste_auflage/programming-php.xml.simplexml.html

Michael Michael am 08.02.07 22:19

Stimmt das geht aus einer Datenbank nicht...

Rebel4s Rebel4s am 09.02.07 09:30

Quote
Original von Michael
Stimmt das geht aus einer Datenbank nicht...

Ich meine nicht den Vorteil von XML gegenüber Datenbanken sondern gegenüber txt Dateien.


EDIT:
Ausserdem steht da auch:
Vor- und Nachteile
+ Einfacher Zugriff auf XML-Element.

+ Geringer Speicherverbrauch, da PHP-Objekte nur bei Bedarf erzeugt werden und das Dokument zu Beginn nur einmal (im Speicher der libxml2-Bibliothek) vorliegt.

+ Schnell.

- Zugriff auf Attribute eines XML-Elementes umständlich.

- Kein Standard.


Wenn die schon schreiben "schnell" dann vertrau ich denen mal. Habs auch getestet, eine 1000 zeilige XML Datei (läuft dann durch meine php Datei und) wird genauso schnell ausgegeben wie eine 100 zeilige.

Michael Michael am 12.02.07 15:05

Quote
Original von Rebel4s
Ich meine nicht den Vorteil von XML gegenüber Datenbanken sondern gegenüber txt Dateien.


Ja schön. Es gibt aber Datenbanken. Sogar ziemlich umfassend verfügbar.
Sicher sind XML Dateien für diese Aufgabe viel besser geeignet als TXT Dateien. Du kannst auch einzelne Buchstaben der News als Bilder speichern, das ist viel besser als die Buchstaben auf den Monitor zu malen.
Ein Vergleich macht nur mit dem (daneben) besten Weg Sinn. Ansonsten ist es vollkommen beliebig. Wenn du XML Dateien dennoch benutzen willst, dann kannst du es ja machen. Aber es als beste Variante hinzustellen, da es noch schlechtere gibt ist Bildzeitungsniveau.


Quote
Original von Rebel4s
Wenn die schon schreiben "schnell" dann vertrau ich denen mal. Habs auch getestet, eine 1000 zeilige XML Datei (läuft dann durch meine php Datei und) wird genauso schnell ausgegeben wie eine 100 zeilige.


Das ist ja mal ein Argument. Meine Güte, es gibt auch Bücher über die Heilkraft von Steinen, die man mit Mondlicht aufgeladen unter dem Haus vergräbt.
Daneben: was soll der Vergleich 1000 Zeilen XML Datei mit 100 Zeilen XML aussagen? Du müsstest es schon mit einer anderen Methode vergleichen.

// edit

Du solltest vielleicht einsehen, dass Vorteile im Vergleich immer relativ sind. Dadurch, dass XML schneller als xy ist, ist es noch lange nicht die schnellste Lösung.

Rebel4s Rebel4s am 12.02.07 15:53

Hallo,
natürlich sind Datenbanken schneller, aber das wär mal eine gelegenheit für mich mal etwas mit XML zu befassen, auch wenn es dafür nicht das optimalste ist.

Mit dem Vergleich wollt ich nur sagen, dass es auch bei größeren Datenmengen noch recht flott läuft.

Michael Michael am 12.02.07 15:59

Wenn du XML aus ideologischen Gründen verwenden möchtest, ist das ja vollkommen in Ordnung. Nur die Aussage, es sei dafür gut geeignet stimmt einfach nicht.

Du solltest aber das gesamte Projekt im Hinterkopf behalten, wenn ich mich recht entsinne, sollte ein schönes CMS entstehen, hoffentlich leidet es nicht zu sehr an solchen Dingen.

Rebel4s Rebel4s am 19.02.07 10:06

Ob es noch so "schön" wird weiß ich nicht, aber es sieht momentan ganz praktisch aus.
Der Rahmen steht schon und es ist momentan noch unabhängig von XML. Ich glaube ich mach das dann so, dass man sich die Quelle der Daten selbst aussuchen kann.

Rebel4s Rebel4s am 19.02.07 13:40

Hab mal einen screeny vom "compiler" gemacht. Also das Ding, was die Inhalte in html umwandelt. Momentan macht er das mit allen Inhalten, in Zukunft, soll man sich aber aussuchen können was man "kompilieren" will.

Michael Michael am 19.02.07 17:55

Nett. Zeig doch mal ein wenig Code, also besondere Stellen oder ist es geheim?

Rebel4s Rebel4s am 19.02.07 18:33

Quote
Original von Michael
Nett. Zeig doch mal ein wenig Code, also besondere Stellen oder ist es geheim?


Hier mal "das Herz" vom "compiler". Wenn irgendwas blöd gecoded ist oder man es besser machen kann, dann würd ich mich über eine Anregung freuen.

class.file.php
<?PHP

class file {

var $html_directory;
var $show_msg;

function file ($html_directory, $content=0, $show_msg=0)
{
$this->html_directory = $html_directory;
$this->show_msg = $show_msg;

if(is_array($content))
{
$this->array2files($content);
}
}

/* Macht aus einem String einen dateinamen.html */
function name ($name)
{
if(!empty($name))
{
$filename = str_replace(" ", "_", $name);
$filename = $filename.".html";
}
else
{
$filename = "build_".time().".html";
}

return $filename;
}

/* Erstellt eine Datei mit dem Namen $name und dem Inhalt $content */
function create ($name, $content)
{
chdir($this->html_directory); //wechselt ins Hauptverzeichnis

$file = $this->name($name);

if(!file_exists($file))
{
$handle = fopen($file, "a");
fwrite($handle, $content);
fclose($handle);
}
else
{
unlink($file); //Löscht Datei
$this->create($name, $content);
}
}

/* Erstellt Dateien aus dem Array */
function array2files ($content)
{
if($this->show_msg == 1) echo "<b>HTML-Dateien werden erstellt</b><br>";
foreach ($content as $key => $value) {
$this->create($content[$key]["filename"], $content[$key]["content"]);
if($this->show_msg == 1) echo $this->name($content[$key]["filename"])." erstellt<br>";
}
}

}


?>


cgrabber.class.php
<?php

class cgrabber {

var $files = array(); //Dateinamen von den Content-Dateien
var $content_directory; //Ordnername, wo die Content-Dateien liegen
var $files_directory; //Wo die Dateien erstellt werden

var $content_name = array(); //Klassennamen der Content-Dateien
var $content_class = array(); //Klassen der Content-Dateien
var $content = array(); //Der Content

var $show_msg; //Debugmode, zeigt status an

function cgrabber ($show_msg=0, $content_directory="content") {
$this->show_msg = $show_msg;

$this->content_directory = $content_directory;

$this->sourcedir();

$this->include_content_files();

$this->content();
}

/* Verzeichnis durchsuchen, Dateien in array schreiben */
function sourcedir () {
if($this->show_msg == 1) echo "<b>Verzeichnis wird durchsucht</b><br>";
$dir = dir($this->content_directory);

while ($file = $dir->read()) {
if (substr($file,-4)=='.php') {
$this->files[] = $file;
$this->content_name[] = substr($file, 0, -4);
if($this->show_msg == 1) echo $file." gefunden<br>";
}
}

$dir->close();
}

/* Included Dateien, startet die Klassen */
function include_content_files () {
if($this->show_msg == 1) echo "<b>Dateien werden eingelesen</b><br>";
foreach ($this->files as $key => $file) {

require_once($this->content_directory."/".$file);

if(class_exists($this->content_name[$key])) //Prüft ob es die Klasse überhaupt existiert
{
$this->content_class[$this->content_name[$key]] = new $this->content_name[$key]();
if($this->show_msg == 1) echo $file." eingelesen<br>";
}
//Debugging
else die("<br><b>ERROR</b><br>cgrabber.class.php<br>include_content_files();<br>Keine Klasse namens \"".$this->content_name[$key]."\" in \" \"".$file."\" gefunden!");
}
}

/* Holt den Inhalt aus den klassen */
function content () {
if($this->show_msg == 1) echo "<b>Inhalt werden in Variablen gespeichert</b><br>";
$i=0;
//Geht alle Klassen durch
foreach ($this->content_class as $name => $content_class) {
foreach ($content_class->content as $key => $value) {
$this->content[$i] = $value;
$i++;
}
if($this->show_msg == 1) echo $name." Inhalte gespeichert<br>";
}
if($this->show_msg == 1) echo "Insgesamt ".$i." Inhalt/e gespeichert<br>";
}

}
?>


compiler.php
<?PHP
define ("SHOWMSG", 1);


$ges_startzeit = microtime(true);

$con_startzeit = microtime(true);
require_once ("lib/cgrabber.class.php");
$cgrabber = new cgrabber(SHOWMSG);
$con_endzeit = microtime(true);

$fil_startzeit = microtime(true);
require_once ("lib/file.class.php");
$php_directory = "\phpfly";
$html_directory = str_replace($php_directory, "", getcwd());
$file = new file($html_directory, $cgrabber->content, SHOWMSG);
$fil_endzeit = microtime(true);

echo "<br><b>Zeit für das Parsen des Contents:</b> ".round($con_endzeit-$con_startzeit, 5)."s";
echo "<br><b>Zeit für das Erstellen der Dateien:</b> ".round($fil_endzeit-$fil_startzeit, 5)."s";
echo "<br><b>Zeit Gesamt:</b> ".round(microtime(true)-$ges_startzeit, 5)."s";

?>

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt