extensions = array(); $regex = '@'.preg_quote(VIEWPATH,'@').'[^.]*\.(.*)\.php$@'; foreach ($files as $file) { $ext = preg_replace($regex, '$1', $file); $this->extensions[] = $ext; } if (count($this->extensions)<1) return false; if (PAGE_EXT != '') { // First, do a check if we can just return requested // file extension: if (in_array(PAGE_EXT, $this->extensions)) { return PAGE_EXT; } // Check for other extensions with the same mime type as // the requested: $accept_str = implode(', ', Mime::ext2mime(PAGE_EXT)); $extensions = $this->parseAccept($view, $accept_str); if ($ext = $this->chooseBetweenEquals($extensions)) return $ext; } // Check for other extensions based on HTTP 'Accept' headers: $accept_str = $_SERVER['HTTP_ACCEPT']; $extensions = $this->parseAccept($view, $accept_str); if ($ext = $this->chooseBetweenEquals($extensions)) return $ext; // Well, all the good options failed, so let's see what we've // got left: $extensions = $this->extensions; return $this->chooseBetweenEquals($extensions); } private function parseAccept($view, $accept_str) { // $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 = new HTTP_Accept($accept_str); // Loop through the candidate views, and record how much we // like each. foreach ($this->extensions as $ext) { $mimes = Mime::ext2mime($ext); foreach ($mimes as $mime) { $quality = $accept->getQuality($mime); if (isset($prefs[$ext])) { $quality = max($prefs[$ext], $quality); } $prefs[$ext] = $quality; } } // Create an array of all extensions tied for the top quality. $ret = array(); $top_quality = 0.001;// minimum acceptable according to RFC 2616 foreach ($prefs as $ext => $quality) { if ($quality > $top_quality) { $top_quality = $quality; $ret = array(); } if ($quality == $top_quality) { $ret[] = $ext; } } return $ret; } public function __construct($view) { $this->ext = $this->chooseExtension($view); $this->view = $view; } public function show($vars) { $file = self::filename($this->view, $this->ext); $mimes = Mime::ext2mime($this->ext); header('Content-type: '.$mimes[0]); require_once(VIEWPATH.'/Template.class.php'); $vars['template'] = new Template(); global $VARS; $VARS = $vars; include($file); unset($VARS); } }