Как уже было сказано во второй главе, сервер не получает от клиента конкретного указания на тип устройства, поэтому определить, чем именно пользуется пользователь и какой вариант страницы ему требуется отправить можно только по браузеру, создавшему запрос. Название браузера содержится  в заголовке User-Agent и его можно получить при помощи предопределённой переменной $_SERVER['HTTP_USER_AGENT'], но при условии, что она не пуста. Обычно браузеры всегда отправляют такую информацию, а если заголовок пустой, то это вполне может означать, что  данный запрос отправлен не обычным пользователем, а роботом какого-либо портала, причём в большинстве случаев с не самой хорошей целью.

 Обратите внимание: при необходимости вы можете полученное значение подвергнуть "расшифровке" при помощи функции  get_browser(). Эта функция вернёт массив из различных данных, однако в данной статье это не рассматривается (за ненадобностью).

  

Код для определения устройства пользователя

Здесь нужно обратить внимание на то, что данный код будет несколько отличаться в зависимости от варианта использования и места его установки.

Начнём с динамической вёрстки. Здесь применяется один URL независимо от устройства, поэтому код будет выглядеть так:

if (preg_match('регулярное выражение1', $_SERVER['HTTP_USER_AGENT']) ||

    preg_match('регулярное выражение2', substr($_SERVER['HTTP_USER_AGENT'], 0, 4))) {

          код для мобильной версии

} else {

          код для десктопной версии (компьютеры, ноутбуки)

}

Конструкция if проверяет на истинность два выражения, и если одно из них истинно (true), т.е. переменная содержит данные браузера для мобильного устройства, то запускается выполнение соответствующего кода. Если оба выражения false, то запускается код для обычной версии сайта.

При этом:

preg_match('регулярное выражение1', $_SERVER['HTTP_USER_AGENT'])

определяет, насколько переменная $_SERVER['HTTP_USER_AGENT']  соответствует следующему регулярному выражению:

'/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge|maemo|midp|mmp|netfront|opera m(ob|in)i|palm(os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i'

Второе выражение

preg_match('регулярное выражение2', substr($_SERVER['HTTP_USER_AGENT'], 0, 4)))

определяет, насколько первые четыре символа в переменной соответствуют следующему регулярному выражению:

'/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i'

 Обратите внимание: при копировании выражения не должны содержать пробелов и переносов!

 Для справки: функция preg_match проверяет на совпадение регулярному выражению не весь текст, содержащийся в переменной, а ищет в ней любую часть строки, полностью совпадающей с регулярным выражением.

При динамической вёрстке такой "переключатель" устанавливается почти в самом начале файла index.php шаблона сайта (не путать с файлом index.php в корне сайта!). Этот файл содержит код для обычного и мобильного варианта и благодаря такому "переключателю" отдаёт тот, который соответствует запросу; об этом будет подробно рассказано в следующей главе.

 

Особенности работы мобильной версии

В мобильной версии "переключатель" имеет немного другой код и устанавливается по-другому; более того в мобильной версии таких переключателя два.

Всё дело в том, что к сайту в этом случае подключено два домена, один из которых является поддоменом основного. Соответственно, не исключён вариант, когда страницу на основном домене будет запрашивать мобильное устройство, поэтому его нужно сразу переадресовать на правильный адрес. Например, если на этот сайт поступит запрос со смартфона, содержащий URL  https://web-development-school.ru/, то система его переадресует на  https://m.web-development-school.ru/; тоже самое произойдёт с другими страницами. Несмотря на то, что поисковики обычно отправляют в выдачу правильную версию, ситуацию, при которой будет отправлена десктопная версия для мобильного устройства исключать не стоит; именно для этого и устанавливается "переключатель" на входе.

Код такого "переключателя" довольно прост:

if ($_SERVER['SERVER_NAME'] == 'домен_сайта') {

     if (preg_match('регулярное выражение', $_SERVER['HTTP_USER_AGENT']) ||
         preg_match('регулярное выражение', substr($_SERVER['HTTP_USER_AGENT'], 0, 4))) {

            header('Location: https://m.домен_сайта' . $_SERVER['REQUEST_URI']);

     }

}

Если выражение во внешней конструкции if окажется true, т.е. запрос отправлен как https://домен_сайта, будет произведена проверка типа браузера устройства. Если это окажется браузер для мобильного, то внутренняя конструкция if переадресует запрос на мобильный поддомен, т.е. на https://m.домен_сайта, причём переменная $_SERVER['REQUEST_URI'] обеспечит переадресацию на запрашиваемую страницу. Если же запрос отправлен как m.домен_сайта, то за счёт внешней конструкции if проверка браузера пользователя будет проигнорирована.

Как было сказано выше, этот "переключатель" устанавливается на входе, т.е. в главном файле index.php в корне сайта. Например, для CMS Joomla это нужно сделать сразу после следующего выражения (в 13 строке):

define('JOOMLA_MINIMUM_PHP', '5.3.10');

код переключателя;

Второй "переключатель" установлен так же, как и при динамической вёрстке, почти в самом начале файла index.php шаблона сайта. Здесь он выполняет ту же функцию, что и при динамической вёрстке (т.е. подставляет нужный код), однако выглядит намного проще:

if ($_SERVER['SERVER_NAME'] == 'домен_сайта') {

     код для десктопной версии (компьютеры, ноутбуки)

} else {

         код для мобильной версии

}

Пользователи CMS Joomla могут применить несколько другой код, но смысл от этого не поменяется:

$uri = JFactory::getURI();
$t_uri = $uri->getHost();
if ($t_uri == 'домен_сайта') {

     код для десктопной версии (компьютеры, ноутбуки)

else {

         код для мобильной версии

}

- - - - - - - - - - - -

Итак, с теорией разобрались, можно приступать к изменению кода.

 Напоминание: если вы выбрали вариант "мобильная версия сайта на поддомене", в первую очередь создайте поддомен и закажите для него сертификат SSL. Так же для этой версии установите "переключатель" в корневом файле index.php (см. выше). Второй "переключатель" в шаблоне пока устанавливать не нужно - это будет сделано в следующей главе.