Dynamische Websites. Week 10

Maat: px
Weergave met pagina beginnen:

Download "Dynamische Websites. Week 10"

Transcriptie

1 Dynamische Websites Week 10

2 INFO Feedback vraag het in de labo s als je feedback wilt op je code Lessen op 5/12 en 12/12 om op 19/12 om 11.00

3 KLEURENCODE GROEN = zelf kunnen schrijven PAARS = code moet je niet zelf kunnen schrijven, maar moet je wel begrijpen, kunnen uitleggen en gebruiken op de juiste plaatsen en hier moet je eventueel een methode moeten kunnen toevoegen indien nodig

4 Loader Input AGENDA

5 PROBLEEM PHP code is nu vervuild met require_once op verschillende plaatsen wanneer we bepaalde php files en/of klassen nodig hebben

6 CATEGORYCONTROLLER.PHP <?php class CategoryController extends Controller private $_categorymapper; public function construct () parent:: construct(); require_once(application_path. 'model/categorymapper.php'); $this->_categorymapper = new CategoryMapper();

7 CATEGORYMAPPER.PHP <?php require_once(application_path. 'model/category.php'); class CategoryMapper extends Mapper public function construct() parent:: construct('category', 'Category');

8 OPLOSSING Loader klasse require_once code wordt hierdoor weg gewerkt kan meerdere klassen die elkaar nodig hebben ineens laden

9 CATEGORYCONTROLLER.PHP <?php class CategoryController extends Controller private $_categorymapper; public function construct () parent:: construct(); $this->_categorymapper = $this->_loader->getmodelmapper('category');

10 <?php class Controller protected $_template; protected $_loader; protected $_input; protected $_validator; CONTROLLER.PHP public function construct() // Loader initialiseren $this->_loader = Loader::getInstance(); // input class initialiseren $this->_input = new Input(); $this->_template = new Template(); $this->_validator = new Validator(); $menumapper = $this->_loader->getmodelmapper('menu'); $this->_template->menuitems = $menumapper->getmenuitems(); $this->_template->setpartial('navbar'); $this->_template->setpartial('headermeta'); $this->_template->setpartial('statusmessage'); $this->_template->setpartial('footer'); // haal de statusberichten uit een sessie, dus van een vorige pagina voor de redirect $this->_getstatusmessage();

11 <?php LOADER.PHP class Loader private static $instance = null; private $_model_path = 'model/'; private $_view_path = 'view/'; private $_layout_path = 'view/_layouts/'; private $_partial_path = 'view/_partials/'; private $_controller_path = 'controller/'; private function construct()... public static function getinstance() if (!self::$instance) self::$instance = new self(); return self::$instance;

12 CATEGORYCONTROLLER.PHP <?php class CategoryController extends Controller private $_categorymapper; public function construct () parent:: construct(); $this->_categorymapper = $this->_loader->getmodelmapper('category');

13 LOADER.PHP public function getmodelmapper($modelname) $modelname = ucfirst($modelname); $modelmapper = $modelname. 'Mapper'; $modelfile = $this->_getfile($modelname, $this->_model_path); $modelmapperfile = $this->_getfile($modelmapper, $this->_model_path); require_once($modelfile); require_once($modelmapperfile); try return new $modelmapper(); catch (Exception $e) exit; parameter $modelname = category $modelname = Category $modelmapper = CategoryMapper $modelfile = application/model/category.php $modelmapperfile = application/model/categorymapper.php require_once( application/model/category.php ) require_once( application/model/categorymapper.php ) return new CategoryMapper();

14 LOADER.PHP... private function _getfile($name, $path) $file = APPLICATION_PATH. $path. $this->_addextension($name); if (file_exists($file)) return $file; else error_log("file not found: $file"); exit; private function _addextension($filename) return (substr($filename, -4) == '.php')? $filename : $filename. '.php';

15 CATEGORYCONTROLLER.PHP <?php class CategoryController extends Controller private $_categorymapper; public function construct () parent:: construct(); $this->_categorymapper = $this->_loader->getmodelmapper('category'); $this->_categorymapper = new CategoryMapper();

16 Loader Input AGENDA

17 INPUT Formulieren input, deze moeten we controleren voor de herfstvakantie deden we dit met klassen Validator en Controller Deze klassen gaan we nu integreren in het framework Input klasse Validator klasse

18 Create Read Update Delete CRUD

19 Create Read Update Delete

20 TOT NU TOE... Read bijvoorbeeld overview van alle categorieen tonen

21 VANAF NU ERBIJ... Delete bijvoorbeeld het verwijderen van een bestaande categorie

22 VANAF NU ERBIJ... Create bijvoorbeeld een nieuwe categorie aanmaken Update bijvoorbeeld een bestaande categorie bewerken Hiervoor hebben we formulieren nodig dus input controleren!

23 INPUT 2 belangrijke stappen sanitizen van input trimmen van input en XSS tegen gaan Input klasse validation van input heb ik een -adres ingegeven, heb ik een geldig paswoord ingegeven, heb ik een gebruikersnaam ingegeven die minimum 6 letters lang is,... Validator klasse

24 MESSAGES 2 types messages statusmessage bovenaan de pagina (zowel bij ok als bij nok) fieldmessages onder de velden (zowel bij de ok als bij de nok)

25 statusmessage fieldmessage

26 statusmessage

27 VOORBEELD 1 category/add we vullen amerika in in het categorienaam veld en drukken op de Opslaan knop zonder foutmeldingen, adden lukt

28

29

30

31 INDEX.PHP <?php // constanten ivm de paths define('application_path', 'application/'); define('system_path', 'system/'); // require before unserializing object from session require_once(system_path. 'model/message.php'); require_once(application_path. 'config.php'); require_once(system_path. 'model/db.php'); require_once(system_path. 'model/mapper.php'); require_once(system_path. 'model/identifiable.php'); require_once(system_path. 'model/validator.php'); require_once(system_path. 'controller/frontcontroller.php'); require_once(system_path. 'controller/controller.php'); require_once(system_path. 'controller/loader.php'); require_once(system_path. 'controller/input.php'); require_once(system_path. 'controller/routehelpers.php'); require_once(system_path. 'view/template.php'); require_once(system_path. 'view/viewhelpers.php'); session_start(); $frontcontroller = new FrontController(); $frontcontroller->run();

32 FRONTCONTROLLER.PHP <?php class FrontController const DEFAULT_CONTROLLER = "Home"; const DEFAULT_ACTION = "index"; const CONTROLLER_PATH = 'controller/'; const CONTROLLER_FILE = 'index.php'; private $controller = self::default_controller; private $action = self::default_action; private $params = array(); private $_loader; private $_controllerobject; public function construct() $this->_loader = Loader::getInstance(); $this->parseuri();

33 FRONTCONTROLLER.PHP private function parseuri() // strip the controllerfile out of the scriptname $scriptprefix = str_replace(self::controller_file, '', $_SERVER['SCRIPT_NAME']); $uri = str_replace(self::controller_file, '', $_SERVER['REQUEST_URI']); // get the part of the uri, starting from the position after the scriptprefix $path = substr($uri, strlen($scriptprefix)); // strip non-alphanumeric characters out of the path $path = preg_replace('/[^a-za-z0-9]\//', "", $path); // trim the path for / $path = trim($path, '/'); // explode the $path into three parts to get the controller, action and parameters // is used to supress errors when the function after it $action, $params) = explode("/", $path, 3); if (isset($controller)) $this->setcontroller($controller); if (isset($action)) $this->setaction($action); if (isset($params)) $this->setparams(explode("/", $params));

34 FRONTCONTROLLER.PHP private function setcontroller($controller) $controller = ($controller)? $controller : self::default_controller; $this->controller = ucfirst(strtolower($controller)). 'Controller'; // create an instance of the controller as an object $this->_controllerobject = $this->_loader->getcontroller($this->controller, self::default_controller); return $this; private function setaction($action)... private function setparams(array $params)...

35 FRONTCONTROLLER.PHP public function run() // checking the parameter count, using Reflection ( $reflector = new ReflectionClass($this->controller); $method = $reflector->getmethod($this->action); $parameters = $method->getnumberofrequiredparameters(); if (($parameters) > count($this->params)) die("action '$this->action' in class '$this->controller' expects $parameters mandatory parameter(s), you only provided ". // call the method based on $this->action and the params call_user_func_array(array($this->_controllerobject, $this->action), $this->params);

36 CATEGORYCONTROLLLER.PHP <?php class CategoryController extends Controller private $_categorymapper; public function construct() parent:: construct(); $this->_categorymapper = $this->_loader->getmodelmapper('category');

37 <?php class Controller protected $_template; protected $_loader; protected $_input; protected $_validator; CONTROLLER.PHP public function construct() $this->_loader = Loader::getInstance(); $this->_input = new Input(); $this->_template = new Template(); $this->_validator = new Validator(); $menumapper = $this->_loader->getmodelmapper('menu'); $this->_template->menuitems = $menumapper->getmenuitems(); $this->_template->setpartial('navbar'); $this->_template->setpartial('headermeta'); $this->_template->setpartial('statusmessage'); $this->_template->setpartial('footer'); // haal de statusberichten uit een sessie, dus van een vorige pagina voor de redirect $this->_getstatusmessage();

38 CATEGORYCONTROLLLER.PHP $this->_input->post( categoryname ) public function add() is de ingegeven string in categorienaam veld gesanitized dus amerika $category = new Category(); $this->_template->_category = $category; if ($_POST) $category->setcategoryname($this->_input->post('categoryname')); $this->_validator->isrequired('categoryname', $category->getcategoryname()); if ($this->_validator->isvalidform()) $this->_categorymapper->add($this->_template->_category); $this->_navigatetooverview('nieuwe categorie toegevoegd.'); else $this->_seterrormessages('er zijn fouten in het toevoegen van de categorie.'); $this->_template->setpagetitle('voeg categorie toe'); $this->_template->render('category/form');

39 <?php class Input public function construct() INPUT.PHP public function post($key, $default = false) if (isset($_post[$key])) return $this->_sanitize($_post[$key]); else return $default; private function _sanitize($input) if (is_array($input)) for ($i = 0; $i < count($input); $i++) $this->_sanitize($input[$i]); else $input = trim($input); $input = htmlentities($input, ENT_QUOTES, "UTF-8");... return $input;

40 CATEGORYCONTROLLLER.PHP public function add() deze methode zet in de fieldmessages een key categoryname en zet hier een new message met een lege message en status true $category = new Category(); $this->_template->_category = $category; if ($_POST) $category->setcategoryname($this->_input->post('categoryname')); $this->_validator->isrequired('categoryname', $category->getcategoryname()); if ($this->_validator->isvalidform()) $this->_categorymapper->add($this->_template->_category); $this->_navigatetooverview('nieuwe categorie toegevoegd.'); else $this->_seterrormessages('er zijn fouten in het toevoegen van de categorie.'); $this->_template->setpagetitle('voeg categorie toe'); $this->_template->render('category/form');

41 <?php VALIDATOR.PHP class Validator private $_fieldmessages = array(); public function isrequired($key, $value) return $this->isvalidlength($key, $value); public function isvalidlength($key, $value, $min = 1, $max=100) if (strlen($value) < $min strlen($value) > $max) $this->_fieldmessages[$key] = new Message($key. " moet minstens $min lang zijn en mag niet meer dan $max zijn", false); $valid = false; else $this->_fieldmessages[$key] = new Message('', true); $valid = true; return $valid;...

42 CATEGORYCONTROLLLER.PHP public function add() $category = new Category(); $this->_template->_category = $category; if ($_POST) $category->setcategoryname($this->_input->post('categoryname')); $this->_validator->isrequired('categoryname', $category->getcategoryname()); if ($this->_validator->isvalidform()) $this->_categorymapper->add($this->_template->_category); $this->_navigatetooverview('nieuwe categorie toegevoegd.'); else $this->_seterrormessages('er zijn fouten in het toevoegen van de categorie.'); $this->_template->setpagetitle('voeg categorie toe'); $this->_template->render('category/form');

43 <?php class Validator private $_fieldmessages = array(); VALIDATOR.PHP public function isvalidform () foreach ($this->_fieldmessages as $field) if (!$field->getstatus()) return false; return true;... deze methode kijkt in de array van fieldmessages als er een message inzit waarvan de status op false staat (dat betekent dat er nog fouten in het form zitten) en geeft dan false terug, anders betekent het dat er geen fouten in het form meer zitten en dan geeft deze methode true terug

44 CATEGORYCONTROLLLER.PHP public function add() $category = new Category(); $this->_template->_category = $category; if ($_POST) $category->setcategoryname($this->_input->post('categoryname')); $this->_validator->isrequired('categoryname', $category->getcategoryname()); if ($this->_validator->isvalidform()) $this->_categorymapper->add($this->_template->_category); $this->_navigatetooverview('nieuwe categorie toegevoegd.'); else $this->_seterrormessages('er zijn fouten in het toevoegen van de categorie.'); $this->_template->setpagetitle('voeg categorie toe'); $this->_template->render('category/form');

45 CATEGORYMAPPER.PHP <?php class CategoryMapper extends Mapper public function construct() parent:: construct('category', 'Category');

46 MAPPER.PHP <?php class Mapper protected $_db; protected $_table; protected $_type; public function construct($table, $type) $this->_db = Db::getInstance(); $this->_table = $table; $this->_type = $type; public function add($object) $values = $object->toarray(); $fieldnames = array_keys($values); $queryarguments = $this->createqueryarguments($values); $object = object(category)#14 (2) ["_categoryname":"category":private]=> string(7) "Amerika" ["_id":"identifiable":private]=> NULL $values = array(1) ["categoryname"]=> string(7) "Amerika" $fieldnames = array(1) [0]=> string(12) "categoryname" $queryarguments = array(1) [":categoryname"]=> string(7) "Amerika" $query = "INSERT INTO $this->_table (". implode(', ', $fieldnames). ") VALUES (:". implode(', :', $fieldnames). ")"; $this->_db->execute($query, $queryarguments);

47 MAPPER.PHP private function createqueryarguments($values) $queryarguments = array(); foreach ($values as $key => $value) $queryarguments[':'. $key] = $value; return $queryarguments;...

48 MAPPER.PHP <?php class Mapper protected $_db; protected $_table; protected $_type; public function construct($table, $type) $this->_db = Db::getInstance(); $this->_table = $table; $this->_type = $type; public function add($object) $values = $object->toarray(); $fieldnames = array_keys($values); $queryarguments = $this->createqueryarguments($values); $object = object(category)#14 (2) ["_categoryname":"category":private]=> string(7) "Amerika" ["_id":"identifiable":private]=> NULL $values = array(1) ["categoryname"]=> string(7) "Amerika" $fieldnames = array(1) [0]=> string(12) "categoryname" $queryarguments = array(1) [":categoryname"]=> string(7) "Amerika" $query = string(58) "INSERT INTO category (categoryname) VALUES (:categoryname)" $query = "INSERT INTO $this->_table (". implode(', ', $fieldnames). ") VALUES (:". implode(', :', $fieldnames). ")"; $this->_db->execute($query, $queryarguments);

49 <?php DB.PHP class Db private static $instance = null; private $_db; public function execute($sql, $arguments = array()) if (!is_array($arguments)) $arguments = array($arguments); gaat SQL injections tegen try $stmt = $this->_db->prepare($sql); $stmt->execute($arguments); $stmt->setfetchmode(pdo::fetch_assoc); catch(pdoexception $e) error_log($e->getmessage()); nu pas worden de argumenten in de query gezet en wordt de query uitgevoerd return $stmt; INSERT INTO category (categoryname) VALUES ( amerika )...

50 CATEGORYCONTROLLLER.PHP public function add() $category = new Category(); $this->_template->_category = $category; if ($_POST) $category->setcategoryname($this->_input->post('categoryname')); $this->_validator->isrequired('categoryname', $category->getcategoryname()); if ($this->_validator->isvalidform()) $this->_categorymapper->add($this->_template->_category); $this->_navigatetooverview('nieuwe categorie toegevoegd.'); else $this->_seterrormessages('er zijn fouten in het toevoegen van de categorie.'); $this->_template->setpagetitle('voeg categorie toe'); $this->_template->render('category/form');

51 CATEGORYCONTROLLLER.PHP private function _navigatetooverview($message) $statusmessage = new Message($message, true); $this->_setstatusmessage($statusmessage); redirect('category/index'); $statusmessage is een new Message object met als message 'Nieuwe categorie toegevoegd.' en als status true (want het is gelukt het adden)

52 <?php class Message private $_status; private $_message; MESSAGE.PHP function construct($message = '', $status = true) $this->_setmessage($message); $this->_setstatus($status); private function _setmessage($message) $this->_message = $message; public function getmessage() return $this->_message; private function _setstatus($status) $this->_status = $status; public function getstatus() return $this->_status;

53 CATEGORYCONTROLLLER.PHP private function _navigatetooverview($message) $statusmessage = new Message($message, true); $this->_setstatusmessage($statusmessage); redirect('category/index'); $statusmessage wordt toegevoegd aan de SESSION (want we gaan redirecten naar een andere pagina en dan moet het in de SESSION gestopt worden de statusmessage) (om te kunnen tonen wanneer we gaan redirecten naar de volgende pagina)

54 CONTROLLLER.PHP protected function _setstatusmessage($statusmessage, $resetstatusmessage = false) // als reset: dan direct zetten en niet via sessie gaan if ($resetstatusmessage) $this->_template->setstatusmessage($statusmessage); else $_SESSION['statusMessage'] = $statusmessage;

55 CATEGORYCONTROLLLER.PHP private function _navigatetooverview($message) $statusmessage = new Message($message, true); $this->_setstatusmessage($statusmessage); redirect('category/index');

56 ROUTEHELPERS.PHP <?php function redirect($location) header('location: '. baseurl($location)); exit;

57 CATEGORYCONTROLLLER.PHP private function _navigatetooverview($message) $statusmessage = new Message($message, true); $this->_setstatusmessage($statusmessage); redirect('category/index'); redirect naar category/index dus hier begint het spel opnieuw, we gaan terug naar index.php en dus een FrontController object maken en CategoryController object en naar index methode hier gaat nu ook $statusmessage uit de SESSION gehaald worden om te tonen op de index pagina dat het toevoegen van de category gelukt is

58 <?php class Controller protected $_template; protected $_loader; protected $_input; protected $_validator; CONTROLLER.PHP public function construct() $this->_loader = Loader::getInstance(); $this->_input = new Input(); $this->_template = new Template(); $this->_validator = new Validator(); $menumapper = $this->_loader->getmodelmapper('menu'); $this->_template->menuitems = $menumapper->getmenuitems(); $this->_template->setpartial('navbar'); $this->_template->setpartial('headermeta'); $this->_template->setpartial('statusmessage'); $this->_template->setpartial('footer'); $this->_getstatusmessage() heeft message object met als message 'Nieuwe categorie toegevoegd.' en als status true in de SESSION zitten // haal de statusberichten uit een sessie, dus van een vorige pagina voor de redirect $this->_getstatusmessage();

59 CONTROLLLER.PHP private function _getstatusmessage() if (isset($_session['statusmessage'])) $this->_template->setstatusmessage($_session['statusmessage']); unset($_session['statusmessage']);

60 DEFAULT.PHP <!DOCTYPE html> <html lang="nl"> <head> <?php $this->renderpartial('headermeta');?> </head> <body> <?php $this->renderpartial('navbar');?> <div class="container"> <?php $this->renderpartial('statusmessage');?> <h1><?php echo $this->getpagetitle();?></h1> <?php $this->getcontent();?> <hr> <?php $this->renderpartial('footer');?> </div> </body> </html>

61 STATUSMESSAGE.PHP <?php if (isset($this->statusmessage)):?> <div class="alert alert-<?php echo ($this->getstatusmessage()->getstatus())? 'success' : 'danger';?> alert-dismissable"> <button type="button" class="close" data-dismiss="alert" aria-hidden="true"> </button> <?php echo $this->getstatusmessage()->getmessage();?> </div> <?php endif?>

62 TEMPLATE.PHP <? php class Template... public function getstatusmessage() return $this->statusmessage;...

63 <?php class Message private $_status; private $_message; MESSAGE.PHP function construct($message = '', $status = 'success') $this->_setmessage($message); $this->_setstatus($status); private function _setmessage($message) $this->_message = $message; public function getmessage() return $this->_message; private function _setstatus($status) $this->_status = $status; public function getstatus() return $this->_status;

64 DEFAULT.PHP <!DOCTYPE html> <html lang="nl"> <head> <?php $this->renderpartial('headermeta');?> </head> <body> <?php $this->renderpartial('navbar');?> <div class="container"> <?php $this->renderpartial('statusmessage');?> <h1><?php echo $this->getpagetitle();?></h1> <?php $this->getcontent();?> <hr> <?php $this->renderpartial('footer');?> </div> </body> </html>

65 INDEX.PHP <div class="row"> <div class="col-md-12"> <?php if ($this->_categories):?> <table class="table table-striped"> <thead> <tr> <th>categorie</th> <th></th> <th></th> </tr> </thead> <tbody> <?php foreach ($this->_categories as $category):?> <tr data-id="<?php echo $category->id;?>"> <td><?php echo $category->categoryname;?></td> <td><a href="<?php echo baseurl('category/edit/'. $category->id);?>"><span class="glyphicon glyphicon-edit"></span> bewerk</a></td> <td> <a href="<?php echo baseurl('category/delete/'. $category->id);?>" class="delete"><span class="glyphicon glyphiconremove"></span> wissen</a> </td> </tr> <?php endforeach;?> </tbody> </table> <?php else:?> <p>geen categorieën gevonden.</p> <?php endif;?> <a href="<?php echo baseurl('category/add/');?>" class="btn btn-lg btn-primary"><span class="glyphicon glyphicon-plus"></span> voeg categorie toe</a> </div> </div>

66 VOORBEELD 2 category/add we laten het veld categorienaam leeg en drukken op de Opslaan knop met foutmeldingen, adden lukt niet omdat je de categorynaam leeg laat en dat mag niet

67

68

69 statusmessage

70 INDEX.PHP <?php // constanten ivm de paths define('application_path', 'application/'); define('system_path', 'system/'); // require before unserializing object from session require_once(system_path. 'model/message.php'); require_once(application_path. 'config.php'); require_once(system_path. 'model/db.php'); require_once(system_path. 'model/mapper.php'); require_once(system_path. 'model/identifiable.php'); require_once(system_path. 'model/validator.php'); require_once(system_path. 'controller/frontcontroller.php'); require_once(system_path. 'controller/controller.php'); require_once(system_path. 'controller/loader.php'); require_once(system_path. 'controller/input.php'); require_once(system_path. 'controller/routehelpers.php'); require_once(system_path. 'view/template.php'); require_once(system_path. 'view/viewhelpers.php'); session_start(); $frontcontroller = new FrontController(); $frontcontroller->run();

71 FRONTCONTROLLER.PHP <?php class FrontController const DEFAULT_CONTROLLER = "Home"; const DEFAULT_ACTION = "index"; const CONTROLLER_PATH = 'controller/'; const CONTROLLER_FILE = 'index.php'; private $controller = self::default_controller; private $action = self::default_action; private $params = array(); private $_loader; private $_controllerobject; public function construct() $this->_loader = Loader::getInstance(); $this->parseuri();

72 FRONTCONTROLLER.PHP private function parseuri() // strip the controllerfile out of the scriptname $scriptprefix = str_replace(self::controller_file, '', $_SERVER['SCRIPT_NAME']); $uri = str_replace(self::controller_file, '', $_SERVER['REQUEST_URI']); // get the part of the uri, starting from the position after the scriptprefix $path = substr($uri, strlen($scriptprefix)); // strip non-alphanumeric characters out of the path $path = preg_replace('/[^a-za-z0-9]\//', "", $path); // trim the path for / $path = trim($path, '/'); // explode the $path into three parts to get the controller, action and parameters // is used to supress errors when the function after it $action, $params) = explode("/", $path, 3); if (isset($controller)) $this->setcontroller($controller); if (isset($action)) $this->setaction($action); if (isset($params)) $this->setparams(explode("/", $params));

73 FRONTCONTROLLER.PHP public function run() // checking the parameter count, using Reflection ( $reflector = new ReflectionClass($this->controller); $method = $reflector->getmethod($this->action); $parameters = $method->getnumberofrequiredparameters(); if (($parameters) > count($this->params)) die("action '$this->action' in class '$this->controller' expects $parameters mandatory parameter(s), you only provided ". // call the method based on $this->action and the params call_user_func_array(array($this->_controllerobject, $this->action), $this->params);

74 CATEGORYCONTROLLLER.PHP <?php class CategoryController extends Controller private $_categorymapper; public function construct() parent:: construct(); $this->_categorymapper = $this->_loader->getmodelmapper('category');

75 <?php class Controller protected $_template; protected $_loader; protected $_input; protected $_validator; CONTROLLER.PHP public function construct() $this->_loader = Loader::getInstance(); $this->_input = new Input(); $this->_template = new Template(); $this->_validator = new Validator(); $menumapper = $this->_loader->getmodelmapper('menu'); $this->_template->menuitems = $menumapper->getmenuitems(); $this->_template->setpartial('navbar'); $this->_template->setpartial('headermeta'); $this->_template->setpartial('statusmessage'); $this->_template->setpartial('footer'); // haal de statusberichten uit een sessie, dus van een vorige pagina voor de redirect $this->_getstatusmessage();

76 CATEGORYCONTROLLLER.PHP public function add() $this->_input->post( categoryname ) is de ingegeven string in categorienaam veld gesanitized dus $category = new Category(); $this->_template->_category = $category; if ($_POST) $category->setcategoryname($this->_input->post('categoryname')); $this->_validator->isrequired('categoryname', $category->getcategoryname()); if ($this->_validator->isvalidform()) $this->_categorymapper->add($this->_template->_category); $this->_navigatetooverview('nieuwe categorie toegevoegd.'); else $this->_seterrormessages('er zijn fouten in het toevoegen van de categorie.'); $this->_template->setpagetitle('voeg categorie toe'); $this->_template->render('category/form');

77 <?php class Input public function construct() INPUT.PHP public function post($key, $default = false) if (isset($_post[$key])) return $this->_sanitize($_post[$key]); else return $default; private function _sanitize($input) if (is_array($input)) for ($i = 0; $i < count($input); $i++) $this->_sanitize($input[$i]); else $input = trim($input); $input = htmlentities($input, ENT_QUOTES, "UTF-8");... return $input;

78 CATEGORYCONTROLLLER.PHP public function add() $category = new Category(); $this->_template->_category = $category; deze methode zet in de fieldmessages een key categoryname en zet hier een new message in met een message categoryname moet minstens 1 lang zijn en mag niet meer dan $100 zijn en status false if ($_POST) $category->setcategoryname($this->_input->post('categoryname')); $this->_validator->isrequired('categoryname', $category->getcategoryname()); if ($this->_validator->isvalidform()) $this->_categorymapper->add($this->_template->_category); $this->_navigatetooverview('nieuwe categorie toegevoegd.'); else $this->_seterrormessages('er zijn fouten in het toevoegen van de categorie.'); $this->_template->setpagetitle('voeg categorie toe'); $this->_template->render('category/form');

79 <?php VALIDATOR.PHP class Validator private $_fieldmessages = array(); public function isrequired($key, $value) return $this->isvalidlength($key, $value); public function isvalidlength($key, $value, $min = 1, $max=100) if (strlen($value) < $min strlen($value) > $max) $this->_fieldmessages[$key] = new Message($key. " moet minstens $min lang zijn en mag niet meer dan $max zijn", false); $valid = false; else $this->_fieldmessages[$key] = new Message('', true); $valid = true; return $valid;...

80 CATEGORYCONTROLLLER.PHP public function add() $category = new Category(); $this->_template->_category = $category; if ($_POST) $category->setcategoryname($this->_input->post('categoryname')); $this->_validator->isrequired('categoryname', $category->getcategoryname()); if ($this->_validator->isvalidform()) $this->_categorymapper->add($this->_template->_category); $this->_navigatetooverview('nieuwe categorie toegevoegd.'); else $this->_seterrormessages('er zijn fouten in het toevoegen van de categorie.'); $this->_template->setpagetitle('voeg categorie toe'); $this->_template->render('category/form');

81 <?php class Validator private $_fieldmessages = array(); VALIDATOR.PHP public function isvalidform () foreach ($this->_fieldmessages as $field) if (!$field->getstatus()) return false; return true;... deze methode kijkt in de array van fieldmessages als er een message inzit waarvan de status op false staat (dat betekent dat er nog fouten in het form zitten) en geeft dan false terug, anders betekent het dat er geen fouten in het form meer zitten en dan geeft deze methode true terug

82 CATEGORYCONTROLLLER.PHP public function add() $category = new Category(); $this->_template->_category = $category; if ($_POST) $category->setcategoryname($this->_input->post('categoryname')); $this->_validator->isrequired('categoryname', $category->getcategoryname()); if ($this->_validator->isvalidform()) $this->_categorymapper->add($this->_template->_category); $this->_navigatetooverview('nieuwe categorie toegevoegd.'); else $this->_seterrormessages('er zijn fouten in het toevoegen van de categorie.'); $this->_template->setpagetitle('voeg categorie toe'); $this->_template->render('category/form');

83 CONTROLLER.PHP protected function _seterrormessages ($message) $statusmessage = new Message($message, false); $this->_setstatusmessage($statusmessage, true); $fieldmessages = $this->_validator->getfieldmessages(); $this->_template->setfieldmessages($fieldmessages); $message = 'Er zijn fouten in het toevoegen van de categorie.' $statusmessage = new Message object met als message 'Er zijn fouten in het toevoegen van de categorie.' en als status false $statusmessage wordt gezet en tweede parameter is true omdat we niet redirecten, maar op dezelfde pagina de fouten willen tonen, dus statusmessage moet nu ook niet in de SESSION gestopt worden

84 CONTROLLLER.PHP protected function _setstatusmessage($statusmessage, $resetstatusmessage = false) // als reset: dan direct zetten en niet via sessie gaan if ($resetstatusmessage) $this->_template->setstatusmessage($statusmessage); else $_SESSION['statusMessage'] = $statusmessage;

85 CONTROLLER.PHP protected function _seterrormessages ($message) $statusmessage = new Message($message, false); $this->_setstatusmessage($statusmessage, true); $fieldmessages = $this->_validator->getfieldmessages(); $this->_template->setfieldmessages($fieldmessages); $fieldmessages = array(1) ["categoryname"]=> object(message)#15 (2) ["_status":"message":private]=> bool(false) ["_message":"message":private]=> string(68) "categoryname moet minstens 1 lang zijn en mag niet meer dan 100 zijn"

86 CATEGORYCONTROLLLER.PHP public function add() $category = new Category(); $this->_template->_category = $category; if ($_POST) $category->setcategoryname($this->_input->post('categoryname')); $this->_validator->isrequired('categoryname', $category->getcategoryname()); if ($this->_validator->isvalidform()) $this->_categorymapper->add($this->_template->_category); $this->_navigatetooverview('nieuwe categorie toegevoegd.'); else $this->_seterrormessages('er zijn fouten in het toevoegen van de categorie.'); $this->_template->setpagetitle('voeg categorie toe'); $this->_template->render('category/form');

87 DEFAULT.PHP <!DOCTYPE html> <html lang="nl"> <head> <?php $this->renderpartial('headermeta');?> </head> <body> <?php $this->renderpartial('navbar');?> <div class="container"> <?php $this->renderpartial('statusmessage');?> <h1><?php echo $this->getpagetitle();?></h1> <?php $this->getcontent();?> <hr> <?php $this->renderpartial('footer');?> </div> </body> </html>

88 STATUSMESSAGE.PHP <?php if (isset($this->statusmessage)):?> <div class="alert alert-<?php echo ($this->getstatusmessage()->getstatus())? 'success' : 'danger';?> alert-dismissable"> <button type="button" class="close" data-dismiss="alert" aria-hidden="true"> </button> <?php echo $this->getstatusmessage()->getmessage();?> </div> <?php endif?>

89 DEFAULT.PHP <!DOCTYPE html> <html lang="nl"> <head> <?php $this->renderpartial('headermeta');?> </head> <body> <?php $this->renderpartial('navbar');?> <div class="container"> <?php $this->renderpartial('statusmessage');?> <h1><?php echo $this->getpagetitle();?></h1> <?php $this->getcontent();?> <hr> <?php $this->renderpartial('footer');?> </div> </body> </html>

90 FORM.PHP <div class="row"> <div class="col-md-12"> <form action="" class="form-horizontal" method="post" role="form"> <div class="form-group <?php echo $this->getfieldstatus('categoryname');?>"> <label for="categoryname" class="col-sm-2 control-label">categorienaam</label> <div class="col-sm-10"> <input type="text" class="form-control" id="categoryname" name="categoryname" placeholder="vul de categorienaam in" value="<?php echo $this->_category->getcategoryname();?>"> <span class="help-block"><?php echo $this->getfieldmessage('categoryname');?></span> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-floppy-disk"></ span> Opslaan</button> - <a href="<?php echo baseurl('category/');?>" class="">annuleer</a> </div> </div> </form> </div> </div>

91 TEMPLATE.PHP public function getfieldstatus($key) $status = ''; if(isset($this->fieldmessages[$key])) $status = ($this->fieldmessages[$key]->getstatus())? 'has-success' : 'has-error'; return $status; public function getfieldmessage($key) $status = ''; if(isset($this->fieldmessages[$key])) $status = $this->fieldmessages[$key]->getmessage(); return $status;

92 AGENDA? Loader Input

Dynamische Websites. Week 9

Dynamische Websites. Week 9 Dynamische Websites Week 9 AGENDA Nut van een framework? Relatieve URLs Views Slicing 2 step design NUT VAN EEN FRAMEWORK? Heel veel code is voor jullie al geschreven, jullie moeten deze op de juiste plaatsen

Nadere informatie

ASP.NET Test 2009-2010. Jan Van Ryckeghem

ASP.NET Test 2009-2010. Jan Van Ryckeghem ASP.NET Test 2009-2010 Jan Van Ryckeghem Inhoud Exceptionhandling H4... 3 Try Catch slide 25... 3 Error pagina slide 29... 3 Error.aspx... 3 Error.aspx.cs... 4 Web.config... 4 Logbestand aanmaken... 4

Nadere informatie

Dynamische Websites. Week 6. vrijdag 25 oktober 13

Dynamische Websites. Week 6. vrijdag 25 oktober 13 Dynamische Websites Week 6 AGENDA Herhaling Databank SQL Injection Ontwerp OO _ indien private of protected magic zo weinig mogelijk php! View MVC home.php confirm.php vehicledetail.php Controller Model

Nadere informatie

MVC BASICS 2. Kevin Picalausa

MVC BASICS 2. Kevin Picalausa MVC BASICS 2 Kevin Picalausa 1 Forms 2 Action en Method Action Vertelt de Browser naar waar de form data (informatie) door te zenden. URL kan relatief of absoluut zijn. Method De manier waarop de form

Nadere informatie

Object Oriented Programming

Object Oriented Programming Object Oriented Programming voor webapplicaties Door Edwin Vlieg Waarom OOP? Basis uitleg over OOP Design Patterns ActiveRecord Model View Controller Extra informatie Vragen OOP Object Oriented Programming

Nadere informatie

Dynamische websites met PHP (basis) Karel Nijs 2010/09

Dynamische websites met PHP (basis) Karel Nijs 2010/09 Dynamische websites met PHP (basis) Karel Nijs 2010/09 Leswijze Eerst wat theorie Begeleid met (korte) oefeningen Editor = UltraEdit Geen DreamWeaver Browser = Internet Explorer Vereiste voorkennis: (X)HTML

Nadere informatie

Kleine cursus PHP5. Auteur: Raymond Moesker

Kleine cursus PHP5. Auteur: Raymond Moesker Kleine cursus PHP5 Auteur: Raymond Moesker Kleine cursus PHP PHP is platform en CPU onafhankelijk, open source, snel, heeft een grote userbase, het is object georiënteerd, het wordt omarmd door grote bedrijven

Nadere informatie

Domein API Handleiding

Domein API Handleiding Domein API Handleiding Versie 1.6 Datum: 16-07-2014 1 Inhouds opgave 2 Inleiding 3 Result codes 4 Api functies 5 Api helpers 2 Inleiding: De API van 123 Hosting Service kan worden gebruikt om te registreren

Nadere informatie

Les 15 : updaten van gegevens in de database (deel2).

Les 15 : updaten van gegevens in de database (deel2). Les 15 : updaten van gegevens in de database (deel2). In de volgende reeks lessen zal alle vorige leerstof uitgebreid aan het bod komen. Zie ook de vorige lessen en documenten om informatie op te zoeken

Nadere informatie

SQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database.

SQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database. SQL manipulatietaal We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database. Basiscommando's: INSERT : toevoegen van gegevens DELETE : verwijderen van gegevens UPDATE : wijzigen van gegevens

Nadere informatie

Formulieren maken met Dreamweaver CS 4/CS 5

Formulieren maken met Dreamweaver CS 4/CS 5 Formulieren maken met Dreamweaver CS 4/CS 5 In deze handleiding leer je om een formulier en elementen die je binnen een formulier kunt gebruiken, te ontwerpen met Dreamweaver. Het uitgangspunt is dat dit

Nadere informatie

Introductie en even voorstellen

Introductie en even voorstellen Introductie en even voorstellen Onlangs is PHP5 uitgekomen. PHP5 is een grote stap voorwaards voor iedereen die met deze populaire programmeertaal werkt. In deze presentatie bekijken we de belangrijkste

Nadere informatie

Dit kan gebruikt worden in zowel een ASP.NET web applicatie als een desktop applicatie.

Dit kan gebruikt worden in zowel een ASP.NET web applicatie als een desktop applicatie. Introductie Dit artikel laat zien hoe je een Image in een C# applicatie kan opslaan in een database en het kan ophalen uit de database om het te laten zien. Voor de database gebruiken we MS SQL maar voor

Nadere informatie

Les 12 : database koppeling, opmaken van template, webstructuur en afdrukken van gegevens. (deel2).

Les 12 : database koppeling, opmaken van template, webstructuur en afdrukken van gegevens. (deel2). Les 12 : database koppeling, opmaken van template, webstructuur en afdrukken van gegevens. (deel2). In de volgende reeks lessen zal alle vorige leerstof uitgebreid aan het bod komen. Zie ook de vorige

Nadere informatie

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, 11.00-13.00 uur

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, 11.00-13.00 uur Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, 11.00-13.00 uur 1. (2 punten per deelvraag) Deze opgave bestaat uit een aantal tekstvragen. Houd het antwoord kort: een

Nadere informatie

Web building gevorderden: CSS & JavaScript. Karel Nijs 2008/11

Web building gevorderden: CSS & JavaScript. Karel Nijs 2008/11 Web building gevorderden: CSS & JavaScript Karel Nijs 2008/11 Webbuilding gevorderden les 3 JavaScript intro JavaScript invoegen JavaScript statements JavaScript popup berichten JavaScript functies JavaScript

Nadere informatie

Hoofdstuk 6. PHP Data Objects. Cursus PHP & MySQL Groep D

Hoofdstuk 6. PHP Data Objects. Cursus PHP & MySQL Groep D Hoofdstuk 6 PHP Data Objects Cursus PHP & MySQL Groep D Hoofdstuk 1: PHP Data Objects 1.1 Inleiding Tegenwoordig kun je er bij het ontwikkelen van een website bijna niet meer omheen: het gebruik van een

Nadere informatie

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd.

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd. BASISINSTRUCTIES SQL SQL : Structured Query Language is een taal gericht op het ondervragen van een relationele database en die aan veel klassieke databasemanagementsystemen kan worden gekoppeld. SQL is

Nadere informatie

Handleiding RS Form! 1.0.4

Handleiding RS Form! 1.0.4 Handleiding RS Form! 1.0.4 Inhoud 1. Controlepaneel... 3 2. Forms Manager... 4 2.1 Nieuwe form aanmaken... 4 2.2 Nieuwe fields toevoegen... 7 2.3 Wijzigen/verwijderen bestaande Forms, Fields... 10 Versie

Nadere informatie

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double. Algemeen C# Variabele Een variabele is een willekeurige waarde die word opgeslagen. Een variabele heeft altijd een datetype ( De soort waarde die een variabele bevat). Datatypes Een datatype is de sort

Nadere informatie

Eindtoets XML: Theorie en toepassingen

Eindtoets XML: Theorie en toepassingen Eindtoets XML: Theorie en toepassingen Deze eindtoets geeft een indruk, niet meer en niet minder, van mogelijke tentamenvragen. De spreiding over verschillende onderwerpen zal nooit bij elk tentamen hetzelfde

Nadere informatie

Inhoud. Pagina 2 van 13

Inhoud. Pagina 2 van 13 Code Conventie Inhoud PHP algemeen... 3 Namen van variabelen... 3 Enkele of dubbele aanhalingstekens... 3 Globale variabelen... 3 Namen van functies... 3 Argumenten van functies... 3 Formattering... 4

Nadere informatie

Maak een pivot uit een Generic.List

Maak een pivot uit een Generic.List Maak een pivot uit een Generic.List Introductie in extensions, reflection en code generation Nivo: 400 Introductie In bepaalde gevallen komt het voor dat je een Generic.List van een specifieke class hebt,

Nadere informatie

Dynamische Websites. Week 3. donderdag 3 oktober 13

Dynamische Websites. Week 3. donderdag 3 oktober 13 Dynamische Websites Week 3 AGENDA Herhaling Cookies Sessions voorbeeld.php Zuiver PHP: initialisatie variabelen instructies HTML minimum PHP nooit HTML in PHP FORM URL HTTP Methode Parameters Verstuurt

Nadere informatie

Datastructuren: stapels, rijen en binaire bomen

Datastructuren: stapels, rijen en binaire bomen Programmeermethoden Datastructuren: stapels, rijen en binaire bomen week 12: 23 27 november 2015 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 Inleiding In de informatica worden Abstracte DataTypen (ADT s)

Nadere informatie

Handleiding configuratie en gebruik tekenmodule

Handleiding configuratie en gebruik tekenmodule Handleiding configuratie en gebruik tekenmodule B3Partners Inhoudsopgave 1 Inleiding...2 2 Configuratie tekenmodule...3 2.1 Database tabel...4 2.2 WMS Service...5 2.3 Gegevensbron en kaartlaag...6 2.4

Nadere informatie

Instellen en werken met Templates

Instellen en werken met Templates Instellen en werken met Templates Pagina 2 van 8 Nationaal Golfpakket F Inhoudsopgave D Instellingen in het golfpakket...5 Aanmaken Templates... 5 Instellen van de templates in het golfpakket... 6 Links

Nadere informatie

My CRUD functions. Hieronder ziet u een overzicht van de bestandenlijst en functies die we gemaakt hebben en gaan gebruiken.

My CRUD functions. Hieronder ziet u een overzicht van de bestandenlijst en functies die we gemaakt hebben en gaan gebruiken. My CRUD functions Snel een tabel aanmaken en enkele formulieren hiervoor maken kan een tijdrovende bezigheid zijn. Gelukkig kunnen enkele functies ons het leven gemakkelijk maken. Telkens wij een tabel

Nadere informatie

AUTHENTICATIE. Version Date Author Description Mark Hameetman Initiele document

AUTHENTICATIE. Version Date Author Description Mark Hameetman Initiele document Postbode.nu API Version Date Author Description 1.0 21-02-2018 Mark Hameetman Initiele document AUTHENTICATIE Via https://app.postbode.nu/settings/api kunt u uw eigen API key aanmaken en/of ophalen, deze

Nadere informatie

Jarno Verhoogt 21 mei 2014 Stud. Nr. 500684953 Docent: Joost Faber. Deeltoets 2: Hoe maak je met javascript een eenvoudige slideshow?

Jarno Verhoogt 21 mei 2014 Stud. Nr. 500684953 Docent: Joost Faber. Deeltoets 2: Hoe maak je met javascript een eenvoudige slideshow? Jarno Verhoogt 21 mei 2014 Stud. Nr. 500684953 Docent: Joost Faber Deeltoets 2: Hoe maak je met javascript een eenvoudige slideshow? Inleiding Dit is een eenvoudige handleiding om in javascript een simpele

Nadere informatie

What is the advantage of using expression language instead of JSP scriptlets and JSP expressions?

What is the advantage of using expression language instead of JSP scriptlets and JSP expressions? Web 3: Theorievragen No Scriptlets What is the advantage of using expression language instead of JSP scriptlets and JSP expressions? Geen javacode tussen de html. What is the difference between the. operator

Nadere informatie

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren Universiteit van Amsterdam FNWI Voorbeeld van tussentoets Inleiding programmeren Opgave 1: Wat is de uitvoer van dit programma? public class Opgave { static int i = 0 ; static int j = 1 ; int i = 1 ; int

Nadere informatie

HTML en CSS gevorderd

HTML en CSS gevorderd HTML en CSS gevorderd Inhoudsopgave Inleiding! 3 Opbouw webpage en css! 4 DIVʼs of iframes?! 8 Eigen icoon in de adresbalk van de browser! 8 Web-editors! 8 Koppelen van css-bestanden! 9 Browser afhankelijke

Nadere informatie

Joomla! vs Facebook (en andere Social Media)

Joomla! vs Facebook (en andere Social Media) Joomla! vs Facebook (en andere Social Media) Arnold Bergshoeff facebook.com/verfrissendmarketing twitter.com/verfrissendmkt Welke kant op koppelen? Website Content of Functionaliteit naar Facebook Content

Nadere informatie

Dynamische Websites. Week 2

Dynamische Websites. Week 2 Dynamische Websites Week 2 AGENDA Labo 1 GET, POST Navigatie, etc Varia 1 2

Nadere informatie

Overerving & Polymorfisme

Overerving & Polymorfisme Overerving & Polymorfisme Overerving Sommige klassen zijn speciaal geval van andere klasse Docent is een speciaal geval van werknemer, dwz. elke docent is ook werknemer Functionaliteit van docent = functionaliteit

Nadere informatie

Les 9: formulier controle met javascript.

Les 9: formulier controle met javascript. Les 9: formulier controle met javascript. Javascript is erg veel gebruikt bij internet toepassingen. In tegenstelling tot PHP, wat een server side scripting is, is java client side scripting. Dwz, niet

Nadere informatie

Zelftest Programmeren in Java

Zelftest Programmeren in Java Zelftest Programmeren in Java Document: n0883test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING BIJ DE ZELFTEST PROGRAMMEREN IN JAVA Deze test

Nadere informatie

Chris de Kok 223548 TDI 3. Vak: Software Architectuur Datum: 21-01-2008 Docent: Fons van Kesteren

Chris de Kok 223548 TDI 3. Vak: Software Architectuur Datum: 21-01-2008 Docent: Fons van Kesteren Chris de Kok 223548 TDI 3 Vak: Software Architectuur Datum: 21-01-2008 Docent: Fons van Kesteren Inhoud Inleiding... 3 Black box / White box... 3 XP... 3 SimpleTest... 3 Eclipse plugin... 4 GroupTest...

Nadere informatie

Naam project Lost And Found Animals Lokaal gehost Percentage van het totaal geleverde werk 1 Cindy Jansen 50% 2 Eline Steyvers 50%

Naam project Lost And Found Animals Lokaal gehost Percentage van het totaal geleverde werk 1 Cindy Jansen 50% 2 Eline Steyvers 50% Naam project Lost And Found Animals Url Lokaal gehost Groepsleden Percentage van het totaal geleverde werk 1 Cindy Jansen 50% 2 Eline Steyvers 50% 1. Beveiliging in de toepassing Naam gebruiker Wachtwoord

Nadere informatie

Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, uur

Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, uur Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, 11.00-13.00 uur 1. Deze opgave bestaat uit een aantal deelvragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan

Nadere informatie

Testondersteuning in frameworks voor webapplicaties

Testondersteuning in frameworks voor webapplicaties Testondersteuningin frameworksvoorwebapplicaties MirkovanEde(9902236) NijmeegsInstituutvoorInformaticaenInformatiekunde RadboudUniversiteitNijmegen Versie:1.1,11februari2009 Omvang:3ects Samenvatting Frameworkszijneenveelgebruiktebasisvoorhetbouwenvaneenwebapplicatie.

Nadere informatie

Tentamen Objectgeorienteerd Programmeren

Tentamen Objectgeorienteerd Programmeren Tentamen Objectgeorienteerd Programmeren 5082IMOP6Y maandag 16 november 2015 13:00 15:00 Schrijf je naam en studentnummer op de regel hieronder. Sla deze pagina niet om tot de surveillant vertelt dat het

Nadere informatie

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur 1. deze opgave telt voor 30% van het totaal. Schrijf een compleet programma, dat door de gebruiker vanaf

Nadere informatie

NHibernate als ORM oplossing

NHibernate als ORM oplossing NHibernate als ORM oplossing Weg met de SQL Queries Wat is ORM? ORM staat in dit geval voor Object Relational Mapping, niet te verwarren met Object Role Modeling. ORM vertaalt een objectmodel naar een

Nadere informatie

Arrays en Foreach. Huub de Beer. Eindhoven, 4 juni 2011

Arrays en Foreach. Huub de Beer. Eindhoven, 4 juni 2011 Arrays en Foreach Huub de Beer Eindhoven, 4 juni 2011 Associatieve arrays (I) Je kent er al een aantal: $_POST en $_GET. PHP maakt er meer aan: $_SERVER, $_SESSION. Zie http://www.php.net/manual/en/reserved.variables.php

Nadere informatie

Het toepassen van een gelaagde architectuur

Het toepassen van een gelaagde architectuur Het toepassen van een gelaagde architectuur Bijlagen Bert Dingemans www.via-nova-architectura.org August 2007 1 Bijlage 1: SQL-script als voorbeeld CREATE TABLE EXEMPLAAR ( aanschafdatum DateTime, druk

Nadere informatie

Een unit test is geen integratie test. Niet het hele systeem, maar onderdelen van een systeem worden getest.

Een unit test is geen integratie test. Niet het hele systeem, maar onderdelen van een systeem worden getest. WAT IS EEN UNIT TEST? Een unit test is een test om de functionaliteit van stukken code te controleren. Een goede unit test waarborgt een consistente werking van een klein onderdeel (een unit ) van de broncode.

Nadere informatie

Tentamen Object Georiënteerd Programmeren TI1200 30 januari 2013, 9.00-12.00 Afdeling SCT, Faculteit EWI, TU Delft

Tentamen Object Georiënteerd Programmeren TI1200 30 januari 2013, 9.00-12.00 Afdeling SCT, Faculteit EWI, TU Delft Tentamen Object Georiënteerd Programmeren TI1200 30 januari 2013, 9.00-12.00 Afdeling SCT, Faculteit EWI, TU Delft Bij dit tentamen mag je geen gebruik maken van hulpmiddelen zoals boek of slides. Dit

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 6 december 2013 Terugblik Programma en geheugen Opdrachten Variabelen Methoden Objecten Klasse Programma en geheugen Opdrachten Variabelen zijn gegroepeerd in

Nadere informatie

Hoofdstuk 1 Inleiding PHP 7 of ouder Hoe dit boek werkt 2

Hoofdstuk 1 Inleiding PHP 7 of ouder Hoe dit boek werkt 2 Inhoud Hoofdstuk 1 Inleiding 1 1.1 PHP 7 of ouder 2 1.2 Hoe dit boek werkt 2 Hoofdstuk 2 De programmeeromgeving 5 2.1 In dit hoofdstuk 5 2.2 Editor 5 2.3 Webserver op Linux, Mac of PC 5 2.4 De webmap 6

Nadere informatie

File Uploads met standaard ASP.NET

File Uploads met standaard ASP.NET File Uploads met standaard ASP.NET In deze tutorial gaan we een aspx pagina maken (met codebehind), waarmee je een bestand kan uploaden naar de webserver. Noot: de hier beschreven code gaat niet in op

Nadere informatie

Een website maken met databasetoegang.

Een website maken met databasetoegang. Hoofdstuk 5 Een website maken met databasetoegang. In dit hoofdstuk gaan we het weblog dat je in hoofdstuk 4 hebt gemaakt verder uitbreiden. Een belangrijk onderdeel wordt toegevoegd aan de applicatie,

Nadere informatie

SQL datadefinitietaal

SQL datadefinitietaal SQL datadefinitietaal We kunnen er het schema van de database mee bepalen: metadata toevoegen, wijzigen en verwijderen uit een database. Basiscommando's: CREATE : toevoegen van metagegevens DROP : verwijderen

Nadere informatie

Maillijsten voor medewerkers van de Universiteit van Amsterdam

Maillijsten voor medewerkers van de Universiteit van Amsterdam See page 11 for Instruction in English Maillijsten voor medewerkers van de Universiteit van Amsterdam Iedereen met een UvAnetID kan maillijsten aanmaken bij list.uva.nl. Het gebruik van de lijsten van

Nadere informatie

Datastructuren Werkcollege Intro

Datastructuren Werkcollege Intro Bart Hijmans, Universiteit Leiden. Universiteit Leiden The Netherlands Focus 1 19 ˆ Ervaring in gebruik en implementatie van datastructuren ˆ Kennis van mogelijkheden ˆ Programmeren voor andere programmeurs

Nadere informatie

Een gelinkte lijst in C#

Een gelinkte lijst in C# Een gelinkte lijst in C# In deze tutorial ga demonstreren hoe je een gelinkte lijst kan opstellen in C#. We gaan een klasse schrijven, die een gelijkaardige functionaliteit heeft als een ArrayList, namelijk

Nadere informatie

Elfde-Liniestraat 24 3500 Hasselt Schooljaar 2009-2010 TINFO POKER GAME Oracle Scripts

Elfde-Liniestraat 24 3500 Hasselt Schooljaar 2009-2010 TINFO POKER GAME Oracle Scripts Elfde-Liniestraat 24 3500 Hasselt Schooljaar 2009-2010 TINFO POKER GAME Oracle Scripts Studenten: Peter Asnong Rik Broens Tom De Keyser Daan Gielen Kris Gregoire Koen Olaerts Toon Wouters Inhoudsopgave

Nadere informatie

Dergelijke functionaliteit kunnen we zelf ook aan eigen code toevoegen.

Dergelijke functionaliteit kunnen we zelf ook aan eigen code toevoegen. Indexers in C#.Net In deze tutorial ga ik het hebben over indexers. Bij het gebruik van bijvoorbeeld een ArrayList object, kan je de gegevens uit deze collectie opvragen als ware het een array. // ArrayList

Nadere informatie

Formulierbeheer Importeren bestaand (model)formulier... 2 Wat is exporteren/importeren eigenlijk?... 3 Formulier aanpassen/opbouwen...

Formulierbeheer Importeren bestaand (model)formulier... 2 Wat is exporteren/importeren eigenlijk?... 3 Formulier aanpassen/opbouwen... Formulierbeheer Importeren bestaand (model)formulier... 2 Wat is exporteren/importeren eigenlijk?... 3 Formulier aanpassen/opbouwen... 4 Bewerken formulier in formulierbeheer... 4 Bewerken formulier -

Nadere informatie

BathySurvey. A Trimble Access hydrographic survey module

BathySurvey. A Trimble Access hydrographic survey module BathySurvey A Trimble Access hydrographic survey module Contents 1. Introduction... 3 2. Installation... 4 3. Main Screen... 5 4. Device... 6 5. Jobs... 7 6. Settings Odom Echotrac... 8 7. Settings Ohmex

Nadere informatie

9. MYSQL. Daarin zien we het administratie paneel van mysql.

9. MYSQL. Daarin zien we het administratie paneel van mysql. 9. MYSQL We kunnen ook in dit systeem gebruik maken van de gekende ACCESS databanken. Zolang het maar relationale databanjken zijn kunnen we er gebruik van maken. In PHP echter maakt men meestal gebruik

Nadere informatie

1. De basis 2. De basis uitbreiden

1. De basis 2. De basis uitbreiden Wordpress Theme Hoe moet je deze reader gebruiken? Deze reader is digitaal, zodat je makkelijk stukjes code kunt kopieren en plakken. 1. De basis 2. De basis uitbreiden Hier aan de linkerkant vind je een

Nadere informatie

Extra voorbeelden. 1 Objectenhierarchie. 2 Kalender

Extra voorbeelden. 1 Objectenhierarchie. 2 Kalender Extra voorbeelden 1 Objectenhierarchie 2 Kalender PHP EN MYSQL de basis 1.1 Uitgebreid voorbeeld van een objectenhierarchie We zullen een aantal kenmerken van objectgeoriënteerd programmeren toelichten

Nadere informatie

Aanvullende toets Gameprogrammeren Woensdag 5 januari 2011, uur

Aanvullende toets Gameprogrammeren Woensdag 5 januari 2011, uur Dit tentamen is in elektronische vorm beschikbaar gemaakt door de TBC van A Eskwadraat. A Eskwadraat kan niet aansprakelijk worden gesteld voor de gevolgen van eventuele fouten in dit tentamen. Aanvullende

Nadere informatie

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10 CPP 1 van 10 ADSdt 1-2009 TENTAMENVOORBLAD Voor aanvang van het tentamen s.v.p. de tentamengegevens goed doorlezen om eventuele misverstanden te voorkomen!! Naam student : Studentnummer : Groep : Studieonderdeel

Nadere informatie

Release Notes. Afdrukdatum: 2011/12/20

Release Notes. Afdrukdatum: 2011/12/20 Release Notes Afdrukdatum: 2011/12/20 Dit document beschrijft vanuit technisch oogpunt de aanpassingen in Hi-Ant aan de betreffende versie. Deze tekst is geenszins bedoeld als document naar de eindgebruiker,

Nadere informatie

et Zend Framework bestaat volledig uit objectgeoriënteerde

et Zend Framework bestaat volledig uit objectgeoriënteerde et Zend Framework bestaat volledig uit objectgeoriënteerde PHP-code. Om het Zend Framework goed te kunnen begrijpen en te kunnen gebruiken, moet u minimaal de basis van objectgeoriënteerd programmeren

Nadere informatie

Formulieren en waarden posten naar een view

Formulieren en waarden posten naar een view Hoofdstuk 4 Formulieren en waarden posten naar een view Waarden posten naar een view in een Zend-project gaat heel anders dan dat je gewend bent. Om dit mechanisme te leren, kunnen we het beste een eenvoudige

Nadere informatie

DBMS. DataBase Management System. Op dit moment gebruiken bijna alle DBMS'en het relationele model. Deze worden RDBMS'en genoemd.

DBMS. DataBase Management System. Op dit moment gebruiken bijna alle DBMS'en het relationele model. Deze worden RDBMS'en genoemd. SQL Inleiding relationele databases DBMS DataBase Management System!hiërarchische databases.!netwerk databases.!relationele databases.!semantische databases.!object oriënted databases. Relationele databases

Nadere informatie

Een fragment wordt afgeleid van de basis klasse "Fragment".

Een fragment wordt afgeleid van de basis klasse Fragment. Android fragmenten 1/5 Fragmenten Klasse Een fragment wordt afgeleid van de basis klasse "Fragment". package com.android.cursustekst; import java.text.simpledateformat; import java.util.arraylist; import

Nadere informatie

Inleiding Software Engineering! Unit Testing, Contracten, Debugger! 13 Februari 2014!

Inleiding Software Engineering! Unit Testing, Contracten, Debugger! 13 Februari 2014! Inleiding Software Engineering Unit Testing, Contracten, Debugger 13 Februari 2014 Beknopte info over Unit Testing en Contracten kan je vinden op het einde van dit document. Eclipse beschikt over een handige

Nadere informatie

Sparse columns in SQL server 2008

Sparse columns in SQL server 2008 Sparse columns in SQL server 2008 Object persistentie eenvoudig gemaakt Bert Dingemans, e-mail : info@dla-os.nl www : http:// 1 Content SPARSE COLUMNS IN SQL SERVER 2008... 1 OBJECT PERSISTENTIE EENVOUDIG

Nadere informatie

Implementatie AssurePay ASP.NET. ideal

Implementatie AssurePay ASP.NET. ideal Implementatie AssurePay ASP.NET ideal Implementatie AssurePay ASP.NET 2 van 11 Inhoudsopgave Microsoft ASP.NET... 3 Classic ASP... 9 Implementatie AssurePay ASP.NET 3 van 11 Microsoft ASP.NET Implementeren

Nadere informatie

3-2013 GSM250 GSM OPENER PROGRAMMATIE HANDLEIDING

3-2013 GSM250 GSM OPENER PROGRAMMATIE HANDLEIDING 3-2013 GSM250 GSM OPENER PROGRAMMATIE HANDLEIDING 1. Voedingsspanning 12 VDC + aansluiten op + 12V - aansluiten op GND 2. SIM-kaart voorbereiden De SIM-kaart voorzien van abonnement of indien prepaid,

Nadere informatie

[BP-ebMS-H-000] Welke versie van Hermes moet er gebruikt worden?

[BP-ebMS-H-000] Welke versie van Hermes moet er gebruikt worden? [BP-ebMS-H-000] Welke versie van Hermes moet er gebruikt worden? Gebruik altijd de laatste versie omdat er serieuse bug-fixes in kunnen zitten. Check altijd de release notes en openstaande bugs. Er is

Nadere informatie

Secure Application Roles

Secure Application Roles Secure Application Roles Beheer de toegang tot de database 1. Inleiding Het realiseren van geautoriseerde toegang tot een database lijkt eenvoudig. Echter, vaak blijkt dat dezelfde combinatie van gebruikersnaam

Nadere informatie

Visual Basic.NET. Visual Basic.NET. M. den Besten 0.3 VB. NET

Visual Basic.NET. Visual Basic.NET. M. den Besten 0.3 VB. NET Visual Basic.NET M. den Besten 0.3 VB. NET Inhoud Voorwoord Deel 1 Visual Basic.NET 1.1 Inleiding...13 1.2 De programmeertaal Visual Basic.NET...14 1.3 Microsoft Visual Basic 2010 Express Edition...15

Nadere informatie

Een formulier ontwerpen

Een formulier ontwerpen Een formulier ontwerpen Op iedere professionele website is tegenwoordig wel een formulier te vinden, dat door de bezoeker van de website kan worden ingevuld. Formulieren op websites worden voor verschillende

Nadere informatie

PL/SQL. Declaraties van variabelen. Structuur PL/SQL is een blok-georiënteerde taal: Toekenningen

PL/SQL. Declaraties van variabelen. Structuur PL/SQL is een blok-georiënteerde taal: Toekenningen PL/SQL PL/SQL is een procedurele uitbreiding op SQL, omdat SQL op zich niet krachtig genoeg is om complexe databank applicaties te ontwikkelen. Server-side functies, of stored procedures worden op de database

Nadere informatie

In de tweede regel plaatsen we in het gereserveerde stukje geheugen een getal.

In de tweede regel plaatsen we in het gereserveerde stukje geheugen een getal. 4. Array s Een array is een geïndexeerde variabele. Deze zin zal de nodig vragen oproepen, waarop enige uitleg van toepassing is. Met variabelen hebben we al kennis gemaakt. In een variabele kun je iets

Nadere informatie

Inleiding C++ Coding Conventions

Inleiding C++ Coding Conventions Inleiding C++ Coding Conventions Opleiding Bachelor of Science in Informatica, van de Faculteit Wetenschappen, Universiteit Antwerpen. Nota s bij de cursus voor academiejaar 2012-2013. Ruben Van den Bossche,

Nadere informatie

DIAGNOSTISCHE TOETS Softwaresystemen UITWERKING

DIAGNOSTISCHE TOETS Softwaresystemen UITWERKING DIAGNOSTISCHE TOETS Softwaresystemen datum: Donderdag van Week 7 UITWERKING Deze diagnostische toets bevat vragen over excepties en concurrency. Beantwoord de vragen zo goed mogelijk in 30 minuten Bespreek

Nadere informatie

VoipCenter Application Programming Interface (API)

VoipCenter Application Programming Interface (API) Introductie Via de VoipCenter PBX API is het mogelijk om : 1. informatie op te vragen inzake de configuratie van : - SIP-accounts - Telefoonnummers - Tijdfilters zoals feestdagen, vakantieperiodes en kantooruren

Nadere informatie

Mailing List Manager. Hoofdstuk 19

Mailing List Manager. Hoofdstuk 19 Mailing List Manager Een MLM (Mailing List Manager) dient enerzijds om mailinglijsten te maken en daar berichten naar te sturen. Dat is de beheerkant. Anderzijds kan men zich als gebruiker met een MLM

Nadere informatie

Bibliotheek in ProcessMaker

Bibliotheek in ProcessMaker Bibliotheek in ProcessMaker Gevraagd wordt voor een bibliotheek een informatiesysteem te ontwerpen. De bibliotheek heeft een aantal bibliothecarissen die de verzameling beheren, en leden die deze boeken

Nadere informatie

Foutcontrole met Javascript

Foutcontrole met Javascript Foutcontrole met Javascript Pol Van Dingenen Yannick Van Hauwe INLEIDING Het controleren van de gegevens die ingevuld zijn in formulieren is heel erg belangrijk. In de praktijk is enkel en alleen controle

Nadere informatie

IMP Uitwerking week 13

IMP Uitwerking week 13 IMP Uitwerking week 13 Opgave 1 Nee. Anders moet bijvoorbeeld een venster applicatie een subklasse zijn van zowel Frame en WindowListener. Als de applicatie ook een button of een menu heeft, dan moet het

Nadere informatie

Handleiding beheer lijst.hva.nl. See page 11 for Instruction in English

Handleiding beheer lijst.hva.nl. See page 11 for Instruction in English Handleiding beheer lijst.hva.nl See page 11 for Instruction in English Maillijsten voor medewerkers van de Hogeschool van Amsterdam Iedereen met een HvA-ID kan maillijsten aanmaken bij lijst.hva.nl. Het

Nadere informatie

Tentamen Imperatief Programmeren

Tentamen Imperatief Programmeren Tentamen Imperatief Programmeren Maandag 22 oktober 2001 Toelichting Dit is een open boek tentamen, d.w.z. het cursusboek mag gebruikt worden. N.B.: Het tentamen is individueel: voor het maken van de opgaven

Nadere informatie

Ingebouwde klassen & methodes

Ingebouwde klassen & methodes Ingebouwde klassen & methodes Statische methodes Methodes die bij een klasse horen ipv. bij een object public class Docent { public static Docent departementshoofd() { return new Docent("Jan Ivens"); private

Nadere informatie

ContentSearch. Deep dive

ContentSearch. Deep dive ContentSearch Deep dive 2 Waarvoor in te zetten? Alternatief voor database queries Waar performance een issue kan zijn Daadwerkelijk frontend Site Search Mogelijk niet de beste optie maar wel goedkoop

Nadere informatie

Veel succes! 1. Gegeven is de volgende klasse:

Veel succes! 1. Gegeven is de volgende klasse: Dit tentamen is in elektronische vorm beschikbaar gemaakt door de TBC van A Eskwadraat. A Eskwadraat kan niet aansprakelijk worden gesteld voor de gevolgen van eventuele fouten in dit tentamen. Derde deeltentamen

Nadere informatie

Handleiding Basecamp

Handleiding Basecamp Handleiding Basecamp PlusPort b.v. PlusPort 2013 Pagina 1 van 24 1 Inhoudsopgave. 1 Inhoudsopgave.... 2 2 Wat is Basecamp?... 3 3 Aan de slag met Basecamp... 4 3.1 Inloggen... 4 4 Projects... 6 4.1 Projectoverzicht...

Nadere informatie

Objective-C Basis. 23 april 2005, Eindhoven Patrick Machielse

Objective-C Basis. 23 april 2005, Eindhoven Patrick Machielse Objective-C Basis 23 april 2005, Eindhoven Patrick Machielse patrick@hieper.nl Algemeen // extensies Objective-C code in bestanden met.m extensie // commentaar moet! /* Alles hiertussen wordt genegeerd

Nadere informatie

Formulieren maken met Dreamweaver CS 4

Formulieren maken met Dreamweaver CS 4 Formulieren maken met Dreamweaver CS 4 In deze handleiding leer je om een formulier en elementen die je binnen een formulier kunt gebruiken, te ontwerpen met Dreamweaver. Het uitgangspunt is dat dit zoveel

Nadere informatie

ExceltoCI s voor het aanmaken van studieactiviteiten. Inhoud

ExceltoCI s voor het aanmaken van studieactiviteiten. Inhoud ExceltoCI s voor het aanmaken van studieactiviteiten Inhoud Algemene opmerkingen ExceltoCI voor het aanmaken van studieactiviteiten... 2 Voordat je aan de slag kunt... 3 Introductie tot de verschillende

Nadere informatie

Verslag. Projectteam: 107 Datum: 16 oktober 2008 Project leden: Lennard Fonteijn Harish Marhe Nicoletta Saba Turgay Saruhan Robin Tummers

Verslag. Projectteam: 107 Datum: 16 oktober 2008 Project leden: Lennard Fonteijn Harish Marhe Nicoletta Saba Turgay Saruhan Robin Tummers Verslag SE Projectteam: 107 Datum: 16 oktober 2008 Project leden: Lennard Fonteijn Harish Marhe Nicoletta Saba Turgay Saruhan Robin Tummers In dit verslag zullen wij een beschrijving geven, over welke

Nadere informatie

Wat leuk dat je wilt werken met Glogster (http://www.glogster.com)! Maar wat is het?

Wat leuk dat je wilt werken met Glogster (http://www.glogster.com)! Maar wat is het? Inhoudsopgave Inleiding! 1 TIP: Inlognamen op de basisschool! 2 Gereedschap - Graphics! 6 Gereedschap - Wall! 6 Gereedschap - Video! 8 Publiceren en/of Opslaan! 9 Inleiding Wat leuk dat je wilt werken

Nadere informatie

PHP & MySQL. Studievaardigheden 2014. Jan van Rijn (j.n.van.rijn@liacs.leidenuniv.nl) LIACS, Universiteit Leiden

PHP & MySQL. Studievaardigheden 2014. Jan van Rijn (j.n.van.rijn@liacs.leidenuniv.nl) LIACS, Universiteit Leiden PHP & MySQL Studievaardigheden 2014 Jan van Rijn (j.n.van.rijn@liacs.leidenuniv.nl) LIACS, Universiteit Leiden Inleiding Voorkennis: geen Stof: dit college, www.w3schools.com en www.php.net Opdracht: maak

Nadere informatie