Initial Kohana install
[speedfreak] / Server / system / libraries / View.php
diff --git a/Server/system/libraries/View.php b/Server/system/libraries/View.php
new file mode 100644 (file)
index 0000000..2b8471c
--- /dev/null
@@ -0,0 +1,309 @@
+<?php defined('SYSPATH') OR die('No direct access allowed.');
+/**
+ * Loads and displays Kohana view files. Can also handle output of some binary
+ * files, such as image, Javascript, and CSS files.
+ *
+ * $Id: View.php 4072 2009-03-13 17:20:38Z jheathco $
+ *
+ * @package    Core
+ * @author     Kohana Team
+ * @copyright  (c) 2007-2008 Kohana Team
+ * @license    http://kohanaphp.com/license.html
+ */
+class View_Core {
+
+       // The view file name and type
+       protected $kohana_filename = FALSE;
+       protected $kohana_filetype = FALSE;
+
+       // View variable storage
+       protected $kohana_local_data = array();
+       protected static $kohana_global_data = array();
+
+       /**
+        * Creates a new View using the given parameters.
+        *
+        * @param   string  view name
+        * @param   array   pre-load data
+        * @param   string  type of file: html, css, js, etc.
+        * @return  object
+        */
+       public static function factory($name = NULL, $data = NULL, $type = NULL)
+       {
+               return new View($name, $data, $type);
+       }
+
+       /**
+        * Attempts to load a view and pre-load view data.
+        *
+        * @throws  Kohana_Exception  if the requested view cannot be found
+        * @param   string  view name
+        * @param   array   pre-load data
+        * @param   string  type of file: html, css, js, etc.
+        * @return  void
+        */
+       public function __construct($name = NULL, $data = NULL, $type = NULL)
+       {
+               if (is_string($name) AND $name !== '')
+               {
+                       // Set the filename
+                       $this->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('core.invalid_filetype', $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) OR array_key_exists($property, View::$kohana_global_data)) ? TRUE : FALSE;
+                       }
+               }
+               else
+               {
+                       // Otherwise just check one property
+                       $result = (array_key_exists($key, $this->kohana_local_data) OR array_key_exists($key, View::$kohana_global_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;
+       }
+
+       /**
+        * Sets a view global variable.
+        *
+        * @param   string|array  name of variable or an array of variables
+        * @param   mixed         value when using a named variable
+        * @return  void
+        */
+       public static function set_global($name, $value = NULL)
+       {
+               if (is_array($name))
+               {
+                       foreach ($name as $key => $value)
+                       {
+                               View::$kohana_global_data[$key] = $value;
+                       }
+               }
+               else
+               {
+                       View::$kohana_global_data[$name] = $value;
+               }
+       }
+
+       /**
+        * 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];
+
+               if (isset(View::$kohana_global_data[$key]))
+                       return View::$kohana_global_data[$key];
+
+               if (isset($this->$key))
+                       return $this->$key;
+       }
+
+       /**
+        * Magically converts view object to string.
+        *
+        * @return  string
+        */
+       public function __toString()
+       {
+               try
+               {
+                       return $this->render();
+               }
+               catch (Exception $e)
+               {
+                       // Display the exception using its internal __toString method
+                       return (string) $e;
+               }
+       }
+
+       /**
+        * 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
+        * @return  string    if print is FALSE
+        * @return  void      if print is TRUE
+        */
+       public function render($print = FALSE, $renderer = FALSE)
+       {
+               if (empty($this->kohana_filename))
+                       throw new Kohana_Exception('core.view_set_filename');
+
+               if (is_string($this->kohana_filetype))
+               {
+                       // Merge global and local data, local overrides global with the same name
+                       $data = array_merge(View::$kohana_global_data, $this->kohana_local_data);
+
+                       // Load the view in the controller for access to $this
+                       $output = Kohana::$instance->_kohana_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;
+       }
+} // End View
\ No newline at end of file