Как подключить отдельный шаблон для мобильного устройства в Yii2 проекте.

В ходе работы над любым проектом (с использованием Yii2 php фреймоврка), очень часто возникает потребность подключения отдельного шаблона для разных устройств (планшет, телефон, ПК).

Решается задача очень просто.

1) В проекте необходимо поставить и настроить расширение: skeeks/yii2-mobile-detect

Главный конфиг проекта:

'components' => [
    'mobileDetect' => [
        'class' => '\skeeks\yii2\mobiledetect\MobileDetect'
    ]
]

2) Создать простой yii2 компонент

<?php
/**
 * @author Semenov Alexander <semenov@skeeks.com>
 * @link http://skeeks.com/
 * @copyright 2010 SkeekS (СкикС)
 * @date 05.07.2015
 */
namespace common\components;

use skeeks\yii2\mobiledetect\MobileDetect;
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->mobileDetect->isMobile())
            {
                //определение пути к папке с шаблоном
                \Yii::$app->view->theme = new Theme([
                    'pathMap' =>
                    [
                        '@app/views' =>
                        [
                            '@app/templates/mobile',
                        ],
                    ]
                ]);
            }
        });
    }
}

3) Подключить в конфиге проекта, и добавить в автозагрузку

'components' => [
    'appComponent' =>
        [
            'class' => \common\components\AppComponent::className()
        ],
    ]
]

'bootstrap' => ['appComponent'],

4) Структура папок


Теперь если в коде встретится обращение к какому либо файлу шаблона. Например:

echo \Yii::$app->view->render('@app/view/site/index');

При просмотре сайта с телефона, файл шаблона будет браться из папки templates/mobile/site/index.php, ну а если же этого файла там не окажется то будет подключен файл по адресу views/site/index.php

1 фото