Current Directory: /home/astoriaah/www/administrator/components/com_sh404sef/classes
Viewing File: /home/astoriaah/www/administrator/components/com_sh404sef/classes/baselistmodel.php
<?php
/**
* sh404SEF - SEO extension for Joomla!
*
* @author Yannick Gaultier
* @copyright (c) Yannick Gaultier - Weeblr llc - 2022
* @package sh404SEF
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
* @version 4.24.1.4308
* @date 2022-05-31
*/
use Joomla\Utilities\ArrayHelper;
// Security check to ensure this file is being included by a parent file.
if (!defined('_JEXEC'))
{
die('Direct Access to this location is not allowed.');
}
class Sh404sefClassBaselistmodel extends Sh404sefClassBasemodel
{
/**
* Data array
*
* @var array
*/
protected $_data = null;
/**
* Data total
*
* @var integer
*/
protected $_total = null;
/**
* Pagination object
*
* @var object
*/
protected $_pagination = null;
/**
* Holds current context, ie : controller/model/view/layout hierarchy
*
* @var string
*/
protected $_context = null;
/**
* Method to get lists item data
*
* @access public
*
* @param object holding options
* @param boolea $returnZeroElement . If true, and the list returned is empty, a null object will be returned (as
* an array)
*
* @return array
*/
public function getList($options = null, $returnZeroElement = false, $forcedLimitstart = null, $forcedLimit = null)
{
// make sure we use latest user state
$this->_updateContextData();
// Lets load the content if it doesn't already exist
if (is_null($this->_data))
{
// get pagination values, and check them
$total = $this->getTotal($options);
$limitstart = is_null($forcedLimitstart) ? $this->_getState('limitstart') : $forcedLimitstart;
if ( /*!is_null( $forcedLimitstart) &&*/
$limitstart >= $total)
{
$this->_setState('limitstart', 0);
}
$limit = is_null($forcedLimit) ? $this->_getState('limit') : $forcedLimit;
// don't allow display 'all' ie $limit = 0, and do sanity check
if (empty($limit) || intval($limit) > 500)
{
$limit = 20;
$this->_setState('limit', $limit);
}
// build the actual query
$query = $this->_buildListQuery($options, $forcedLimitstart, $forcedLimit);
$this->_data = $this->_getList($query);
//echo '<br >----------------------<br />data query:<br />' . $query . '<br >----------- '. count( $this->_data).' -----------<br />';
if ($returnZeroElement && empty($this->_data))
{
// create an empty record and return it
$zeroObject = JTable::getInstance($this->_defaultTable, 'Sh404sefTable');
return array($zeroObject);
}
}
return $this->_data;
}
/**
* Method to get the total number of categories
*
* @access public
* @return integer
*/
public function getTotal($options = null)
{
// make sure we use latest user state
$this->_updateContextData();
$options = is_null($options) ? new stdClass() : $options;
// Lets load the content if it doesn't already exist
if (is_null($this->_total))
{
$options->onlyCount = true;
$query = $this->_buildListQuery($options);
$this->_total = $this->_getListCount($query);
$options->onlyCount = false;
}
return $this->_total;
}
/**
* Method to get a pagination object for the lists
*
* @access public
* @return integer
*/
public function getPagination($options = null)
{
// make sure we use latest user state
$this->_updateContextData();
// Lets load the content if it doesn't already exist
if (empty($this->_pagination))
{
// get pagination values, and check them
$total = $this->getTotal($options);
$limitstart = $this->_getState('limitstart');
$limit = $this->_getState('limit');
// create a pagination object
jimport('joomla.html.pagination');
$this->_pagination = new JPagination($total, $limitstart, $limit);
}
return $this->_pagination;
}
/**
* Gets alist of current filters and sort options which have
* been applied when building up the data
*
* @return object the list ov values as object properties
*/
public function getDisplayOptions()
{
$options = new stdClass();
// search string applied to either sef or non sef
$options->search_all = $this->_getState('search_all');
// ordering column
$options->filter_order = $this->_getState('filter_order');
// show all/only custom/only automatic
$options->filter_order_Dir = $this->_getState('filter_order_Dir');
// return cached instance
return $options;
}
/**
* Set a display option for the current context
*
* @return mixed previous value of the property
*/
public function setDisplayOptions($key, $value)
{
// read previous
$previous = $this->_getState($key);
// set new
$this->_setState($key, $value);
// return previous
return $previous;
}
protected function _buildListQuery($options, $forcedLimitstart = null, $forcedLimit = null)
{
// Collect the various parts of the query
$select = $this->_buildListSelect($options);
$join = $this->_buildListJoin($options);
$where = $this->_buildListWhere($options);
$limit = $this->_buildListLimit($options, $forcedLimitstart, $forcedLimit);
$orderBy = $this->_buildListOrderBy($options);
$groupBy = $this->_buildListGroupBy($options);
// complete query
$query = $select . $join . $where . $groupBy;
// wrap if combined queries
$query = $this->_buildListCombinedQuery($query, $options);
// add sorting
$query .= $orderBy;
// limit number of items
$query .= $limit;
return $query;
}
protected function _buildListSelect($options)
{
// array to hold select clause parts
$select = array();
// get options
$select[] = ' select *';
// add from clause
$select[] = 'from ' . $this->_getTableName();
// aggregate clauses
$select = (count($select) ? implode(' ', $select) : '');
return $select;
}
protected function _buildListJoin($options)
{
// array to hold join clause parts
$join = array();
// aggregate clauses
$join = (count($join) ? ' ' . implode(' ', $join) : '');
return $join;
}
protected function _buildListWhere($options)
{
// array to hold where clause parts
$where = array();
// aggregate clauses
$where = (count($where) ? ' WHERE ' . implode(' AND ', $where) : '');
return $where;
}
protected function _buildListLimit($options, $forcedLimitstart = null, $forcedLimit = null)
{
// build query fragment
$limitString = '';
// get the layout options from param
$layout = $this->_getOption('layout', $options);
// in some case, we only need a simple list of urls, with no
// additionnal date, pageids, aliases, etc
$simpleUrlList = $this->_getOption('simpleUrlList', $options, false);
// various cases of layouts
switch ($layout)
{
case 'view404':
default:
// build query fragment
$onlyCount = $this->_getOption('onlyCount', $options, false);
if (!$onlyCount)
{
$limitstart = is_null($forcedLimitstart) ? ($this->_getState('limitstart')) : intval($forcedLimitstart);
$limit = is_null($forcedLimit) ? intval($this->_getState('limit')) : intval($forcedLimit);
if (empty($limit) && empty($limitstart))
{
$limitstring = '';
}
else
{
$limitString = ' limit ' . $limitstart . ',' . $limit;
}
}
break;
}
return $limitString;
}
protected function _buildListGroupBy($options)
{
// build query fragment
$groupBy = '';
return $groupBy;
}
protected function _buildListOrderBy($options)
{
if ($options && !empty($options->layout) && $options->layout == 'export')
{
$this->_setState('filter_order', 'oldurl');
}
// get set of filters applied to the current view
$filters = $this->getDisplayOptions();
// build query fragment
if (!empty($filters->filter_order))
{
$orderBy = ' order by ' . $this->_db->quoteName($filters->filter_order);
$orderBy .= ' ' . $filters->filter_order_Dir;
}
return $orderBy;
}
protected function _buildListCombinedQuery($query, $options)
{
return $query;
}
/**
* Provides context data definition, to be used by context handler
* Should be overriden by descendant
*/
protected function _getContextDataDef()
{
$application = JFactory::getApplication();
// define context data to be retrieved. Cannot be done at class level,
// as some default values are dynamic
$contextData = array(
array('name' => 'limit', 'html_name' => 'limit', 'default' => $application->getCfg('list_limit'), 'type' => 'int')
, array('name' => 'limitstart', 'html_name' => 'limitstart', 'default' => 0, 'type' => 'int')
// search string applied to either sef or non sef
, array('name' => 'search_all', 'html_name' => 'search_all', 'default' => '', 'type' => 'string')
// ordering column
, array('name' => 'filter_order', 'html_name' => 'filter_order', 'default' => 'oldurl', 'type' => 'string')
// ordering direction
, array('name' => 'filter_order_Dir', 'html_name' => 'filter_order_Dir', 'default' => 'ASC', 'type' => 'string')
);
return $contextData;
}
/**
* Reset model internal cached data
* used after changing context for instance
*/
protected function _resetData()
{
// clean data, total and pagination, as we need them rebuilt
$this->_data = null;
$this->_total = null;
$this->_pagination = null;
}
/**
* Read application user state stored by
* Joomla application object for the current context
* context represents current controller/model/view hierarchy
* and has been set by each of those elements
*/
protected function _updateContextData()
{
// if not been there before, or context has changed since last visit
if (is_null($this->_context) || $this->_context != $this->getState('context'))
{
// read context name and store inclass variabel, easier to access later on
$this->_context = $this->getState('context', $this->_context);
// get an application instance
$application = JFactory::getApplication();
// define context data to be retrieved. Cannot be done at class level,
// as some default values are dynamic
$contextData = $this->_getContextDataDef();
// must reset limistart if limit is changed
$mustResetLimitstart = false;
// get the values from session and store them for future reuse
foreach ($contextData as $contextDataItem)
{
// must reset limistart if limit is changed, so store previous value of limit
if ($contextDataItem['name'] == 'limit')
{
// search for previous value
$previousLimit = $application->getUserState($this->_context . '.limit');
$previousLimitstart = $application->getUserState($this->_context . '.limitstart');
}
// get value
$value = $application->getUserStateFromRequest($this->_context . '.' . $contextDataItem['name'], $contextDataItem['html_name'], $contextDataItem['default'], $contextDataItem['type']);
if ($contextDataItem['name'] == 'limit' && isset($previousLimit) && $value != $previousLimit)
{
$mustResetLimitstart = true;
$newLimit = $value;
}
// and store it into this model
$this->setState($this->_context . '.' . $contextDataItem['name'], $value);
}
// now check if we should reset limitstart
if ($mustResetLimitstart)
{
$newLimitstart = empty($newLimit) ? 0 : $newLimit * floor($previousLimitstart / $newLimit);
// store it into the session and the model
$application->setUserState($this->_context . '.limitstart', $newLimitstart);
$this->setState($this->_context . '.limitstart', $newLimitstart);
}
}
}
protected function _getOption($name, $options, $default = null)
{
if (empty($options) || !is_object($options))
{
return $default;
}
$value = isset($options->$name) ? $options->$name : $default;
return $value;
}
/**
* Short cut to get current state of value
*
* @param string $key
*/
protected function _getState($key)
{
return $this->getState($this->_context . '.' . $key);
}
/**
* short cut to set the state of a value
*
* @param string $key
* @param mixed $value
*/
protected function _setState($key, $value)
{
return $this->setState($this->_context . '.' . $key, $value);
}
protected function _cleanForQuery($string)
{
$cleaned = $this->_db->escape(JString::trim(JString::strtolower($string)));
return addcslashes($cleaned, '_%');
}
/**
* Joomla! Content Management System
*
* @copyright Copyright (C) 2005 - 2017 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
/**
* Saves the manually set order of records.
*
* @param array $pks An array of primary key ids.
* @param integer $order +1 or -1
*
* @return boolean|\JException Boolean true on success, false on failure, or \JException if no items are selected
*
* @since 1.6
*/
public function saveorder($pks = array(), $order = null)
{
$table = JTable::getInstance($this->_defaultTable, 'Sh404sefTable');
$conditions = array();
if (empty($pks))
{
return \JError::raiseWarning(500, \JText::_($this->text_prefix . '_ERROR_NO_ITEMS_SELECTED'));
}
$orderingField = 'ordering';
// Update ordering values
foreach ($pks as $i => $pk)
{
$table->load((int)$pk);
if ($table->$orderingField != $order[$i])
{
$table->$orderingField = $order[$i];
if (!$table->store())
{
$this->setError($table->getError());
return false;
}
$key = $table->getKeyName();
$conditions[] = array($table->$key, '');
}
}
// Execute reorder for each category.
foreach ($conditions as $cond)
{
$table->load($cond[0]);
$table->reorder($cond[1]);
}
// Clear the component's cache
$this->cleanCache();
return true;
}
}