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.

Quick PHP tip: hoe develop je een site lokaal en online met een andere DB?

Zelf develop ik mijn PHP het liefst lokaal (via XAMPP), soms willen teamgenoten / klanten / baas af en toe mee kijken waar je ongeveer bent. Je kan je lokale site wel online gooien maar als je online database een andere login en password heeft dan de offline versie kan er van alles mis gaan.

Je kan natuurlijk elke keer voordat je hem online gooit de instellingen aanpassen, maar zit je erop te wachten omdat elke keer te doen?

Als je deze code in je index.php zet (of bijvoorbeeld een config bestand die je require’d of include via je index.php) kan je verschillende instellingen meegeven en worden de juiste toegepast afhankelijk van je situatie.

//BASE is the root of our app
//substr strips off 'index.php'
define('BASE', substr($SERVER['PHPSELF'],0,-9));

‘local’ en ‘local/publish’ slaan op mappen op de root van mijn lokale machine (bij XAMPP in htdocs) vanaf waar mijn app gedraaid zou kunnen worden (deze moet je dus zeer waarschijnlijk aanpassen). Wordt de app niet vanaf een van die mappen gedraaid? Dan zijn we live met de echte instellingen!

Posted at December 06, 2011, under PHP.

Hoe maak je een dynamisch menu in PHP?

Ik heb al een aantal keer de vraag gekregen hoe je makkelijk met PHP een menu kan maken met waarbij een item de klasse ‘current’ oid. heeft.

Je kan dit oplossen door ifjes in elkaar te nesten, dit wordt echter een te groot drama als je ook met subnavigatie gaat werken. Daarnaast wil je code (voor bijv. hoe een link eruit ziet) eigenlijk maar op 1 plek hebben.

Hier zijn twee functies uit mijn visitekaartjes generator die dit iets slimmer voor elkaar krijgen. (het voorbeeld hieronder is iets simpeler omdat je in het kader van het probleem geen Classes nodig hebt, dat maakt alles alleen maar ingewikkelder).

function createMenu($menu, $current) {
    //if current is empty (homepage), set it to home
    $current = (empty($current)) ? 'home' : $current;
    //start UL
    $html = "<ul>n";
    //for each item in menu create a link
    foreach ($menu as $value) {
        if ($value['name'] == $current) {
            $html .= '<li>' . $value['name'] . "</li>n";
        } else {
            $html .= '<li><a href="' . $value['url'] . '">' . $value['name'] . "</a></li>n";
        }
    }
    //end UL
    $html .= "</ul>n";
    //return the menu
    return $html;
}

De getMenu functie bevat nu het hele menu in de code (aka hardcoded), Het zou beter zijn om ze uit een database te halen en ze in een array aan de createMenu functie te voeren(die niks weet over het menu zelf, behalve dat home de homepagina is).

Belangrijk is wel dat alle urls niet relatief zijn (of relatief aan de root), oftewel hij moet beginnen met http://website of /. Als je dit niet doet kunnen je links anders zijn op basis van waar je je in je app bevindt (dat wil je niet).

Op deze manier kan je de functie gebruiken:

//deze set je normaal dynamisch, afhankelijk van op welke pagina de gebruiker zit.
$current = ";
$menu = getMenu();
echo createMenu($menu,$current);

De output is afhankelijk van de pagina waar de gebruiker op dat moment is, iets in deze trand:


Posted at December 01, 2011, under PHP.

Hou je PHP code overzichtelijk: MVC

Zodra je meer met PHP begint te spelen wordt het handig om je code beter te kunnen ordenen en structureren. PHP kan namelijk een spaghetti taal zijn als je PHP in je HTML zet met ifjes en loopjes. Grote frameworks en CMS systemen hebben al eerder manieren gevonden om alles overzichtelijk te houden.

MVC MVC (Model-View-Controller) is een abstract design pattern die het mogelijk maakt om eenvoudig logica van presentatie te scheiden, met logica bedoel ik hier eigenlijk alles wat niks meer met het design van je website te maken heeft. Omdat MVC een abstract idee is staat het los van de implementatie, zelfs op dat niveau zijn er al veel verschillende ideeën over wat nou de beste manier is.

Even een klein metafoor om het principe duidelijk te maken:

Als je naar de supermarkt gaat heb je alleen te maken met een cassiere, tenminste zo lijkt het. Echter zijn er in de supermarkt nog twee andere belangrijke rollen: namelijk de manager die alles en iedereen bij elkaar houdt en de magazijnmedewerker die ervoor zorgt dat er altijd genoeg spullen in de winkel staan.

Zo werkt het ook bij een website die zich aan het MVC principe houdt: Je denkt dat je alleen met de voorkant (views) te maken hebt, echter is altijd nog de baas die bepaald welke views er nodig zijn en die zorgt dat alles in de winkel aanwezig is, ofwel dat alle gegevens die nodig zijn om de views op te bouwen worden geregeld door een model.

Hoe gaat dit in zijn werk?

Het is belangrijk dat alle rollen worden aangeroepen onder leiding van de controller. Deze zit of rechtstreeks in een index.php (bestand die vaak automagisch geladen wordt) of wordt hierin al eerste aangeroepen. De controller zorgt dat het model de benodigdheden uit de database haalt* en verzamelt deze data en geeft ze mee aan de view.

*het model heeft alle informatie van je applicatie minus de user interface, in het geval van websites zijn dit vaak functies en klasses om een database te query’en.

Dit is een extreem simpel voorbeeld, het wordt al moeilijker als de Controller eerst moet uitzoeken welke pagina er aangevraagd wordt (vaak op basis van GET informatie vermomd via je webserver) en op basis daarvan andere controllers moet raadplegen die meerdere models en views bij elkaar moeten schrapen.

Bij een MVC website is het dus altijd zo dat je op een centraal punt binnenkomt en vanuit daar de betreffende pagina opbouwt.

MVC is niet alleen in de webwereld een belangrijk principe, ook als je bijvoorbeeld apps wilt gaan maken moet je dit begrijpen. Binnenkort zal ik een een tutorial posten die een extreem minimaal voorbeeld in PHP demonstreert.

Posted at November 28, 2011, under PHP.