File Manager

Current Directory: /home/astoriaah/www/administrator/components/com_sh404sef/models
Viewing File: /home/astoriaah/www/administrator/components/com_sh404sef/models/metas.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 */ // Security check to ensure this file is being included by a parent file. if (!defined('_JEXEC')) { die(''); } class Sh404sefModelMetas extends Sh404sefClassBaselistModel { protected $_context = 'sh404sef.metas'; protected $_defaultTable = 'metas'; /** * Reads stored meta data for a given non-sef URL * * @param $nonSef * * @return JTable */ public function getCustomMetaData($nonSef) { try { // using a table object ensure we do get an object // and it has all required properties defined, even if empty $tags = JTable::getInstance('metas', 'Sh404sefTable'); $tagsData = ShlDbHelper::selectObject('#__sh404sef_metas', '*', array('newurl' => $nonSef)); if (!empty($tagsData)) { $tags->bind($tagsData); } } catch (\Exception $e) { ShlSystem_Log::error('sh404sef', '%s::%d: %s', __METHOD__, __LINE__, $e->getMessage()); } return $tags; } /** * 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' || substr($key, 0, 12) == 'raw_content_')) { $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 $row->newurl .= '&lang=' . Sh404sefHelperLanguage::getDefaultLanguageSef(); } // 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'; } }