📄 controller.php
字号:
<?php
/**
* @version $Id: controller.php 8682 2007-08-31 18:36:45Z jinx $
* @package Joomla.Framework
* @subpackage Application
* @copyright Copyright (C) 2005 - 2007 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 Controller
*
* Controller (controllers are where you put all the actual code) Provides basic
* functionality, such as rendering views (aka displaying templates).
*
* @abstract
* @package Joomla.Framework
* @subpackage Application
* @author Johan Janssens <johan.janssens@joomla.org>
* @author Louis Landry <louis.landry@joomla.org>
* @author Andrew Eddie
* @since 1.5
*/
class JController extends JObject
{
/**
* The base path of the controller
*
* @var string
* @access protected
*/
var $_basePath = null;
/**
* The name of the controller
*
* @var array
* @access protected
*/
var $_name = null;
/**
* Array of class methods
*
* @var array
* @access protected
*/
var $_methods = null;
/**
* Array of class methods to call for a given task.
*
* @var array
* @access protected
*/
var $_taskMap = null;
/**
* Current or most recent task to be performed.
*
* @var string
* @access protected
*/
var $_task = null;
/**
* The mapped task that was performed.
*
* @var string
* @access protected
*/
var $_doTask = null;
/**
* The set of search directories for resources (views or models).
*
* @var array
* @access protected
*/
var $_path = array(
'model' => array(),
'view' => array()
);
/**
* URL for redirection.
*
* @var string
* @access protected
*/
var $_redirect = null;
/**
* Redirect message.
*
* @var string
* @access protected
*/
var $_message = null;
/**
* Redirect message type.
*
* @var string
* @access protected
*/
var $_messageType = null;
/**
* ACO Section for the controller.
*
* @var string
* @access protected
*/
var $_acoSection = null;
/**
* Default ACO Section value for the controller.
*
* @var string
* @access protected
*/
var $_acoSectionValue = null;
/**
* Constructor.
*
* @access protected
* @param array An optional associative array of configuration settings.
* Recognized key values include 'name', 'default_task', 'model_path', and
* 'view_path' (this list is not meant to be comprehensive).
* @since 1.5
*/
function __construct( $config = array() )
{
//Initialize private variables
$this->_redirect = null;
$this->_message = null;
$this->_messageType = 'message';
$this->_taskMap = array();
$this->_methods = array();
$this->_data = array();
// Get the methods only for the final controller class
$thisMethods = get_class_methods( get_class( $this ) );
$baseMethods = get_class_methods( 'JController' );
$methods = array_diff( $thisMethods, $baseMethods );
// Add default display method
$methods[] = 'display';
// Iterate through methods and map tasks
foreach ( $methods as $method )
{
if ( substr( $method, 0, 1 ) != '_' ) {
$this->_methods[] = strtolower( $method );
// auto register public methods as tasks
$this->_taskMap[strtolower( $method )] = $method;
}
}
//set the view name
if (empty( $this->_name ))
{
if (array_key_exists('name', $config)) {
$this->_name = $config['name'];
} else {
$this->_name = $this->getName();
}
}
// Set a base path for use by the controller
if (array_key_exists('base_path', $config)) {
$this->_basePath = $config['base_path'];
} else {
$this->_basePath = JPATH_COMPONENT;
}
// If the default task is set, register it as such
if ( array_key_exists( 'default_task', $config ) ) {
$this->registerDefaultTask( $config['default_task'] );
} else {
$this->registerDefaultTask( 'display' );
}
// set the default model search path
if ( array_key_exists( 'model_path', $config ) ) {
// user-defined dirs
$this->_setPath( 'model', $config['model_path'] );
} else {
$this->_setPath( 'model', $this->_basePath.DS.'models' );
}
// set the default view search path
if ( array_key_exists( 'view_path', $config ) ) {
// user-defined dirs
$this->_setPath( 'view', $config['view_path'] );
} else {
$this->_setPath( 'view', $this->_basePath.DS.'views' );
}
}
/**
* Execute a task by triggering a method in the derived class.
*
* @access public
* @param string The task to perform. If no matching task is found, the
* '__default' task is executed, if defined.
* @return mixed|false The value returned by the called method, false in
* error case.
* @since 1.5
*/
function execute( $task )
{
$this->_task = $task;
$task = strtolower( $task );
if (isset( $this->_taskMap[$task] )) {
$doTask = $this->_taskMap[$task];
} elseif (isset( $this->_taskMap['__default'] )) {
$doTask = $this->_taskMap['__default'];
} else {
return JError::raiseError( 404, JText::_('Task ['.$task.'] not found') );
}
// Record the actual task being fired
$this->_doTask = $doTask;
// Make sure we have access
if ($this->authorize( $doTask ))
{
$retval = $this->$doTask();
return $retval;
}
else
{
return JError::raiseError( 403, JText::_('Access Forbidden') );
}
}
/**
* Authorization check
*
* @access public
* @param string $task The ACO Section Value to check access on
* @return boolean True if authorized
* @since 1.5
*/
function authorize( $task )
{
// Only do access check if the aco section is set
if ($this->_acoSection)
{
// If we have a section value set that trumps the passed task ???
if ($this->_acoSectionValue) {
// We have one, so set it and lets do the check
$task = $this->_acoSectionValue;
}
// Get the JUser object for the current user and return the authorization boolean
$user = & JFactory::getUser();
return $user->authorize( $this->_acoSection, $task );
}
else
{
// Nothing set, nothing to check... so obviously its ok :)
return true;
}
}
/**
* Typical view method for MVC based architecture
*
* This function is provide as a default implementation, in most cases
* you will need to override it in your own controllers.
*
* @access public
* @param string $cachable If true, the view output will be cached
* @since 1.5
*/
function display($cachable=false)
{
$document =& JFactory::getDocument();
$viewType = $document->getType();
$viewName = JRequest::getCmd( 'view', $this->_name );
$viewLayout = JRequest::getCmd( 'layout', 'default' );
$view = & $this->getView( $viewName, $viewType);
// Get/Create the model
if ($model = & $this->getModel($viewName)) {
// Push the model into the view (as default)
$view->setModel($model, true);
}
// Set the layout
$view->setLayout($viewLayout);
// Display the view
if ($cachable) {
global $option;
$cache =& JFactory::getCache($option, 'view');
$cache->get($view, 'display');
} else {
$view->display();
}
}
/**
* Redirects the browser or returns false if no redirect is set.
*
* @access public
* @return boolean False if no redirect exists.
* @since 1.5
*/
function redirect()
{
if ($this->_redirect) {
global $mainframe;
$mainframe->redirect( $this->_redirect, $this->_message, $this->_messageType );
}
return false;
}
/**
* Method to get a model object, loading it if required.
*
* @access public
* @param string The model name.
* @param string The class prefix. Optional.
* @return object The model.
* @since 1.5
*/
function &getModel( $name, $prefix = '' )
{
if ( empty( $prefix ) ) {
$prefix = $this->_name . 'Model';
}
if ( $model = & $this->_createModel( $name, $prefix ) )
{
// task is a reserved state
$model->setState( 'task', $this->_task );
// Get menu item information if Itemid exists
$menu =& JMenu::getInstance();
if (is_object( $menu ))
{
if ($item = $menu->getActive())
{
$params =& $menu->getParams($item->id);
// Set Default State Data
$model->setState( 'parameters.menu', $params );
}
}
}
return $model;
}
/**
* Adds to the stack of controller model paths in LIFO order.
*
* @static
* @param string|array The directory (string), or list of directories
* (array) to add.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -