Исправление автопереключения мобильного шаблона для 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');
		}
	}
}

9 комментариев

avatar
Кстати эта либа умеет определять тип устройства (смартфон, планшет), операционку (iOS, Android, etc.), браузер…
avatar
Да, там много плюх. Но нужна по сути только 1 функция
avatar
Хорошую работу проделали. Получается, с этой библиотекой даже быстрей загрузка будет, не будет лишних запросов перед загрузкой страницы.
avatar
Спасибо ))
avatar
Использую 2 браузера на сотовом: Хром и мозилла.
На мозилле в прошлом году перестала включаться мобильная версия сайта, в хроме как работала так и работает.
Переделал по Вашему варианту автоопределение, в хроме также работает, а в мозилле также нет))))
какие предположения будут?
avatar
UPD: после принудительного включения ?force-mobile=on заработала и в Мозилле. Видимо нужно было почистить куки браузера для повторного определения.
avatar
Аналогично. И никаих проблем просто не бывает в таком случае

Использую 2 браузера на сотовом: Хром и мозилла.
На мозилле в прошлом году перестала включаться мобильная версия сайта, в хроме как работала так и работает.
Переделал по Вашему варианту автоопределение, в хроме также работает, а в мозилле также нет))))
какие предположения будут?
avatar
Пробуйте заходить с разных браузеров. Скорей всего ошибка и трабл кроется именно в кэше

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

То есть на практике все новые посетители попадают на мобильную версию вашего сайта, пока не установят специальную куку (принудительно не переключатся на десктопную версию).
avatar
Скорей всего ошибка в оригинале. Я так думаю. Десткоп иногда дает такие ошибки непонятные
Тут нужно убить запросы к апи сервиса яндекса и переопределить логику определения мобилок. Я не кодер, как и писал раньше, так что нарубил как смог )))) Чтобы не мучать вас сильно своими правками, начало кода стало выглядеть так (если хотите, можете проверить что я менял, сверив с оригиналом). Потом еще проверил на рейтинге сео компаний и понял в каком направлении надо двигаться. Но в итоге это не решало мою проблему но приблизило к решению.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.