%PDF- %PDF-
| Direktori : /home/lightco1/luminero.com.au/libraries/compojoom/model/ |
| Current File : /home/lightco1/luminero.com.au/libraries/compojoom/model/update.php |
<?php
/**
* @package Lib_Compojoom
* @author DanielDimitrov <daniel@compojoom.com>
* @date 17.09.2014
*
* @copyright Copyright (C) 2008 - 2013 compojoom.com . All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
*/
defined('_JEXEC') or die('Restricted access');
/**
* Class CompojoomModelUpdate
*
* This class is based onF0FUtilsUpdate so all creadits go to F0F
*
* @since 4.0
*/
class CompojoomModelUpdate extends JModelLegacy
{
/** @var JUpdater The Joomla! updater object */
protected $updater = null;
/** @var int The extension_id of this component */
protected $extension_id = 0;
/** @var string The currently installed version, as reported by the #__extensions table */
protected $version = 'dev';
/** @var string The name of the component e.g. com_something */
protected $component = 'com_foobar';
/** @var string The URL to the component's update XML stream */
protected $updateSite = null;
/** @var string The name to the component's update site (description of the update XML stream) */
protected $updateSiteName = null;
/** @var string The extra query to append to (commercial) components' download URLs */
protected $extraQuery = null;
/**
* Public constructor. Initialises the protected members as well. Useful $config keys:
* update_component The component name, e.g. com_foobar
* update_version The default version if the manifest cache is unreadable
* update_site The URL to the component's update XML stream
* update_extraquery The extra query to append to (commercial) components' download URLs
* update_sitename The update site's name (description)
*
* @param array $config - array with the config
*/
public function __construct($config = array())
{
parent::__construct($config);
// Get an instance of the updater class
$this->updater = JUpdater::getInstance();
// Get the component name
if (isset($config['update_component']))
{
$this->component = $config['update_component'];
}
else
{
$this->component = JFactory::getApplication()->input->getCmd('option', '');
}
// Get the component version
if (isset($config['update_version']))
{
$this->version = $config['update_version'];
}
// Get the update site
if (isset($config['update_site']))
{
$this->updateSite = $config['update_site'];
}
// Get the extra query
if (isset($config['update_extraquery']))
{
$this->extraQuery = $config['update_extraquery'];
}
// Get the extra query
if (isset($config['update_sitename']))
{
$this->updateSiteName = $config['update_sitename'];
}
// Find the extension ID
$db = $this->getDbo();
$query = $db->getQuery(true)
->select('*')
->from($db->qn('#__extensions'))
->where($db->qn('type') . ' = ' . $db->q('component'))
->where($db->qn('element') . ' = ' . $db->q($this->component));
$db->setQuery($query);
$extension = $db->loadObject();
if (is_object($extension))
{
$this->extension_id = $extension->extension_id;
$data = json_decode($extension->manifest_cache, true);
if (isset($data['version']))
{
$this->version = $data['version'];
}
}
}
/**
* Gets the component's Download ID.
*
* @param string $component The component, e.g. com_foo.
*
* @return string|bool The download ID or false if a valid download ID can't be found.
*/
public function getDownloadId($component)
{
$params = CompojoomUtilsComponent::getInstance($component);
$dlid = $params->get('downloadid', '');
if (!preg_match('/^([0-9]{1,}:)?[0-9a-f]{32}$/i', $dlid))
{
return false;
}
return $dlid;
}
/**
* Retrieves the update information of the component, returning an array with the following keys:
*
* hasUpdate True if an update is available
* version The version of the available update
* infoURL The URL to the download page of the update
*
* @param bool $force Set to true if you want to forcibly reload the update information
*
* @return array See the method description for more information
*/
public function getUpdates($force = false)
{
$db = $this->getDbo();
// Default response (no update)
$updateResponse = array(
'hasUpdate' => false,
'version' => '',
'infoURL' => ''
);
if (empty($this->extension_id))
{
return $updateResponse;
}
// If we are forcing the reload, set the last_check_timestamp to 0
// and remove cached component update info in order to force a reload
if ($force)
{
// Find the update site IDs
$updateSiteIds = $this->getUpdateSiteIds();
if (empty($updateSiteIds))
{
return $updateResponse;
}
// Set the last_check_timestamp to 0
$query = $db->getQuery(true)
->update($db->qn('#__update_sites'))
->set($db->qn('last_check_timestamp') . ' = ' . $db->q('0'))
->where($db->qn('update_site_id') . ' IN (' . implode(', ', $updateSiteIds) . ')');
$db->setQuery($query);
$db->execute();
// Remove cached component update info from #__updates
$query = $db->getQuery(true)
->delete($db->qn('#__updates'))
->where($db->qn('update_site_id') . ' IN (' . implode(', ', $updateSiteIds) . ')');
$db->setQuery($query);
$db->execute();
}
// Use the update cache timeout specified in com_installer
$comInstallerParams = CompojoomUtilsComponent::getInstance('com_installer');
$timeout = 3600 * $comInstallerParams->get('cachetimeout', '6');
// Load any updates from the network into the #__updates table
$this->updater->findUpdates($this->extension_id, $timeout);
// Get the update record from the database
$query = $db->getQuery(true)
->select('*')
->from($db->qn('#__updates'))
->where($db->qn('extension_id') . ' = ' . $db->q($this->extension_id));
$db->setQuery($query);
$updateRecord = $db->loadObject();
// If we have an update record in the database return the information found there
if (is_object($updateRecord))
{
$updateResponse = array(
'hasUpdate' => true,
'version' => $updateRecord->version,
'infoURL' => $updateRecord->infourl,
);
}
return $updateResponse;
}
/**
* Gets the update site Ids for our extension.
*
* @return mixed An array of Ids or null if the query failed.
*/
public function getUpdateSiteIds()
{
$db = $this->getDbo();
$query = $db->getQuery(true)
->select($db->qn('update_site_id'))
->from($db->qn('#__update_sites_extensions'))
->where($db->qn('extension_id') . ' = ' . $db->q($this->extension_id));
$db->setQuery($query);
$updateSiteIds = $db->loadColumn(0);
return $updateSiteIds;
}
/**
* Get the currently installed version as reported by the #__extensions table
*
* @return string
*/
public function getVersion()
{
return $this->version;
}
/**
* Override the currently installed version as reported by the #__extensions table
*
* @param string $version - version number
*
* @return void
*/
public function setVersion($version)
{
$this->version = $version;
}
/**
* Refreshes the Joomla! update sites for this extension as needed
*
* @return void
*/
public function refreshUpdateSite()
{
if (empty($this->extension_id))
{
return;
}
// Create the update site definition we want to store to the database
$update_site = array(
'name' => $this->updateSiteName,
'type' => 'extension',
'location' => $this->updateSite,
'enabled' => 1,
'last_check_timestamp' => 0,
'extra_query' => $this->extraQuery
);
// Get a reference to the db driver
$db = $this->getDbo();
// Get the #__update_sites columns
$columns = $db->getTableColumns('#__update_sites', true);
if (version_compare(JVERSION, '3.0.0', 'lt') || !array_key_exists('extra_query', $columns))
{
unset($update_site['extra_query']);
}
// Get the update sites for our extension
$updateSiteIds = $this->getUpdateSiteIds();
if (!count($updateSiteIds))
{
// No update sites defined. Create a new one.
$newSite = (object) $update_site;
$db->insertObject('#__update_sites', $newSite);
$id = $db->insertid();
$updateSiteExtension = (object) array(
'update_site_id' => $id,
'extension_id' => $this->extension_id,
);
$db->insertObject('#__update_sites_extensions', $updateSiteExtension);
}
else
{
// Loop through all update sites
foreach ($updateSiteIds as $id)
{
$query = $db->getQuery(true)
->select('*')
->from($db->qn('#__update_sites'))
->where($db->qn('update_site_id') . ' = ' . $db->q($id));
$db->setQuery($query);
$aSite = $db->loadObject();
if (empty($aSite))
{
// Update site not defined. Create a new one.
$update_site['update_site_id'] = $id;
$newSite = (object) $update_site;
$db->insertObject('#__update_sites', $newSite);
// Update site is now up-to-date, don't need to refresh it anymore.
continue;
}
// Is it enabled (Joomla! seriously sucks: IT DISABLES UPDATE SITES WITHOUT THE POSSIBILITY TO RE-ENABLE THEM!)
if ($aSite->enabled)
{
// Does the name and location match?
if (($aSite->name == $update_site['name']) && ($aSite->location == $update_site['location']))
{
// Do we have the extra_query property (J 3.2+) and does it match?
if (property_exists($aSite, 'extra_query') && isset($update_site['extra_query']))
{
if ($aSite->extra_query == $update_site['extra_query'])
{
continue;
}
}
else
{
// Joomla! 3.1 or earlier. Updates may or may not work.
continue;
}
}
}
$update_site['update_site_id'] = $id;
$newSite = (object) $update_site;
$db->updateObject('#__update_sites', $newSite, 'update_site_id', true);
}
}
}
/**
* Checks if the download ID provisioning plugin for the updates of this extension is published. If not, it will try
* to publish it automatically. It reports the status of the plugin as a boolean.
*
* @param string $element - the installer plugin element
*
* @return bool
*/
public function isUpdatePluginEnabled($element)
{
// We can't be bothered about the plugin in Joomla! 2.5.0 through 2.5.19
if (version_compare(JVERSION, '2.5.19', 'lt'))
{
return true;
}
// We can't be bothered about the plugin in Joomla! 3.x
if (version_compare(JVERSION, '3.0.0', 'gt'))
{
return true;
}
$db = $this->getDBO();
// Let's get the information of the update plugin
$query = $db->getQuery(true)
->select('*')
->from($db->qn('#__extensions'))
->where($db->qn('folder') . ' = ' . $db->quote('installer'))
->where($db->qn('element') . ' = ' . $db->quote($element))
->where($db->qn('type') . ' = ' . $db->quote('plugin'))
->order($db->qn('ordering') . ' ASC');
$db->setQuery($query);
$plugin = $db->loadObject();
// If the plugin is missing report it as unpublished (of course!)
if (!is_object($plugin))
{
return false;
}
// If it's enabled there's nothing else to do
if ($plugin->enabled)
{
return true;
}
// Otherwise, try to enable it and report false (so the user knows what he did wrong)
$pluginObject = (object) array(
'extension_id' => $plugin->extension_id,
'enabled' => 1
);
try
{
$result = $db->updateObject('#__extensions', $pluginObject, 'extension_id');
// Do not remove this line. We need to tell the user he's doing something wrong.
$result = false;
}
catch (Exception $e)
{
$result = false;
}
return $result;
}
/**
* Updates the component configuration.
* It first fetches the config.xml file & reads all entries there.
* Then we load the current component parameters from the db
* and merge them with the .xml file. This way we ensure that
* the db has all the current values for each setting even if the
* user doesn't edit his config.
*
* @return array - the parameters
*/
public function updateConfiguration()
{
$settings = JPATH_ADMINISTRATOR . '/components/' . $this->component . '/config.xml';
$json = array();
$form = new JForm('config');
$form->loadFile($settings, true, '/config');
$params = JComponentHelper::getParams($this->component)->toArray();
$fieldsets = $form->getFieldsets();
foreach ($fieldsets as $fieldsetkey => $fieldset)
{
$fields = $form->getFieldset($fieldsetkey);
foreach ($fields as $fieldkey => $field)
{
// If we have a group for this field, use it!
if ($field->group)
{
$json[$field->group][$field->fieldname] = $field->value;
}
else
{
$json[$field->fieldname] = $field->value;
}
}
}
$merged = array_merge($json, $params);
$this->updateParams($merged);
return $merged;
}
/**
* Save the component params to the database
*
* @param array $params - the parameters to save in the DB
*
* @return void
*/
public function updateParams($params)
{
// Now let's update the Database
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->update($db->qn('#__extensions'))
->set($db->qn('params') . '=' . $db->q(json_encode($params)))
->where($db->qn('element') . '=' . $db->q($this->component))
->where($db->qn('type') . '=' . $db->q('component'));
$db->setQuery($query);
$db->execute();
}
}