Все мы знаем как популярны сейчас responsive (адаптивные) шаблоны и все так современно и удобно с ними, что как бы мобильную версию магазина и не надо. Но у меня возникла необходимость реализовать именно мобильную версию сайта с переходом на поддомен m.domain.com, как это сделано на lamoda.ru (m.lamoda.ru работает только с моб. девайсов). Нужно было сделать, моб.версию магазина с одинаковой базой товаров и категорий, но естественно с другим отображением и с возможностью перейти на полную версию магазина с мобильного устройства и обратно. Что было сделано: Определение с какого устройства зашел пользователь - был использован php class Mobile_Detect.php (https://github.com/serbanghita/Mobile-Detect)
1. Добавление библиотеки
файл mobile_detect.php залить в папку system/library
в файле system/startup.php после строки library/config.php подключаем mobile_detect.php
require_once(DIR_SYSTEM . 'library/Mobile_Detect.php');
$detect = new Mobile_Detect();
define('isMobile', $detect->isMobile(), false);//Это используем
define('isTablet', $detect->isTablet(), false); //Это используем
//Остальные в принципе не нужны
define('isiOS', $detect->isiOS(), false);
define('isAndroidOS', $detect->isAndroidOS(), false);
isMobile, isTablet - определяет тип устройства - телефон или планшет isiOS, isAndroindOS, isBlackBerryOS, isSymbainOS, isWindowsPhoneOS и так далее - определяет ОС посетителя (если не собератетесь делать моб.версию под отдельную ОС, можете не использовать вообще =) )
2. Определение устройства посетителя и редирект на поддомен (лично я не использую этот способ)
Далее будем использовать эти константы (isMobile...)для действий переадресации на моб. версию
теперь в контроллере header.php после protected function index() { пишем следующее
$detect = new Mobile_Detect();
if ($detect->isMobile()){
if (isset($this->request->server['HTTPS'])) {
$mobile_redirect = 'https://m.mystore.com';
} else {
$mobile_redirect = 'http://m.mystore.com';
}
if ($_SERVER['REQUEST_URI']) $mobile_redirect .= html_entity_decode($_SERVER['REQUEST_URI']);
header('Location: '.$mobile_redirect);
}
Это собственно и заставит перенаправить пользователя на мобильную версию (или другой URL), если он зашел с мобильного. С условиями можете сами крутить
detect->isMobile() - только для мобильных
$detect->isTablet() - только для планшетов
$detect->isMobile() || $detect->isTablet() - для обоих и так далее
Это первый вариант (не очень удачный), когда пользователь попадает на мобильную версию, то обратно на полную не зайдет. Решение для перехода обратно, путем записи параметра в COOKIE. Вместо кода предложенного выше в контроллере header.php после protected function index() { пишем
$detect = new Mobile_Detect();
if($detect->isMobile()) {
if (isset($this->request->server['HTTPS'])) {
$mobile_redirect = 'https://m.mystore.com';
} else {
$mobile_redirect = 'http://m.mystore.com';
}
if(isset($_REQUEST['ver']) and $_REQUEST['ver'] === 'full') {
if(empty($_COOKIE['ver']))
setcookie('ver', 'full', time() + 86400, '/', '.mystore.com'); //будет работать для всех поддоменов, подробнее читайте на php.su setcookie()
} else {
header('Location: '.$mobile_redirect);
}
}
В этом случае _mobile (префикс шаблона который стоит по умолчанию), то есть если папка с шаблоном по-умолчанию (для полной версии) 'default', а для мобильной соответственно 'default_mobile' На мобильной версии можете разместить ссылку на полную страницу по типу
<a href="http://mystore.com/?ver=full">Полная версия</a>
где ?ver=full - параметр что мы записали в куки. Вроде все. P.S Есть еще вариант сделать это через .htaccess - работает безотказно, но придется перечислить весь список мобильных девайсов ну и в полную версию вернуться нельзя. Решение для тех кому просто нужна смена шаблона в зависимости от устройства без поддомена (Работает на живом сайте paffos ru)
1. Добавляем библиотеку MobileDetect как это было описано выше в п.1 2. Затем в корне сайта в файле index.php перед
// Currency
$registry->set('currency', new Currency($registry));
добавляем
//Mobile
if(isMobile && !isTablet && $_COOKIE['ver'] !== 'full'){
$config->set('config_template', 'default_mobile');
}elseif(isMobile && !isTablet && $_COOKIE['ver'] == 'full'){
$config->set('config_template', 'default');
}
Так мы определим устройство того кто зашел и в случае если он зашел с телефона (не с планшета) мы проверяем наличие куки ver и ее значение, если значение не Full, то грузим шаблон default_mobile, в противном случае грузим шаблон default
3. При заходе на шаблон нам нужно записать куки, что бы пользователя не кидало на неверный сразу же и при последующих заходах (если не чистили куки в браузере)
В файле header.tpl каждого шаблона перед
<link rel="stylesheet" type="text/css" href="catalog/view/theme/default_mobile/stylesheet/stylesheet.css" />
- добавляем запись куки mobile в мобильном шаблоне
<?php setcookie('ver', 'mobile', time() + 60 * 60 * 24 * 30, '/'); ?>
- добавляем запись куки full в обычном шаблоне
<?php setcookie('ver', 'full', time() + 60 * 60 * 24 * 30, '/'); ?>
4. Если же пользователю надо дать возможность переходить с мобильной версии на полную и наоборот.
В контроллере footer.php добавляем запись для проверки отображать нам кнопку переход в полную версию или нет (В примере условие только для мобильных)
if(isMobile && !isTablet){
$this->data['gofull'] = true;
}else{
$this->data['gofull'] = false;
}
В файле footer.tpl каждого шаблона где вам удобно:
- добавляем кнопки перехода в полную версию для mobile шаблона
<div class="ver">Перейти на: <span id="gofull">Полный сайт</span></div>
- добавляем кнопки перехода в мобильную версию для default шаблона
<?php if($gofull){ ?>
Перейти на: <span id="gofull">Мобильную версию</span>
<?php } ?>
- в файле common.js после
$(document).ready(function() {
добавляем
$('#gofull').on('tap click touchstart', function(){
$.cookie('ver', 'mobile', { expires: 1, path: '/' });
location.reload();
});
При клике на элемент с id="gofull" будет срабатывать на всех устройствах переход либо в полную версию либо обратно.
Возможно местами это костыли, зато работает и проверено на живом магазине с большой посещалкой в сезон.
Всем спасибо. Благодарности принимаю в денежном эквиваленте 2 чашек кофе 8-) ))
Если тема актуальна буду рад дальнейшему развитию и усовершенствованию решения, потому-что прибегать к использованию коммерческих буржуйских решений Opencart Mobile Framework или Omtex Mobile Template не очень удобно, так как нужно перепиливать готовый дизайн под себя. И нет ничего хуже ковырять чужой код.