689 lines
16 KiB
PHP
689 lines
16 KiB
PHP
|
|
<?php
|
||
|
|
/**
|
||
|
|
* @version $Id: view.php 14401 2010-01-26 14:10:00Z louis $
|
||
|
|
* @package Joomla.Framework
|
||
|
|
* @subpackage Application
|
||
|
|
* @copyright Copyright Copyright (C) 2005 - 2010 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
|
||
|
|
defined('JPATH_BASE') or die();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Base class for a Joomla View
|
||
|
|
*
|
||
|
|
* Class holding methods for displaying presentation data.
|
||
|
|
*
|
||
|
|
* @abstract
|
||
|
|
* @package Joomla.Framework
|
||
|
|
* @subpackage Application
|
||
|
|
* @since 1.5
|
||
|
|
*/
|
||
|
|
class JView extends JObject
|
||
|
|
{
|
||
|
|
/**
|
||
|
|
* The name of the view
|
||
|
|
*
|
||
|
|
* @var array
|
||
|
|
* @access protected
|
||
|
|
*/
|
||
|
|
var $_name = null;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Registered models
|
||
|
|
*
|
||
|
|
* @var array
|
||
|
|
* @access protected
|
||
|
|
*/
|
||
|
|
var $_models = array();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* The base path of the view
|
||
|
|
*
|
||
|
|
* @var string
|
||
|
|
* @access protected
|
||
|
|
*/
|
||
|
|
var $_basePath = null;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* The default model
|
||
|
|
*
|
||
|
|
* @var string
|
||
|
|
* @access protected
|
||
|
|
*/
|
||
|
|
var $_defaultModel = null;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Layout name
|
||
|
|
*
|
||
|
|
* @var string
|
||
|
|
* @access protected
|
||
|
|
*/
|
||
|
|
var $_layout = 'default';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Layout extension
|
||
|
|
*
|
||
|
|
* @var string
|
||
|
|
* @access protected
|
||
|
|
*/
|
||
|
|
var $_layoutExt = 'php';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* The set of search directories for resources (templates)
|
||
|
|
*
|
||
|
|
* @var array
|
||
|
|
* @access protected
|
||
|
|
*/
|
||
|
|
var $_path = array(
|
||
|
|
'template' => array(),
|
||
|
|
'helper' => array()
|
||
|
|
);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* The name of the default template source file.
|
||
|
|
*
|
||
|
|
* @var string
|
||
|
|
* @access private
|
||
|
|
*/
|
||
|
|
var $_template = null;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* The output of the template script.
|
||
|
|
*
|
||
|
|
* @var string
|
||
|
|
* @access private
|
||
|
|
*/
|
||
|
|
var $_output = null;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Callback for escaping.
|
||
|
|
*
|
||
|
|
* @var string
|
||
|
|
* @access private
|
||
|
|
*/
|
||
|
|
var $_escape = 'htmlspecialchars';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Charset to use in escaping mechanisms; defaults to urf8 (UTF-8)
|
||
|
|
*
|
||
|
|
* @var string
|
||
|
|
* @access private
|
||
|
|
*/
|
||
|
|
var $_charset = 'UTF-8';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Constructor
|
||
|
|
*
|
||
|
|
* @access protected
|
||
|
|
*/
|
||
|
|
function __construct($config = array())
|
||
|
|
{
|
||
|
|
//set the view name
|
||
|
|
if (empty( $this->_name ))
|
||
|
|
{
|
||
|
|
if (array_key_exists('name', $config)) {
|
||
|
|
$this->_name = $config['name'];
|
||
|
|
} else {
|
||
|
|
$this->_name = $this->getName();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// set the charset (used by the variable escaping functions)
|
||
|
|
if (array_key_exists('charset', $config)) {
|
||
|
|
$this->_charset = $config['charset'];
|
||
|
|
}
|
||
|
|
|
||
|
|
// user-defined escaping callback
|
||
|
|
if (array_key_exists('escape', $config)) {
|
||
|
|
$this->setEscape($config['escape']);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Set a base path for use by the view
|
||
|
|
if (array_key_exists('base_path', $config)) {
|
||
|
|
$this->_basePath = $config['base_path'];
|
||
|
|
} else {
|
||
|
|
$this->_basePath = JPATH_COMPONENT;
|
||
|
|
}
|
||
|
|
|
||
|
|
// set the default template search path
|
||
|
|
if (array_key_exists('template_path', $config)) {
|
||
|
|
// user-defined dirs
|
||
|
|
$this->_setPath('template', $config['template_path']);
|
||
|
|
} else {
|
||
|
|
$this->_setPath('template', $this->_basePath.DS.'views'.DS.$this->getName().DS.'tmpl');
|
||
|
|
}
|
||
|
|
|
||
|
|
// set the default helper search path
|
||
|
|
if (array_key_exists('helper_path', $config)) {
|
||
|
|
// user-defined dirs
|
||
|
|
$this->_setPath('helper', $config['helper_path']);
|
||
|
|
} else {
|
||
|
|
$this->_setPath('helper', $this->_basePath.DS.'helpers');
|
||
|
|
}
|
||
|
|
|
||
|
|
// set the layout
|
||
|
|
if (array_key_exists('layout', $config)) {
|
||
|
|
$this->setLayout($config['layout']);
|
||
|
|
} else {
|
||
|
|
$this->setLayout('default');
|
||
|
|
}
|
||
|
|
|
||
|
|
$this->baseurl = JURI::base(true);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 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.
|
||
|
|
* @see fetch()
|
||
|
|
*/
|
||
|
|
function display($tpl = null)
|
||
|
|
{
|
||
|
|
$result = $this->loadTemplate($tpl);
|
||
|
|
if (JError::isError($result)) {
|
||
|
|
return $result;
|
||
|
|
}
|
||
|
|
|
||
|
|
echo $result;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 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.
|
||
|
|
*
|
||
|
|
* <code>
|
||
|
|
* $view = new JView();
|
||
|
|
*
|
||
|
|
* // assign directly
|
||
|
|
* $view->var1 = 'something';
|
||
|
|
* $view->var2 = 'else';
|
||
|
|
*
|
||
|
|
* // assign by name and value
|
||
|
|
* $view->assign('var1', 'something');
|
||
|
|
* $view->assign('var2', 'else');
|
||
|
|
*
|
||
|
|
* // assign by assoc-array
|
||
|
|
* $ary = array('var1' => 'something', 'var2' => 'else');
|
||
|
|
* $view->assign($obj);
|
||
|
|
*
|
||
|
|
* // assign by object
|
||
|
|
* $obj = new stdClass;
|
||
|
|
* $obj->var1 = 'something';
|
||
|
|
* $obj->var2 = 'else';
|
||
|
|
* $view->assign($obj);
|
||
|
|
*
|
||
|
|
* </code>
|
||
|
|
*
|
||
|
|
* @access public
|
||
|
|
* @return bool True on success, false on failure.
|
||
|
|
*/
|
||
|
|
function assign()
|
||
|
|
{
|
||
|
|
// get the arguments; there may be 1 or 2.
|
||
|
|
$arg0 = @func_get_arg(0);
|
||
|
|
$arg1 = @func_get_arg(1);
|
||
|
|
|
||
|
|
// assign by object
|
||
|
|
if (is_object($arg0))
|
||
|
|
{
|
||
|
|
// assign public properties
|
||
|
|
foreach (get_object_vars($arg0) as $key => $val)
|
||
|
|
{
|
||
|
|
if (substr($key, 0, 1) != '_') {
|
||
|
|
$this->$key = $val;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
// assign by associative array
|
||
|
|
if (is_array($arg0))
|
||
|
|
{
|
||
|
|
foreach ($arg0 as $key => $val)
|
||
|
|
{
|
||
|
|
if (substr($key, 0, 1) != '_') {
|
||
|
|
$this->$key = $val;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 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.
|
||
|
|
if (is_string($arg0) && substr($arg0, 0, 1) != '_' && func_num_args() > 1)
|
||
|
|
{
|
||
|
|
$this->$arg0 = $arg1;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
// $arg0 was not object, array, or string.
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 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.
|
||
|
|
*
|
||
|
|
* <code>
|
||
|
|
* $view = new JView();
|
||
|
|
*
|
||
|
|
* // assign by name and value
|
||
|
|
* $view->assignRef('var1', $ref);
|
||
|
|
*
|
||
|
|
* // assign directly
|
||
|
|
* $view->ref =& $var1;
|
||
|
|
* </code>
|
||
|
|
*
|
||
|
|
* @access public
|
||
|
|
*
|
||
|
|
* @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.
|
||
|
|
*/
|
||
|
|
|
||
|
|
function assignRef($key, &$val)
|
||
|
|
{
|
||
|
|
if (is_string($key) && substr($key, 0, 1) != '_')
|
||
|
|
{
|
||
|
|
$this->$key =& $val;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Escapes a value for output in a view script.
|
||
|
|
*
|
||
|
|
* If escaping mechanism is one of htmlspecialchars or htmlentities, uses
|
||
|
|
* {@link $_encoding} setting.
|
||
|
|
*
|
||
|
|
* @param mixed $var The output to escape.
|
||
|
|
* @return mixed The escaped value.
|
||
|
|
*/
|
||
|
|
function escape($var)
|
||
|
|
{
|
||
|
|
if (in_array($this->_escape, array('htmlspecialchars', 'htmlentities'))) {
|
||
|
|
return call_user_func($this->_escape, $var, ENT_COMPAT, $this->_charset);
|
||
|
|
}
|
||
|
|
|
||
|
|
return call_user_func($this->_escape, $var);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Method to get data from a registered model or a property of the view
|
||
|
|
*
|
||
|
|
* @access public
|
||
|
|
* @param string The name of the method to call on the model, or the property to get
|
||
|
|
* @param string The name of the model to reference, or the default value [optional]
|
||
|
|
* @return mixed The return value of the method
|
||
|
|
*/
|
||
|
|
function &get( $property, $default = null )
|
||
|
|
{
|
||
|
|
|
||
|
|
// If $model is null we use the default model
|
||
|
|
if (is_null($default)) {
|
||
|
|
$model = $this->_defaultModel;
|
||
|
|
} else {
|
||
|
|
$model = strtolower( $default );
|
||
|
|
}
|
||
|
|
|
||
|
|
// First check to make sure the model requested exists
|
||
|
|
if (isset( $this->_models[$model] ))
|
||
|
|
{
|
||
|
|
// Model exists, lets build the method name
|
||
|
|
$method = 'get'.ucfirst($property);
|
||
|
|
|
||
|
|
// Does the method exist?
|
||
|
|
if (method_exists($this->_models[$model], $method))
|
||
|
|
{
|
||
|
|
// The method exists, lets call it and return what we get
|
||
|
|
$result = $this->_models[$model]->$method();
|
||
|
|
return $result;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
// degrade to JObject::get
|
||
|
|
$result = parent::get( $property, $default );
|
||
|
|
return $result;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Method to get the model object
|
||
|
|
*
|
||
|
|
* @access public
|
||
|
|
* @param string $name The name of the model (optional)
|
||
|
|
* @return mixed JModel object
|
||
|
|
*/
|
||
|
|
function &getModel( $name = null )
|
||
|
|
{
|
||
|
|
if ($name === null) {
|
||
|
|
$name = $this->_defaultModel;
|
||
|
|
}
|
||
|
|
return $this->_models[strtolower( $name )];
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the layout.
|
||
|
|
*
|
||
|
|
* @access public
|
||
|
|
* @return string The layout name
|
||
|
|
*/
|
||
|
|
|
||
|
|
function getLayout()
|
||
|
|
{
|
||
|
|
return $this->_layout;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Method to get the view name
|
||
|
|
*
|
||
|
|
* The model name by default parsed using the classname, or it can be set
|
||
|
|
* by passing a $config['name'] in the class constructor
|
||
|
|
*
|
||
|
|
* @access public
|
||
|
|
* @return string The name of the model
|
||
|
|
* @since 1.5
|
||
|
|
*/
|
||
|
|
function getName()
|
||
|
|
{
|
||
|
|
$name = $this->_name;
|
||
|
|
|
||
|
|
if (empty( $name ))
|
||
|
|
{
|
||
|
|
$r = null;
|
||
|
|
if (!preg_match('/View((view)*(.*(view)?.*))$/i', get_class($this), $r)) {
|
||
|
|
JError::raiseError (500, "JView::getName() : Cannot get or parse class name.");
|
||
|
|
}
|
||
|
|
if (strpos($r[3], "view"))
|
||
|
|
{
|
||
|
|
JError::raiseWarning('SOME_ERROR_CODE',"JView::getName() : Your classname contains the substring 'view'. ".
|
||
|
|
"This causes problems when extracting the classname from the name of your objects view. " .
|
||
|
|
"Avoid Object names with the substring 'view'.");
|
||
|
|
}
|
||
|
|
$name = strtolower( $r[3] );
|
||
|
|
}
|
||
|
|
|
||
|
|
return $name;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 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
|
||
|
|
* Category.
|
||
|
|
*
|
||
|
|
* @access public
|
||
|
|
* @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 )
|
||
|
|
{
|
||
|
|
$name = strtolower($model->getName());
|
||
|
|
$this->_models[$name] = &$model;
|
||
|
|
|
||
|
|
if ($default) {
|
||
|
|
$this->_defaultModel = $name;
|
||
|
|
}
|
||
|
|
return $model;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Sets the layout name to use
|
||
|
|
*
|
||
|
|
* @access public
|
||
|
|
* @param string $template The template name.
|
||
|
|
* @return string Previous value
|
||
|
|
* @since 1.5
|
||
|
|
*/
|
||
|
|
|
||
|
|
function setLayout($layout)
|
||
|
|
{
|
||
|
|
$previous = $this->_layout;
|
||
|
|
$this->_layout = $layout;
|
||
|
|
return $previous;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Allows a different extension for the layout files to be used
|
||
|
|
*
|
||
|
|
* @access public
|
||
|
|
* @param string The extension
|
||
|
|
* @return string Previous value
|
||
|
|
* @since 1.5
|
||
|
|
*/
|
||
|
|
function setLayoutExt( $value )
|
||
|
|
{
|
||
|
|
$previous = $this->_layoutExt;
|
||
|
|
if ($value = preg_replace( '#[^A-Za-z0-9]#', '', trim( $value ) )) {
|
||
|
|
$this->_layoutExt = $value;
|
||
|
|
}
|
||
|
|
return $previous;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Sets the _escape() callback.
|
||
|
|
*
|
||
|
|
* @param mixed $spec The callback for _escape() to use.
|
||
|
|
*/
|
||
|
|
function setEscape($spec)
|
||
|
|
{
|
||
|
|
$this->_escape = $spec;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Adds to the stack of view script paths in LIFO order.
|
||
|
|
*
|
||
|
|
* @param string|array The directory (-ies) to add.
|
||
|
|
* @return void
|
||
|
|
*/
|
||
|
|
function addTemplatePath($path)
|
||
|
|
{
|
||
|
|
$this->_addPath('template', $path);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Adds to the stack of helper script paths in LIFO order.
|
||
|
|
*
|
||
|
|
* @param string|array The directory (-ies) to add.
|
||
|
|
* @return void
|
||
|
|
*/
|
||
|
|
function addHelperPath($path)
|
||
|
|
{
|
||
|
|
$this->_addPath('helper', $path);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Load a template file -- first look in the templates folder for an override
|
||
|
|
*
|
||
|
|
* @access public
|
||
|
|
* @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.
|
||
|
|
*/
|
||
|
|
function loadTemplate( $tpl = null)
|
||
|
|
{
|
||
|
|
global $mainframe, $option;
|
||
|
|
|
||
|
|
// clear prior output
|
||
|
|
$this->_output = null;
|
||
|
|
|
||
|
|
//create the template file name based on the layout
|
||
|
|
$file = isset($tpl) ? $this->_layout.'_'.$tpl : $this->_layout;
|
||
|
|
// clean the file name
|
||
|
|
$file = preg_replace('/[^A-Z0-9_\.-]/i', '', $file);
|
||
|
|
$tpl = preg_replace('/[^A-Z0-9_\.-]/i', '', $tpl);
|
||
|
|
|
||
|
|
// load the template script
|
||
|
|
jimport('joomla.filesystem.path');
|
||
|
|
$filetofind = $this->_createFileName('template', array('name' => $file));
|
||
|
|
$this->_template = JPath::find($this->_path['template'], $filetofind);
|
||
|
|
|
||
|
|
if ($this->_template != false)
|
||
|
|
{
|
||
|
|
// unset so as not to introduce into template scope
|
||
|
|
unset($tpl);
|
||
|
|
unset($file);
|
||
|
|
|
||
|
|
// never allow a 'this' property
|
||
|
|
if (isset($this->this)) {
|
||
|
|
unset($this->this);
|
||
|
|
}
|
||
|
|
|
||
|
|
// start capturing output into a buffer
|
||
|
|
ob_start();
|
||
|
|
// 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
|
||
|
|
// clear it.
|
||
|
|
$this->_output = ob_get_contents();
|
||
|
|
ob_end_clean();
|
||
|
|
|
||
|
|
return $this->_output;
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return JError::raiseError( 500, 'Layout "' . $file . '" not found' );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Load a helper file
|
||
|
|
*
|
||
|
|
* @access public
|
||
|
|
* @param string $tpl The name of the helper source file ...
|
||
|
|
* automatically searches the helper paths and compiles as needed.
|
||
|
|
* @return boolean Returns true if the file was loaded
|
||
|
|
*/
|
||
|
|
function loadHelper( $hlp = null)
|
||
|
|
{
|
||
|
|
// clean the file name
|
||
|
|
$file = preg_replace('/[^A-Z0-9_\.-]/i', '', $hlp);
|
||
|
|
|
||
|
|
// load the template script
|
||
|
|
jimport('joomla.filesystem.path');
|
||
|
|
$helper = JPath::find($this->_path['helper'], $this->_createFileName('helper', array('name' => $file)));
|
||
|
|
|
||
|
|
if ($helper != false)
|
||
|
|
{
|
||
|
|
// include the requested template filename in the local scope
|
||
|
|
include_once $helper;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Sets an entire array of search paths for templates or resources.
|
||
|
|
*
|
||
|
|
* @access protected
|
||
|
|
* @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.
|
||
|
|
*/
|
||
|
|
function _setPath($type, $path)
|
||
|
|
{
|
||
|
|
global $mainframe, $option;
|
||
|
|
|
||
|
|
// clear out the prior search dirs
|
||
|
|
$this->_path[$type] = array();
|
||
|
|
|
||
|
|
// actually add the user-specified directories
|
||
|
|
$this->_addPath($type, $path);
|
||
|
|
|
||
|
|
// always add the fallback directories as last resort
|
||
|
|
switch (strtolower($type))
|
||
|
|
{
|
||
|
|
case 'template':
|
||
|
|
{
|
||
|
|
// set the alternative template search dir
|
||
|
|
if (isset($mainframe))
|
||
|
|
{
|
||
|
|
$option = preg_replace('/[^A-Z0-9_\.-]/i', '', $option);
|
||
|
|
$fallback = JPATH_BASE.DS.'templates'.DS.$mainframe->getTemplate().DS.'html'.DS.$option.DS.$this->getName();
|
||
|
|
$this->_addPath('template', $fallback);
|
||
|
|
}
|
||
|
|
} break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Adds to the search path for templates and resources.
|
||
|
|
*
|
||
|
|
* @access protected
|
||
|
|
* @param string|array $path The directory or stream to search.
|
||
|
|
*/
|
||
|
|
function _addPath($type, $path)
|
||
|
|
{
|
||
|
|
// just force to array
|
||
|
|
settype($path, 'array');
|
||
|
|
|
||
|
|
// loop through the path directories
|
||
|
|
foreach ($path as $dir)
|
||
|
|
{
|
||
|
|
// no surrounding spaces allowed!
|
||
|
|
$dir = trim($dir);
|
||
|
|
|
||
|
|
// add trailing separators as needed
|
||
|
|
if (substr($dir, -1) != DIRECTORY_SEPARATOR) {
|
||
|
|
// directory
|
||
|
|
$dir .= DIRECTORY_SEPARATOR;
|
||
|
|
}
|
||
|
|
|
||
|
|
// add to the top of the search dirs
|
||
|
|
array_unshift($this->_path[$type], $dir);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Create the filename for a resource
|
||
|
|
*
|
||
|
|
* @access private
|
||
|
|
* @param string $type The resource type to create the filename for
|
||
|
|
* @param array $parts An associative array of filename information
|
||
|
|
* @return string The filename
|
||
|
|
* @since 1.5
|
||
|
|
*/
|
||
|
|
function _createFileName($type, $parts = array())
|
||
|
|
{
|
||
|
|
$filename = '';
|
||
|
|
|
||
|
|
switch($type)
|
||
|
|
{
|
||
|
|
case 'template' :
|
||
|
|
$filename = strtolower($parts['name']).'.'.$this->_layoutExt;
|
||
|
|
break;
|
||
|
|
|
||
|
|
default :
|
||
|
|
$filename = strtolower($parts['name']).'.php';
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return $filename;
|
||
|
|
}
|
||
|
|
}
|