/** * Display method. * * @param string $tpl The name of the template file to parse. * * @return void */ public function display($tpl = null) { $app = JFactory::getApplication(); // Is product upgradable? if (!($edition = JSNUtilsText::getConstant('EDITION')) or strcasecmp($edition, 'pro unlimited') == 0) { $app->redirect('index.php?option=' . $app->input->getCmd('option') . '&view=update'); } // Get product info $info = JSNUtilsXml::loadManifestCache(); // Pass data to view $this->assignRef('product', $info); // Display the template parent::display($tpl); }
public static function aboutHelp($links = array()) { $links['doc'] = JSNUtilsText::getConstant('DOC_LINK'); $html[] = '<div> <h3 class="jsn-section-header">' . JText::_('JSN_EXTFW_ABOUT_HELP') . '</h3> <p>' . JText::_('JSN_EXTFW_ABOUT_HAVE_PROBLEMS') . ':</p> <ul>'; if (!empty($links['doc'])) { $html[] = ' <li>' . JText::sprintf('JSN_EXTFW_ABOUT_READ_DOCS', JRoute::_($links['doc'])) . '</li>'; } $html[] = ' <li>' . JText::_('JSN_EXTFW_ABOUT_ASK_FORUM') . '</li> <li>' . JText::_('JSN_EXTFW_ABOUT_DEDICATED_SUPPORT') . '</li> </ul> </div>'; return implode($html); }
/** * This task will be send list of editions to the client in JSON format. * * @return void */ public function editions() { // Initialize variables $input = JFactory::getApplication()->input; $jVer = new JVersion(); $info = JSNUtilsXml::loadManifestCache(); // Get product edition and identified name $edition = strtolower(JSNUtilsText::getConstant('EDITION')); $identified = ($identified = JSNUtilsText::getConstant('IDENTIFIED_NAME')) ? $identified : strtolower($info->name); // Build query string $query[] = 'joomla_version=' . urlencode($jVer->RELEASE); $query[] = 'username='******'customer_username')); $query[] = 'password='******'customer_password')); $query[] = 'identified_name=' . ($input->getCmd('id') ? urlencode($input->getCmd('id')) : urlencode($identified)); // Finalize link $url = str_replace('upgrade=yes', 'upgrade=no', JSN_EXT_DOWNLOAD_UPDATE_URL) . '&' . implode('&', $query); // Get results try { $result = JSNUtilsHttp::get($url); if (substr($result['body'], 0, 3) == 'ERR') { jexit(json_encode(array('message' => JText::_('JSN_EXTFW_LIGHTCART_ERROR_' . $result['body']), 'type' => 'error'))); } // JSON-decode the result $result = json_decode($result['body']); if (is_null($result)) { jexit(json_encode(array('message' => JText::_('JSN_EXTFW_VERSION_CHECK_FAIL'), 'type' => 'error'))); } if ($edition != 'free') { if (!in_array('PRO UNLIMITED', $result->editions)) { jexit(json_encode(array('message' => JText::sprintf('JSN_EXTFW_UPGRADE_YOUR_ACCOUNT_IS_NOT_PROVIDED_WITH_UNLIMITED_EDITION', JText::_($info->name) . ' PRO Unlimited'), 'type' => 'error'))); } $result->editions = array('PRO UNLIMITED'); } jexit(json_encode($result->editions)); } catch (Exception $e) { jexit(json_encode(array('message' => JText::_('JSN_EXTFW_VERSION_CHECK_FAIL'), 'type' => 'error'))); } }
/** * Generate markup for message configuration. * * @param array $msgs Queried messages. * * @return string */ public static function showConfig($msgs = array()) { // Parse configuration declaration $xml = JSNUtilsXml::load(JPATH_COMPONENT_ADMINISTRATOR . '/config.xml'); $html[] = ' <table border="0" class="table table-bordered"> <thead> <tr> <th width="20" class="center">#</th> <th class="center">' . JText::_('JSN_EXTFW_MESSAGE') . '</th> <th width="150" nowrap="nowrap" class="center">' . JText::_('JSN_EXTFW_MESSAGE_SCREEN') . '</th> <th width="80" nowrap="nowrap" class="center">' . JText::_('JSN_EXTFW_MESSAGE_ORDER') . '</th> <th width="80" nowrap="nowrap" class="center">' . JText::_('JSN_EXTFW_MESSAGE_SHOW') . '</th> </tr> </thead> <tbody>'; for ($i = 0, $n = count($msgs); $i < $n; $i++) { $msg =& $msgs[$i]; $scr = $xml->xpath('//field[@type="messagelist"]/option[@value="' . $msg->msg_screen . '"]'); $html[] = ' <tr> <td class="center">' . ($i + 1) . '</td> <td><span title="::' . htmlspecialchars(strip_tags(JText::_('MESSAGE_' . $msg->msg_screen . '_' . $msg->ordering . '_PRIMARY'))) . '" class="editlinktip hasTip">' . JSNUtilsText::getWords(strip_tags(JText::_('MESSAGE_' . $msg->msg_screen . '_' . $msg->ordering . '_PRIMARY')), 15) . '</span></td> <td class="center">' . JText::_((string) $scr[0]) . '</td> <td class="center">' . $msg->ordering . '</td> <td class="center"><input type="checkbox"' . ($msg->published ? ' checked="checked"' : '') . ' value="' . $msg->msg_id . '" name="messages[]" /></td> </tr>'; if ($msg->published) { $html[] = '<input type="hidden" name="messagelist[]" value="' . $msg->msg_id . '" />'; } } $html[] = ' </tbody> </table> '; return implode($html); }
function getCurrentElementsOfImageShow() { $indentifiedNames = array(); $indentifiedNames[JSNUtilsText::getConstant('IDENTIFIED_NAME', 'framework')] = JSNUtilsText::getConstant('VERSION', 'framework'); $indentifiedNames[JSN_IMAGESHOW_IDENTIFIED_NAME] = $this->getVersion(); // Gets all themes $modelThemePlugin = JModelLegacy::getInstance('plugins', 'imageshowmodel'); $themeItems = $modelThemePlugin->getFullData(); if (count($themeItems)) { for ($i = 0, $count = count($themeItems); $i < $count; $i++) { $themeItem = $themeItems[$i]; $manifestCachce = json_decode($themeItem->manifest_cache); $indentifiedNames[strtolower($themeItem->element)] = strtolower($manifestCachce->version); } } // Gets all sources $objJSNSource = JSNISFactory::getObj('classes.jsn_is_source'); $listSource = $objJSNSource->getListSources(); if (count($listSource)) { foreach ($listSource as $source) { if ($source->identified_name != 'folder') { $manifestCachce = json_decode($source->pluginInfo->manifest_cache); $indentifiedNames[strtolower($source->identified_name)] = trim($manifestCachce->version); } } } return $indentifiedNames; }
/** * Communicate with JoomlaShine server for latest product version. * * If a product does not have sub-product, the <b>$products</b> parameter * does not required when calling this method: * * <pre>JSNUpdateHelper::check();</pre> * * Result will be returned in the following format: * * <pre>If product update is available: * <code>array( * 'identified_name' => object( * 'name' => 'The product name', * 'identified_name' => 'The product identification', * 'description' => 'The product description', * 'version' => 'The latest product version', * 'authentication' => 'Indicates whether authentication is required when updating product' * ) * )</code> * If the product does not have update: * <code>array( * 'identified_name' => false * )</code></pre> * * If a product has sub-product, this method need to be called as below to * check all sub-product for latest version: * * <pre>JSNUpdateHelper::check( * array( * // Core component * 'imageshow' => '4.2.0', * * // Themes * 'themeclassic' => '1.1.5', * 'themeslider' => '1.0.4', * 'themegrid' => '1.0.0', * * // Sources * 'picasa' => '1.1.2', * 'flickr' => '1.1.2', * 'phoca' => '1.0.1', * 'joomgallery' => '1.0.1', * 'rsgallery2' => '1.0.1', * 'facebook' => '1.0.1' * ) * );</pre> * * In this case, the returned result might look like below: * * <pre>array( * // Core component * 'imageshow' => object( * 'name' => 'JSN ImageShow', * 'identified_name' => 'imageshow', * 'description' => 'Something about JSN ImageShow', * 'version' => '4.3.0', * 'editions' => array( * 0 => object( * 'edition' => 'PRO STANDARD', * 'authentication' => 1 * ), * 1 => object( * 'edition' => 'PRO UNLIMITED', * 'authentication' => 1 * ), * 2 => object( * 'edition' => 'FREE', * 'authentication' => 0 * ) * ) * ), * * // Themes * 'themeclassic' => false, // Product update not available * 'themeslider' => false, // Product update not available * 'themegrid' => object( * 'name' => 'Theme Grid', * 'identified_name' => 'themegrid', * 'description' => 'JSN ImageShow Theme Grid plugin', * 'version' => '1.0.1', * 'edition' => 'FREE', * 'authentication' => 0 * ), * * // Sources * 'picasa' => false, // Product update not available * 'flickr' => false, // Product update not available * 'phoca' => false, // Product update not available * 'joomgallery' => false, // Product update not available * 'rsgallery2' => false, // Product update not available * 'facebook' => object( * 'name' => 'FaceBook', * 'identified_name' => 'facebook', * 'description' => 'JSN ImageShow Image Source Facebook plugin', * 'version' => '1.0.2', * 'edition' => 'FREE', * 'authentication' => 0 * ) * )</pre> * * @param array $products Array of identified name for checking latest version. * @param string $requiredJoomlaVersion Joomla version required by extension, e.g. 2.5, 3.0, etc. * @param array $latestUpdates Latest update response (for use in self recursive call only). * @param array $results Check update results (for use in self recursive call only). * * @return mixed */ public static function check($products = array(), $requiredJoomlaVersion = JSN_FRAMEWORK_REQUIRED_JOOMLA_VER, $latestUpdates = '', $results = '') { // Only communicate with server if check update URLs is not load before if (empty($latestUpdates)) { if (!isset(self::$versions)) { try { // Get Joomla config and input object $config = JFactory::getConfig(); $input = JFactory::getApplication()->input; // Generate cache file path $cache = $config->get('tmp_path') . '/JoomlaShineUpdates.json'; // Get current option and view $option = $input->getCmd('option'); $view = $input->getCmd('view'); // Get latest version from local file if not in about page or cache is not timed out if ((!in_array($option, JSNVersion::$products) or $view != 'about') and is_readable($cache) and time() - filemtime($cache) < CHECK_UPDATE_PERIOD) { // Decode JSON encoded update details self::$versions = json_decode(JFile::read($cache)); } else { // Always update cache file modification time is_writable($cache) and touch($cache, time()); // Communicate with JoomlaShine server via latest version checking URL try { self::$versions = JSNUtilsHttp::get(JSN_EXT_VERSION_CHECK_URL); self::$versions = isset(self::$versions['body']) ? self::$versions['body'] : '{"items":[]}'; // Cache latest version to local file system JFile::write($cache, self::$versions); // Decode JSON encoded update details self::$versions = json_decode(self::$versions); } catch (Exception $e) { throw $e; } } } catch (Exception $e) { throw new Exception(JText::_('JSN_EXTFW_VERSION_CHECK_FAIL')); } } $latestUpdates = self::$versions; } // Prepare product identification if (!is_array($products) or !count($products)) { is_array($products) or $products = array(); // Get the product info $version = JSNUtilsText::getConstant('VERSION'); // Is identified name defined? if ($const = JSNUtilsText::getConstant('IDENTIFIED_NAME')) { $products[$const] = $version; } else { $component = substr(JFactory::getApplication()->input->getCmd('option'), 4); $products[$component] = $version; $products['ext_' . $component] = $version; } } // Get Joomla version $joomlaVersion = new JVersion(); // Preset return results is_array($results) or $results = array(); // Get the latest product version foreach ($products as $product => $current) { if (!isset($results[$product])) { foreach ($latestUpdates->items as $item) { if (isset($item->items)) { $results = self::check(array($product => $current), $requiredJoomlaVersion, $item, $results); continue; } if (isset($item->identified_name) and $item->identified_name == $product) { $results[$product] = $item; break; } } // Does latest product info found? if (isset($results[$product]) and is_object($results[$product])) { // Does product support installed Joomla version? $tags = explode(';', $results[$product]->tags); if (!in_array($joomlaVersion->RELEASE, $tags)) { $results[$product] = false; } // Does product upgradable? if ($results[$product] and !empty($requiredJoomlaVersion) and !JSNVersion::isJoomlaCompatible($requiredJoomlaVersion) and !version_compare($results[$product]->version, $current, '>=')) { $results[$product] = false; } // Does product have newer version? if ($results[$product] and (empty($requiredJoomlaVersion) or JSNVersion::isJoomlaCompatible($requiredJoomlaVersion)) and !version_compare($results[$product]->version, $current, '>')) { $results[$product] = false; } } } } return $results; }
' + (switcher.checked ? 0 : 1)); } }); }); </script> </head> <body class="jsn-master"> <div class="jsn-bootstrap"> <div id="jsn-ask-for-review"> <?php echo JText::sprintf('JSN_EXTFW_CHOOSERS_REVIEW_ON_JED_MESSAGE', preg_replace('/JSN\\s*/i', '', JText::_($product->name))); ?> <div class="form-actions"> <p><a class="btn btn-primary" href="<?php echo JSNUtilsText::getConstant('REVIEW_LINK', $component); ?> " target="_blank"><?php echo JText::_('JSN_EXTFW_CHOOSERS_REVIEW_ON_JED'); ?> </a></p> <div class="control-group"> <label class="checkbox" for="jsn-review-on-jed-switcher"> <input type="checkbox" value="1" name="status" id="jsn-review-on-jed-switcher"<?php echo $config->get('review_popup') ? '' : ' checked="checked"'; ?> /> <span><?php echo JText::_('JSN_EXTFW_CHOOSERS_REVIEW_ON_JED_DISABLE'); ?> </span>
public static function footer($products = array(), $echo = true) { JHTML::_('behavior.tooltip'); // Get extension manifest cache $info = JSNUtilsXml::loadManifestCache('', 'component'); // Initialize variables $name = $info->name; $edition = JSNUtilsText::getConstant('EDITION'); $version = JSNUtilsText::getConstant('VERSION'); // Initialize links $links['info'] = JSNUtilsText::getConstant('INFO_LINK'); $links['doc'] = JSNUtilsText::getConstant('DOC_LINK'); $links['review'] = JSNUtilsText::getConstant('REVIEW_LINK'); $links['update'] = JSNUtilsText::getConstant('UPDATE_LINK'); $links['upgrade'] = JSNUtilsText::getConstant('UPGRADE_LINK'); // Generate markup $html[] = ' <div id="jsn-footer" class="jsn-page-footer jsn-bootstrap"> <div class="pull-left"> <ul class="jsn-footer-menu">' . '<a class="btn btn-primary" style="margin-left: 10px;" href="https://www.joomlashine.com/jsn-easyslider-beta.html" target="_blank">Submit your feedback about JSN EasySlider</a>' . '</ul> <ul class="jsn-footer-menu"> <li class="first">'; if (!empty($links['info'])) { $html[] = ' <a href="' . JRoute::_($links['info']) . '" target="_blank">JSN ' . preg_replace('/JSN\\s*/i', '', JText::_($name)) . ' ' . $edition . ' v' . $version . '</a>'; } else { $html[] = 'JSN ' . preg_replace('/JSN\\s*/i', '', JText::_($name)) . ' ' . $edition . ' v' . $version; } $html[] = ' by <a href="http://www.joomlashine.com" target="_blank">JoomlaShine.com</a>'; if (!empty($edition) and !empty($links['upgrade']) and ($pos = strpos('free + pro standard', strtolower($edition))) !== false) { $html[] = ' <a class="label label-important" href="' . JRoute::_($links['upgrade']) . '"><strong class="jsn-text-attention">' . JText::_($pos ? 'JSN_EXTFW_GENERAL_UPGRADE_TO_PRO_UNLIMITED' : 'JSN_EXTFW_GENERAL_UPGRADE_TO_PRO') . '</strong></a>'; } $html[] = ' </li>'; try { $hasUpdate = false; foreach (JSNUpdateHelper::check($products) as $result) { if ($result) { $hasUpdate = true; break; } } if ($hasUpdate) { $html[] = ' <li id="jsn-global-check-version-result" class="jsn-outdated-version"> <span class="jsn-global-outdated-version">' . JText::_('JSN_EXTFW_GENERAL_UPDATE_AVAILABLE') . '</span> <a href="' . JRoute::_($links['update']) . '" class="label label-important">' . JText::_('JSN_EXTFW_GENERAL_UPDATE_NOW') . '</a> </li>'; } } catch (Exception $e) { // Simply ignore } $html[] = ' </ul> </div> <div class="pull-right"> <ul class="jsn-footer-menu"> <li class="jsn-iconbar first"> <span class="hasTip" title="' . JText::_('JSN_EXTFW_GENERAL_POWERADMIN') . '"><a target="_blank" href="http://www.joomlashine.com/joomla-extensions/jsn-poweradmin.html"> <i class="jsn-icon32 jsn-icon-products jsn-icon-poweradmin"></i> </a></span> <span class="hasTip" title="' . JText::_('JSN_EXTFW_GENERAL_IMAGESHOW') . '"><a target="_blank" href="http://www.joomlashine.com/joomla-extensions/jsn-imageshow.html"> <i class="jsn-icon32 jsn-icon-products jsn-icon-imageshow"></i> </a></span> <span class="hasTip" title="' . JText::_('JSN_EXTFW_GENERAL_UNIFORM') . '"><a target="_blank" href="http://www.joomlashine.com/joomla-extensions/jsn-uniform.html"> <i class="jsn-icon32 jsn-icon-products jsn-icon-uniform"></i> </a></span> <span class="hasTip" title="' . JText::_('JSN_EXTFW_GENERAL_MOBILIZE') . '"><a target="_blank" href="http://www.joomlashine.com/joomla-extensions/jsn-mobilize.html"> <i class="jsn-icon32 jsn-icon-products jsn-icon-mobilize"></i> </a></span> <span class="hasTip" title="' . JText::_('JSN_EXTFW_GENERAL_PAGEBUILDER') . '"><a target="_blank" href="http://www.joomlashine.com/joomla-extensions/jsn-pagebuilder.html"> <i class="jsn-icon32 jsn-icon-products jsn-icon-pagebuilder"></i> </a></span> </li> </ul> </div> <div class="clearbreak"></div> </div> '; if ($echo) { echo implode($html); } else { return implode($html); } }
<div class="jsn-page-update"> <div class="jsn-page-content jsn-rounded-large jsn-box-shadow-large jsn-bootstrap"> <span id="jsn-update-cancel"><a class="jsn-link-action" href="<?php echo JRoute::_('index.php?option=' . $input->getCmd('option')); ?> "> <?php echo JText::_('JCANCEL'); ?> </a></span> <h1><?php echo JText::sprintf('JSN_EXTFW_UPDATE_PAGE_HEAD', $name, $edition); ?> </h1> <?php if (!JSNVersion::isJoomlaCompatible(JSN_FRAMEWORK_REQUIRED_JOOMLA_VER) or !JSNVersion::checkCompatibility(JSNUtilsText::getConstant('IDENTIFIED_NAME'), JSNUtilsText::getConstant('VERSION'))) { // Show a message indicating user that their JoomlaShine product is no longer compatible with the installed JoomlaShine extension framework ?> <div class="alert alert-danger"><?php echo JText::_('JSN_EXTFW_GENERAL_INCOMPATIBLE_ALERT'); ?> </div> <?php } ?> <div id="jsn-update-action"> <p><?php echo JText::sprintf('JSN_EXTFW_UPDATE_PAGE_DESC', $name); ?> </p> <div class="alert alert-info">
/** * Do any preparation needed before doing real data restore. * * @param string &$backup Path to folder containing extracted backup files. * @param boolean $checkEdition Check for matching edition before restore? * * @return void */ protected function beforeRestore(&$backup, $checkEdition = true) { // Initialize variables $com = preg_replace('/^com_/i', '', JFactory::getApplication()->input->getCmd('option')); $info = JSNUtilsXml::loadManifestCache(); $jVer = new JVersion(); // Extract backup file if (!JArchive::extract($backup, substr($backup, 0, -4))) { throw new Exception(JText::_('JSN_EXTFW_DATA_EXTRACT_UPLOAD_FILE_FAIL')); } $backup = substr($backup, 0, -4); // Auto-detect backup XML file $files = glob("{$backup}/*.xml"); foreach ($files as $file) { $this->data = JSNUtilsXml::load($file); // Check if this XML file contain backup data for our product if (strcasecmp($this->data->getName(), 'backup') == 0 and isset($this->data['extension-name']) and isset($this->data['extension-version']) and isset($this->data['joomla-version'])) { // Store backup XML file name $this->xml = basename($file); // Simply break the loop if we found backup file break; } unset($this->data); } if (isset($this->data)) { // Check if Joomla series match if (!$jVer->isCompatible((string) $this->data['joomla-version'])) { throw new Exception(JText::_('JSN_EXTFW_DATA_JOOMLA_VERSION_NOT_MATCH')); } // Check if extension match if ((string) $this->data['extension-name'] != 'JSN ' . preg_replace('/JSN\\s*/i', '', JText::_($info->name))) { throw new Exception(JText::_('JSN_EXTFW_DATA_INVALID_PRODUCT')); } elseif (isset($this->data['extension-edition']) and $checkEdition and (!($const = JSNUtilsText::getConstant('EDITION')) or (string) $this->data['extension-edition'] != $const)) { throw new Exception(JText::_('JSN_EXTFW_DATA_INVALID_PRODUCT_EDITION')); } elseif (!version_compare($info->version, (string) $this->data['extension-version'], '=') and !$checkEdition) { // Get update link for out-of-date product $ulink = $info->authorUrl; if (isset($this->data['update-url'])) { $ulink = (string) $this->data['update-url']; } elseif ($const = JSNUtilsText::getConstant('UPDATE_LINK')) { $ulink = $const; } throw new Exception(JText::_('JSN_EXTFW_DATA_PRODUCT_VERSION_OUTDATE') . ' <a href="' . $ulink . '" class="jsn-link-action">' . JText::_('JSN_EXTFW_GENERAL_UPDATE_NOW') . '</a>'); } elseif (!version_compare($info->version, (string) $this->data['extension-version'], 'ge')) { // Get update link for out-of-date product $ulink = $info->authorUrl; if (isset($this->data['update-url'])) { $ulink = (string) $this->data['update-url']; } elseif ($const = JSNUtilsText::getConstant('UPDATE_LINK')) { $ulink = $const; } throw new Exception(JText::_('JSN_EXTFW_DATA_PRODUCT_VERSION_OUTDATE') . ' <a href="' . $ulink . '" class="jsn-link-action">' . JText::_('JSN_EXTFW_GENERAL_UPDATE_NOW') . '</a>'); } } else { throw new Exception(JText::_('JSN_EXTFW_DATA_BACKUP_XML_NOT_FOUND')); } $dataForm = $this->getForm(); if (!empty($dataForm) && count($dataForm)) { foreach ($dataForm as $formId) { if (!empty($formId->form_id) && (int) $formId->form_id) { $this->_db->setQuery("DROP TABLE IF EXISTS #__jsn_uniform_submissions_{$formId->form_id}"); $this->_db->execute(); } } } if (JSNUniformHelper::checkTableSql('#__jsn_uniform_submissions') === false) { JSNUniformHelper::createTableIfNotExistsSubmissions(); } if (JSNUniformHelper::checkTableSql('#__jsn_uniform_submission_data') === false) { JSNUniformHelper::createTableIfNotExistsSubmissionData(); } }
/** * Generate HTML markup for footer. * * If a product has sub-product, this method need to be called as below to * check all sub-product for latest version: * * <pre>JSNHtmlGenerate::footer( * array( * // Core component * 'imageshow' => '4.2.0', * * // Themes * 'themeclassic' => '1.1.5', * 'themeslider' => '1.0.4', * 'themegrid' => '1.0.0', * * // Sources * 'picasa' => '1.1.2', * 'flickr' => '1.1.2', * 'phoca' => '1.0.1', * 'joomgallery' => '1.0.1', * 'rsgallery2' => '1.0.1', * 'facebook' => '1.0.1' * ) * );</pre> * * If a product does not have sub-product, the <b>$products</b> parameter * does not required when calling this method: * * <pre>JSNHtmlGenerate::footer();</pre> * * @param array $products Array of product identified name. * @param boolean $echo Whether to echo the output or not? * * @return string */ public static function footer($products = array(), $echo = true) { // Get extension manifest cache $info = JSNUtilsXml::loadManifestCache(); // Initialize variables $name = $info->name; $edition = JSNUtilsText::getConstant('EDITION'); $version = JSNUtilsText::getConstant('VERSION'); // Initialize links $links['info'] = JSNUtilsText::getConstant('INFO_LINK'); $links['doc'] = JSNUtilsText::getConstant('DOC_LINK'); $links['review'] = JSNUtilsText::getConstant('REVIEW_LINK'); $links['update'] = JSNUtilsText::getConstant('UPDATE_LINK'); $links['upgrade'] = JSNUtilsText::getConstant('UPGRADE_LINK'); // Generate markup $html[] = ' <div id="jsn-footer" class="jsn-page-footer jsn-bootstrap"> <div class="pull-left"> <ul class="jsn-footer-menu"> <li class="first">'; if (!empty($links['doc'])) { $html[] = ' <a href="' . JRoute::_($links['doc']) . '" target="_blank">' . JText::_('JSN_EXTFW_GENERAL_DOCUMENTATION') . '</a> </li> <li>'; } $html[] = ' <a href="http://www.joomlashine.com/contact-us/get-support.html" target="_blank">' . JText::_('JSN_EXTFW_GENERAL_SUPPORT') . '</a> </li>'; if (!empty($links['review'])) { $html[] = ' <li> <a href="' . JRoute::_($links['review']) . '" target="_blank">' . JText::_('JSN_EXTFW_GENERAL_VOTE') . '</a> </li>'; } $html[] = ' <li class="jsn-iconbar"> <strong>' . JText::_('JSN_EXTFW_GENERAL_KEEP_IN_TOUCH') . ':</strong> <a title="' . JText::_('JSN_EXTFW_GENERAL_FACEBOOK') . '" target="_blank" href="http://www.facebook.com/joomlashine"><i class="jsn-icon16 jsn-icon-social jsn-icon-facebook"></i></a><a title="' . JText::_('JSN_EXTFW_GENERAL_TWITTER') . '" target="_blank" href="http://www.twitter.com/joomlashine"><i class="jsn-icon16 jsn-icon-social jsn-icon-twitter""></i></a><a title="' . JText::_('JSN_EXTFW_GENERAL_YOUTUBE') . '" target="_blank" href="http://www.youtube.com/joomlashine"><i class="jsn-icon16 jsn-icon-social jsn-icon-youtube""></i></a> </li> </ul> <ul class="jsn-footer-menu"> <li class="first">'; if (!empty($links['info'])) { $html[] = ' <a href="' . JRoute::_($links['info']) . '" target="_blank">JSN ' . preg_replace('/JSN\\s*/i', '', JText::_($name)) . ' ' . $edition . ' v' . $version . '</a>'; } else { $html[] = 'JSN ' . preg_replace('/JSN\\s*/i', '', JText::_($name)) . ' ' . $edition . ' v' . $version; } $html[] = ' by <a href="http://www.joomlashine.com" target="_blank">JoomlaShine.com</a>'; if (!empty($edition) and !empty($links['upgrade']) and ($pos = strpos('free + pro standard', strtolower($edition))) !== false) { $html[] = ' <a class="label label-important" href="' . JRoute::_($links['upgrade']) . '"><strong class="jsn-text-attention">' . JText::_($pos ? 'JSN_EXTFW_GENERAL_UPGRADE_TO_PRO_UNLIMITED' : 'JSN_EXTFW_GENERAL_UPGRADE_TO_PRO') . '</strong></a>'; } $html[] = ' </li>'; try { $hasUpdate = false; foreach (JSNUpdateHelper::check($products) as $result) { if ($result) { $hasUpdate = true; break; } } if ($hasUpdate) { $html[] = ' <li id="jsn-global-check-version-result" class="jsn-outdated-version"> <span class="jsn-global-outdated-version">' . JText::_('JSN_EXTFW_GENERAL_UPDATE_AVAILABLE') . '</span> <a href="' . JRoute::_($links['update']) . '" class="label label-important">' . JText::_('JSN_EXTFW_GENERAL_UPDATE_NOW') . '</a> </li>'; } } catch (Exception $e) { // Simply ignore } $html[] = ' </ul> </div> <div class="pull-right"> <ul class="jsn-footer-menu"> <li class="jsn-iconbar first"> <a title="' . JText::_('JSN_EXTFW_GENERAL_POWERADMIN') . '" target="_blank" href="http://www.joomlashine.com/joomla-extensions/jsn-poweradmin.html"> <i class="jsn-icon32 jsn-icon-products jsn-icon-poweradmin"></i> </a> <a title="' . JText::_('JSN_EXTFW_GENERAL_IMAGESHOW') . '" target="_blank" href="http://www.joomlashine.com/joomla-extensions/jsn-imageshow.html"> <i class="jsn-icon32 jsn-icon-products jsn-icon-imageshow""></i> </a> <a title="' . JText::_('JSN_EXTFW_GENERAL_UNIFORM') . '" target="_blank" href="http://www.joomlashine.com/joomla-extensions/jsn-uniform.html"> <i class="jsn-icon32 jsn-icon-products jsn-icon-uniform""></i> </a> <a title="' . JText::_('JSN_EXTFW_GENERAL_MOBILIZE') . '" target="_blank" href="http://www.joomlashine.com/joomla-extensions/jsn-mobilize-joomla-mobile-extension.html"> <i class="jsn-icon32 jsn-icon-products jsn-icon-mobilize""></i> </a> </li> </ul> </div> <div class="clearbreak"></div> </div> '; if ($echo) { echo implode($html); } else { return implode($html); } }
/** * Check if there is new update for installed JoomlaShine product. * * @return mixed */ private function checkUpdate() { // Initialize extensions to check for update $exts = JSNVersion::isJoomlaCompatible('3.1') ? array($this->option) : JSNVersion::$products; // 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 />'; } } }
?> </span></p> </div> </li> </ul> </div> <div id="jsn-upgrade-successfully" style="display: none;"> <hr> <p><?php echo JText::sprintf('JSN_EXTFW_UPGRADE_SUCCESS_MESSAGE', $name); ?> </p> <div class="form-actions"> <p> <a class="btn btn-primary" href="<?php echo JRoute::_($redirAfterFinish ? $redirAfterFinish : 'index.php?option=' . $input->getCmd('option')); ?> "> <?php echo JText::_('JSN_EXTFW_UPDATE_FINISH'); ?> </a> </p> </div> </div> </div> </div> <?php // Add assets echo JSNHtmlAsset::loadScript('jsn/upgrade', array('button' => 'jsn-proceed-button', 'language' => array('JSN_EXTFW_GENERAL_STILL_WORKING', 'JSN_EXTFW_GENERAL_PLEASE_WAIT'), 'redirect' => strpos($_SERVER['HTTP_REFERER'], '/administrator/index.php?option=com_installer') !== false ? 1 : 0, 'component' => JFactory::getApplication()->input->getCmd('option'), 'identifiedName' => JSNUtilsText::getConstant('IDENTIFIED_NAME')), true);
/** * Download update package for current product. * * @return void */ protected function downloadPackage() { // Get Joomla config $config = JFactory::getConfig(); // Initialize variable $input = JFactory::getApplication()->input; $JVersion = new JVersion(); // Get the product info $info = JSNUtilsXml::loadManifestCache(); $edition = $input->getVar('edition', JSNUtilsText::getConstant('EDITION')); $identified = ($identified = JSNUtilsText::getConstant('IDENTIFIED_NAME')) ? $identified : strtolower($info->name); // Build query string $query[] = 'joomla_version=' . $JVersion->RELEASE; $query[] = 'username='******'customer_username')); $query[] = 'password='******'customer_password')); $query[] = 'identified_name=' . ($input->getCmd('id') ? $input->getCmd('id') : $identified); $query[] = 'edition=' . strtolower(urlencode($edition)); // Build final URL for downloading update $url = JSN_EXT_DOWNLOAD_UPDATE_URL . '&' . implode('&', $query); // Generate file name for update package $name[] = 'jsn'; $name[] = $input->getCmd('id') ? $input->getCmd('id') : $identified; if ($edition) { $name[] = $input->getCmd('view') == 'upgrade' ? 'pro_' . (strtolower($edition) == 'free' ? 'standard' : 'unlimited') : strtolower(str_replace(' ', '_', $input->getVar('edition') ? $input->getVar('edition') : $edition)); } $name[] = 'j' . $JVersion->RELEASE; $name[] = 'install.zip'; $name = implode('_', $name); // Set maximum execution time ini_set('max_execution_time', 300); // Try to download the update package try { $path = $config->get('tmp_path') . '/' . $name; if (!JSNUtilsHttp::get($url, $path, true)) { throw new Exception(JText::_('JSN_EXTFW_UPDATE_DOWNLOAD_PACKAGE_FAIL')); } } catch (Exception $e) { throw new Exception(JText::_('JSN_EXTFW_UPDATE_DOWNLOAD_PACKAGE_FAIL')); } // Validate downloaded update package if (filesize($path) < 10) { // Get LightCart error code $errorCode = JFile::read($path); if ($edition) { $edition = $input->getCmd('view') == 'upgrade' ? 'pro ' . (strtolower($edition) == 'free' ? 'standard' : 'unlimited') : $input->getVar('edition') ? $input->getVar('edition') : $edition; } throw new Exception(JText::sprintf('JSN_EXTFW_LIGHTCART_ERROR_' . $errorCode, JText::_($info->name) . ' ' . strtoupper($edition))); } return $path; }
public static function getDependentExtensions() { $indentifiedNames = array(); $indentifiedNames[JSNUtilsText::getConstant('IDENTIFIED_NAME', 'framework')] = JSNUtilsText::getConstant('VERSION', 'framework'); $indentifiedNames[JSN_PAGEBUILDER_IDENTIFIED_NAME] = JSN_PAGEBUILDER_VERSION; $exts = self::getPbExtensions(); if (count($exts)) { foreach ($exts as $ext) { $manifest = json_decode($ext->manifest_cache); $indentifiedNames[JSN_PAGEBUILDER_EXT_IDENTIFIED_NAME_PREFIX . $ext->element] = $manifest->version; } } return $indentifiedNames; }
/** * Retrieve the version number of an extension. * * @param string $extension Name of the extension. * * @return void */ private static function _getExtensionVersion($extension) { if (!isset(self::$_loadedVersions[$extension])) { // Store extension version self::$_loadedVersions[$extension] = ($version = JSNUtilsText::getConstant('VERSION')) ? $version : '1.0.0'; } return self::$_loadedVersions[$extension]; }