Sitemagic CMS - Stærkt udvikler-framework

Tags:    php
Skrevet af Bruger #2779 @ 25.09.2010
Artikel filer

Indledning


Sitemagic CMS er et PHP-baseret framework og Content Management System i stærk fremgang. Denne artikel vil introducere dig til udvikling af udvidelser til den populære danske platform, Sitemagic CMS.

Sitemagic CMS er et simpelt men både stærkt og fleksibelt framework til udviklere, der gør det muligt at producere stærke online-applikationer i en fart. Resultatet er færre linjer kode samt større sikkerhed og pålidelighed.

Frameworket stiller en lang række funktioner til rådighed, hvilket omfatter alt fra database-funktionalitet til GUI-komponenter (indtastningsfelter, knapper, lister, træ-visninger osv).

Koden bag Sitemagic CMS er baseret på Objekt Orienteret Programmering (OOP). Kendskab til klasser og objekter vil derfor være en fordel.

Målet er, at du efter at have læst denne artikel, kan skrive dine egne udvidelser til Sitemagic CMS. Kode-eksemplerne i denne artikel resulterer i en færdig gæstebog/tagwall-udvidelse, som kan indsættes på indholdssider i Sitemagic CMS.

Har du ikke arbejdet med Sitemagic CMS før, så besøg først CMS-guiden, som giver en god introduktion til systemet. Det kan også betale sig at opsætte Sitemagic CMS på eget webhotel, så det hele kan prøves af. Derudover er udvikler-dokumentationen guld værd, hvis der er kode i disse eksempler som du ikke forstå.

Bemærk: De følgende par afsnit handler om hvordan Sitemagic CMS fungerer. Hvis du bare er interesseret i at se hvordan en udvidelse laves til Sitemagic CMS, så sprig direkte til afsnittet "Hello world".


Kort om Sitemagic CMS


Sitemagic CMS er et framework med en række standard-moduler som udgør et Content Management System. Produktet kan downloades gratis fra http://sitemagic.dk. Den gratis udgave gemmer data i XML filer, mens Enterprise-udgaven benytter den lynhurtige MySQL database. Enterprise-udgaven koster penge, men udviklere kan også få denne udgave gratis, ved at kontakte Sitemagic-teamet.

En generel guide til opsætning og konfiguration findes på adressen http://cms-guide.dk. Artiklen her vil derfor ikke behandle disse emner nærmere. Det er dog relevant at se på strukturen af Sitemagic CMS, for at få en forståelse for hvordan løsningen hænger sammen.

  • base
    Mappe med alle klasser til frameworket

  • data
    Mappe med XML-data-filer (i Enterprise-versionen bruges i stedet en MySQL database)

  • extensions
    Mappe med alle udvidelserne

  • files
    Mappe med filer der bruges på websiden (fx billeder, video osv.)

  • images
    Mappe med ikon-pakker til Sitemagic

  • templates
    Mappe med design-skabeloner

  • config.xml.php
    XML fil med indstillinger (fx brugernavn og adgangskode til login, samt navn på udvidelsen der som standard skal vises)


Altså er mapperne extensions, images og templates, samt filen config.xml.php, de relevante dele når det kommer til tilpasning af Sitemagic CMS. Vi kommer til at tilføje filer til mappen extensions i denne guide.


Generelt om udvidelser


Normalt består en webside, baseret på Sitemagic CMS, i grove træk af en menu og et indholdsområde. I indholdsområdet indlæses udvidelserne. Når en besøgende kigger på hjemmesiden, ser han eller hun normalt blot tekst og billeder - men det er i virkeligheden udvidelsen SMPages, der viser indholdet.

I denne artikel laver vi også en normal udvidelse (en gæstebog). Den skal dog ikke indlæses i indholdsområdet ligesom de andre udvidelser. I stedet er vi interesseret i at lave en udvidelse som kan trækkes ind på en indholdsside, samme med øvrig tekst og billeder. Dette er muligt takket være SMPages udvidelsen, som understøtter såkaldte Indholdsside-udvidelser (altså en "mini-udvidelse" inde i en "rigtig" udvidelse).

En udvidelse ligger i mappen extensions, og består som minimum af følgende filer:

  • Main.class.php (selve udvidelsen)

  • metadata.xml (information om udvidelsen)


Filen Main.class.php indeholder en klasse, som udgør udvidelsen. Denne vender vi tilbage til.

Filen metadata.xml indeholder lidt generel information om vores udvidelse, herunder navn, ejer/forfatter, versionsnummer og information om eventuelle afhængigheder.

Derudover kan en udvidelse også indeholde følgende:

  • Languages (mappe med sprog-filer)

  • ContentPageExtension.class.php (indholdsside-udvidelse)


Mappen Languages indeholder XML-filer med oversættelser til udvidelsen.

Filen ContentPageExtension.class.php kan kaldes noget andet, men dækker over vores "mini-udvidelse" (indhodsside-udvidelse). Det er altså denne fil der udgør vores gæstebog, som skal kunne trækkes ind på en indholdsside samme med tekst og billeder.


Sådan fungerer udvidelser


Indtil videre har denne artikel givet indtryk af, at kun én udvidelse kører af gangen. Dette er dog ikke helt korrekt. Faktisk kan alle installerede udvidelser få lov til at afvikle kode, hver gang en side indlæses - men det er kun én udvidelse der får lov til at blive indlæst i indholds-området. Eksempelvis bygger udvidelsen SMMenu en navigationsmenu, selv om udvidelsen SMPages bliver kørt og viser tekst og billeder. Dette muliggøres af Sitemagic CMS, som lader de forskellige moduler afvikle kode på forskellige tidspunkter.

På billedet nedenfor vises princippet, hvor 3 udvidelser skiftevis får kaldt metoderne PreInit, Init og InitComplete. Livscyklussen består dog af flere metoder end vist.



Det smarte ved livscyklussen er, at den giver mulighed for at udvidelserne kan interagere med hinanden på bestemte tidspunkter. Dette udnytter de fleste udvidelser fx til at registrere links i menuen, så brugeren kan tilgå dem i kontrolpanelet. Dette ser vi et eksempel på senere.

Den udvidelse der afvikles i indholds-området kaldes vores Main Extension - dvs. den primære udvidelse. Hvilken udvidelse der får lov til at være Main Extension afgøres af en parameter i URL'en der ser således ud: SMExt=SMPages. Dette er ikke noget brugeren skal tænke på - parameteren indsættes typisk i URL'en automatisk, når der klikkes på en knap eller et link - fx i menuen. Mere om dette senere.

Al denne tekniske snak kan måske virke forvirrende, men brikkerne falder sikkert på plads, så snart du ser nogle kode-eksempler.


Hello world - min først udvidelse


Vi vil straks kaste os over vores første udvidelse. Start med at oprette de nødvendige filer og mapper til den nye udvidelse:

  1. I mappen extensions oprettes en ny mappe med navnet HelloWorld

  2. I den nye HelloWorld mappe oprettes disse filer: Main.class.php, ContentPageExtension.class.php og metadata.xml.php (det er ikke en fejl at filen ender på .php - det forhindrer folk i at åbne den via webserveren udefra)


I det følgende ser du indholdet til de 3 filer. Kopier indholdet ind i de respektive filer. Forklaringen til koden findes i selve kode-filerne som kommentarer. Du kan også blot downloade kode-eksemplet (vedhæftet som HelloWorld.zip)

Bemærk: Det anbefales at koden åbnes uden for udvikleren.dk, da kodeboksene nedenfor er så små, at det bliver svært at overskue koden.

Main.class.php
Fold kodeboks ind/udPHP kode 



ContentPageExtension.class.php
Fold kodeboks ind/udPHP kode 



metadata.xml.php
Fold kodeboks ind/udXML kode 


Test nu den nye udvidelse. Gå til Sitemagic CMS i en webbrowser. I menuen dukker et eller flere nye links op, afhængig af om du er logget ind eller ej. Prøv at trykke på de nye links for at se udvidelsen udskrive nyt indhold. Bemærk også at der i URL'en står ?SMExt=HelloWorld - altså navnet på vores udvidelse, som dermed bliver Main Extension.

Prøv også at indsætte den nye indholdsside-udvidelse på en af de eksisterende indholdssider. Læs hvordan i guiden til Sitemagic CMS (se listen over knapper i redigerings-programmet nederst på siden).

Vores Hello World eksempel er ganske simpelt, idet der kun udskriver tekst og HTML kode. Det er dog muligt at lave langt mere avanceret funktionalitet, hvilket Sitemagic CMS i sig selv vidner om, da al funktionalitet bestå i udvidelser og indholdsside-udvidelser.


Udvikling af gæstebog


Lad os nu tage hul på at lave vores gæstebog. Denne vil blive lidt mere avanceret, idet vi ser på hvordan GUI-biblioteket benyttes til at skabe tekst-felter og knapper, hvordan database-funktionaliteten gør det let at gemme og indlæse data, og hvordan sprogfilerne kan bruges til at skabe internationale udvidelser.



Vi starter med at oprette de nødvendige filer. Opret mappen SMComments under mappen extensions. I denne mappe oprettes:

  1. Opret de samme filer som i Hello World eksempelet.

  2. Opret mappen Languages med to underliggende filer: da.xml og en.xml (dansk og engelsk)

  3. Opret filerne SMComments.classes.php (data-lag) og tables.sql (tabel-definition til Sitemagic CMS Enterprise)


Vi vil i denne omgang skabe "smuk" seperation mellem layout og data. Det betyder at vi laver seperate klasser til håndtering af data (SMComments.classes.php) og den grafiske del (ContentPageExtension.class.php)

Denne udvidelse vil være at finde på den officielle sektion med udvidelser til Sitemagic CMS. Hvis du vil have fat i kodefilerne, så hent dog i stedet den vedhæftede udgave her fra udvikleren.dk, da den indeholder alle kommentarerne som vist nedenfor.

Main.class.php
I denne fil registrerer vi vores nye indholdsside-udvidelse i udvidelsen SMPages
Fold kodeboks ind/udPHP kode 


ContentPageExtension.class.php
I denne fil udskriver vi selve indholdsside-udvidelsen.
Fold kodeboks ind/udPHP kode 


SMComments.classes.php
Denne fil indeholder data-laget, dvs. den rå behandling af data, samt adgangen til databasen.
Fold kodeboks ind/udPHP kode 


Languages/da.xml
Filen da.xml i mappen Languages indeholder alle danske ord og tekster til udvidelsen.
Fold kodeboks ind/udXML kode 


Languages/en.xml
Filen en.xml i mappen Languages indeholder alle engelske ord og tekster til udvidelsen.
Fold kodeboks ind/udXML kode 


metadata.xml.php
Filen indeholder lidt generel information om udvidelsen så som navn, forfatter og versionsnummer. Disse informationer bruges af Sitemagic CMS til at tjekke for nyere versioner af udvidelsen (gælder dog kun for officielle udvidelser udviklet af Sitemagic-teamet).
Fold kodeboks ind/udXML kode 


tables.sql
Filen indeholder SQL-koden til at skabe den nødvendige database-tabel til Sitemagic CMS Enterprise. Hvis den almindelige udgave af Sitemagic CMS benyttes, skal denne fil ikke bruges til noget.
Fold kodeboks ind/udSQL kode 


Koden i det foregående udgør altså således vores nye indholdsside-udvidelse (som er vedhæftet denne artikel som SMComments.zip). Vores gæstebog kan nu trækkes ind på en hvilken som helst indholdsside, og giver således de besøgende mulighed for at kommentere indholdet.

Sådan kommer du videre


At beskrive hele Sitemagic frameworket er en stor opgave, og det er på ingen måde dækket af denne korte artikel. Vi kan passende kalde det en smagsprøve. Jeg håber dog at den valgte artikel-form, hvor der tages udgangspunkt i kommenterede kode-eksempler, har lært dig noget, og givet dig mod på flere eksperimenter med Sitemagic CMS.

Det kan anbefales at kigge på koden til nogle af de eksisterende udvidelser. Den medfølgende udvidelse SMLogin er forholdsvis simpel, og derfor et godt udgangspunkt. Er du interesseret i at se endnu en indholdsside-udvidelse, er udvidelsen Vurdering et godt bud.

Intet slår dog den rå dokumentation. En dags tid eller to spenderet på http://sitemagic.org/dev vil være godt givet ud. Her skulle du være i stand til at opnå den nødvendige viden for at komme videre.

Har du spørgsmål, kan forummet på Sitemagic.dk altid bruges. Her kan der spørges til alt lige fra hjælp til opsætning, til råd og vejledning om udvikling af udvidelser.

- God fornøjelse med udvikling til Sitemagic CMS! :-)

Vedhæftede filer:
Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (1)

User
Bruger #2779 @ 02.10.10 16:27
Bemærk at der i koden til gæstebogen er en fejl der potentielt udgør et sikkerhedsproblem. Det er muligt at indsætte JavaScript, som vil blive fortolket på hjemmesiden.

I filen ContentPageExtension.class.php skal foreach-løkken på linje 246 se således ud:

foreach ($this->comments as $comment)
{
$output .= "
<br>
<hr style=\"height: 1px; border-bottom-style: none\">
" . (($comment["cmdDelete"] !== null) ? $comment["cmdDelete"]->Render() . "  " : "") . "
<b>" . htmlentities($comment["comment"]->GetName()) . "</b> (" . date($this->lang->GetTranslation("DateTimeFormat"), $comment["comment"]->GetTimeStamp()) . ")
<hr style=\"height: 1px; border-bottom-style: none\">
" . nl2br(htmlentities($comment["comment"]->GetComment())) . "
<br>
";
}

Bemærk at htmlentities(..) er tilføjet ved print af en gæsts navn og besked.
Du skal være logget ind for at skrive en kommentar.
t