diff options
Diffstat (limited to 'src/lib/Controller.class.php')
-rw-r--r-- | src/lib/Controller.class.php | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/lib/Controller.class.php b/src/lib/Controller.class.php new file mode 100644 index 0000000..592ea2c --- /dev/null +++ b/src/lib/Controller.class.php @@ -0,0 +1,80 @@ +<?php + +class Controller { + /** + * Find the best view file to include based on file extension and HTTP + * 'Accept' headers. + */ + private function _resolveView($view) { + require_once('Mime.class.php'); + require_once('HTTP_Accept.class.php'); + + // Make a list of candidate views + $glob_string = VIEWPATH.'/pages/'.$view.'.*.php'; + $files = glob($glob_string); + + // Return false if there were no candidate views. + if (count($files) < 1) return false; + + // $prefs is a associative array where the key is the file + // extension, and the value is how much we like that extension. + // Higher numbers are better. + $prefs = array(); + + // $accept will tell us how much we like a given mime type, + // based on the ACCEPT constant. + $accept = new HTTP_Accept(ACCEPT); + + // Loop through the candidate views, and record how much we + // like each. + foreach ($files as $file) { + $ext = preg_replace('@[^.]*\.(.*)\.php$@','$1', $file); + $mimes = Mime::ext2mime($ext); + foreach ($mimes as $mime) { + $quality = $accept->getQuality($mime); + if (isset($final[$ext])) { + $quality = max($final[$ext], $quality); + } + $prefs[$ext] = $quality; + } + } + + // Sort $prefs such that the entry with the highest value will + // appear first. + arsort($prefs); + + // Return the first entry in $prefs. + foreach ($prefs as $ext => $quality) { + return VIEWPATH."/pages/$view.$ext.php"; + } + } + + /** + * Show a $view, in the most appropriate format (according to file + * extension and HTTP Accept header). Pass the array $vars to the view. + */ + protected function showView($view, $vars=null) { + global $VARS, $mm; + if ($vars===null) { $vars = array(); } + $VARS = $vars; + $VARS['template'] = $mm->template(); + include($this->_resolveView($view)); + unset($VARS); + } + + // Here be default handlers //////////////////////////////////////////// + + public function index($routed, $remainder) { + header('Content-type: text/plain'); + echo " == Generic Controller Index == \n\n"; + $routed_str = implode('/', $routed); + $remainder_str = implode('/', $remainder); + echo "Full path: $routed_str/$remainder_str\n"; + echo "Controller path: $routed_str\n"; + echo "Remainder path: $remainder_str\n"; + } + public function http404($routed, $remainder) { + $this->showView('http404', array('routed'=>$routed, + 'remainder'=>$remainder)); + } +} |