Problema con Artodia: Mobile and SEO
Publicado: 11 Sep 2012, 00:52
Instale este mod y tal en principio va genial, pero hay una cosa que me da bastante rabia.
Al instalar este mod aparecen automáticamente tanto en el header como en el footer del theme principal el mensaje de "Cambiar a la versión móvil".
¿Hay alguna forma de que este no aparezca automáticamente? Vamos, para ponerlo a mano. La cosa es que también debe haber algún bug, porque a veces sale abajo y arriba y otras veces solo abajo.
Adjunto el archivo principal de dicho mod por si sirve de ayuda.
Al instalar este mod aparecen automáticamente tanto en el header como en el footer del theme principal el mensaje de "Cambiar a la versión móvil".
¿Hay alguna forma de que este no aparezca automáticamente? Vamos, para ponerlo a mano. La cosa es que también debe haber algún bug, porque a veces sale abajo y arriba y otras veces solo abajo.
Adjunto el archivo principal de dicho mod por si sirve de ayuda.
Código: Seleccionar todo
<?php
/**
* phpBB Mobile style mod for phpBB 3.0
*
* Created by Vjacheslav Trushkin (Arty) for use with one of mobile phpBB styles.
* See detect_mobile.xml for mod installation instructions.
* Check http://www.phpbbmobile.com/ for latest version.
*
* @version 3.0
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* Mobile style class
*/
class phpbb_mobile
{
/**
* Mobile style path.
* Change it to correct string to make script locate mobile style faster.
* Alternatively you can define 'MOBILE_STYLE_PATH' in includes/constants.php or config.php
*
* @var string|bool
*/
public static $mobile_style_path = false;
/**
* Mobile style ID, if style is installed.
* Change it to correct string to make script locate mobile style faster.
* Alternatively you can define 'MOBILE_STYLE_ID' in includes/constants.php or config.php
*
* If mobile style path is set, this variable will be ignored
*
* @var int
*/
public static $mobile_style_id = 0;
/**
* True if mobile style should be used for search engines
*
* @var bool
*/
public static $mobile_seo = true;
/**
* @var bool
*/
protected static $mobile_mode = false;
protected static $mobile_var = 'mobile';
protected static $cookie_var = false;
protected static $is_bot = false;
/**
* Start mobile style setup
*
* @var string $style_path Path to mobile style, saved to $mobile_style_path
*/
public static function setup($style_path = false)
{
global $user;
self::set_cookie_var();
self::override_template();
self::$is_bot = empty($user->data['is_bot']) ? false : $user->data['is_bot'];
// Check mode only if it wasn't checked already
if (self::$mobile_mode === false)
{
if (is_string($style_path) && strlen($style_path))
{
self::$mobile_style_path = $style_path;
}
elseif (is_int($style_path) && $style_path > 0)
{
self::$mobile_style_id = $style_path;
}
self::$mobile_mode = self::get_mode();
}
if (self::is_desktop_mode(self::$mobile_mode))
{
// Force desktop style
return;
}
if (!self::is_mobile_mode(self::$mobile_mode))
{
// Detect browser
$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
if (!self::is_mobile_browser($user_agent))
{
return;
}
}
// Locate mobile style
$path = self::locate_mobile_style();
if ($path === false)
{
// Mobile style was not found
self::set_cookie('404', false);
self::$mobile_mode = '404';
return;
}
// Set mobile style data
self::set_mobile_style();
}
/**
* Set mobile style
*/
protected static function set_mobile_style()
{
global $user, $template;
// Define MOBILE_STYLE if it is not defined yet
if (!defined('MOBILE_STYLE'))
{
define('MOBILE_STYLE', true);
}
// Change user->theme data
$user->theme = array_merge($user->theme, self::user_theme_data());
$template->orig_tpl_inherits_id = $user->theme['template_inherits_id'];
// Reset imageset
$user->img_array = array();
// Set template
$template->set_template();
}
/**
* Override global $template variable
*/
protected static function override_template()
{
if (defined('ADMIN_START'))
{
return;
}
global $template;
if (is_a($template, 'mobile_template'))
{
return;
}
$tpl = new mobile_template();
$tpl->clone_properties($template);
$template = $tpl;
}
/**
* @return array Data for $user->theme
*/
protected static function user_theme_data()
{
return array(
'style_id' => self::$mobile_style_id,
'template_storedb' => 0,
'template_path' => self::$mobile_style_path,
'template_id' => 0,
'bbcode_bitfield' => 'lNg=',
'template_inherits_id' => 1,
'template_inherit_path' => 'prosilver',
'theme_path' => self::$mobile_style_path,
'theme_name' => self::$mobile_style_path,
'theme_storedb' => 0,
'theme_id' => 0,
'imageset_path' => self::$mobile_style_path,
'imageset_id' => 0,
'imageset_name' => self::$mobile_style_path,
);
}
/**
* Set cookie variable name
*/
protected static function set_cookie_var()
{
if (self::$cookie_var !== false)
{
return;
}
global $config;
self::$cookie_var = (isset($config['cookie_name']) ? $config['cookie_name'] . '_' : '') . self::$mobile_var;
}
/**
* Set cookie value
*
* param string $value Cookie value
* param bool $long If true, cookie will be set for full duration. If false, cookie will be set for browser session duration
*/
protected static function set_cookie($value, $long = true)
{
global $config;
$cookietime = ($long && empty($_SERVER['HTTP_DNT'])) ? time() + (($config['max_autologin_time']) ? 86400 * (int) $config['max_autologin_time'] : 31536000) : 0;
$name_data = rawurlencode(self::$cookie_var) . '=' . rawurlencode($value);
if ($cookietime)
{
$expire = gmdate('D, d-M-Y H:i:s \\G\\M\\T', $cookietime);
}
$domain = (!$config['cookie_domain'] || $config['cookie_domain'] == 'localhost' || $config['cookie_domain'] == '127.0.0.1') ? '' : '; domain=' . $config['cookie_domain'];
header('Set-Cookie: ' . $name_data . (($cookietime) ? '; expires=' . $expire : '') . '; path=' . $config['cookie_path'] . $domain . ((!$config['cookie_secure']) ? '' : '; secure') . '; HttpOnly', false);
}
/**
* Check if mode triggers mobile style
*
* @param string $mode Browser mode
*
* @return bool
*/
protected static function is_mobile_mode($mode)
{
return ($mode == 'mobile');
}
/**
* Check if mode triggers desktop style
*
* @param string $mode Browser mode
*
* @return bool
*/
protected static function is_desktop_mode($mode)
{
return ($mode == 'desktop' || $mode == '404');
}
/*
* Get browser mode from cookie and $_GET data
*
* @return string|false Mobile style mode, false if default
*/
protected static function get_mode()
{
$value = request_var(self::$mobile_var, '');
switch ($value)
{
case 'reset':
// Reset to default mode
self::set_cookie('', false);
return false;
case 'on':
// Mobile device detected by JavaScript
$value = 'mobile';
self::set_cookie($value, false);
return $value;
case 'off':
// Desktop detected by JavaScript
$value = 'desktop';
self::set_cookie($value, false);
return $value;
case '404': // Mobile style detected, but not found
case 'desktop': // Force desktop style
case 'mobile': // Force mobile style
self::set_cookie($value, $value != '404');
return $value;
}
if (isset($_COOKIE[self::$cookie_var]))
{
switch ($_COOKIE[self::$cookie_var])
{
case 'mobile': // Force mobile style
case 'desktop': // Force desktop style
$value = $_COOKIE[self::$cookie_var];
return $value;
}
}
return false;
}
/**
* Return path to styles directory
*
* @param bool $include_style_path If true, result will include mobile style path
*
* @return string Path to 'styles' or to 'styles/' + mobile style path
*/
protected static function styles_path($include_style_path = false)
{
global $phpbb_root_path;
return $phpbb_root_path . 'styles' . ($include_style_path ? '/' . self::$mobile_style_path : '');
}
/**
* Check user agent string for mobile browser id.
*
* @param string $user_agent User agent string
*
* @return bool True if mobile browser
*/
public static function is_mobile_browser($user_agent)
{
if (self::$mobile_seo && self::$is_bot)
{
return true;
}
if ((strpos($user_agent, 'Mobile') === false && // Generic mobile browser string, most browsers have it.
strpos($user_agent, 'SymbianOS') === false && // Nokia device running Symbian OS.
strpos($user_agent, 'Opera M') === false && // Opera Mini or Opera Mobile.
strpos($user_agent, 'Android') === false && // Android devices that don't have 'Mobile' in UA string.
stripos($user_agent, 'HTC_') === false && // HTC devices that don't have 'Mobile' nor 'Android' in UA string. Case insensitive.
strpos($user_agent, 'Fennec/') === false && // Firefox mobile
strpos($user_agent, 'BlackBerry') === false) || // BlackBerry
strpos($user_agent, 'iPad') !== false) // iPad should be excluded
{
// Not a mobile browser
return false;
}
// Mobile browser
return true;
}
/**
* Check if mobile style exists
*
* @param string $path Directory name of mobile style
*
* @return bool True if mobile style exists
*/
protected static function check_style_path($path)
{
// Locate and read style.cfg
$style_cfg = self::styles_path() . '/' . $path . '/style.cfg';
if (!file_exists($style_cfg))
{
return false;
}
$style_cfg_data = @file_get_contents($style_cfg);
if ($style_cfg_data === false || strpos($style_cfg_data, 'mobile') === false)
{
return false;
}
// Check style.cfg for "mobile = 1"
foreach (explode("\n", $style_cfg_data) as $row)
{
$list = explode('=', $row);
if (count($list) == 2 && trim($list[0]) == 'mobile' && trim($list[1]) == '1')
{
return true;
}
}
return false;
}
/**
* Check if mobile style exists
*
* @param int $id Style id
*
* @return string|bool Path to style if mobile style exists, false on error
*/
protected static function check_style_id($id)
{
global $db;
$id = (int) $id;
$sql = 'SELECT t.template_path
FROM ' . STYLES_TABLE . ' s, ' . STYLES_TEMPLATE_TABLE . " t
WHERE s.style_id = $id
AND t.template_id = s.template_id";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if ($row === false || !self::check_style_path($row['template_path']))
{
return false;
}
return $row['template_path'];
}
/**
* Locate mobile style
*
* @param bool $check_db If true and mobile style id is set, script will check phpbb_styles table for mobile style
* @param bool $check_dirs If true, script will search for mobile style in styles directory
*
* @return string|bool Mobile style path
*/
public static function locate_mobile_style($check_db = true, $check_dirs = true)
{
// Locate by style path
if (defined('MOBILE_STYLE_PATH'))
{
self::$mobile_style_path = MOBILE_STYLE_PATH;
}
if (self::$mobile_style_path !== false && self::check_style_path(self::$mobile_style_path))
{
return self::$mobile_style_path;
}
// Locate by style id
if ($check_db && defined('MOBILE_STYLE_ID') && ($path = self::check_style_id(MOBILE_STYLE_ID)) !== false)
{
self::$mobile_style_path = $path;
return $path;
}
if ($check_db && self::$mobile_style_id && (!defined('MOBILE_STYLE_ID') || MOBILE_STYLE_ID != self::$mobile_style_id) && ($path = self::check_style_id(self::$mobile_style_id)) !== false)
{
self::$mobile_style_path = $path;
return $path;
}
// Search styles directory
if (!$check_dirs)
{
return false;
}
$styles_dir = self::styles_path();
$iterator = new DirectoryIterator($styles_dir);
foreach ($iterator as $fileinfo)
{
if ($fileinfo->isDir() && self::check_style_path($fileinfo->getFilename()))
{
self::$mobile_style_path = $fileinfo->getFilename();
return self::$mobile_style_path;
}
}
return false;
}
/**
* Create HTML code for mobile style link
*
* @param template $template Template class instance
* @param string $mode Mode to add to URL
* @param string $lang Language variable for link text
*
* @return string HTML code for link
*/
protected static function create_link($template, $mode, $lang)
{
global $user;
$text = '';
$lang_key = 'MOBILE_STYLE_' . strtoupper($lang);
switch ($lang)
{
case 'switch_full':
$text = isset($user->lang[$lang_key]) ? $user->lang[$lang_key] : 'Cambiar a la version completa';
break;
case 'switch_mobile':
$text = isset($user->lang[$lang_key]) ? $user->lang[$lang_key] : 'Cambiar a la version movil';
break;
case 'not_found':
$text = isset($user->lang[$lang_key]) ? $user->lang[$lang_key] : 'Error locating mobile style files';
break;
default:
return '';
}
$link = $template->_rootref['U_INDEX'];
$link .= (strpos($link, '?') === false ? '?' : '&') . self::$mobile_var . '=' . $mode;
return '<a href="' . $link . '">' . $text . '</a>';
}
/**
* Add data to overall_footer.html
*
* @param mobile_template $template Template class instance
*
* @return string Empty string
*/
public static function template_footer($template)
{
$link = '';
switch (self::$mobile_mode)
{
case '404':
$link = self::create_link($template, 'mobile', 'not_found');
break;
case 'mobile':
$link = self::create_link($template, 'desktop', 'switch_full');
break;
case 'desktop':
$link = self::create_link($template, 'mobile', 'switch_mobile');
break;
case '':
if (!defined('MOBILE_STYLE'))
{
// Detected desktop style
$link = self::create_link($template, 'mobile', 'switch_mobile');
}
break;
}
if (strlen($link))
{
echo '<div class="mobile-style-switch mobile-style-switch-footer" style="padding: 5px; text-align: center;">' . $link . '</div>';
}
return '';
}
/**
* Add data to overall_header.html
*
* @param mobile_template $template Template class instance
*
* @return string HTML code to echo after overall_header.html
*/
public static function template_header($template)
{
$link = '';
switch (self::$mobile_mode)
{
case 'mobile':
if (isset($_GET[self::$mobile_var]))
{
// Show link below header only if style was just switched
$link = self::create_link($template, 'desktop', 'switch_full');
}
break;
case 'desktop':
if (isset($_GET[self::$mobile_var]))
{
// Show link below header only if style was just switched
$link = self::create_link($template, 'mobile', 'switch_mobile');
}
break;
case '':
self::include_js($template);
if (defined('MOBILE_STYLE'))
{
// Detected mobile style
$link = self::create_link($template, 'desktop', 'switch_full');
}
break;
}
if (strlen($link))
{
return '<div class="mobile-style-switch mobile-style-switch-header" style="padding: 5px; text-align: center;">' . $link . '</div>';
}
return '';
}
/**
* Attempt to include detect.js from mobile style
*
* @param mobile_template $template Template class instance
*/
protected static function include_js($template)
{
if (count($_POST) || isset($_GET[self::$mobile_var]))
{
// Do not redirect on forms or when URL has mode
return;
}
// Locate mobile style
if (self::locate_mobile_style(false, false) === false)
{
return;
}
$script = self::styles_path(true) . '/template/detect.js';
if (!@file_exists($script))
{
return;
}
$template->_rootref['META'] = (isset($template->_rootref['META']) ? $template->_rootref['META'] : '') . '<script> var phpBBMobileStyle = ' . (defined('MOBILE_STYLE') ? 'true' : 'false') . ', phpBBMobileVar = \'' . addslashes(self::$mobile_var) . '\'; </script><script src="' . htmlspecialchars($script) . '"></script>';
}
}
/**
* Extend template class to override _tpl_include()
*/
class mobile_template extends template
{
/**
* Override _tpl_include function
*/
function _tpl_include($filename, $include = true)
{
if ($include)
{
$to_echo = '';
if ($filename == 'overall_footer.html')
{
$to_echo = phpbb_mobile::template_footer($this);
}
if ($filename == 'overall_header.html')
{
$to_echo = phpbb_mobile::template_header($this);
}
}
parent::_tpl_include($filename, $include);
if ($include)
{
echo $to_echo;
}
}
/**
* Clone template class properties
*
* @param template $template Template class instance to copy from
*/
public function clone_properties($template)
{
foreach (array_keys(get_class_vars(get_class($this))) as $var)
{
$this->$var = $template->$var;
}
}
}