Portfolio
Frameworks
Been there, done that.
Na het werken in zo veel verschillende systemen, frameworks en grote, angstaanjagend vieze hopen code heb ik erg veel geleerd over programmeren in verschillende omgevingen en samenwerken met verschillende programmeurs. Hieronder een overzicht van wat projecten.
Dirty code, send it to jail
In theorie komen vaak de geweldigste ideeën, goed doorgedachte structuur en de schoonste code. In de praktijk is het vaak een heel ander verhaal. Te strakke deadline's, te weinig budget en slecht management leid vaak tot onoverzichtelijke structuur, slechte functionaliteit en hele vieze code.
Zend Framework
Het aantal projecten dat ik in dit framework heb gemaakt is ongekend veel. De projecten vliegen bijna letterlijk de deur uit. Een deadline van telkens een of twee dagen, vaak kleine projecten, geven een leuke afwisseling en geven je een goed beeld van veel verschillende klanten.
Een greep uit de doos
Bijvoorbeeld: www.canal.nl, www.openpodium.es, www.ipan.nl, www.wkkijken.nl, www.moerland.nl, www.myriaddesign.nl, www.hksadvocaten.nl, www.echtscheidingennederland.nl, www.strafzaakrotterdam.nl, www.nederlandleest.nl, www.bar-ca.com, www.campingsmetkorting.nl, www.chevroletnederland.nl, www.thebootcampclub.nl, www.restaurantdubbel.nl
Kohana Framework
Een licht, snel en vooral makkelijk framework. Alles is zo voor de hand liggend dat je het zo oppakt. Krachtig en toch klein. Perfect voor een groot aantal projecten. Dit framework word intern veel gebruikt voor grote software-pakketten.
Mijn CMS
Een van de proeve van bekwaamheid staat voor het realiseren van een content-management-systeem. Deze proeve heb ik uitgevoerd met als basis het Kohana Framework. Deze als onderliggende krachtpatser en bovenop een enorm simpel maar toch professioneel design maakt een strak CMS. Voeg daar een makkelijk integreerbaar design aan toe en je hebt een huis van een CMS.
Na het tonen van dit CMS aan mijn stagebegeleider was hij zo onder de indruk van de snelheid waarmee een website gerealiseerd kan worden, dat ik toestemming heb gekregen om deze in kleine projecten te gebruiken.
Server config
Bash, don't break it
Wat is er nou leuker dan een zaterdagavond te besteden aan het intypen van commando's, ontdekken van interessante open-source projecten en het oplossen van veel voorkomende problemen.
Look at my little Javascript Typewriter example.Expirimenteren
De aanschaf van een VPS is een van mijn beste aankopen tot nu toe. De mogelijkheid om hem binnen 3 minuten opnieuw te installeren met welke linux-distro je maar wilt geef je veel vrijheid. Zo heb ik hem al meer dan 200 keer opnieuw laten installeren. Spelenderwijs leren hoe het Linux wereldje in elkaar steekt. Meer leren over pakketten, broncode compilen en server configuraties. De mogelijkheid om vanuit PHP commando's uit te voeren en andersom.
Zo is het leuk om alternatieven te zoeken voor software zoals Nginx voor Lighttpd en Apache. MongoDB, PostgreSQL voor MySQL. Ook het toevoegen van nieuwe caching-technieken als Memcached en Project Voldemort.
Code sample
Kohana Frontend
Het initialiseren van de frontend. Het controleren van alle gegevens, het uitvoeren van de benodigde functies en de uiteindelijke opbouw. Hieronder staat de volledige frontend code van het door mij ontwikkelde CMS op basis van het Kohana Framework.
$ cd /home/root/domains/pitgroup.nl/public_html/projects/bredius/site/application/
$ cat frontend.php
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Frontend extends Controller {
/**
* array with data to parse to the view
* @var Array
* @access private
*/
protected $viewdata = array();
/**
* session data
* @var Session_Core
* @access private
*/
protected $session;
/**
* @var string template that has to be rendered
* @access protected
*/
protected $template = null;
/**
* @var string master that wraps the child template
* @access protected
*/
protected $masterTemplate = 'template';
/**
* @var object member object
* @access protected
*/
protected $member = null;
/**
* @var login
* @access protected
*/
protected $login = false;
/**
* runs before running the controller
*/
public function before( )
{
// default meta info
$this->_meta();
//$this->_setTemplate('helper/plain');
i18n::$lang = 'nl-NL';
// vanuit flash uploader een sessie id posten
$this->session = Session::instance('native',Arr::get($_POST,'PHPSESSID',NULL));
View::set_global('_baseurl',BASEURL);
View::set_global('_controller',$this->request->controller);
View::set_global('_method',$this->request->action);
View::set_global('_uri',$this->request->uri);
View::set_global('_url',$this->request->controller . '/' . $this->request->action );
View::set_global('_pageurl', '');
// alle formulieren handlen
if( $_POST )
{
$_POST = $this->cleanPost( $_POST );
}
if( Arr::get($_GET,'ajax','') != '' ) {
$this->_setMasterTemplate('helper/plain');
}
}
private function cleanPost( $post) {
foreach( $post as $var => $val ) {
if( is_array( $val ) ){
$post[$var] = $this->cleanPost( $val );
} else {
if( $this->request->directory == 'admin' )
{
$post[$var] = trim( $val );
}else{
$post[$var] = security::xss_clean( trim( $val ) );
}
}
}
return $post;
}
/**
* runs after running the controller
*/
public function after()
{
/*
* Sessie messages
*/
if( is_array( $this->session->get('_msg','') ) ){
View::set_global('_msg',$this->session->get('_msg'));
$this->session->delete('_msg');
}
/*
* Template = controller / actie .php
*/
$template = View::factory( $this->masterTemplate );
/*
* Geassignde vars naar de template sturen
*/
if( count( $this->viewdata ) > 0 ){
foreach( $this->viewdata as $key => $val ){
$this->template->set($key, $val);
}
}
/*
* Sub template renderen
*/
if( !is_null( $this->template ) ) {
$template->_content = $this->template->render();
} else {
throw new Exception('Geen template gezet');
}
/*
* De hoofd template als response naar de gebruiker sturen
*/
$this->request->response = $template->render();
}
/**
* Setter voor de title
* @param string $strTitle de titel
*/
protected function _meta( $strTitle = '', $strDescription = '', $strKeywords = '' )
{
View::set_global('_title', $strTitle );
View::set_global('_description', $strDescription );
View::set_global('_keywords', $strKeywords );
}
/**
* setter voor template
* @param <type> $template
*/
protected function _setTemplate( $template )
{
$this->template = View::factory( $template );
}
/**
* setter voor template wrapper
* @param <type> $template
*/
protected function _setMasterTemplate( $template )
{
$this->masterTemplate = $template;
}
/**
* set a key and a value to parse into template
*
* @param mixed $key
* @param mixed $value
*/
protected function _set( $key, $value )
{
$this->viewdata[$key] = $value;
}
/**
* set a session message
*
* @param mixed $key
* @param mixed $value
*/
protected function _msg( $message, $status )
{
$this->session->set('_msg',array(
'message' => $message,
'status' => $status
));
}
/**
* redirect tot a specified url
*
* @param mixed $key
* @param mixed $value
*/
protected function _redirect( $url, $ignore = false )
{
if( !$ignore && Arr::get($_GET,'goto','') != '' ) {
if( strstr( Arr::get($_GET,'goto'), 'http://' ) ) {
$this->request->redirect( Arr::get($_GET,'goto') );
}
$this->request->redirect( BASEURL . Arr::get($_GET,'goto') );
}
$this->request->redirect( BASEURL . $url );
}
}
?>
