<?php
/**
 * @author Nico Kaag
 * @copyright 2009
 */

/**
 * @Description Maakt een URL (vanaf het ?) vanuit een Object
 * @Param $object : Object() : Het object waaruit de URL moet worden gecreërd
 * @return : String : een url vanaf het ?
 */
function ObjectToUrl($object) {
	// Maak lege array aan om te vullen met de waardes
	$array = array();
	// Cast het Object naar een Array en loop deze door
	foreach ((array)$object as $key => $value) {
		// Even de Key waarde opschonen door de klasse naam eruit te halen, en de eerste twee tekens verwijderen.
		$key = str_replace(get_class($object), '', $key);
		$key = substr($key, 2);
		// Voeg gegevens toe aan de array
		$array[$key] = $value;
	}
	
	// Begincode van de URL
	$url = "?";
	$i = 0;
	// Loop de array
	foreach($array as $key => $value) {
		// Als er geen waarde is, doen we lekker niks
		if (!empty($value)) {
			// Als we nog bij de eerste zijn, dan geen & ervoor, want we hebben het ? al
			if ($i != 0) {
				$url .= '&';
			}
			$i++;
			// Spaties vervangen door underscores
			$value = str_replace(' ', '_', $value);
			// URL opbouwen, En nog een urlencode over de Value, zodat deze geen erros gaan veroorzaken.
			$url .= $key .'='. urlencode($value);
		}
	}
	// Geef de URL terug
	return $url;
}

/**
 * @Description Maakt van een opgegeven URL een object naar keuze
 * @Param $object : Object() : Een instantie van een Object die moet worden gevuld
 * @Param $url : String : De url waaruit het object moet worden gemaakt, Gebruik "null" om de algemene "$_GET" te gebruiken
 * @Param $useSetter : Boolean : true als er gebruik word gemaakt van setters (standaard), anders false
 */
function UrlToObject($object, $url = null, $useSetter = true) {
	// Even een lijst maken met alle variablen in de klasse
	$objectVars = getObjectVariables($object);
	// Als er geen URL is opgegeven, dan lopen doen wij het gewoon via de GET
	if ($url == null) {
		// een loop door de Get
		foreach ($_GET as $key => $value) {
    		// Kijken of de variable ook echt in de klasse bestaat
    		if (in_array($key, $objectVars)) {
    			// Als er setters worden gebruikt
    			if ($useSetter) {
    				// Maak de naam van de set Functie, en roep deze aan, en haal er ook meteen een urldecode overheen
    				$setMethod = 'set'. ucfirst($key);
    				$object->$setMethod(urldecode($value));
    			} else {
    				// Zet de variable met een url_decode, WERKT NIET MET PRIVATE OF PROTECTED OF STATIC VARIABLEN
					$object->$key = urldecode($value);
				}
			}
    	}
    } else {
    	// Data opdelen vanaf de vraagteken
		$data = explode('?', $url);
		// Alles voor het vraagteken uit de array schoppen
		array_shift($data);
		// De rest van de data doorlopen.
		foreach ($data as $item) {
			//Opdelen in tussen de &
			$item = explode('&', $item);
			// Alles doorloopen
			foreach ($item as $subItem) {
				// verdelen op de =
				$subItem = explode('=', $subItem);
				// de Key staat voor de =
				$key = $subItem[0];
				// underscores vervangen door spaties
    			$value = str_replace('_', ' ', $subItem[1]);
    			// Kijken of de variable ook echt in de klasse bestaat
    			if (in_array($key, $objectVars)) {
	    			if ($useSetter) {
						// Maak de naam van de set Functie, en roep deze aan, en haal er ook meteen een urldecode overheen	    				
    					$setMethod = 'set'. ucfirst($key);
	    				$object->$setMethod(urldecode($value));
	    			} else {
	    				// Zet de variable met een url_decode, WERKT NIET MET PRIVATE OF PROTECTED OF STATIC VARIABLEN
						$object->$key = urldecode($value);
					}
				}
			}
		}
	}
	// Geef het object terug
	return $object;
}

/**
 * @Description Maakt een lijst met alle klasse variablen van de opgegeven klasse
 * @Param $object : Object() : Het object waarvan de variablen moeten worden gevonden
 * @Return : Array() : met alle klasse variablen
 */
function getObjectVariables($object) {
	// Maak array aan om te vullen en te returnen
	$array = array();
	// Cast Object naar een array en loop hem door, Waarbij Key de variable naam is, met de klassenaam tussen 2 onbekende tekens ervoor
	foreach ((array)$object as $key => $value) {
		// Vervang de Klasse naam met niks, en verwijder de eerste 2 karakters.
		$key = str_replace(get_class($object), '', $key);
		$key = substr($key, 2);
		// Voeg de variable naam toe aan de Array
		$array[] = $key;
	}
	// Geef de array terug
	return $array;
}
?>