در دروپال شما می‌توانید قالب پیشفرض را از صفحه مدیریت قالبها تنظیم کنید و یا با بعضی ماژولهای کمکی مثل themeKey برای کاربران خاص یا صفحات خاص یا گیرنده خاص مثل موبایل یا ترکیبی از شروط یک قالب مجزا تعیین کنید.
اما همه این کارها را به سادگی با چند خط کد هم می‎توان انجام داد.
در دروپال شما می‌توانید قالب پیشفرض را از صفحه مدیریت قالبها تنظیم کنید و یا با بعضی ماژولهای کمکی مثل themeKey برای کاربران خاص یا صفحات خاص یا گیرنده خاص مثل موبایل یا ترکیبی از شروط یک قالب مجزا تعیین کنید. اما همه این کارها را به سادگی با چند خط کد هم می‎توان انجام داد.

 

برای این کار در دروپال 7 کافی بود از هوک hook_custom_theme استفاده کنید.

امادر دروپال 8 در دایرکتوری روت ماژولتان یک فایل  جهت معرفی سرویسهای استفاده شده ایجاد کنید. مثلا فایلی با نام:

myModule.services.yml

 

سپس فایل را باز کنید و بگویید که میخواهم از سرویس تغییر قالب استفاده کنم و آدرس کلاس مربوط به آن را بدهم و اولویت آن را بین همه سرویس های مشابه که در سایر ماژولها استفاده شده تعیین کنم:

services:
    myModule.theme.negotiator:
        class: Drupal\myModule\Theme\ThemeNegotiator
        tags:
          - { name: theme_negotiator, priority: 1000 }

 

سپس فایل کلاسی را که در بالا معرفی کردیم در دایرکتوری و جایگاه زیر ایجاد می‌کنیم:

myModule/src/Theme/ThemeNegotiator.php

 

فایل را باز میکنیم و ThemeNegotiatorInterface را به صورت زیر پیاده سازی می‌کنیم:

<?php
namespace Drupal\myModule\Theme;

use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Theme\ThemeNegotiatorInterface;

class ThemeNegotiator implements ThemeNegotiatorInterface {
    /**
     * @param RouteMatchInterface $route_match
     * @return bool
     */
    public function applies(RouteMatchInterface $route_match)
    {
        return $this->negotiateRoute($route_match) ? true : false;
    }
    /**
     * @param RouteMatchInterface $route_match
     * @return null|string
     */
    public function determineActiveTheme(RouteMatchInterface $route_match)
    {
        return $this->negotiateRoute($route_match) ?: null;
    }
    /**
     * Function that does all of the work in selecting a theme
     * @param RouteMatchInterface $route_match
     * @return bool|string
     */
    private function negotiateRoute(RouteMatchInterface $route_match)
    {
		
        $userRolesArray = \Drupal::currentUser()->getRoles();
        if ($route_match->getRouteName() == 'user.login') {
            return 'myTheme_1';
        }
        elseif ($route_match->getRouteName() == 'some.other.route') {
            return 'myTheme_2';
        }
        elseif (in_array("administrator", $userRolesArray)) {
            return 'myTheme_3';
        }
		
		$detect = \Drupal::service('mobiledetect')->detect();
		if (isset($_GET['theme']) && $_GET['theme'] == 'myTheme_4' && $detect->isMobile())
        {
            return 'myTheme_4';
        }
		
        return false;
    }
}

این کلاس را همینطور که هست کپی کنید. بخش مهم خط 29 به بعد هست. یعنی فانکشن negotiateRoute.

در خط 32 نقش کاربر را خوانده ایم.

در خط 33 گفته ایم اگر صفحه فعلی صفحه لاگین کاربر بود قالب یک روی صفحه اعمال شود.

در خط 36 گفته ایم اگر مثلا صفحه ای دیگر بود قالب دو اعمال شود.

در خط 39 گفته ایم اگر کاربر نقش administrator داشت قالب 3 اعمال شود.

در خط 43 سرویس موبایل دیتکت را فراخوانده ایم. این سرویس نیاز به نصب ماژول mobiledetect دارد و برای بررسی User Agent کاربرد دارد. مثلا برای بررسی دستگاه کاربر که موبایل است یا دستکتاپ یا تبلت یا غیره استفاده دارد.

در خط 44 گفته ایم اگر دستگاه کاربر موبایل بود یا اینکه نام قالب را در URL وارد کرده بود قالب 4 روی صفحه اعمال شود.

 

موفق باشید

 

ارسال پیام