%PDF- %PDF-
Direktori : /home/lightco1/public_html/ilfanale.com.au/plugins/system/jsnmobilize/ |
Current File : /home/lightco1/public_html/ilfanale.com.au/plugins/system/jsnmobilize/jsnmobilize.php |
<?php /** * @version $Id$ * @package JSN_Mobilize * @subpackage SystemPlugin * @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' ); error_reporting( 1 ); // Load client device detection library /** * System plugin for initializing JSN Mobilize. * * @package JSN_Mobilize * @subpackage SystemPlugin * @since 1.0.0 */ class PlgSystemJSNMobilize extends JPlugin { /** * Application object. * * @var $_app object An instance of JApplication class. */ private static $_app; /** * JSN Mobilize global configuration. * * @var $_cfg object An instance of JObject class. */ private static $_cfg; /** * Real request URI after parsing for user preference. * * @var $_request string */ private static $_request; /** * Detected user preference. * * @var $_device string */ private static $_device; protected static $mode_sef; /** * Event handler to get user preference. * * @return void */ public function onAfterInitialise() { // Initialize JSN Mobilize require_once dirname( __FILE__ ) . '/define.php'; if ( ! class_exists( 'JSNConfigHelper' ) ) { return; } $input = JFactory::getApplication()->input; $flag = $input->getString('flag', ''); $option = $input->getString('option', ''); $author = $input->getString('author', ''); if (JFactory::getApplication()->isAdmin() && $option == 'com_media' && ( $flag == 'jsn_mobilize' || $author == 'jsn_mobilize' )) { $doc = JFactory::getDocument(); $doc->addStyleSheet( JURI::base() . 'components/com_mobilize/assets/css/admin.css', 'text/css' ); } self::$_app = JFactory::getApplication(); $get = self::$_app->input->getArray($_GET); if ( ! self::$_app->isAdmin() ) { require_once dirname( __FILE__ ) . '/libraries/joomlashine/client/mobiledetect.php'; $detect = new JSN_Mobile_Detect; $deviceType = ( $detect->isMobile() ? 'mobilize' : 'desktop' ); if(isset($get['switch_to_desktop_ui'])){ $session =& JFactory::getSession(); $session->set( 'switch', $get['switch_to_desktop_ui']); }else{ $session =& JFactory::getSession(); $switch = $session->get('switch'); if(!isset($get[ 'jsn_mobilize_preview' ])){ if($switch == 1 && $deviceType == 'mobilize'){ $input->set('switch_to_desktop_ui', 1); } } } // Get parsed request URI object $jUri = JURI::getInstance(); // Get application object $config = JFactory::getConfig(); $rewrite = $config->get( "sef_rewrite" ) ? "/" : "/index.php/"; // Get JSN Mobilize configuration $linkMobilize = JURI::root( true ) . $rewrite; self::$_cfg = JSNConfigHelper::get( 'com_mobilize'); self::$_cfg->set( 'link_mobilize', $linkMobilize ); // Check cookie $urlRequest = isset( $_SERVER[ "REQUEST_URI" ] ) ? $_SERVER[ "REQUEST_URI" ] : ""; $getPreView = ! empty( $get[ 'jsn_mobilize_preview' ] ) ? (int)$get[ 'jsn_mobilize_preview' ] : ''; if ( $getPreView == 1 ) { $deviceType = 'mobilize'; } if ( $getPreView != 1 && $deviceType == "desktop" ) { self::$_device = ""; } // Continue only if not in administrator section if ( ! self::$_app->isAdmin() ) { // Does user prefer desktop site? if ( self::$_app->input->getInt( 'switch_to_desktop_ui' ) == 1 ) { self::$_device = 'desktop'; } elseif ( self::$_app->input->getInt( 'switch_to_desktop_ui' ) == 2 ) { $device = $deviceType; self::$_device = $device; } if ( ! isset( self::$_device ) ) { self::$_device = $deviceType; } require_once JPATH_BASE . '/templates/jsn_mobilize/helpers/mobilize.php'; if ( $getPreView == 1 ) { $mCfg = JSNMobilizeTemplateHelper::getConfig( self::$_device, true ); } else { $mCfg = JSNMobilizeTemplateHelper::getConfig( self::$_device ); } if ( ! empty( $device ) ) { $deviceUi = $device . "_ui_enabled"; } else { $deviceUi = ""; } // Check if mobile/tablet UI is enabled? if ( $getPreView != 1 && $deviceType == "desktop" && $deviceUi ) { if ( ! self::$_app->input->getInt( 'jsn_mobilize_preview' ) AND ! $mCfg->get( $deviceUi ) AND self::$_device == "mobilize" ) { self::$_device = 'desktop'; } } // Do some preparation for mobile/tablet site rendering if ( self::$_device == "mobilize" ) { // Reparse request URI $jUri->parse( $jUri->toString() ); } // Load language file $this->_loadLanguage(); $router = self::$_app->getRouter(); self::$mode_sef = ( $router->getMode() == JROUTER_MODE_SEF ) ? true : false; // attach build rules for Preview SEF $router->attachBuildRule( array( $this, 'buildRule' ) ); // attach parse rules for language SEF $router->attachParseRule( array( $this, 'parseRule' ) ); } if (JPluginHelper::isEnabled('system', 'cache') && version_compare(JVERSION, '3.0.0', '>=')) { if ($getPreView != 1) { if ($detect->isMobile() && !$detect->isTablet()) { $cacheKey = 'mobile'; } elseif($detect->isTablet()) { $cacheKey = 'tablet'; } else { $cacheKey = 'desktop'; } } else { $cacheKey = time(); } $dispatcher = JEventDispatcher::getInstance(); $refObj = new ReflectionObject($dispatcher); $refProp = $refObj->getProperty('_observers'); $refProp->setAccessible(true); $observers = $refProp->getValue($dispatcher); foreach($observers as $index => $object) { if(is_a($object, 'plgSystemCache')) { $object->_cache_key = 'jsnmobilize' . $cacheKey . 'jsnmobilize' . $object->_cache_key; } } } } } public function parseRule( &$router, &$uri ) { $app = JFactory::getApplication(); $get = $app->input->getArray($_GET); $array = array(); if ( ! empty( $_SERVER[ 'HTTP_REFERER' ] ) ) { if ( strpos( $_SERVER[ 'HTTP_REFERER' ], 'jsn_mobilize_preview=1' ) && ! isset( $get[ 'jsn_mobilize_preview' ] ) && empty( $_REQUEST[ 'format' ] ) ) { $uri->setVar( 'jsn_mobilize_preview', 1 ); $app->redirect( JURI::base( true ) . '/index.php?' . $uri->getQuery() ); } } return $array; } public function buildRule( &$router, &$uri ) { $app = JFactory::getApplication(); $get = $app->input->getArray($_GET); $preview = ! empty( $get[ 'jsn_mobilize_preview' ] ) ? $get[ 'jsn_mobilize_preview' ] : ''; $switch = ! empty( $get[ 'switch_to_desktop_ui' ] ) ? $get[ 'switch_to_desktop_ui' ] : ''; if ( ! empty( $preview ) ) { $uri->setVar( 'jsn_mobilize_preview', $preview ); if ( ! empty( $switch ) ) { $uri->setVar( 'switch_to_desktop_ui', $switch ); } } if ( ! empty( $switch ) ) { $app->input->set( 'switch_to_desktop_ui', $switch ); } } /** * Event handler to re-parse request URI. * * @return void */ public function onAfterRoute() { self::$_app = JFactory::getApplication(); $get = self::$_app->input->getArray($_GET); if ( ! class_exists( 'JSNConfigHelper' ) ) { return true; } // Continue only if not in administrator section and in mobile/tablet site if ( ! self::$_app->isAdmin() ) { require_once JPATH_BASE . '/templates/jsn_mobilize/helpers/mobilize.php'; if ( self::$_device == "mobilize" ) { $getPreView = ! empty( $get[ 'jsn_mobilize_preview' ] ) ? $get[ 'jsn_mobilize_preview' ] : ''; // Get input object $input = self::$_app->input; // Set necessary variables to request array $urlRequest = isset( $_SERVER[ "REQUEST_URI" ] ) ? $_SERVER[ "REQUEST_URI" ] : ""; if ( $getPreView == 1 ) { $mCfg = JSNMobilizeTemplateHelper::getConfig( self::$_device, true ); } else { $mCfg = JSNMobilizeTemplateHelper::getConfig( self::$_device ); } if ( ! empty( $mCfg ) ) { self::$_app->setTemplate( 'jsn_mobilize' ); $input->set( '_device', self::$_device ); } } if ( JSNMobilizeTemplateHelper::getConfig( "mobilize" ) ) { self::$_app->registerEvent( 'onAfterRender', 'jsnMobilizeFinalize' ); } } } /** * Alter response body if necessary. * * - Mobile/tablet site: alter URI based on detected client device type. * - Desktop site: inject switcher link if visitor viewing desktop site on either mobile device or tablet PC. * * @return void */ public static function onAfterRender() { self::$_app = JFactory::getApplication(); $get = self::$_app->input->getArray($_GET); if ( ! self::$_app->isAdmin() ) { require_once dirname( __FILE__ ) . '/libraries/joomlashine/client/mobiledetect.php'; $detect = new JSN_Mobile_Detect; $deviceType = ( $detect->isMobile() ? 'mobilize' : 'desktop' ); $getPreview = ! empty( $get[ 'jsn_mobilize_preview' ] ) ? $get[ 'jsn_mobilize_preview' ] : ''; $getSwitch = ! empty( $get[ 'switch_to_desktop_ui' ] ) ? $get[ 'switch_to_desktop_ui' ] : ''; if ( JSNMobilizeTemplateHelper::getConfig( "mobilize" )){ if ( ! defined( 'JSN_MOBILIZE_LAST_EXECUTION' ) ) { return; } } if ( ! self::$_app->isAdmin() && self::$_device == "mobilize" && ( $device = $deviceType ) == 'desktop' ) { // Alter and/or optimize response body based on detected client device type self::_finalizeResponse(); } elseif ( self::$_device == 'desktop' && ( $device = $deviceType ) != 'desktop' || ( $getSwitch == 1 && $getPreview == 1 ) ) { // Inject UI switcher link if visitor viewing desktop site on either mobile device or tablet PC self::_injectUISwitcher( $device ); } if ( self::$_device != 'desktop' ) { self::Optimize(); } } } /** * Optimize js,css,images. * * @param string $html Response body generated by Joomla. * * @return void */ private static function Optimize( $html = '' ) { // Initialize response body ! empty( $html ) OR $html = JResponse::getBody(); $detect = new JSN_Mobile_Detect; $session = JFactory::getSession(); $profile = $session->get( 'jsn_mobilize_profile' ); $profileMinify = ! empty( $profile->profile_minify ) ? $profile->profile_minify : ''; $profileOptimizeImages = ! empty( $profile->profile_optimize_images ) ? $profile->profile_optimize_images : ''; // Minify stylesheets and Javascript files if ($profileMinify != '' && ($detect->isMobile() || $detect->isTablet())) { // Load library to minify assets require_once dirname( dirname( __FILE__ ) ) . '/jsnmobilize/libraries/joomlashine/compress/helper.php'; // Minify stylesheets if ( strpos( 'css + both', $profileMinify ) !== false ) { require_once dirname( dirname( __FILE__ ) ) . '/jsnmobilize/libraries/joomlashine/compress/css.php'; $html = preg_replace_callback( '/(<link([^>]+)rel=["|\']stylesheet["|\']([^>]*)>\s*)+/i', array( 'JSNMobilizeCompressCss', 'compress' ), $html ); } // Minify Javascript files if ( strpos( 'js + both', $profileMinify ) !== false ) { require_once dirname( dirname( __FILE__ ) ) . '/jsnmobilize/libraries/joomlashine/compress/js.php'; $html = preg_replace_callback( '/(<script([^>]+)src=["|\']([^"|\']+)["|\']([^>]*)>\s*<\/script>\s*)+/i', array( 'JSNMobilizeCompressJs', 'compress' ), $html ); } } // Optimize image files if ( $detect->isMobile() && ! $detect->isTablet() && $profileOptimizeImages != '' ) { // Load library to optimize image files require_once dirname( dirname( __FILE__ ) ) . '/jsnmobilize/libraries/joomlashine/response/image.php'; // Initialize image file optimization $html = JSNResponseImage::init( JSN_MOBILIZE_PATH_OPTIMIZED_IMAGE, (int)$profileOptimizeImages, $html, false ); } // Set manipulated HTML code JResponse::setBody( $html ); } /** * Finalize response body for rendering mobile/tablet UI. * * @param string $html Response body generated by Joomla. * * @return void */ private static function _finalizeResponse( $html = '' ) { self::$_app = JFactory::getApplication(); $get = self::$_app->input->getArray($_GET); // Initialize response body ! empty( $html ) OR $html = JResponse::getBody(); // Build regular expression to parse response $regEx = '#<(a|form|img)[^>]*(href|action|src)=("|\')(' . JURI::root() . '|' . JURI::root( true ) . ')*([^\s]*)("|\')[^>]*>#i'; $getPreView = ! empty( $get[ 'jsn_mobilize_preview' ] ) ? $get[ 'jsn_mobilize_preview' ] : ''; // Get input object $input = self::$_app->input; // Set necessary variables to request array $urlRequest = isset( $_SERVER[ "REQUEST_URI" ] ) ? $_SERVER[ "REQUEST_URI" ] : ""; // Get all a and form tag from responce if ( preg_match_all( $regEx, $html, $matches, PREG_SET_ORDER ) ) { // var_dump($matches); foreach ( $matches AS $match ) { if ( strpos( $match[ 0 ], ' id="jsn-mobilize-ui-switcher"' ) === false ) { // Check if this is a direct link if ( ! empty( $match[ 5 ] ) && $match[ 5 ] != '/' && strpos( $match[ 5 ], '/index.php' ) !== 0 && ( is_readable( JPATH_ROOT . $match[ 5 ] ) || ( ( $pos = strpos( $match[ 5 ], '?' ) ) !== false AND is_readable( JPATH_ROOT . substr( $match[ 5 ], 0, $pos ) ) ) ) ) { continue; } // Build mobile/tablet URI if ( $match[ 1 ] != 'img' ) { if ( substr( $link = self::$_cfg->get( 'link_' . self::$_device ), 0, 1 ) == '/' ) { $uri = str_replace( JURI::root( true ), '/' . trim( $link, '/' ), $match[ 4 ] ); } else { // Get parsed request URI object $jUri = JURI::getInstance(); if ( preg_match( '/^https?:/i', $match[ 4 ] ) ) { $uri = str_replace( $jUri->getHost(), $link, $match[ 4 ] ); } elseif ( substr( $match[ 4 ], 0, 1 ) == '/' ) { $uri = ( $uri = $jUri->getScheme() ) . ( empty( $uri ) ? '' : '://' ) . $link . $match[ 4 ]; } } // Finalize link $uri .= str_replace( '/index.php', '', $match[ 5 ] ); } else { if ( ! preg_match( '/^https?:/', $match[ 5 ] ) ) { $uri = JURI::root( true ) . '/' . $match[ 5 ]; } else { $uri = $match[ 5 ]; } } if ( $getPreView == 1 && $match[ 1 ] != 'img' && strpos( $match[ 5 ], 'javascript:' ) === false && $match[ 5 ] != "#" ) { if ( $pos = strpos( $match[ 5 ], '?' ) == false ) { $uri = $uri . '?jsn_mobilize_preview=1'; } else if ( strpos( $uri, 'jsn_mobilize_preview=' ) == false ) { $uri = $uri . '&jsn_mobilize_preview=1'; } } // Create replacement $replace = str_replace( $match[ 4 ] . $match[ 5 ], $uri, $match[ 0 ] ); //var_dump( $match, $uri ); // Replace original link with link for mobile/tablet site $html = str_replace( $match[ 0 ], $replace, $html ); } } } // Set manipulated HTML code JResponse::setBody( $html ); } /** * Inject UI switcher into default desktop template. * * @param string $device Detected client device type. * @param string $html Response body generated by Joomla. * * @return void */ private static function _injectUISwitcher( $device, $html = '' ) { $lang = JFactory::getLanguage(); self::$_app = JFactory::getApplication(); $lang->load( 'plg_system_jsnmobilize', JPATH_ADMINISTRATOR ); $detect = new JSN_Mobile_Detect; $textSwitcher = ''; if ( $detect->isMobile() && ! $detect->isTablet() ) { $textSwitcher = 'JSN_MOBILIZE_SWITCH_TO_WEB_UI_FOR_MOBILE'; } else if ( $detect->isMobile() && $detect->isTablet() ) { $textSwitcher = 'JSN_MOBILIZE_SWITCH_TO_WEB_UI_FOR_TABLET'; } else { $textSwitcher = 'Switch To Mobile'; } // Initialize response body ! empty( $html ) OR $html = JResponse::getBody(); // Get parsed request URI object $jUri = JURI::getInstance(); // Build URI for switching back to mobile/tablet site if ( substr( $link = self::$_cfg->get( "link_{$device}" ), 0, 1 ) == '/' ) { $switch = str_replace( JURI::root( true ), '/' . trim( $link, '/' ), $jUri->toString() ); } else { $switch = str_replace( $jUri->getHost(), $link, $jUri->toString() ); } $get = self::$_app->input->getArray($_GET); $getPreView = ! empty( $get[ 'jsn_mobilize_preview' ] ) ? $get[ 'jsn_mobilize_preview' ] : ''; // Get input object $input = self::$_app->input; // Set necessary variables to request array $urlRequest = isset( $_SERVER[ "REQUEST_URI" ] ) ? $_SERVER[ "REQUEST_URI" ] : ""; if ( $getPreView == 1 ) { $url = JURI::root() . '?switch_to_desktop_ui=0&jsn_mobilize_preview=1'; } else { $url = JURI::root() . '?switch_to_desktop_ui=0'; } $switch = preg_replace( '/(\?|&)switch_to_desktop_ui=1/', '', $switch ); // Get user selected style $style = self::$_cfg->get( 'style', 'default' ); // Inject UI switcher assets $html = str_replace( '</head>', "\t" . '<link media="screen" type="text/css" href="' . JURI::root( true ) . '/templates/jsn_mobilize/css/switcher.css" rel="stylesheet" />' . "\n</head>", $html ); // Inject UI switcher link $html = str_replace( '</body>', "\t" . '<div class="mobilize-ui-switcher"><a id="jsn-mobilize-ui-switcher" class="btn" href="' . $url . '" title="' . JText::_( $textSwitcher ) . '">' . JText::_( $textSwitcher ) . '</a></div>' . "\n</body>", $html ); // Set manipulated HTML code JResponse::setBody( $html ); } /** * Load plugin language. * * @return void */ private function _loadLanguage() { // Get active language $language = JFactory::getLanguage(); self::$_app = JFactory::getApplication(); // Check if language file exists for active language if ( ! file_exists( JPATH_ROOT . '/administrator/language/' . $language->getDefault() . '/' . $language->getDefault() . '.plg_system_jsnmobilize.ini' ) ) { // If requested component has the language file, install then load it if ( file_exists( JPATH_ROOT . '/administrator/components/' . self::$_app->input->getCmd( 'option' ) . '/language/admin/' . $language->getDefault() . '/' . $language->getDefault() . '.plg_system_jsnmobilize.ini' ) ) { JSNLanguageHelper::install( (array)$language->getDefault(), false, true ); $language->load( 'plg_system_jsnmobilize', JPATH_BASE, null, true ); } // Otherwise, try to load language file from plugin directory else { $language->load( 'plg_system_jsnmobilize', dirname( __FILE__ ), null, true ); } } else { $language->load( 'plg_system_jsnmobilize', JPATH_BASE, null, true ); } } } /** * Finalize response body. * * @return void */ function jsnMobilizeFinalize() { define( 'JSN_MOBILIZE_LAST_EXECUTION', 1 ); PlgSystemJSNMobilize::onAfterRender(); }