set_filename($name, $type); } if (is_array($data) AND ! empty($data)) { // Preload data using array_merge, to allow user extensions $this->kohana_local_data = array_merge($this->kohana_local_data, $data); } } /** * Magic method access to test for view property * * @param string View property to test for * @return boolean */ public function __isset($key = NULL) { return $this->is_set($key); } /** * Sets the view filename. * * @chainable * @param string view filename * @param string view file type * @return object */ public function set_filename($name, $type = NULL) { if ($type == NULL) { // Load the filename and set the content type $this->kohana_filename = Kohana::find_file('views', $name, TRUE); $this->kohana_filetype = EXT; } else { // Check if the filetype is allowed by the configuration if ( ! in_array($type, Kohana::config('view.allowed_filetypes'))) throw new Kohana_Exception('The requested filetype, .:type:, is not allowed in your view configuration file', array(':type:' => $type)); // Load the filename and set the content type $this->kohana_filename = Kohana::find_file('views', $name, TRUE, $type); $this->kohana_filetype = Kohana::config('mimes.'.$type); if ($this->kohana_filetype == NULL) { // Use the specified type $this->kohana_filetype = $type; } } return $this; } /** * Sets a view variable. * * @param string|array name of variable or an array of variables * @param mixed value when using a named variable * @return object */ public function set($name, $value = NULL) { if (is_array($name)) { foreach ($name as $key => $value) { $this->__set($key, $value); } } else { $this->__set($name, $value); } return $this; } /** * Checks for a property existence in the view locally or globally. Unlike the built in __isset(), * this method can take an array of properties to test simultaneously. * * @param string $key property name to test for * @param array $key array of property names to test for * @return boolean property test result * @return array associative array of keys and boolean test result */ public function is_set( $key = FALSE ) { // Setup result; $result = FALSE; // If key is an array if (is_array($key)) { // Set the result to an array $result = array(); // Foreach key foreach ($key as $property) { // Set the result to an associative array $result[$property] = (array_key_exists($property, $this->kohana_local_data)) ? TRUE : FALSE; } } else { // Otherwise just check one property $result = (array_key_exists($key, $this->kohana_local_data)) ? TRUE : FALSE; } // Return the result return $result; } /** * Sets a bound variable by reference. * * @param string name of variable * @param mixed variable to assign by reference * @return object */ public function bind($name, & $var) { $this->kohana_local_data[$name] =& $var; return $this; } /** * Magically sets a view variable. * * @param string variable key * @param string variable value * @return void */ public function __set($key, $value) { $this->kohana_local_data[$key] = $value; } /** * Magically gets a view variable. * * @param string variable key * @return mixed variable value if the key is found * @return void if the key is not found */ public function &__get($key) { if (isset($this->kohana_local_data[$key])) { return $this->kohana_local_data[$key]; } elseif (isset($this->$key)) { return $this->$key; } else { throw new Kohana_Exception('Undefined view variable: :var', array(':var' => $key)); } } /** * Magically converts view object to string. * * @return string */ public function __toString() { try { return $this->render(); } catch (Exception $e) { Kohana_Exception::handle($e); return (string) ''; } } /** * Renders a view. * * @param boolean set to TRUE to echo the output instead of returning it * @param callback special renderer to pass the output through * @param callback modifier to pass the data through before rendering * @return string if print is FALSE * @return void if print is TRUE */ public function render($print = FALSE, $renderer = FALSE, $modifier = FALSE) { if (empty($this->kohana_filename)) throw new Kohana_Exception('You must set the the view filename before calling render'); if (is_string($this->kohana_filetype)) { // Merge global and local data, local overrides global with the same name $data = $this->kohana_local_data; if ($modifier !== FALSE AND is_callable($modifier, TRUE)) { // Pass the data through the user defined modifier $data = call_user_func($modifier, $data); } $output = $this->load_view($this->kohana_filename, $data); if ($renderer !== FALSE AND is_callable($renderer, TRUE)) { // Pass the output through the user defined renderer $output = call_user_func($renderer, $output); } if ($print === TRUE) { // Display the output echo $output; return; } } else { // Set the content type and size header('Content-Type: '.$this->kohana_filetype[0]); if ($print === TRUE) { if ($file = fopen($this->kohana_filename, 'rb')) { // Display the output fpassthru($file); fclose($file); } return; } // Fetch the file contents $output = file_get_contents($this->kohana_filename); } return $output; } /** * Includes a View within the controller scope. * * @param string view filename * @param array array of view variables * @return string */ public function load_view($kohana_view_filename, $kohana_input_data) { if ($kohana_view_filename == '') return; // Buffering on ob_start(); // Import the view variables to local namespace extract($kohana_input_data, EXTR_SKIP); try { include $kohana_view_filename; } catch (Exception $e) { ob_end_clean(); throw $e; } // Fetch the output and close the buffer return ob_get_clean(); } } // End View