Mijn eigen CMS voor ServerSide Scripting
Posted at January 17, 2012
You’ve found a dinosaur, this post is only here for archiving purposes. The content is outdated and is not applicable anymore.
Ter afsluiting van het vak ServerSide Scripting heb ik mijn eigen CMS geschreven in PHP (en een hoop JS). In deze post licht ik alle onderdelen toe omdat ik een aantal niet-standaard elementen heb verwerkt.
Op dit moment is het admin gedeelte nog voor iedereen te bekijken, ik verwijs er in deze post een aantal keer naartoe. Zodra dit vak is afgerond timmer ik alles dicht. Nu kan niemand op de online versie wijzigingen aanpassen (met uitzondering van het vullen van mijn analytics tabellen).
Alle code (op een config bestand na) is te vinden op mijn github.
Globaal overzicht features
- De website (op individuele blog posts na) is een enkele html pagina, Javascript regelt de rest.
- Dynamische content in deze pagina wordt met AJAX opgehaald. Alle content is ook zonder AJAX te bereiken.
- De website heeft alleen URL’s met slashes (en soms een hash) erin.
- De website bevat een blog.
- De website heeft een eigen analytics systeem die bezoeken bijhoudt.
- De website importeert (in mijn database) mijn tweets en afbeeldingen van mijn fotoblog
Technisch overzicht
Site
- Alle PHP is OOP (inclusief lazyloading).
- De website volgt het MVC principe*.
- Alle requests komen centraal binnen en vanaf hier wordt verder geroute.
- Ook de enkele (JS) pagina parsed requests.
- Ookal moeten gebruikers JS hebben, ik heb (redelijke) fallbacks voor hopeloos verouderde browsers
- Ik gebruik alleen cookie’s om de PHP sessie op te slaan, verder doe ik alles in HTML.
- Onbekende links krijgen een 404 terug.
- Alle links zijn dynamisch, ze beginnen allemaal met de constant BASE.
Analytics
- Javascript scharrelt alle info die ik wil hebben bij elkaar en gooit het naar mijn website.
- Mijn PHP script checkt deze info via REGEX.
- Via deze methode kan ik ook JS pagina wijzigingen bijhouden die buiten de server omgaan.
- De uiteindelijke statistieken kunnen of per post of globaal bekeken worden. Om dit voor elkaar te krijgen gebruik ik de JS lib Raphael en wat rekenwerk om de afgelopen 20/31 dagen te genereren.
Blog
- Ik wil in Markdown kunnen schrijven en bloggen over HTML code, hiervoor heb ik wat text parsing truucjes moeten uithalen.
- Je kan posts aanmaken of wijzigen. Verwijderen kan bewust niet.
- Mijn blog heeft een (xml) sitemap en een (rss) feed.
import tweets / afbeeldingen
Ik gebruik een cronjob om elke 10 minuten de laatste tweets en afbeeldingen in mijn eigen database te stoppen. Hierdoor hoef ik bij een pagerequest niet on-the-fly te checken wat deze laatste gegevens zijn. Deze methode is niet alleen snel maar ook stabiel (als er tijdelijk iets met twitter aan de hand is bijvoorbeeld).
beveiliging
Je kan in deze post meer lezen over de beveiliging die ik heb toegepast en ga toepassen.
Credits
Ik heb zo goed alles zelf geschreven, ik maak wel gebruik van een aantal libraries die me het developen makkelijker hebben gemaakt.
Javascript:
- jQuery 1.7.1
- menu: lavalamp 1.2
- browser support: Modernizr 2.0
- plugin: jQuery color function of jQuery UI 1.9pre
- syntax highlighting: shjs
- AJAX social media buttons: socialite.js
- charts (analytics): Raphaël
PHP:
- PHP Markdown 1.0.1o
- PHP SmartyPants
Overig:
Ik ben gestart vanaf de HTML5Boilerplate, ik gebruik nog steeds het buildscript om alle JS en CSS samen te voegen en te minify’en.
*MVC: Na veel googlen kwam ik bij verschillende implementatie’s van het MVC principe uit. ‘Mijn’ implementatie is als volgt:
- Views mogen alleen data weergeven, de enige uitzonderingen hierop zijn:
- Het weergeven van dynamische data (variabelen),
- het misschien weergeven van data (if),
- het loopen door een array.
- Models mogen alleen data in een database stoppen of uit een database halen.
- Controllers doen alles wat nodig is om met behulp van Views en Models (hun children) de pagina op het scherm te krijgen.