Mobile Detection

This tutorial explains how to add automatic mobile device detection to your phpBB 3.0 forum.

Style Installation

First you need to install a mobile phpBB style.

There are several styles to choose from, download one from this category and install it on your forum.

After installing style, get style id. Go to admin control panel -> styles -> click "preview" button:

Getting style id

Then look at URL in browser, it will look like index.php?style=11&sid=

Get value of "style" parameter. That's the style ID.

Getting style id

Editing files

You will need to edit several phpBB files to add automatic mobile device detection.

1. Open includes/session.php, find this:

       $result = $db->sql_query($sql, 3600);
       $this->theme = $db->sql_fetchrow($result);
       $db->sql_freeresult($result);

       // User has wrong style

and add before it:

       // MOD start: Mobile/SEO style
       if($this->check_mobile($sql, $style))
       {
       // MOD end: Mobile/SEO style

Then find this:

       if (!$this->theme)
       {
           trigger_error('Could not get style data', E_USER_ERROR);
       }

and add before it:

       // MOD start: Mobile/SEO style
       }
       if(defined('MOBILE_DEVICE_OFF'))
       {
           global $SID, $_EXTRA_URL;
           $SID .= '&nomobile=1';
           $_EXTRA_URL[] = 'nomobile=1';
       }
       // MOD end: Mobile/SEO style

Then find this:

   /**
   * More advanced language substitution

and add before it:

   // MOD start: Mobile/SEO style
   /**
   * Check for mobile/seo, get style
   */
   function check_mobile($sql, $style)
   {
       $browser = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
       if (empty($this->data['is_bot']) && strpos($browser, 'Mobile') === false && strpos($browser, 'Symbian') === false && strpos($browser, 'Opera M') === false && strpos($browser, 'Android') === false && stripos($browser, 'HTC_') === false && strpos($browser, 'Fennec/') === false && stripos($browser, 'Blackberry') === false && strpos($browser, 'Windows Phone') === false && strpos($browser, 'WP7') === false && strpos($browser, 'WP8') === false)
       {
               return true;
       }
       define('MOBILE_DEVICE', true);
       if(!empty($_REQUEST['nomobile']))
       {
           define('MOBILE_DEVICE_OFF', true);
           return true;
       }
       global $db;
       // Important: change number 0 below to ID of Artodia:Mobile style.
       // If it is set to 0, script will automatically find style, but it will use extra time and resources.
       $mobile_style_id = 0;
       if($mobile_style_id)
       {
           $sql2 = str_replace('s.style_id = ' . $style, 's.style_id = ' . $mobile_style_id, $sql);
           $result = $db->sql_query($sql2, 3600);
           $this->theme = $db->sql_fetchrow($result);
           $db->sql_freeresult($result);
           if($this->theme !== false)
           {
               define('MOBILE_STYLE', true);
               return false;
           }
       }
       // try to find style
       global $phpbb_root_path;
       $files = scandir($phpbb_root_path . 'styles');
       $base = $phpbb_root_path . 'styles/';
       for($i=0; $i<count($files); $i++)
       {
           if($files[$i] != '.' && $files[$i] != '..' && is_dir($base . $files[$i]) && @file_exists($base . $files[$i] . '/style.cfg'))
           {
               // found directory with style
               $data = file_get_contents($base . $files[$i] . '/style.cfg');
               if(strpos($data, 'mobile = 1') !== false && ($pos = strpos($data, 'name = ')) !== false)
               {
                   $list = explode("\n", substr($data, $pos + 7), 2);
                   $name = trim($list[0]);
                   // found style
                   $sql2 = str_replace('s.style_id = ' . $style, 's.style_name = \'' . $db->sql_escape($name) . '\'', $sql);
                   $result = $db->sql_query($sql2, 3600);
                   $this->theme = $db->sql_fetchrow($result);
                   $db->sql_freeresult($result);
                   if($this->theme !== false)
                   {
                       define('MOBILE_STYLE', true);
                       return false;
                   }
               }
           }
       }
       return true;
   }
   // MOD end: Mobile/SEO style

On line 21 of code (see highlighted code) above replace 0 with id of mobile style.

2. Open includes/functions.php, find this:

   // The following assigns all _common_ variables that may be used at any point in a template.

and add before it:

   // MOD start: Mobile/SEO style
   if(defined('MOBILE_DEVICE'))
   {
       $full_style = defined('MOBILE_DEVICE_OFF');
       if($full_style)
       {
           $s_search_hidden_fields['nomobile'] = 1;
           $mobile_text = isset($user->lang['MOBILE_ON']) ? $user->lang['MOBILE_ON'] : 'Mobile Version';
           $mobile_link = str_replace('nomobile=1&amp;', '', append_sid("{$phpbb_root_path}index.$phpEx", 'nomobile=0'));
       }
       else
       {
           $mobile_text = isset($user->lang['MOBILE_OFF']) ? $user->lang['MOBILE_OFF'] : 'Full Version';
           $mobile_link = append_sid("{$phpbb_root_path}index.$phpEx", 'nomobile=1');
       }
       $mobile_html = '<a href="' . $mobile_link . '">' . $mobile_text . '</a>';
       $user->lang['TRANSLATION_INFO'] = (isset($user->lang['TRANSLATION_INFO']) ? $user->lang['TRANSLATION_INFO'] . ' ' : '') . $mobile_html;
       $template->assign_var('MOBILE_LINK', $mobile_html);
   }
   // MOD end: Mobile/SEO style

Problems

If you have ran into problems after editing templates, look closely at code changes. Probably you have done a mistake somewhere.

Almost all instructions tell you to paste code BEFORE code you are searching for, not after it. This is the most common mistake.

If you have any questions or ran into problems, please post your questions on support forum.