Source code for file /libraries/joomla/application/component/modellist.php
Documentation is available at modellist.php
* @package Joomla.Platform
* @subpackage Application
* @copyright Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
jimport('joomla.application.component.model');
* Model class for handling lists of items.
* @package Joomla.Platform
* @subpackage Application
* Internal memory based cache array of data.
* Context string for the model type. This is used to handle uniqueness
* when dealing with the getStoreId() method and caching data structures.
* Valid filter fields or ordering.
* An internal cache for the last query used.
* @param array $config An optional associative array of configuration settings.
// Add the ordering filtering fields white list.
if (isset
($config['filter_fields']))
// Guess the context as Option.ModelName.
* Method to cache the last query constructed.
* This method ensures that the query is constructed only once for a given state of the model.
* @return JDatabaseQuery A JDatabaseQuery object
// Capture the last store id used.
// Compute the current store id.
// If the last store id is different from the current, refresh the query.
if ($lastStoreId !=
$currentStoreId ||
empty($this->query))
$lastStoreId =
$currentStoreId;
* Method to get an array of data items.
* @return mixed An array of data items on success, false on failure.
// Try to load the data from internal storage.
if (isset
($this->cache[$store]))
return $this->cache[$store];
// Check for a database error.
if ($this->_db->getErrorNum())
// Add the items to the internal cache.
$this->cache[$store] =
$items;
return $this->cache[$store];
* Method to get a JDatabaseQuery object for retrieving the data set from a database.
* @return JDatabaseQuery A JDatabaseQuery object to retrieve the data set.
$query =
$db->getQuery(true);
* Method to get a JPagination object for the data set.
* @return JPagination A JPagination object for the data set.
// Try to load the data from internal storage.
if (isset
($this->cache[$store]))
return $this->cache[$store];
// Create the pagination object.
$limit = (int)
$this->getState('list.limit') - (int)
$this->getState('list.links');
// Add the object to the internal cache.
$this->cache[$store] =
$page;
return $this->cache[$store];
* Method to get a store id based on the model configuration state.
* This is necessary because the model is used by the component and
* different modules that might need different sets of data or different
* @param string $id An identifier string to generate the store id.
* @return string A store id.
// Add the list state to the store id.
$id .=
':' .
$this->getState('list.start');
$id .=
':' .
$this->getState('list.limit');
$id .=
':' .
$this->getState('list.ordering');
$id .=
':' .
$this->getState('list.direction');
* Method to get the total number of items for the data set.
* @return integer The total number of items available in the data set.
// Try to load the data from internal storage.
if (isset
($this->cache[$store]))
return $this->cache[$store];
// Check for a database error.
if ($this->_db->getErrorNum())
// Add the total to the internal cache.
$this->cache[$store] =
$total;
return $this->cache[$store];
* Method to get the starting number of items for the data set.
* @return integer The starting number of items available in the data set.
// Try to load the data from internal storage.
if (isset
($this->cache[$store]))
return $this->cache[$store];
if ($start >
$total -
$limit)
$start =
max(0, (int)
(ceil($total /
$limit) -
1) *
$limit);
// Add the total to the internal cache.
$this->cache[$store] =
$start;
return $this->cache[$store];
* Method to auto-populate the model state.
* This method should only be called once per instantiation and is designed
* to be called on the first call to the getState() method unless the model
* configuration flag to ignore the request is set.
* Note. Calling getState in this method will result in recursion.
* @param string $ordering An optional ordering field.
* @param string $direction An optional direction (asc|desc).
protected function populateState($ordering =
null, $direction =
null)
// If the context is set, assume that stateful lists are used.
$value =
$app->getUserStateFromRequest('global.list.limit', 'limit', $app->getCfg('list_limit'));
$value =
$app->getUserStateFromRequest($this->context .
'.limitstart', 'limitstart', 0);
$limitstart =
($limit !=
0 ?
(floor($value /
$limit) *
$limit) :
0);
$this->setState('list.start', $limitstart);
// Check if the ordering field is in the white list, otherwise use the incoming value.
$value =
$app->getUserStateFromRequest($this->context .
'.ordercol', 'filter_order', $ordering);
$app->setUserState($this->context .
'.ordercol', $value);
$this->setState('list.ordering', $value);
// Check if the ordering direction is valid, otherwise use the incoming value.
$value =
$app->getUserStateFromRequest($this->context .
'.orderdirn', 'filter_order_Dir', $direction);
$app->setUserState($this->context .
'.orderdirn', $value);
$this->setState('list.direction', $value);
$this->state->set('list.limit', 0);
* Gets the value of a user state variable and sets it in the session
* This is the same as the method in JApplication except that this also can optionally
* force you back to the first page when a filter has changed
* @param string $key The key of the user state variable.
* @param string $request The name of the variable passed in a request.
* @param string $default The default value for the variable if not found. Optional.
* @param string $type Filter for the variable, for valid values see {@link JFilterInput::clean()}. Optional.
* @param boolean $resetPage If true, the limitstart in request is set to zero
* @return The request user state.
$old_state =
$app->getUserState($key);
$cur_state =
(!is_null($old_state)) ?
$old_state :
$default;
if (($cur_state !=
$new_state) &&
($resetPage))
// Save the new value only if it is set in this request.
$app->setUserState($key, $new_state);