Constructr CMS Demo
OpenSource CMS hat Constructr CMS in die Demo-Section aufgenommen. Hier kann man testen…
Tags: constructr cms, development, programming
Posted in CONSTRUCTR, programming
OpenSource CMS hat Constructr CMS in die Demo-Section aufgenommen. Hier kann man testen…
ConstructrCMS Fehler: FE-Cache-Dateien die zeitlich abgelaufen waren, wurden bisher nicht wieder gelöscht - es wurde lediglich eine neue Cache-Datei angelegt. Kann den Webspace schon mal zumüllen… Ein BugFix ist via Sourceforge.net Subversion verfügbar. Ansonsten:
Wow, da hat mein CMS dem Peter gefallen und jetzt bekomme ich eine dänische Übersetzung für das Backend! Erobern wir Dänemark… bei dieser Gelegenheit: Mehr als 1.500 Downloads!!! Constructr CMS hat mittlerweile auch eine eigene Seite: constructr-cms.org.
Mal ein wenig Werbung in Eigenregie, wenn ich schon nicht dazu komme was neues hier zu posten:
Hab da was: http://constructr.phaziz.com in der ersten stabilen Version 3.02.0 Stable. The ChangeLog:
============================================================
Constructr-CMS 3.02.0 STABLE 04.09.2008
============================================================
1) Frontend Cache-System (altered)
2) Fixed Bugs
3) Fixed Bugs
4) Fixed Bugs
5) Fixed Bugs
============================================================
[Zum einlesen die erste Folge]
Zur Einführung ein Bild, das in dieser Folge als grafisches Hilfsmittel dienen soll.

Nested Sets-Hirachie in ConstructrCMS
Erstellt wurde es mit dem Content Management System ConstructrCMS in der Version 3.01.4 Beta (kostenlos erhältlich unter http://constructr.phaziz.com - GPLv3).
Wir werden uns heute mit dem Löschen von Seiten beschäftigen. Was muss getan werden um Seiten zu löschen, ohne das der gesamte Baum verschruddelt wird?
Es muss festgestellt werden, an welcher Stelle im Baum die Seite gelöscht werden soll. Aus folgendem Grund: weil ab da der Baum nach dem eigentlichen Löschvorgang reorganisiert werden muss (die Zähler LFT -> Left und RGT -> Right).
Würde der Baum ab der gelöschten Seite nach dem Löschvorgang nicht reorganisiert werden, enstünde eine Lücke. Diese Lücke würde das weitere Pflegen des Bäumchens behindern - so ein Baum soll ja mal groß und stark werden.
Es muss also schon vor dem Löschen bekannt sein, welchen linken und rechten Zähler die zu löschende Seite inne hat. Außerdem benötigen wir die Information, ob nur die eigentliche Seite gelöscht werden soll, oder ob ein eventuell vorhandener Teilbaum gelöscht werden soll (Unterseiten zur Seite die gelöscht werden soll).
Nehmen wir zum Beispiel die Seite 1.2 aus dem oben gezeigten Bild. Was soll nach dem Löschen mit der Unterseite 1.2.1 geschehen? Soll die Unterseite mit gelöscht werden, oder soll die Seite an die Stelle der gelöschten Seite treten - soll die Seite in der Ebene nach oben wandern?
Wir wollen die Seite 1.2 mit allen evtl. vorhandenen Unterseiten löschen (also den gesamten Teilbaum, der die Seite 1.2 zur Wurzel hat):
Wir benötigen folgende Informationen vor dem Löschvorgang:
- ID der Seite die gelöscht werden soll
- LFT-Wert der Seite die gelöscht werden soll
- RGT-Wert der Seite die gelöscht werden soll
Die erste Maßnahme ist das löschen der Seite, mit den vorhandenen Unterseiten:
DELETE FROM TABELLE
WHERE LFT BETWEEN 16 AND 19
Warum jetzt nicht das löschen per ID (DELETE FROM TABELLE WHERE ID = ‘10′)? Weil wir mit dieser DELETE-Anweisung schon die Seite erfassen, die gelöscht werden soll - inklusive aller Unterseiten evtl. vorhandnen Unterseiten. Alle Unterseiten zu einer Seite, besizten LFT- und RGT-Werte innerhalb der LFT- und RGT-Werte dieser Seite -> das ist eine feste Regel im Konzept der Nested Set´s.
Wir haben es also geschafft den Teilbaum ab Seite 1.2 inklusive der Seite 1.2.1 zu löschen. Die Seite 1.2.1 besitzt die LFT- und RGT-Werte 17 und 18. Diese liegen innerhalb (BETWEEN) der LFT- (16) und RGT-Werte (19) der Seite 1.2.
Doch jetzt haben wir mit der Axt eine Lücke geschlagen und müssen schleunigst zusehen, das wir die entstandene Lücke versorgen. Wir reorganisieren die LFT-Werte der Seiten, die der Seite 1.2 folgten (1.3, 1.3.1 und 1.3.2):
UPDATE TABELLE
SET
LFT = LFT - ((19-16)+1)
WHERE LFT > 19
Wir reorganisieren den Baum ab der nun gelöschten Seite 1.2 wie folgt: Die LFT-Werte die größer sind als der RGT-Wert der Seite 1.2 (weil das der äußerste Zähler im gelöschten Teilbaum ist), verringern sich um den Wert 4 (mit dem Wert 4 haben wir hier zwei Seiten abgedeckt -> 1.2 und 1.2.1).
Generell ließe sich das mit dem Ausdruck ...SET LFT = LFT - ((DELETE_RGT - DELETE_LFT)+1) beschreiben, wobei DELETE_RGT und DELETE_LFT die Werte der zu löschenden Seite darstellen. Wir erinnern uns: RGT - LFT ergibt die Anzahl der Unterseiten (feste Regel). Daher auch die Addition mit 1 für die eigentliche Seite die gelöscht werden soll (1.2).
Fehlt uns noch die reorganisation der RGT-Werte:
UPDATE TABELLE
SET
RGT = RGT - (19-16+1)
WHERE RGT > 19
Diese bewirkt das auch die RGT-Werte der folgenden Seiten im Gesamtbaum (1.3, 1.3.1 und 1.3.2) verringert werden [...SET RGT = RGT - ((DELETE_RGT - DELETE_LFT)+1)].
Das Ziel ist erreicht:
Rekursives Löschen in einem NestedSet´s-Baum mit allgemeingültigen Regeln.
Wer kennt Sie nicht, der sich schon mit hirachischen Strukturen beschäftigen musste: Arne Klempert, dieses oder jenes Tutorial, virtuelle MySQL-Kurse, …
Alles auch sehr hilfreich, aber…
… aber irgendwie hören alle in der Mitte auf. Wie geht das denn nun mit dem verschieben von Teilbäumen rauf und runter in der Struktur im Konzept der NestedSet´s, hä?
Verwiesen wird auf die Pear-Klassen, sonstige Klassen und Frameworks - auf die Details und Feinheiten geht niemand ein. Das versuche ich jetzt nachzuholen. ConstructrCMS liegt vor in Version 1.01.3 Beta und komplette Teilbäume (Seiten mit Unterseiten) können in der Struktur beliebig nach dem NestedSet´s-Konzept verschoben werden. Das war noch das Sahnehäubchen was dort fehlte.
Um das gesamte Konzept zu erläutern fehlt mir heute Abend die Zeit, aber ich fange an und mache auch weiter ;-). Das wird jetzt durchgezogen - bis zum bitteren Ende!
Einführung: Was sind Nested Sets?
Ein Bild sagt mehr als tausend Worte, da ich hier mehrere Bilder zeige ist das schon ein recht langer Artikel ;-). Erläuterung zu den folgenden Bildern: Alle Bilder zeigen die identische hirachische Struktur einer Anordnung von Seiten in einer geordneten Struktur (Seitenbaum):

Nested Sets 1

Nested Sets 2

Nested Sets 3
Im einfachsten Fall genügt also eine Datenbanktabelle mit drei Feldern: PK, LFT und RGT - für eine Feinheit nehmen wir noch ein weiteres Feld hinzu, auf das ich später eingehen werde - eine Art temporären Marker.
PK: Der PrimaryKey der Datenbanktabelle
LFT: Der linke Zähler
RGT: Der rechte Zähler
TMP_MARKER (int, oder char, oder sonst was… ist egal)
Mehr benötigt man nicht um eine solche NestedSet´s-Struktur in einer Datenbanktabelle darzustellen. Für ein - sagen wir mal - Content Management System kämen noch ein paar Felder dazu (Seitenname, Sichtbarkeit, …), aber zum darstellen reicht die Struktur vollkommen aus.
1) Anlegen von Seiten
Befindet sich noch keine Seite in der Tabelle, erstellen wir durch das Anlegen einer neuen Seite den Mutter-Knoten (Root). Dieser Grundstein hat als linken Wert (LFT) immer die 1 - feste Regel. Der Rechte Wert (RGT) ergibt sich aus der Anzahl der vorhandenen Unter- oder Folge-Seiten.
Jetzt legen wir in MySQL die Mutter (Root) an:
INSERT INTO TABELLE (PK,LFT,RGT,TMP_MARKER) VALUES (1,1,2,”);
Sind schon Seiten vorhanden, wird beim Anlegen einer neuen Seite automatisch eine Unterseite erstellt (es kann immer nur einen Wurzel -> Root geben - ist wie bei Highlander).
Benötigt wird für das Anlegen einer neuen Unterseite der RGT- und LFT-Wert der zuletzt eingefügten Seite - des Vorgängers im Seiten-Baum. In unserem Fall also die Werte der Root-Seite -> LFT = 1 und RGT = 2, mehr Seiten gibt es noch nicht.
Der LFT-Wert der neuen Unterseite ergibt sich aus dem LFT-Wert des Vorgängers addiert mit 1 (1+1=2). Der LFT-Wert der ersten Unterseite ist also 2. An der Stelle hätten wir aber ein Problem mit der Mutter-Seite: diese hat bis jetzt der Wert 2 als RGT-Wert inne -> muss also geändert werden.
Vor dem Einfügen der ersten Unterseite, wird also bei Mutti ein wenig Platz geschaffen (der Platz für exakt eine einzige Unterseite - mehr wird aktuell nicht benötigt):
UPDATE TABELLE SET RGT = RGT+2 WHERE RGT >= NEW_LFT;
Wie vergrößern dadurch den RGT-Wert der Mutti. Dadurch ergeben sich die neuen Werte der Mutter-Seite wie folgt:
Aus LFT 1 wird LFT 1 -> weil die Mutti immer die 1 als linken Zähler hat!!!
Aus RGT 2 wird RGT 4 -> damit in die Lücke von 2 bis 4 die neue Seite mit den Werten LFT:2 und RGT:3 passt. Wir fügen die neue Unterseite gefahrenlos ein:
INSERT INTO TABELLE (PK,LFT,RGT,TMP_MARKER) VALUES (2,2,3,”);
War doch net so wild. Wir haben erfolgreich eine Mutter-Seite angelegt und eine Unter-Seite. Das Spiel könnte man nun weiterspielen, bis wir den Seiten-Baum aus den oben gezeigten Bildern nachgebildet haben:
…Jetzt ist Feierabend mit Folge 1, die nächste folgt bald!
Heute ist das erste Download-Paket bei SourceForge.net eingestellt worden. Constructr ist mein eigenes, kleines Content Management System. Zu finden ist die SourceForge-Projektseite unter: SourceForge.net.
…in letzter Zeit. Es liegt daran, das das neue Content Management System CONSTRUCTR im Endstadium der Entwicklung liegt.
Einige Facts:
Viel mehr benötigt man nicht für ein Content-Management-System. Was jetzt noch kommt ist die definierbare Ausgabe von UTF-8-XML-Streams für das Frontend (interessant für die Steuerung von Flash-Frontend´s), außerdem fehlt noch das Asset-Center und ein wenig Plugin-Schnittstelle - ein wenig KleinKram und Anpassung…
Das ganze ist/wird gehostet bei SourceForge. Betatester sind herzlich willkommen.
Also, eine Versionierung der Artikel finde ich sehr interessant…via
Schaut gut aus:
Link: kilianvalkhof.com
Eine Odyssee! Nein, nicht die Rückkehr des Königs Odysseus von Ithaka und seiner Gefährten auf der Heimkehr aus dem Trojanischen Krieg.
Ich meine einen simplen Umzug einer bestehenden ZEN-CART Installation auf eine neue Datenbank und Domain.
Anleitung für Dummy´s:
…fertig!
Das Fazit: Man hat nun eine identische Kopie der bestehenden ZEN-CART-Installation, unter einer neuen Domain. Der Root-Zugang ist identisch mit dem, der ursprünglichen Installation.
Yahoo Design Pattern Library
Welcome to the Yahoo! Design Pattern Library. We’re thrilled to be sharing patterns and code with the web design and development community, we hope it’s useful, and we look forward to your feedback.
developer.yahoo.com/ypatterns/
“Prototip allows you to easily create both simple and complex tooltips using the Prototype javascript framework.”
,
Browse the Web and enjoy yourself
Missing a website? Make a suggestion...
örly work 5195 aaron ac/dc advertising andre rösler architecture archive arcitecture art artist art object artwork baby backgrounds backpack bacon bag bags bamboo batman big bike birdgod black block blog blood blue bo buddies book bottle bowers brain bubbles bugfixes built bunny c-heads caffeine calendar camo campaign carpet carve card ceramic ceramics chat chocolate christmas christopher class clear clock cms code is art coder coffee coke collect collision comic CONSTRUCTR constructr cms cool cool design cotn cover creation creative creative heads css cube cup d+pad david head dbf death defendius delrancho design design blog designer design object development digital dishes dog dojo doktor domain-umzug door download dran drew drummer dude dunny show eat egg embed eye face-bag faces in polaces figure figures fine-art firewire flaherty fold font foundry fraai framework free fun garcia gegenwart generator ghost chair ginza girls glas glass globe glow graffiti grafix graphic guitar gun handbag Handcrafted happy hdd hdd stand he-man headphones heike weber hello kitty help hifi himbeer holder holland homer house hund icon individual INSECTIVORE inspiration iPod ir ironman japanese.school girl javascript jenkins kalender kids kill knuckles kotzreiz kristina lacie lampe laptop lego light lightpipe lines lolli long lorem ipsum loudspeaker lounge lounger love lp lunch mag magazine magic-eye maple mark jenkins meaning mediathek michael harp minimalistic Mo(e)ps(e) moleskin moleskine mootools movie mug munny museo museum nachdenken natural necklace neon nested sets nice nooka notebook not plastic o´reilly ofenrohr online online-mag packaging paper pattern pdf pdf-mag pear pencilvilla people phaziz phonophone photography php pictures pigbuds pink pin up pistol pixel plates porcelain portaits pouch print processing prof.calculator programmierung programming progression prototip prototype pultius puppets putzig qoffee radio red phone reflection reset ressource retro road roller ronald kurniawan room root rubberducky rubic sand santa walken sara de bondt self defense shelf shirt shitbox shop shuffle sigg silver surfer simpsons skateboard slayer sleeping-forest slideshow smoke snow software solin solving sourceforge speak-er Speaker spike press splash spongebob spoonfork spoons stairway stencil sticker stone Streaming street art streetart strings strukturen studio style surrealism survey 2008 sushi swing wing t-shirt tape tech textures the big lebowski theory thinn thinner time titties tongue tonk tools tops toy toys trash tricycle tv typo typography ueno update urban urban dirty usb vector verbarius verdammt vert video virus vodka wall wallpaper watanabe watch web 2.0 webdesign webdesign design website weeds white wiener witty wmf wok wood woof wordpress work wow yeah yui zen-cart zumreed
Stay updated on my meandering thoughts & activities via RSS (Syndicate).
Going so soon? May these links be a guide to web enlightenment. Schwing!