Mijn eigen CMS voor ServerSide Scripting

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.

more

Animeer kleuren via jQuery

Als je veel met jQuery werkt sta je soms versteld als je erachter komt dat er dingen zijn die niet standaard mogelijk zijn met de uitgebreide javascript library. Zo liep ik gister tegen het probleem dat ik kleuren wou animeren via jQuery maar dit standaard niet mogelijk is.

Als uitbreiding op jQuery kan je jQuery UI integreren in je website, maar ik vond hem nogal groot en lomp. Helemaal als je hem puur inlaadt voor de kleuranimatie’s.

Hier is de jQuery color plugin van een aantal developers die erg betrokken zijn bij jQuery. Ook al is de enige functionaliteit van de plugin kleuren animaren, hij is alsnog best groot. Hij biedt allemaal extra functionaliteit die soms handig kan zijn, maar in mijn geval alsnog overbodig was.

Na wat zoeken vond ik op stackoverflow een oplossing die perfect leek. Je ript gewoon de kleuren functie uit jQuery UI en je hebt een perfecte oplossing. Helaas kon ik dit op deze manier niet werkend krijgen: in de functie wordt namelijk een aantal keer verwezen naar een colors array die niet mee geript was. Hier is de functie zodanig dat hij bij mij wel werkt:

/* stripped from jquery UI 1.9pre /
function getColor(a,b){var c;do{c=$.curCSS(a,b);if(c!=""&&c!=="transparent"||$.nodeName(a,"body"))break;b="backgroundColor"}while(a=a.parentNode);return getRGB(c)}function getRGB(a){var b;if(a&&a.constructor===Array&&a.length===3)return a;if(b=/rgb(s([0-9]{1,3})s,s([0-9]{1,3})s,s([0-9]{1,3})s)/.exec(a))return[parseInt(b[1],10),parseInt(b[2],10),parseInt(b[3],10)];if(b=/rgb(s([0-9]+(?:.[0-9]+)?)%s,s([0-9]+(?:.[0-9]+)?)%s,s([0-9]+(?:.[0-9]+)?)%s)/.exec(a))return[parseFloat(b[1])2.55,parseFloat(b[2])2.55,parseFloat(b[3])2.55];if(b=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a))return[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)];if(b=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(a))return[parseInt(b[1]+b[1],16),parseInt(b[2]+b[2],16),parseInt(b[3]+b[3],16)];if(b=/rgba(0, 0, 0, 0)/.exec(a))return colors["transparent"];return colors[$.trim(a).toLowerCase()]}$.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(a,b){$.fx.step[b]=function(a){if(!a.colorInit){a.start=getColor(a.elem,b);a.end=getRGB(a.end);a.colorInit=true}a.elem.style[b]="rgb("+Math.max(Math.min(parseInt(a.pos(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var colors={black:[0,0,0],blue:[0,0,255],green:[0,128,0],red:[255,0,0],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]}

Als je deze functie na jQuery inlaadt (hij past jQuery aan) en voor je eigen script kan je kleuren ook animeren.

Hieronder is een voorbeeld waar ik de achtergrond kleur animeer on hover (ik gebruik de .on functie in plaats van hover omdat er in mijn geval dynamisch content wordt ingeladen nadat dit script wordt uitgevoerd).

if(!Modernizr.csstransitions) {
    $('#blog-posts').children()
        .on('mouseenter', { color: '#eeeeee' }, fadeBg)
        .on('mouseleave', { color: '#ffffff' }, fadeBg);
}
function fadeBg(e) {
    $(this).stop().animate({ backgroundColor: e.data.color }, 400 );
}

Zoals je ziet is er een if die checkt of een bepaalde waarde juist is of niet. In mijn geval wil ik een achtergrond animeren on hover, dit kan ik ook doen met CSS3. Ik gebruik modernizr om te checken of de browser de CSS3 eigenschap transition ondersteund, als de browser het ondersteund wordt de klasse .csstransitions aan mijn html tag toegevoegd en wordt bovenstaande boolean in de if check op true gezet.

Als de browser de eigenschap ondersteund doe ik de animatie via css:

.csstransitions #blog-posts a.blog-post {
    background-color:#ffffff;
    moz-transition: background-color .4s;
    -webkit-transition:background-color .4s;
    -o-transition: background-color .4s;
    -ms-transition: background-color .4s;
    transition: background-color .4s;
}

Note

Op het moment van schrijven is er een bug in chrome die ervoor zorgt dat animeren via CSS3 niet werkt zodra je de link al bezocht heb. Zie deze twee bugs.

Posted at January 02, 2012, under jQuery.

Fatsoenlijk text weergeven op je PHP website

Als je tekst probeert te weergeven op je website kom je al snel achter wat problemen met betrekking tot de weergave van die tekst. Als je bijvoorbeeld netjes je alinea’s gescheiden hebt met witregels wordt alles achter elkaar gezet in je browser. Als je naar de broncode kijkt zie je dat er niks met je witregels is gebeurd. Dit komt omdat je browser witregels en meerdere spaties negeert.

Justus heeft een hele mooie functie geschreven die kale tekst (plain text) geschikt maakt voor html weergave door gebruik te maken van reguliere expressies.

Als je die functie kopieert in een php bestandje kun je met de onderstaande code heel snel testen wat het resultaat van je tekst wordt:

echo texttohtml($_POST['txt']);

Als je dit verwerkt in je scriptjes die tekst weergeven op het scherm voorkom je dat je zelf teksten in html aan het schrijven bent.

Als je een stapje verder wilt gaan zijn er oplossingen als TinyMCE. Zelf ben ik meer fan van een markup taal zoals Markdown die dezelfde functie heeft als html maar dan iets mens-vriendelijker. Je schrijft gewoon bijna natuurlijk je tekst, met een nihile syntax voor niet standaard text. Normaal gesprekken (als je met tekst bezig bent) heb je genoeg aan Markdown voor al je basis markup behoeften zoals: paragrafen, (geneste) lijstjes, headers (1 tot 6), quotes, afbeeldingen en links.

Hier is een PHP script die Markdown tekst vertaald naar HTML. Als je het scriptje hebt gedownload is het net zo makkelijk om hem in te zetten als de functie van Justus:

includeonce "markdown.php";
echo Markdown($mytext);

Posted at December 17, 2011, under PHP.

Maak een voordeur in PHP: redirect alles naar een pagina

In mijn post over het MVC patroon voor PHP applicaties zei ik dat grote systemen altijd een punt hebben waarin een request binnenkomt. Zo kan een CMS een folder simuleren: Een hoop websites hebben een about pagina te vinden op het adres website.nl/about. Nu is er meestal helemaal geen about folder op de webserver van de website maar wordt deze gesimuleerd.

Als je nog een stap verder gaat kan je op deze manier makkelijk en dynamisch nieuwe pagina’s in een database proppen en de request via PHP verwerken. Alle grote systemen werken volgens dit principe.

In mijn mini .htaccess tutorial gaf ik htaccess code waarmee je links naar een bestand kan redirecten:

# rewrite all requests ( /a/b/c/d/ ) to index.php?page=a/b/c/d/
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]

Nu kan je in je script checken welke er gevraagd wordt:

$request = explode('/',$_GET['r']);
if ($request[0] == 'about') { 
    maakAboutPagina();
} else {
    // …
}

explode is een functie die een string omtovert tot array, hij hakt hem in stukken op de plekken van de eerste parameter (in dit geval /). Dit is nu nog niet zo handig, maar zodra je met submenu’s gaat werken heb je de globale nav van de lokale nav gescheiden.

Op deze manier heb jij volledige controle over wat er opgevraagd mag worden en wat niet. Nu kan je uitzoeken door $request te checken welke pagina er gevraagd wordt.

Posted at December 17, 2011, under PHP.

Smooth page transitions using jQuery [video]

I uploaded a video to youtube explaining how to do some basic smooth page transition using javascript (jQuery).

Here is the video:

You can see a live example of the effect over here (also demonstrated in the video).

This is the code from the end of the video:

JS

$(function() {
    var request = window.location.hash;
    if(request == '#page-2') {
        $('.page.current').removeClass('current');
        $('.page').eq(1).addClass('current');
    }
    $('nav a').click(function(){
        var speed = 200;
        var i = $(this).index();
        $('.page.current').animate({opacity: 0, marginTop:80},speed,function(){
            $(this).removeClass('current');
            $('.page').eq(i).css('marginTop',30).animate({opacity:1,marginTop: 50},speed).addClass('current');
        });
    });
});

HTML

<!doctype html>
<html lang=lipsum>
<head>
    <meta charset=utf-8>
    <title>smooth page transition</title>
    <link rel=stylesheet href='style.css'>
</head>
<body> 
    <nav>
        <a href='#page-1'>first page</a>
        <a href='#page-2'>second page</a>
    </nav>
    <div class='page current'>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi eu dignissim leo. 
        Maecenas eleifend, massa eget faucibus lobortis, dolor mauris adipiscing leo, sit amet 
        tristique urna quam non risus. Maecenas sagittis ligula ac magna vestibulum hendrerit. 
        Praesent dignissim elit eu massa laoreet varius. Nullam tortor erat, fringilla ac consectetur 
        eu, lacinia eu sapien. Nunc bibendum porta rhoncus. Sed convallis vehicula feugiat.
        <img src='fire.jpg'>
    </div>
    <div class='page'>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi eu dignissim leo. 
        Maecenas eleifend, massa eget faucibus lobortis, dolor mauris adipiscing leo, sit amet 
        tristique urna quam non risus. Maecenas sagittis ligula ac magna vestibulum hendrerit. 
        Praesent dignissim elit eu massa laoreet varius. Nullam tortor erat, fringilla ac consectetur 
        eu, lacinia eu sapien. Nunc bibendum porta rhoncus. Sed convallis vehicula feugiat.
        <img src='water.jpg'>
    </div>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
    <script src="script.js"></script>
</body>
</html>

CSS

html {
    overflow-y:scroll;
}

body > div, nav {
    width:640px;
    margin:auto;
    margin-top:50px;
}

.page {
    display:none;
    opacity:0;
}

.page.current {
    display: block;
    opacity: 1;
}

Posted at December 11, 2011, under jQuery.