File Manager

Current Directory: /home/astoriaah/www/old15/administrator/components/com_sh404sef/models
Viewing File: /home/astoriaah/www/old15/administrator/components/com_sh404sef/models/aliases.php
<?php /** * sh404SEF - SEO extension for Joomla! * * @author Yannick Gaultier * @copyright (c) Yannick Gaultier 2014 * @package sh404SEF * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL * @version 4.4.4.1791 * @date 2014-07-01 */ // 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 Sh404sefModelAliases extends Sh404sefClassBaselistModel { protected $_context = 'sh404sef.aliases'; protected $_defaultTable = 'aliases'; /** * Save a list of aliases as entered by user in backend to the database * * @param string $aliasList data from an html textarea field * @param string $nonSefUrl the non sef url to which aliases are attached * * @return boolean true on success */ public function saveFromInput($aliasList, $nonSefUrl) { // split aliases from raw input data into an array $aliasList = explode("\n", $aliasList); try { // delete them all. We should do a transaction, but not worth it ShlDbHelper::delete('#__sh404sef_aliases', array('newurl' => $nonSefUrl)); // Write new aliases. if (!empty($aliasList[0])) { $badChars = array("\r\n", "\n", "\r", ' '); foreach ($aliasList as $alias) { // remove end of line chars $alias = str_replace($badChars, '', $alias); // if something left, try insert it into DB if (!empty($alias)) { // first check value is not invalid // either the alias already exists // or same SEF url already exists try { $count = ShlDbHelper::count('#__sh404sef_urls', 'id', 'oldurl = ? and newurl <> ?', array($alias, '')); if (empty($count)) { $count = ShlDbHelper::count('#__sh404sef_aliases', '*', array('alias' => $alias)); } } catch (Exception $e) { $count = 0; } // if ok, insert into db if (empty($count)) { ShlDbHelper::insert('#__sh404sef_aliases', array('newurl' => $nonSefUrl, 'alias' => $alias, 'type' => Sh404sefHelperGeneral::COM_SH404SEF_URLTYPE_ALIAS)); } else { // alias already exists either as an alias or a SEF url $this->setError(JText::sprintf('COM_SH404SEF_ALIAS_ALREADY_EXISTS', $alias)); } } } } } catch (Exception $e) { ShlSystem_Log::error('sh404sef', '%s::%s::%d: %s', __CLASS__, __METHOD__, __LINE__, $e->getMessage()); $this->setError($e->getMessage()); } // return true if no error $error = $this->getError(); return empty($error); } /** * Read data from model and turns it into * a string suitable for display in a text area field * * @param array $options key/value pairs to restrict data selection */ public function getDisplayableList($options) { // get raw data $rawList = $this->getList($options, $returnZeroElement = false, $forcedLimitstart = null, $forcedLimit = 5000); // make a simple string suitable for editing in a text area input field $displayableList = ''; if (!empty($rawList)) { foreach ($rawList as $alias) { $displayableList .= shUrlSafeDisplay($alias->alias) . "\n"; } } return $displayableList; } /** * Purge urls from database (and cache) * either all automatic, or according to current * sef url list page select options as stored in * in session * @param unknown_type $type */ public function purge($type = 'auto') { // make sure we use latest user state $this->_updateContextData(); // call the appropriate sub-method to get the db query $methodName = '_getPurgeQuery' . ucfirst($type); if (is_callable(array($this, $methodName))) { $deleteQuery = $this->$methodName(); } else { $this->setError('Invalid method call _purge' . $type); return; } try { // then run the query $this->_db->setQuery($deleteQuery); $this->_db->execute(); } catch (Exception $e) { ShlSystem_Log::error('sh404sef', '%s::%s::%d: %s', __CLASS__, __METHOD__, __LINE__, $e->getMessage()); $this->setError('Internal database error # ' . $e->getMessage()); } // reset limit and limitstart variables, to avoid // issue when displaying again results $this->_setState('limitstart', 0); $this->_setState('limit', 0); } public function getAliasesCount($which = 'auto') { switch (strtolower($which)) { // we want to read all automatic urls (include duplicates) case 'auto': try { $numberOfUrls = ShlDbHelper::count($this->_getTableName(), '*', array('type' => Sh404sefHelperGeneral::COM_SH404SEF_URLTYPE_ALIAS)); } catch (Exception $e) { $numberofUrls = 0; } break; // we want to read urls as per current selection input fields // ie : component, language, custom, ... case 'selected': $numberOfUrls = $this->getTotal(); break; default: $numberOfUrls = 0; break; } return intval($numberOfUrls); } /** * Finds the sef url record to which an * alias record, identified by its id, * elongs to * * @param integer $aliasId */ public function getUrlByAliasId($aliasId) { $aliasId = empty($aliasId) ? 0 : intval($aliasId); $query = 'select r.* from ' . $this->_db->quoteName('#__sh404sef_urls') . ' as r' . ' left join ' . $this->_db->quoteName('#__sh404sef_aliases') . ' as a' . ' on a.' . $this->_db->quoteName('newurl') . ' = r.' . $this->_db->quoteName('newurl') . ' where a.' . $this->_db->quoteName('id') . ' = ' . $this->_db->Quote($aliasId) . ' order by ' . $this->_db->quoteName('rank'); try { $this->_db->setQuery($query); $url = $this->_db->loadObject(); } catch (Exception $e) { ShlSystem_Log::error('sh404sef', '%s::%s::%d: %s', __CLASS__, __METHOD__, __LINE__, $e->getMessage()); $this->setError('Internal database error # ' . $e->getMessage()); } return $url; } /** * Gets alist of current filters and sort options which have * been applied when building up the data * @override * @return object the list ov values as object properties */ public function getDisplayOptions() { $options = parent::getDisplayOptions(); // get additional options vs base class // component used in url $options->filter_component = $this->_getState('filter_component'); // show all/only one language $options->filter_language = $this->_getState('filter_language'); // return cached instance return $options; } protected function _buildListSelect($options) { // array to hold select clause parts $select = array(); // get options $select[] = ' select a.*, r.oldurl'; // add from clause $select[] = 'from ' . $this->_getTableName() . ' as a'; // aggregate clauses $select = (count($select) ? implode(' ', $select) : ''); return $select; } protected function _buildListWhere($options) { // array to hold where clause parts $where = array(); // get set of filters applied to the current view $filters = $this->getDisplayOptions(); // only aliases, no pageid $where[] = 'a.type = ' . $this->_db->Quote(Sh404sefHelperGeneral::COM_SH404SEF_URLTYPE_ALIAS); // are we reading aliases for one specific url ? $newurl = $this->_getOption('newurl', $options); if (!empty($newurl)) { $where[] = 'a.newurl = ' . $this->_db->Quote($newurl); } else { // we read them all, except possibly the home page aliases $includeHomeData = $this->_getOption('includeHomeData', $options); if (empty($includeHomeData)) { $where[] = 'a.newurl != ' . $this->_db->Quote(sh404SEF_HOMEPAGE_CODE); } } // add search all urls term if any if (!empty($filters->search_all)) { // V 1.2.4.q added search URL feature jimport('joomla.utilities.string'); $searchTerm = $this->_cleanForQuery(JString::strtolower($filters->search_all)); $where[] = " (LOWER(a.alias) LIKE '%" . $searchTerm . "%' OR " . "LOWER(r.newurl) LIKE '%" . $searchTerm . "%')"; } // components check if (!empty($filters->filter_component)) { $where[] = "LOWER(a.newurl) LIKE '%option=" . $this->_cleanForQuery($filters->filter_component) . "%'"; } // language check if (!empty($filters->filter_language)) { $where[] = "LOWER(a.newurl) LIKE '%lang=" . $this->_cleanForQuery($filters->filter_language) . "%'"; } // aggregate clauses $where = (count($where) ? ' WHERE ' . implode(' AND ', $where) : ''); return $where; } protected function _buildListJoin($options) { // array to hold join clause parts $join = array(); // read also the sef url $join[] = 'left join ' . $this->_db->quoteName('#__sh404sef_urls') . ' as r'; $join[] = 'on r.' . $this->_db->quoteName('newurl') . ' = a.' . $this->_db->quoteName('newurl'); // aggregate clauses $join = (count($join) ? ' ' . implode(' ', $join) : ''); return $join; } protected function _buildListOrderBy($options) { // get set of filters applied to the current view $filters = $this->getDisplayOptions(); // build query fragment $orderBy = ' order by ' . $filters->filter_order; $orderBy .= ' ' . $filters->filter_order_Dir; return $orderBy; } protected function _getTableName() { return '#__sh404sef_aliases'; } /** * Provides context data definition, to be used by context handler * Should be overriden by descendant */ protected function _getContextDataDef() { $contextData = parent::_getContextDataDef(); // define context data to be retrieved. Cannot be done at class level, // as some default values are dynamic $addedContextData = array( // redefined default sort order array('name' => 'filter_order', 'html_name' => 'filter_order', 'default' => 'alias', 'type' => 'string') // component used in url , array('name' => 'filter_component', 'html_name' => 'filter_component', 'default' => '', 'type' => 'string') // show all/only one language , array('name' => 'filter_language', 'html_name' => 'filter_language', 'default' => '', 'type' => 'string')); return array_merge($contextData, $addedContextData); } /** * Delete all automatically generated url records * from database and cache */ private function _getPurgeQueryAuto() { // delete from database $query = 'delete from ' . $this->_db->quoteName($this->_getTableName()) . ' where type = ' . $this->_db->Quote(Sh404sefHelperGeneral::COM_SH404SEF_URLTYPE_ALIAS); return $query; } private function _getPurgeQuerySelected() { // a 2 steps process : first collect those urls id we need // in accordance with select drop-down lists // then combine it with a delete query $options = null; $query = $this->_buildListQuery($options); // collect only the ids $queryIds = 'select t.id from (' . $query . ') as t'; // start delete query $deleteQuery = 'delete from ' . $this->_db->quoteName($this->_getTableName()) . ' where id = any (' . $queryIds . ')'; return $deleteQuery; } }