Yii 2 - подключение отдельного шаблона для мобильного устройства

Очень часто возникает потребность подключения отдельного шаблона для разных устройств. Решается задача очень просто.

  • В проекте необходимо поставить и настроить расширение: Yii 2 Device Detect
  • В /common/components/detection скачать и распаковать Mobile Detect
  • В /common/components/ создать компонент AppComponent:
    namespace common\components;
    	
    use alexandernst\devicedetect\DeviceDetect;
    use yii\base\BootstrapInterface;
    use yii\base\Component;
    use yii\base\Theme;
    use yii\web\Application;
    	
    class AppComponent extends Component implements BootstrapInterface {
    	public function bootstrap($app) {
    		\Yii::$app->on(Application::EVENT_BEFORE_REQUEST, function() {
    			if (\Yii::$app->devicedetect->isMobile()) {
    				\Yii::$app->view->theme = new Theme([
    					'pathMap' => [
    						'@app/views' => [
    							'@app/templates/mobile',
    						],
    					]
    				]);
    			}
    		});
    	}
    }
  • Подключить в конфиге проекта (/common/config/main.php), и добавить в автозагрузку:
    'bootstrap' => ['appComponent'],
    
    'components' => [
    	'appComponent' => [
    		'class' => \common\components\AppComponent::className()
    	],
    ],
  • Рядом с папкой views/{folders} находится папка templates/mobile/{folders}. Теперь если в коде встретится обращение к какому либо файлу шаблона, например:
    echo \Yii::$app->view->render('@app/view/site/index');
    При просмотре сайта с телефона, файл шаблона будет браться из папки templates/mobile/site/index.php, ну а если же этого файла там не окажется, то будет подключен файл по адресу views/site/index.php.