%PDF-
%PDF-
Mini Shell
Mini Shell
<?php
/**
* @version $Id$
* @package JSN_Framework
* @author JoomlaShine Team <support@joomlashine.com>
* @copyright Copyright (C) 2012 JoomlaShine.com. All Rights Reserved.
* @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
*
* Websites: http://www.joomlashine.com
* Technical Support: Feedback - http://www.joomlashine.com/contact-us/get-support.html
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// Import necessary Joomla libraries
jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');
/**
* System plugin for initializing JSN Framework.
*
* @package JSN_Framework
* @since 1.0.0
*/
class PlgSystemJSNFramework extends JPlugin
{
/**
* @var JApplication
*/
private static $_app = null;
/**
* Register JSN Framework initialization.
*
* @return void
*/
public function onAfterInitialise()
{
// Initialize JSN Framework
require_once dirname(__FILE__) . '/libraries/loader.php';
require_once dirname(__FILE__) . '/jsnframework.defines.php';
// Get application object
self::$_app = JFactory::getApplication();
// Get requested component, view and task
$this->option = self::$_app->input->getCmd('option');
$this->view = self::$_app->input->getCmd('view');
$this->task = self::$_app->input->getCmd('task');
// Redirect to update page if necessary
if ($this->option == 'com_installer' AND $this->view == 'update' AND $this->task == 'update.update' AND count($cid = (array) self::$_app->input->getVar('cid', array())))
{
// Check if extension to updated is JoomlaShine product
$db = JFactory::getDbo();
$q = $db->getQuery(true);
$q->select('element');
$q->from('#__updates');
$q->where('update_id = ' . (int) $cid[0]);
$db->setQuery($q);
$ext = $db->loadResult();
if (in_array($ext, JSNVersion::$products))
{
return self::$_app->redirect('index.php?option=' . $ext . '&view=update');
}
}
// Get active language
$lang = JFactory::getLanguage();
// Check if language file exists for active language
if ( ! file_exists(JPATH_ROOT . '/administrator/language/' . $lang->get('tag') . '/' . $lang->get('tag') . '.plg_system_jsnframework.ini'))
{
// If requested component has the language file, install then load it
if (file_exists(JPATH_ROOT . '/administrator/components/' . $this->option . '/language/admin/' . $lang->get('tag') . '/' . $lang->get('tag') . '.plg_system_jsnframework.ini'))
{
JSNLanguageHelper::install((array) $lang->get('tag'), false, true);
$lang->load('plg_system_jsnframework', JPATH_ADMINISTRATOR, null, true);
}
// Otherwise, try to load language file from plugin directory
else
{
$lang->load('plg_system_jsnframework', JSN_PATH_FRAMEWORK, null, true);
}
}
else
{
$lang->load('plg_system_jsnframework', JPATH_ADMINISTRATOR, null, true);
}
// Disable notice and warning by default for our products.
// The reason for doing this is if any notice or warning appeared then handling JSON string will fail in our code.
if (function_exists('error_reporting') AND in_array($this->option, JSNVersion::$products))
{
error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE & ~E_STRICT);
}
// Set event handlers to detect and update dependency installation / removal
self::$_app->registerEvent('onExtensionAfterInstall', 'jsnExtFrameworkUpdateDependencyAfterInstallExtension');
self::$_app->registerEvent('onExtensionBeforeUninstall', 'jsnExtFrameworkUpdateDependencyBeforeUninstallExtension');
}
/**
* Event handler to re-parse request URI.
*
* @return void
*/
public function onAfterRoute()
{
// Get installed Joomla version
$JVersion = new JVersion;
$JVersion = $JVersion->getShortVersion();
$option = trim((string) $this->option);
if (self::$_app->isAdmin() && version_compare($JVersion, '3.0', '>=') && in_array($option, JSNVersion::$products))
{
$manifestFile = JPATH_ADMINISTRATOR . '/components/' . $option . '/' . str_replace('com_', '', $option) . '.xml';
if (file_exists($manifestFile))
{
$xml = JSNUtilsXml::load($manifestFile);
$attr = $xml->attributes();
if (count($attr))
{
if (isset($attr['version']) && (string) $attr['version'] != '')
{
$version = (string) $attr['version'];
if ($option == 'com_imageshow')
{
$version = str_replace('.x', '.0', $version);
}
if (version_compare($version, '3.0', '<'))
{
// Check if all JSN Extensions are compatible with Joomla 3.x, if not, redirect to index.php and show a warning message
self::$_app->enqueueMessage(JText::sprintf('You are running a Joomla 2.5 version of %1$s on Joomla 3.x. Please download %1$s for Joomla 3.x and reinstall via Joomla! Installer to fix the problem.', 'JSN ' . ucfirst(str_replace('com_', '', $option))), 'warning');
self::$_app->redirect('index.php');
return false;
}
}
}
}
}
// Make sure our onAfterRender event handler is the last one executed
self::$_app->registerEvent('onAfterRender', 'jsnExtFrameworkFinalize');
}
/**
* Before render needs using this function to make format of HTML of modules
*
* @return Changed HTML format
*/
public function onBeforeRender()
{
if ( ! JSNVersion::isJoomlaCompatible(JSN_FRAMEWORK_REQUIRED_JOOMLA_VER))
{
return;
}
if (self::$_app->isAdmin())
{
// Ask user to review JoomlaShine product on JED
$this->askForReview();
}
elseif (JSNVersion::isJoomlaCompatible('3.0') AND self::$_app->input->getCmd('poweradmin', 0) == 1)
{
$jsnHelper = JSNPositionsModel::_getInstance();
$jsnHelper->renderEmptyModule();
}
}
/**
* Do some output manipulation.
*
* Auto-inject <b>jsn-master tmpl-nameOfDefaultTemplate</b> into the class
* attribute of <b><body></b> tag if not already exists. This
* automation only affects backend page.
*
* @return void
*/
public static function onAfterRender()
{
// Make sure the remaining process is executed in last order
if ( ! defined('JSN_EXTFW_LAST_EXECUTION'))
{
return;
}
// Get active component
$option = self::$_app->input->getCmd('option');
// Get the rendered HTML code
$html = JResponse::getBody();
if (self::$_app->input->getVar('poweradmin'))
{
if (preg_match_all('#<a[^\>]*href\s*=\s*[\'"]([^"]*[^"]+)[\'"]#i', $html, $ms, PREG_SET_ORDER))
{
foreach ($ms as $m)
{
$html = str_replace($m[0], str_replace($m[1], 'javascript:void(0)', $m[0]), $html);
}
}
}
// Do some fixes if this is admin page
if (self::$_app->isAdmin())
{
// Fix asset links for Joomla 2.5
if (JSNVersion::isJoomlaCompatible('2.5') AND ! JSNVersion::isJoomlaCompatible('3.0') AND strpos($html, JSN_URL_ASSETS) !== false)
{
// Get asset link
if (preg_match_all('#<(link|script)([^\>]*)(href|src)="([^"]*' . JSN_URL_ASSETS . '[^"]+)"#i', $html, $matches, PREG_SET_ORDER))
{
foreach ($matches AS $match)
{
// Do replace
$html = str_replace(
$match[0],
'<' . $match[1] . $match[2] . $match[3] . '="' . dirname(dirname($match[4])) . '/' . str_replace('.', '-', basename(dirname($match[4]))) . '/' . basename($match[4]) . '"',
$html
);
}
}
}
// Remove our extensions from the Joomla 3.0's global config page
if ($option == 'com_config' AND JSNVersion::isJoomlaCompatible('3.0'))
{
$html = preg_replace(
'#<li>[\r\n]+\t+<a href="index.php\?option=com_config&view=component&component=(' . implode('|', JSNVersion::$products) . ')">[^<]+</a>[\r\n]+\t+</li>#',
'',
$html
);
}
// Alter body tag
if (preg_match('/<body[^>]*>/i', $html, $match) AND strpos($match[0], 'jsn-master tmpl-' . self::$_app->getTemplate()) === false)
{
if (strpos($match[0], 'class=') === false)
{
$match[1] = substr($match[0], 0, -1) . ' class=" jsn-master tmpl-' . self::$_app->getTemplate() . ' ">';
}
else
{
$match[1] = str_replace('class="', 'class=" jsn-master tmpl-' . self::$_app->getTemplate() . ' ', $match[0]);
}
$html = str_replace($match[0], $match[1], $html);
}
if (JSNVersion::isJoomlaCompatible('3.2'))
{
// Clean-up HTML5 fall-back script if running on Joomla 3.2
if (in_array($option, JSNVersion::$products)
AND preg_match('#[\r\n][\s\t]+<script src="[^"]*/media/system/js/html5fallback(-uncompressed)?\.js"[^>]+></script>#', $html, $match))
{
$html = str_replace($match[0], '', $html);
}
// Temporary fix jQuery version conflict on Joomla 3.2
$pos = strpos($html, JSN_URL_ASSETS . '/3rd-party/jquery/jquery.min.js');
if ($pos !== false AND preg_match('#<script[^>]+src="' . JSN_URL_ASSETS . '/3rd-party/jquery/jquery.min.js"[^>]*></script>#', $html, $match))
{
$html = explode($match[0], $html);
// Do some tricks on multiple jQuery instances
$script = '<script type="text/javascript">'
. "\n\t\t" . '(JoomlaShine = window.JoomlaShine || {});'
. "\n\t\t" . '(!window.jQuery || (JoomlaShine.jQueryBackup = jQuery));'
. "\n\t" . '</script>'
. "\n\t" . $match[0];
// Update document header
$html[0] .= $script;
// Truncate content
$html[2] = substr($html[1], strpos($html[1], '</head>'));
$html[1] = substr($html[1], 0, strpos($html[1], '</head>'));
if (preg_match('#<script[^>]+src="[^"]*/media/jui/js/jquery(\.min)?\.js"[^>]*></script>#', $html[1], $match))
{
$script = '<script type="text/javascript">'
. "\n\t\t" . '(JoomlaShine = window.JoomlaShine || {});'
. "\n\t\t" . '(!window.jQuery || (JoomlaShine.jQuery = jQuery));'
. "\n\t" . '</script>'
. "\n\t" . $match[0];
// Update document header
$html[1] = str_replace($match[0], $script, $html[1]);
}
elseif (preg_match('#<script[^>]+src="[^"]*/js/template\.js[^"]*"[^>]*></script>#', $html[1], $match))
{
$script = '<script type="text/javascript">'
. "\n\t\t" . '(JoomlaShine = window.JoomlaShine || {});'
. "\n\t\t" . '(!window.jQuery || (JoomlaShine.jQuery = jQuery));'
. "\n\t\t" . '(!JoomlaShine.jQueryBackup || (jQuery = JoomlaShine.jQueryBackup));'
. "\n\t" . '</script>'
. "\n\t" . $match[0];
// Update document header
$html[1] = str_replace($match[0], $script, $html[1]);
}
elseif (preg_match('#<script type="text/javascript">#', $html[1], $match))
{
$script = '<script type="text/javascript">'
. "\n\t\t" . '(JoomlaShine = window.JoomlaShine || {});'
. "\n\t\t" . '(!window.jQuery || (JoomlaShine.jQuery = jQuery));'
. "\n\t\t" . '(!JoomlaShine.jQueryBackup || (jQuery = JoomlaShine.jQueryBackup));';
// Update document header
$html[1] = str_replace($match[0], $script, $html[1]);
}
$html = implode($html);
// Fix for (function($) { ... })(jQuery);
$tmp = preg_split('/\}[\s\t\r\n]*\)*\([^\r\n]*jQuery[^\r\n]*\)\s*;?/', $html);
$html = '';
$i = 0;
foreach ($tmp AS $part)
{
$i++;
if ($i == count($tmp))
{
$html .= $part;
}
else
{
$parts = preg_split('/\(\s*function\s*\(\s*\$\s*\)\s*\{/', $part, 2);
if (count($parts) < 2)
{
$html .= $part;
}
elseif (stripos($parts[1], 'jsn') !== false)
{
$html .= "{$parts[0]}(function($) {{$parts[1]}})((window.JoomlaShine && JoomlaShine.jQuery) ? JoomlaShine.jQuery : jQuery);";
}
else
{
$html .= "{$parts[0]}(function($) {{$parts[1]}})(jQuery);";
}
}
}
// Remove JSN ImageShow's buggy fix for jQuery conflict
if (strpos($html, 'administrator/components/com_imageshow/assets/js/joomlashine/jquery.safe.element.js') !== false)
{
$html = preg_replace('#[\r\n][\s\t]*<script[^>]+src="[^"]*/joomlashine/jquery.safe.element.js[^"]*"[^>]*></script>#', '', $html);
}
}
}
}
// Attach JS declaration
$html = str_replace('</head>', JSNHtmlAsset::buildHeader() . '</head>', $html);
// Optimize script tags position
self::moveScriptTags($html);
// Fix compatibility problem between require.js and RokPad editor
if (strpos($html, '/plugins/editors/rokpad/'))
{
if (preg_match_all('#[\r\n][\s\t]*<script[^>]+src="[^"]*/plugins/editors/rokpad/[^"]+"[^>]*></script>#', $html, $matches, PREG_SET_ORDER))
{
foreach ($matches AS $match)
{
// Clean the script tag from its original position
$html = str_replace($match[0], '', $html);
// Inject the removed script tag into the end of head section
$html = str_replace('</head>', $match[0] . '</head>', $html);
}
}
}
// Set new response body
JResponse::setBody($html);
// Execute update checker
if ( ! JSNVersion::isJoomlaCompatible('3.1'))
{
if ( isset($this) )
{
$this->checkUpdate();
}
}
}
/**
* Proceed positions rendering
*
* Remove default tp=1 layout, replace by jsn style to
* show page positions
*
* @return void
*/
public function onAfterDispatch()
{
if ( ! JSNVersion::isJoomlaCompatible(JSN_FRAMEWORK_REQUIRED_JOOMLA_VER))
{
return;
}
// Keep this for joomla 2.5. Will be deprecated.
if (JSNVersion::isJoomlaCompatible('2.5') AND ! JSNVersion::isJoomlaCompatible('3.0'))
{
if (self::$_app->isAdmin()
AND self::$_app->input->getVar('format', '') != 'raw'
AND self::$_app->input->getVar('option', '') == 'com_poweradmin'
AND self::$_app->input->getVar('view') != 'update'
AND self::$_app->input->getVar('view') != 'changeposition')
{
$version = PoweradminHelper::getVersion();
if (version_compare($version, '1.1.3', '>='))
{
$JSNMedia = JSNFactory::getMedia();
$JSNMedia->addMedia();
}
}
}
if (self::$_app->input->getCmd('poweradmin', 0) == 1)
{
$jsnHelper = JSNPositionsModel::_getInstance();
$jsnHelper->renderEmptyComponent();
$jsnHelper->renderEmptyModule();
}
}
/**
* Method to move all script tags from head section to the end of body section.
*
* @param string &$html Generated response body.
*
* @return void
*/
private static function moveScriptTags(&$html)
{
// Get active component
$option = self::$_app->input->getCmd('option');
// First, check if current page is rendered by our products
if ( ! in_array($option, JSNVersion::$products))
{
return;
}
// Second, check if script movement is already done by our template framework
if (defined('JSN_TPLFW_SCRIPTS_MOVEMENT_COMPLETED'))
{
return;
}
// Now, get configuration for our product
$cfg = JSNConfigHelper::get($option);
// Do not continue if script movement is disabled
if ( ! $cfg->get('script_movement'))
{
return;
}
// Move all script tags to the end of body section
if ((self::$_app->isSite() OR in_array($option, JSNVersion::$products)) AND $n = count($parts = preg_split('/>[\s\t\r\n]*<script/', $html)))
{
// Re-generated script tags
$tags = array();
// Inline script code block combination status
$combine = array();
$last = 'inline';
// Re-generate HTML document
$temp = $parts[0];
for ($i = 1; $i < $n; $i++)
{
// Get script tag
$script = substr($parts[$i], 0, strpos($parts[$i], '</script') + 8);
// Remove script tag from its original position
$parts[$i] = str_replace($script, '', $parts[$i]);
// Leave script tag as is if it is placed inside conditional comments
if ((preg_match('/([\r\n][\s\t]*)<\!--\[if[^\]]*IE[^\]]*\]/', $temp, $match) AND strpos($temp, '<![endif]--') === false) OR (isset($notClosed) AND $notClosed))
{
$temp .= '>' . (isset($match[1]) ? $match[1] : '') . '<script' . $script . $parts[$i];
// Look for the end of conditional comments
$notClosed = strpos($parts[$i], '<![endif]--') !== false ? false : true;
// Continue the loop
continue;
}
// Leave script code block as is if document.write function is used inside
if (strpos($script, 'document.write') !== false)
{
$temp .= ">\n<script" . $script . $parts[$i];
// Continue the loop
continue;
}
// Re-generate HTML document
$temp .= $parts[$i];
// Complete script tag
$script = '<script' . $script . '>';
if (strpos(preg_replace(array('/[\s\t\r\n]+/', '/[\s\t\r\n]+=[\s\t\r\n]+/'), array(' ', '='), $script), ' src=') === false)
{
// Clean-up inline script block
$script = substr($script, strpos($script, '>') + 1, -9);
if ($last == 'inline')
{
// Combine continuous script code block
$combine[] = $script;
}
else
{
$combine = array($script);
$last = 'inline';
}
}
else
{
// Copy combined script code block
! count($combine) OR $tags[] = '<script type="text/javascript">' . implode(";\n", $combine) . '</script>';
// Copy script tag
$tags[] = $script;
// Reset variables
$combine = array();
$last = '';
}
}
// Copy remaining combined script code block
! count($combine) OR $tags[] = '<script type="text/javascript">' . implode(";\n", $combine) . '</script>';
// Inject all re-generated script tags to the end of body section
if (count($tags))
{
$html = str_replace('</body>', implode("\n", $tags) . '</body>', $temp);
// Define a constant to state that scripts movement is completed
define('JSN_EXTFW_SCRIPTS_MOVEMENT_COMPLETED', 1);
}
}
}
/**
* Ask user to review JoomlaShine product on JED.
*
* @return void
*/
private function askForReview()
{
// Continue only if this is admin page of JoomlaShine product
if (self::$_app->isAdmin() AND in_array($this->option, JSNVersion::$products))
{
// Get product options
$config = JSNConfigHelper::get($this->option);
if ($config->get('review_popup', 1))
{
// Get time difference
$time = time();
$last = $config->get('last_ask_for_review', 0);
if ($last == 0)
{
$last = filemtime(JPATH_ROOT . "/administrator/components/{$this->option}/" . substr($this->option, 4) . '.xml');
}
// Check if it's time to ask for review
if ($time - $last >= REVIEW_POPUP_PERIOD)
{
// Load script to popup a modal ask user for review
JSNHtmlAsset::loadScript(
'jsn/askforreview',
array(
'url' => JUri::root() . "plugins/system/jsnframework/libraries/joomlashine/choosers/review/index.php?component={$this->option}",
'language' => JSNUtilsLanguage::getTranslated(array('JSN_EXTFW_CHOOSERS_REVIEW_ON_JED'))
)
);
// Get config model
$model = new JSNConfigModel;
// Store time of last popup
$form = $model->getForm(array(), true, JPATH_ROOT . '/administrator/components/' . $this->option . '/config.xml');
$data = array('last_ask_for_review' => $time);
try
{
// Save new configuration
$model->save($form, $data);
}
catch (Exception $e)
{
// Do nothing as this is a background process
}
}
}
}
}
/**
* Check if there is new update for installed JoomlaShine product.
*
* @return mixed
*/
private function checkUpdate()
{
// Initialize extensions to check for update
$exts = array($this->option);
// Get Joomla version
$joomlaVersion = new JVersion;
// Get list of JoomlaShine product need to be checked for new update
$checks = $products = array();
foreach ($exts AS $product)
{
// Instantiate JSN Config model
self::$_app->input->set('option', $product);
$model = new JSNConfigModel;
// Only continue if product is installed
if (is_readable(JPATH_ROOT . '/administrator/components/' . $product . '/config.xml'))
{
// Get product configuration
$cfg = JSNConfigHelper::get($product);
if ( ! $cfg->get('config-table-not-exists') AND ! $cfg->get('live_update_checking', 0))
{
if (time() - $cfg->get('live_update_last_check', 0) >= ((int) $cfg->get('live_update_check_interval', 6) * 60 * 60))
{
// Store necessary data to config table
$form = $model->getForm(array(), true, JPATH_ROOT . '/administrator/components/' . $product . '/config.xml');
$data = array('live_update_checking' => 1);
try
{
$model->save($form, $data);
// Store product for checking new update later
file_exists($define = JPATH_ROOT . '/administrator/components/' . $product . '/' . substr($product, 4) . '.defines.php')
OR file_exists($define = JPATH_ROOT . '/administrator/components/' . $product . '/defines.' . substr($product, 4) . '.php')
OR file_exists($define = JPATH_ROOT . '/administrator/components/' . $product . '/defines.php')
OR $define = null;
if ( ! empty($define))
{
if ($product == 'com_imageshow' AND ! class_exists('JSNISFactory'))
{
// JSN ImageShow specific fix
if (file_exists(JPATH_ROOT . '/administrator/components/com_imageshow/classes/jsn_is_factory.php'))
{
require_once JPATH_ROOT . '/administrator/components/com_imageshow/classes/jsn_is_factory.php';
}
else
{
// Do nothing as this is a background process
continue;
}
}
require_once $define;
$products[JSNUtilsText::getConstant('IDENTIFIED_NAME')] = $product;
$checks[JSNUtilsText::getConstant('IDENTIFIED_NAME')] = JSNUtilsText::getConstant('VERSION', $product);
}
}
catch (Exception $e)
{
// Do nothing as this is a background process
continue;
}
}
}
}
}
// Check update for installed JoomlaShine product
if (count($products))
{
if ($checks = JSNUpdateHelper::check($checks, $joomlaVersion->RELEASE))
{
// Get database object
$db = JFactory::getDbo();
foreach ($checks AS $id => & $result)
{
// Instantiate JSN Config model
self::$_app->input->set('option', $products[$id]);
$model = new JSNConfigModel;
// Get product configuration
$cfg = JSNConfigHelper::get($products[$id]);
// Decode last update info
$last = is_string($last = $cfg->get('live_update_last_notified', '{"version":"0.0.0"}')) ? json_decode($last) : $last;
if ($result AND version_compare($result->version, $last->version, '>'))
{
// Get product details
if ($info = JSNUtilsXml::loadManifestCache($products[$id]))
{
$name = 'JSN ' . preg_replace('/^JSN\s*/i', '', $info->name) . (($edition = JSNUtilsText::getConstant('EDITION', $products[$id])) ? ' ' . $edition : '');
/*if ( ! JSNVersion::isJoomlaCompatible('3.1'))
{
// Get extension ID
$q = $db->getQuery(true);
$q->select('extension_id');
$q->from('#__extensions');
$q->where("element = '" . $products[$id] . "'");
$q->where("type = 'component'", 'AND');
$db->setQuery($q);
$eid = $db->loadResult();
// Check if update is stored before
$q = $db->getQuery(true);
$q->select('version');
$q->from('#__updates');
$q->where("extension_id = '{$eid}'");
$db->setQuery($q);
// Store update info to Joomla updates table
if ($current = $db->loadResult())
{
$q = $db->getQuery(true);
$q->update('#__updates');
$q->set("version = '{$result->version}'");
$q->where("extension_id = '{$eid}'");
$q->where("version = '{$current}'", 'AND');
}
else
{
$q = $db->getQuery(true);
$q->insert('#__updates');
$q->columns('extension_id, name, element, type, version');
$q->values("{$eid}, '{$name}', '{$products[$id]}', 'component', '{$result->version}'");
}
$db->setQuery($q);
$db->execute();
}
else
{*/
// Generate XML content for latest update
$xml[] = '<?xml version="1.0" encoding="utf-8"?>';
$xml[] = '<extensionset name="JoomlaShine Extensions" description="JoomlaShine Extensions Updates">';
$xml[] = ' <extension name="' . $name . '" element="' . $products[$id] . '" type="component" client="administrator" version="' . $result->version . '" detailsurl="" />';
$xml[] = '</extensionset>';
// Write XML content to a local cache file
JFile::write(JFactory::getConfig()->get('tmp_path') . '/' . str_replace('com_', 'jsn_', $products[$id]) . '_update.xml', implode("\n", $xml));
//}
if ($cfg->get('live_update_notification', 0))
{
// Get super administrator account to notify about update available
if ( ! isset($admins))
{
// Get Joomla config
$joomlaConfig = JFactory::getConfig();
// Build query to get super administrator account
$q = $db->getQuery(true);
$q->select('u.id, u.email');
$q->from('#__user_usergroup_map AS g');
$q->join('INNER', '#__users AS u ON g.user_id = u.id');
$q->where('g.group_id = 8');
$q->where('u.sendEmail = 1');
$q->where('u.block = 0');
$db->setQuery($q);
try
{
if ( ! ($admins = $db->loadObjectList()))
{
return;
}
}
catch (Exception $e)
{
return;
}
}
// Generate replacement
$substitutions = array(
'__SITE_NAME__' => $joomlaConfig->get('sitename'),
'__SITE_URL__' => JUri::root(),
'__PRODUCT__' => $name,
'__CURRENT__' => JSNUtilsText::getConstant('VERSION', $products[$id]),
'__NEW__' => $result->version,
'__LINK__' => JUri::root() . 'administrator/index.php?option=' . $products[$id] . '&view=update'
);
// Initialize email subject and message
$subject = JText::_('JSN_EXTFW_UPDATE_NOTIFICATION_SUBJECT');
$message = JText::_('JSN_EXTFW_UPDATE_NOTIFICATION_MESSAGE');
foreach ($substitutions AS $k => $v)
{
$subject = str_replace($k, $v, $subject);
$message = str_replace($k, $v, $message);
}
foreach ($admins AS $admin)
{
// Initialize mailer then send update notification email
try
{
$mailer = JFactory::getMailer();
$mailer->setSender(array($joomlaConfig->get('mailfrom'), $joomlaConfig->get('fromname')));
$mailer->addRecipient($admin->email);
$mailer->setSubject($subject);
$mailer->setBody($message);
$mailer->Send();
}
catch (Exception $e)
{
return;
}
}
}
}
}
// Store last check update time
$form = $model->getForm(array(), true, JPATH_ROOT . '/administrator/components/' . $products[$id] . '/config.xml');
$data = array('live_update_checking' => '0', 'live_update_last_check' => time());
if ($result)
{
// Store last version notified
$data['live_update_last_notified'] = json_encode($result);
}
try
{
$model->save($form, $data);
}
catch (Exception $e)
{
// Do nothing as this is a background process
continue;
}
}
}
}
// Restore current option
self::$_app->input->set('option', $this->option);
// In Joomla! 3.1, return generated XML content about latest update
//if (JSNVersion::isJoomlaCompatible('3.1'))
//{
if (isset($xml))
{
return implode("\n", $xml);
}
elseif (is_readable($cache = JFactory::getConfig()->get('tmp_path') . '/' . str_replace('com_', 'jsn_', $this->option) . '_update.xml'))
{
return JFile::read($cache);
}
else
{
return '<?xml version="1.0" encoding="utf-8"?><extensionset />';
}
//}
}
}
/**
* Finalize response body.
*
* @return void
*/
function jsnExtFrameworkFinalize()
{
define('JSN_EXTFW_LAST_EXECUTION', 1);
PlgSystemJSNFramework::onAfterRender();
}
/**
* Update dependency after an extension is installed.
*
* @param object $installer Joomla installer object.
* @param mixed $identifier Extension ID on installation success, boolean FALSE otherwise.
*
* @return void
*/
function jsnExtFrameworkUpdateDependencyAfterInstallExtension($installer, $identifier)
{
if (is_integer($identifier))
{
// Get installed extension
$ext = basename($installer->getPath('extension_administrator'));
// Check if our product is installed
if (in_array($ext, JSNVersion::$products))
{
// Build query to get dependency installation status
$db = JFactory::getDbo();
$q = $db->getQuery(true);
$q->select('manifest_cache, custom_data');
$q->from('#__extensions');
$q->where("element = 'jsnframework'");
$q->where("type = 'plugin'", 'AND');
$q->where("folder = 'system'", 'AND');
$db->setQuery($q);
// Load dependency installation status
$status = $db->loadObject();
$ext = substr($ext, 4);
$dep = ! empty($status->custom_data) ? (array) json_decode($status->custom_data) : array();
// Update dependency list
in_array($ext, $dep) OR $dep[] = $ext;
$status->custom_data = array_unique($dep);
// Build query to update dependency data
$q = $db->getQuery(true);
$q->update('#__extensions');
$q->set("custom_data = '" . json_encode($status->custom_data) . "'");
// Backward compatible: keep data in this column for older product to recognize
$manifestCache = json_decode($status->manifest_cache);
$manifestCache->dependency = $status->custom_data;
$q->set("manifest_cache = '" . json_encode($manifestCache) . "'");
// Backward compatible: keep data in this column also for another old product to recognize
$q->set("params = '" . json_encode((object) array_combine($status->custom_data, $status->custom_data)) . "'");
$q->where("element = 'jsnframework'");
$q->where("type = 'plugin'", 'AND');
$q->where("folder = 'system'", 'AND');
$db->setQuery($q);
$db->execute();
}
}
}
/**
* Update dependency before an extension is being removed.
*
* @param integer $identifier Extension ID.
*
* @return boolean
*/
function jsnExtFrameworkUpdateDependencyBeforeUninstallExtension($identifier)
{
// Get extension being removed
$ext = JTable::getInstance('Extension');
$ext->load($identifier);
$ext = $ext->element;
// Check if our product is being removed
if (in_array($ext, JSNVersion::$products))
{
// Build query to get dependency installation status
$db = JFactory::getDbo();
$q = $db->getQuery(true);
$q->select('manifest_cache, custom_data');
$q->from('#__extensions');
$q->where("element = 'jsnframework'");
$q->where("type = 'plugin'", 'AND');
$q->where("folder = 'system'", 'AND');
$db->setQuery($q);
// Load dependency installation status
$status = $db->loadObject();
$ext = substr($ext, 4);
$deps = ! empty($status->custom_data) ? (array) json_decode($status->custom_data) : array();
// Update dependency tracking
$status->custom_data = array();
foreach ($deps AS $dep)
{
// Backward compatible: ensure that product is not removed
// if ($dep != $ext)
if ($dep != $ext AND is_dir(JPATH_BASE . '/components/com_' . $dep))
{
$status->custom_data[] = $dep;
}
}
// Build query to update dependency data
$q = $db->getQuery(true);
$q->update('#__extensions');
$q->set("custom_data = '" . json_encode($status->custom_data) . "'");
// Backward compatible: keep data in this column for older product to recognize
$manifestCache = json_decode($status->manifest_cache);
$manifestCache->dependency = $status->custom_data;
$q->set("manifest_cache = '" . json_encode($manifestCache) . "'");
// Backward compatible: keep data in this column also for another old product to recognize
$q->set("params = '" . (count($status->custom_data) ? json_encode((object) array_combine($status->custom_data, $status->custom_data)) : '') . "'");
$q->where("element = 'jsnframework'");
$q->where("type = 'plugin'", 'AND');
$q->where("folder = 'system'", 'AND');
$db->setQuery($q);
$db->execute();
}
// Always return TRUE so the extension can be removed
return true;
}
Zerion Mini Shell 1.0