Current Directory: /home/astoriaah/www/old15/administrator/components/com_sh404sef/models
Viewing File: /home/astoriaah/www/old15/administrator/components/com_sh404sef/models/metas.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 Sh404sefModelMetas extends Sh404sefClassBaselistModel {
protected $_context = 'sh404sef.metas';
protected $_defaultTable = 'metas';
/**
* Save a list of meta data as entered by user in backend to the database
*
* @param string $metaData an array of meta key/meta value from user. Also include nonsef url
* @return boolean true on success
*/
public function save( $dataArray = null) {
$this->_db = ShlDbHelper::getDb();
$row = JTable::getInstance( $this->_defaultTable, 'Sh404sefTable');
// only save if there is actually some metas data
// at least on new records
$metas = '';
foreach($dataArray as $key => $value) {
if($key != 'meta_id' && (substr( $key, 0,4) == 'meta' || substr($key, 0, 3) == 'fb_' || substr( $key, 0, 3) == 'og_' || substr( $key, 0, 13) == 'twittercards_' || $key == 'canonical')) {
$metas .= $value;
}
}
// if there is no meta data entered, and this is an existing record, delete it, or at least do not save
if(!empty($metas) && $metas == SH404SEF_OPTION_VALUE_USE_DEFAULT.SH404SEF_OPTION_VALUE_USE_DEFAULT.SH404SEF_OPTION_VALUE_USE_DEFAULT.SH404SEF_OPTION_VALUE_USE_DEFAULT.SH404SEF_OPTION_VALUE_USE_DEFAULT.SH404SEF_OPTION_VALUE_USE_DEFAULT) {
if(!empty($dataArray['meta_id'])) {
// there is an existing record, meta data was cleared by user, we can delete the record altogether
try {
ShlDbHelper::delete('#__sh404sef_metas', array( 'id' => $dataArray['meta_id']));
return true;
} catch ( Exception $e) {
$this->setError( $e->getMessage());
return false;
}
}
// in any case, don't save anything
return true;
}
if(empty( $metas) && empty( $dataArray['meta_id'])) {
// avoid creating a new (and empty) record when savnig a record from the "metas" page
// where we're editing several records at a time
// This would pass the test just above, because we do not have any values for fb_*, og_*, etc
// fields as we're only editing title and description
return true;
}
$status = true;
// load pre-existing values
if(!empty($dataArray['meta_id'])) {
$status = $row->load( $dataArray['meta_id']);
}
// attach incoming data to table object
$status = $status && $row->bind( $dataArray );
// add language code if missing, except on home page
if ( $status && $row->newurl != sh404SEF_HOMEPAGE_CODE && // don't add on homepage
!preg_match( '/(&|\?)lang=[a-zA-Z]{2,3}/iuU', $row->newurl)) {
// no lang string, let's add default
$shTemp = explode( '-', Sh404sefHelperLanguage::getDefaultLanguageTag());
$shLangTemp = $shTemp[0] ? $shTemp[0] : 'en';
$row->newurl .= '&lang='.$shLangTemp;
}
// sort url params, except on home page
if ( $status && $row->newurl != sh404SEF_HOMEPAGE_CODE) {
$row->newurl = Sh404sefHelperUrl::sortUrl($row->newurl);
}
// pre-save checks
$status = $status && $row->check();
// save the changes
$status = $status && $row->store();
// store error message
if (!$status) {
$error = $row->getError();
$this->setError( $error);
}
// return true if no error
$errors = $this->getError();
return empty( $errors);
}
/**
* Save an array of metadata records
* typycally coming from user entry
* on the meta data list page
*
* @param array of objects $dataSet the data, with each object holding a record
*/
public function SaveSet( $dataSet) {
if (empty($dataSet)) {
$this->setError( 'No data to save');
return;
}
foreach( $dataSet as $dataRecord) {
$status = $this->save( $dataRecord);
}
return $status;
}
/**
* Count meta data records
* either all of them or the currently selected set
* as per user filter settings in meta manager
*
* @param string $type either 'all' or 'selected'
*/
public function getMetaRecordsCount( $type) {
switch (strtolower( $type)) {
// we want to read all automatic urls (include duplicates)
case 'all':
try {
$numberOfMetaRecords = ShlDbHelper::count( $this->_getTableName(), '*');
} catch (Exception $e) {
$numberOfMetaRecords = 0;
ShlSystem_Log::error( 'sh404sef', '%s::%s::%d: %s', __CLASS__, __METHOD__, __LINE__, $e->getMessage());
}
break;
// we want to read urls as per current selection input fields
// ie : component, language, custom, ...
case 'selected':
// get model and update context with current
$model = ShlMvcModel_Base::getInstance( 'urls', 'Sh404sefModel');
// use current filters for default layout of metas manager
$context = $model->updateContext( $this->_context . '.' . 'default');
// read url data from model
$list = $model->getList( (object) array('layout' => 'default', 'getMetaData' => true));
$numberOfMetaRecords = 0;
// just count urls with some meta data
if (!empty($list)) {
foreach ($list as $urlRecord) {
if (!empty( $urlRecord->metas)) {
$numberOfMetaRecords++;
}
}
}
break;
default:
$numberOfMetaRecords = 0;
break;
}
return intval( $numberOfMetaRecords);
}
/**
* Purge meta data records from the database
* either all of them or the currently selected set
* as per user filter settings in meta manager
*
* @param string $type either 'all' or 'selected'
*/
public function purgeMetas( $type) {
// 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;
}
// then run the query
if (!empty( $deleteQuery)) {
try {
$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);
} else {
$this->setError( JText::_('COM_SH404SEF_NORECORDS'));
}
}
/**
* Construct select statement, for use
* by getList() controller method
* @param unknown_type $options
*/
protected function _buildListWhere( $options) {
// array to hold where clause parts
$where = array();
// are we reading metas for one specific url ?
$newurl = $this->_getOption( 'newurl', $options);
if (!empty( $newurl)) {
$where[] = 'newurl = ' . $this->_db->Quote( $newurl);
}
// aggregate clauses
$where = ( count( $where ) ? ' WHERE '. implode( ' AND ', $where ) : '' );
return $where;
}
protected function _buildListOrderBy( $options) {
// get set of filters applied to the current view
$filters = $this->getDisplayOptions();
// build query fragment
$orderBy = ' order by ' . $this->_db->quoteName( 'newurl');
$orderBy .= ' ' . $filters->filter_order_Dir;
return $orderBy;
}
/**
* Delete all automatically generated url records
* from database and cache
*/
private function _getPurgeQueryAll() {
// delete from database
$query = 'truncate ' . $this->_db->quoteName( $this->_getTableName());
return $query;
}
private function _getPurgeQuerySelected() {
// get model and update context with current
$model = ShlMvcModel_Base::getInstance( 'urls', 'Sh404sefModel');
// use current filters for default layout of metas manager
$context = $model->updateContext( $this->_context . '.' . 'default');
// read url data from model
$list = $model->getList( (object) array('layout' => 'default', 'getMetaData' => true));
$metaRecordsIds = array();
// store meta data records ids for urls with some metat data
if (!empty($list)) {
foreach ($list as $urlRecord) {
$id = intval($urlRecord->metaid);
if (!empty( $id)) {
$metaRecordsIds[] = $this->_db->Quote($id);
}
}
}
// if no urls with meta data, return empty query
if (empty( $metaRecordsIds)) {
return '';
}
// start delete query
$query = 'delete from ' . $this->_db->quoteName( $this->_getTableName());
// call method to build where clause in accordance to current settings and user selection
$where = implode( ', ', $metaRecordsIds);
// stitch where clause
$query = $query . ' where id in (' . $where . ')';
return $query;
}
protected function _getTableName() {
return '#__sh404sef_metas';
}
}