/libraries/joomla/application/component/model.php
PHP | 353 lines | 234 code | 18 blank | 101 comment | 16 complexity | b265d2f16ddc639357cc14a96dcc9a0a MD5 | raw file
- <?php
- /**
- * @version $Id: model.php 14401 2010-01-26 14:10:00Z louis $
- * @package Joomla.Framework
- * @subpackage Application
- * @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 Model
- *
- * Acts as a Factory class for application specific objects and
- * provides many supporting API functions.
- *
- * @abstract
- * @package Joomla.Framework
- * @subpackage Application
- * @since 1.5
- */
- class JModel extends JObject
- {
- /**
- * The model (base) name
- *
- * @var string
- * @access protected
- */
- var $_name;
- /**
- * Database Connector
- *
- * @var object
- * @access protected
- */
- var $_db;
- /**
- * An state object
- *
- * @var string
- * @access protected
- */
- var $_state;
- /**
- * Constructor
- *
- * @since 1.5
- */
- 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 model state
- if (array_key_exists('state', $config)) {
- $this->_state = $config['state'];
- } else {
- $this->_state = new JObject();
- }
- //set the model dbo
- if (array_key_exists('dbo', $config)) {
- $this->_db = $config['dbo'];
- } else {
- $this->_db = &JFactory::getDBO();
- }
- // set the default view search path
- if (array_key_exists('table_path', $config)) {
- $this->addTablePath($config['table_path']);
- } else if (defined( 'JPATH_COMPONENT_ADMINISTRATOR' )){
- $this->addTablePath(JPATH_COMPONENT_ADMINISTRATOR.DS.'tables');
- }
- }
- /**
- * Returns a reference to the a Model object, always creating it
- *
- * @param string The model type to instantiate
- * @param string Prefix for the model class name. Optional.
- * @param array Configuration array for model. Optional.
- * @return mixed A model object, or false on failure
- * @since 1.5
- */
- function &getInstance( $type, $prefix = '', $config = array() )
- {
- $type = preg_replace('/[^A-Z0-9_\.-]/i', '', $type);
- $modelClass = $prefix.ucfirst($type);
- $result = false;
- if (!class_exists( $modelClass ))
- {
- jimport('joomla.filesystem.path');
- $path = JPath::find(
- JModel::addIncludePath(),
- JModel::_createFileName( 'model', array( 'name' => $type))
- );
- if ($path)
- {
- require_once $path;
- if (!class_exists( $modelClass ))
- {
- JError::raiseWarning( 0, 'Model class ' . $modelClass . ' not found in file.' );
- return $result;
- }
- }
- else return $result;
- }
- $result = new $modelClass($config);
- return $result;
- }
- /**
- * Method to set model state variables
- *
- * @access public
- * @param string The name of the property
- * @param mixed The value of the property to set
- * @return mixed The previous value of the property
- * @since 1.5
- */
- function setState( $property, $value=null )
- {
- return $this->_state->set($property, $value);
- }
- /**
- * Method to get model state variables
- *
- * @access public
- * @param string Optional parameter name
- * @return object The property where specified, the state object where omitted
- * @since 1.5
- */
- function getState($property = null)
- {
- return $property === null ? $this->_state : $this->_state->get($property);
- }
- /**
- * Method to get the database connector object
- *
- * @access public
- * @return object JDatabase connector object
- * @since 1.5
- */
- function &getDBO()
- {
- return $this->_db;
- }
- /**
- * Method to set the database connector object
- *
- * @param object $db A JDatabase based object
- * @return void
- * @since 1.5
- */
- function setDBO(&$db)
- {
- $this->_db =& $db;
- }
- /**
- * Method to get the model 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('/Model(.*)/i', get_class($this), $r)) {
- JError::raiseError (500, "JModel::getName() : Can't get or parse class name.");
- }
- $name = strtolower( $r[1] );
- }
- return $name;
- }
- /**
- * Method to get a table object, load it if necessary.
- *
- * @access public
- * @param string The table name. Optional.
- * @param string The class prefix. Optional.
- * @param array Configuration array for model. Optional.
- * @return object The table
- * @since 1.5
- */
- function &getTable($name='', $prefix='Table', $options = array())
- {
- if (empty($name)) {
- $name = $this->getName();
- }
- if($table = &$this->_createTable( $name, $prefix, $options )) {
- return $table;
- }
- JError::raiseError( 0, 'Table ' . $name . ' not supported. File not found.' );
- $null = null;
- return $null;
- }
- /**
- * Add a directory where JModel should search for models. You may
- * either pass a string or an array of directories.
- *
- * @access public
- * @param string A path to search.
- * @return array An array with directory elements
- * @since 1.5
- */
- function addIncludePath( $path='' )
- {
- static $paths;
- if (!isset($paths)) {
- $paths = array();
- }
- if (!empty( $path ) && !in_array( $path, $paths )) {
- jimport('joomla.filesystem.path');
- array_unshift($paths, JPath::clean( $path ));
- }
- return $paths;
- }
- /**
- * Adds to the stack of model table paths in LIFO order.
- *
- * @static
- * @param string|array The directory (-ies) to add.
- * @return void
- */
- function addTablePath($path)
- {
- jimport('joomla.database.table');
- JTable::addIncludePath($path);
- }
- /**
- * Returns an object list
- *
- * @param string The query
- * @param int Offset
- * @param int The number of records
- * @return array
- * @access protected
- * @since 1.5
- */
- function &_getList( $query, $limitstart=0, $limit=0 )
- {
- $this->_db->setQuery( $query, $limitstart, $limit );
- $result = $this->_db->loadObjectList();
- return $result;
- }
- /**
- * Returns a record count for the query
- *
- * @param string The query
- * @return int
- * @access protected
- * @since 1.5
- */
- function _getListCount( $query )
- {
- $this->_db->setQuery( $query );
- $this->_db->query();
- return $this->_db->getNumRows();
- }
- /**
- * Method to load and return a model object.
- *
- * @access private
- * @param string The name of the view
- * @param string The class prefix. Optional.
- * @return mixed Model object or boolean false if failed
- * @since 1.5
- */
- function &_createTable( $name, $prefix = 'Table', $config = array())
- {
- $result = null;
- // Clean the model name
- $name = preg_replace( '/[^A-Z0-9_]/i', '', $name );
- $prefix = preg_replace( '/[^A-Z0-9_]/i', '', $prefix );
- //Make sure we are returning a DBO object
- if (!array_key_exists('dbo', $config)) {
- $config['dbo'] =& $this->getDBO();;
- }
- $instance =& JTable::getInstance($name, $prefix, $config );
- return $instance;
- }
- /**
- * 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 'model':
- $filename = strtolower($parts['name']).'.php';
- break;
- }
- return $filename;
- }
- }