Исправление автопереключения мобильного шаблона для LS 1.0.3

Как многие заметили, мобильный шаблон для LS 1.0.3 с какого-то времени перестал работать.

Например, если почистить куки браузера и зайти на главную страницу сайта, то вы будете автоматически перенаправлены на мобильную версию шаблона вне зависимости от того, с какого устройства вы зашли.

То есть на практике все новые посетители попадают на мобильную версию вашего сайта, пока не установят специальную куку (принудительно не переключатся на десктопную версию).

И вина здесь не на разработчике плагина, а на сервисе Янлекса, который перестал работать (апи сервиса больше не предоставляется).

Ниже смотрим как исправить ситуёвину своими руками.

Я не программист, сразу скажу, чтоб в личку с вопросами не лезли, просто балуюсь на досуге ;)
Для определения типа устройства я использовал стороннюю библиотеку отсюда — Mobile Detect.

Я скачал последнюю версию скрипта и уложил ее в каталог
/ваш/сайт/plugins/mobiletpl/classes/lib/mobile-detect

Файл

Mobile_Detect.php

Собсно это готовый класс, который легко и просто можно вызвать для выполнения всего одной функции:

Это мобильный? () //;))


(в понятие мобильного здесь входят и планшеты и смартфоны, но при необходимости можно вызвать другие методы, чтобы отфильтровать нужный вам тип устройства)

Теперь осталось подключить этот класс и переопределить логику работы плагина для мобильного шаблона.

Начнем с первого.

Подключил класс я там же, где ort подключал свой ;)


В файле

/mobiletpl/include/init.php

Добавляем строку:

require_once(dirname(dirname(__FILE__)).'/classes/lib/mobile-detect/Mobile_Detect.php');


То есть получается так:

<?php

require_once(dirname(dirname(__FILE__)).'/classes/lib/mobile-detect/MobileDetect.php');
// Include and instantiate the class.
require_once(dirname(dirname(__FILE__)).'/classes/lib/mobile-detect/Mobile_Detect.php');


MobileDetect::IsNeedShowMobile();


Теперь логика


За обработку переключателя отвечает код в файле

/ваш/сайт/plugins/mobiletpl/classes/lib/mobile-detect/MobileDetect.php (не путать с тем, что мы выкачивали и подключали отдельно!!!)

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

Я не кодер, как и писал раньше, так что нарубил как смог ))))

Чтобы не мучать вас сильно своими правками, начало кода стало выглядеть так (если хотите, можете проверить что я менял, сверив с оригиналом).

class MobileDetect {

	static protected $bIsNeedShowMobile=null;
	/**
	 * Оставляем из всех только эту строчку выше
	 */

	/**
	 * Определение типа устройства - мобильное или нет
	 *
	 * @return bool
	 */
	static public function DetectMobileDevice() {
		$detect = new Mobile_Detect; //инициализируем тот самый подключенный класс
		if ( $detect->isMobile() ) { //а это и есть та самая чудо-функция из класса
			return true;
		}
		
		return false;
	}


Остальное оставляем как и раньше.

Вот так выглядит весь файл в конце правок

<?php

class MobileDetect {

	static protected $bIsNeedShowMobile=null;
	/**
	 * Выполняет запрос к API сервиса
	 *
	 * @param array $aRequest	Список параметров
	 *
	 * @return bool|array
	 */

	/**
	 * Определение типа устройства - мобильное или нет
	 *
	 * @return bool
	 */
	static public function DetectMobileDevice() {
		$detect = new Mobile_Detect;
		if ( $detect->isMobile() ) {
			return true;
		}
		
		return false;
	}

	static public function IsNeedShowMobile() {
		if (!is_null(self::$bIsNeedShowMobile)) {
			return self::$bIsNeedShowMobile;
		}
		/**
		 * Принудительно включаем мобильную версию
		 */
		if (getRequest('force-mobile',false,'get')=='on') {
			setcookie('use_mobile',1,time()+60*60*24*30,Config::Get('sys.cookie.path'),Config::Get('sys.cookie.host'),false);
			return self::$bIsNeedShowMobile=true;
		}
		/**
		 * Принудительно включаем полную версию
		 */
		if (getRequest('force-mobile',false,'get')=='off') {
			setcookie('use_mobile',0,time()+60*60*24*30,Config::Get('sys.cookie.path'),Config::Get('sys.cookie.host'),false);
			return self::$bIsNeedShowMobile=false;
		}
		/**
		 * Пользователь уже использует мобильную или полную версию
		 */
		if (isset($_COOKIE['use_mobile'])) {
			if ($_COOKIE['use_mobile']) {
				return self::$bIsNeedShowMobile=true;
			} else {
				return self::$bIsNeedShowMobile=false;
			}
		}
		/**
		 * Запускаем авто-определение мобильного клиента
		 */
		if (self::DetectMobileDevice()) {
			setcookie('use_mobile',1,time()+60*60*24*30,Config::Get('sys.cookie.path'),Config::Get('sys.cookie.host'),false);
			return self::$bIsNeedShowMobile=true;
		} else {
			setcookie('use_mobile',0,time()+60*60*24*30,Config::Get('sys.cookie.path'),Config::Get('sys.cookie.host'),false);
			return self::$bIsNeedShowMobile=false;
		}
	}

	static public function IsMobileTemplate($bHard=true) {
		if ($bHard) {
			return self::IsNeedShowMobile();
		} else {
			return Config::Get('plugin.mobiletpl.template') && Config::Get('view.skin')==Config::Get('plugin.mobiletpl.template');
		}
	}
}

4 комментария

avatar
Кстати эта либа умеет определять тип устройства (смартфон, планшет), операционку (iOS, Android, etc.), браузер…
avatar
Да, там много плюх. Но нужна по сути только 1 функция
avatar
Хорошую работу проделали. Получается, с этой библиотекой даже быстрей загрузка будет, не будет лишних запросов перед загрузкой страницы.
avatar
Спасибо ))
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.