Source code for file /joomla/application/component/view.php
Documentation is available at view.php
* @version $Id: view.php 6634 2007-02-15 18:27:18Z Jinx $
* @package Joomla.Framework
* @subpackage Application
* @copyright Copyright (C) 2005 Open Source Matters. All rights reserved.
* @license GNU/GPL, see LICENSE.php
* Joomla! is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
// Check to ensure this file is within the rest of the framework
* Base class for a Joomla View
* Class holding methods for displaying presentation data.
* @package Joomla.Framework
* @subpackage Application
* The set of search directories for resources (templates)
* The name of the default template source file.
* The output of the template script.
* Array of callbacks used to escape output.
var $_escape =
array('htmlspecialchars');
if (empty( $this->_name ))
if (isset
($config['name'])) {
$this->_name =
$config['name'];
JError::raiseError (500, "JView::__construct() : Can't get or parse class name.");
// set the default template search path
if (isset
($config['template_path'])) {
$this->_setPath('template', $config['template_path']);
if (isset
($config['layout'])) {
* Execute and display a template script.
* @param string $tpl The name of the template file to parse;
* automatically searches through the template paths.
* @throws object An JError object.
* Assigns variables to the view script via differing strategies.
* This method is overloaded; you can assign all the properties of
* an object, an associative array, or a single value by name.
* You are not allowed to set variables that begin with an underscore;
* these are either private properties for JView or private variables
* within the template script itself.
* $view->var1 = 'something';
* // assign by name and value
* $view->assign('var1', 'something');
* $view->assign('var2', 'else');
* // assign by assoc-array
* $ary = array('var1' => 'something', 'var2' => 'else');
* $obj->var1 = 'something';
* @return bool True on success, false on failure.
// get the arguments; there may be 1 or 2.
// assign public properties
if (substr($key, 0, 1) !=
'_') {
// assign by associative array
foreach ($arg0 as $key =>
$val)
if (substr($key, 0, 1) !=
'_') {
// assign by string name and mixed value.
// we use array_key_exists() instead of isset() becuase isset()
// fails if the value is set to null.
// $arg0 was not object, array, or string.
* Assign variable for the view (by reference).
* You are not allowed to set variables that begin with an underscore;
* these are either private properties for JView or private variables
* within the template script itself.
* // assign by name and value
* $view->assignRef('var1', $ref);
* @param string $key The name for the reference in the view.
* @param mixed &$val The referenced variable.
* @return bool True on success, false on failure.
* Applies escaping to a value.
* You can override the predefined escaping callbacks by passing
* added parameters as replacement callbacks.
* // use predefined callbacks
* $result = $view->escape($value);
* // use replacement callbacks
* $result = $view->escape(
* array('StaticClass', 'method'),
* array($object, $method)
* @param mixed $value The value to be escaped.
// were custom callbacks passed?
// no, only a value was passed.
// loop through the predefined callbacks.
foreach ($this->_escape as $func)
// this if() shaves 0.001sec off of 300 calls.
// yes, use the custom callbacks
// loop through custom callbacks.
foreach ($callbacks as $func)
// this if() shaves 0.001sec off of 300 calls.
* Method to get data from a registered model
* @param string The name of the method to call on the model
* @param string The name of the model to reference [optional]
* @return mixed The return value of the method
function &get( $method, $model =
null )
// If $model is null we use the default model
// First check to make sure the model requested exists
if (isset
( $this->_models[$model] ))
// Model exists, lets build the method name
// Does the method exist?
// The method exists, lets call it and return what we get
$result =
$this->_models[$model]->$method();
// Method wasn't found... throw a warning and return false
// degrade to JObject::get
$result =
parent::get( $method, $model );
* Method to add a model to the view. We support a multiple model single
* view system by which models are referenced by classname. A caveat to the
* classname referencing is that any classname prepended by JModel will be
* referenced by the name without JModel, eg. JModelCategory is just
* @param object $model The model to add to the view.
* @param boolean $default Is this the default model?
* @return object The added model
function &setModel( &$model, $default =
false )
* Method to get the model object
* @param string $name The name of the model (optional)
* @return mixed JModel object
* Sets the layout name to use
* @param string $template The template name.
* @return string The layout name
* Adds to the stack of view script paths in LIFO order.
* @param string|arrayThe directory (-ies) to add.
* Clears then sets the callbacks to use when calling JView::escape().
* Each parameter passed to this function is treated as a separate
* array('StaticClass', 'method'),
* array($object, $method)
* Adds to the callbacks used when calling JView::escape().
* Each parameter passed to this function is treated as a separate
* array('StaticClass', 'method'),
* array($object, $method)
* Load a template file -- first look in the templates folder for an override
* @param string $_tpl The name of the template source file ...
* automatically searches the template paths and compiles as needed.
* @return string The output of the the template script.
global $mainframe, $option;
//create the template file name based on the layout
// load the template script
$this->_template =
JPath::find($this->_path['template'], $this->_createFileName('template', array('name' =>
$file)));
if ($this->_template ==
false)
$file2 = isset
($tpl) ?
'default_'.
$tpl :
'default';
$this->_template =
JPath::find($this->_path['template'], $this->_createFileName('template', array('name' =>
$file2)));
if ($this->_template !=
false)
// unset so as not to introduce into template scope
// never allow a 'this' property
if (isset
($this->this)) {
// start capturing output into a buffer
// include the requested template filename in the local scope
// (this will execute the view logic).
include $this->_template;
// done with the requested template; get the buffer and
* Sets an entire array of search paths for templates or resources.
* @param string $type The type of path to set, typically 'template'.
* @param string|array$path The new set of search paths. If null or
* false, resets to the current directory only.
global $mainframe, $option;
// clear out the prior search dirs
$this->_path[$type] =
array();
// always add the fallback directories as last resort
// set the alternative template searh dir
$fallback =
JPATH_BASE.
DS.
'templates'.
DS.
$mainframe->getTemplate().
DS.
'html'.
DS.
$option.
DS.
$this->_name;
// actually add the user-specified directories
* Adds to the search path for templates and resources.
* @param string|array$path The directory or stream to search.
// loop through the path directories
// no surrounding spaces allowed!
// add trailing separators as needed
if (substr($dir, -
1) !=
DIRECTORY_SEPARATOR) {
$dir .=
DIRECTORY_SEPARATOR;
// add to the top of the search dirs
* Create the filename for a resource
* @param string $type The resource type to create the filename for
* @param array $parts An associative array of filename information
* @return string The filename
function _createFileName($type, $parts =
array())