Trong Drupal 8, bạn sử dụng các nhà đàm phán chủ đề , về cơ bản là các dịch vụ sử dụng một thẻ cụ thể. Xem các nhà đàm phán chủ đề được thực hiện bởi Drupal, để hiểu chính xác cách họ làm việc; ví dụ đưa ra trong hồ sơ thay đổi không được cập nhật.
theme.negotiator.admin_theme:
class: Drupal\user\Theme\AdminNegotiator
arguments: ['@current_user', '@config.factory', '@entity.manager', '@router.admin_context']
tags:
- { name: theme_negotiator, priority: -40 }
namespace Drupal\user\Theme;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Routing\AdminContext;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Theme\ThemeNegotiatorInterface;
/**
* Sets the active theme on admin pages.
*/
class AdminNegotiator implements ThemeNegotiatorInterface {
/**
* The current user.
*
* @var \Drupal\Core\Session\AccountInterface
*/
protected $user;
/**
* The config factory.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
protected $configFactory;
/**
* The entity manager.
*
* @var \Drupal\Core\Entity\EntityManagerInterface
*/
protected $entityManager;
/**
* The route admin context to determine whether a route is an admin one.
*
* @var \Drupal\Core\Routing\AdminContext
*/
protected $adminContext;
/**
* Creates a new AdminNegotiator instance.
*
* @param \Drupal\Core\Session\AccountInterface $user
* The current user.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The config factory.
* @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
* The entity manager.
* @param \Drupal\Core\Routing\AdminContext $admin_context
* The route admin context to determine whether the route is an admin one.
*/
public function __construct(AccountInterface $user, ConfigFactoryInterface $config_factory, EntityManagerInterface $entity_manager, AdminContext $admin_context) {
$this->user = $user;
$this->configFactory = $config_factory;
$this->entityManager = $entity_manager;
$this->adminContext = $admin_context;
}
/**
* {@inheritdoc}
*/
public function applies(RouteMatchInterface $route_match) {
return ($this->entityManager->hasHandler('user_role', 'storage') && $this->user->hasPermission('view the administration theme') && $this->adminContext->isAdminRoute($route_match->getRouteObject()));
}
/**
* {@inheritdoc}
*/
public function determineActiveTheme(RouteMatchInterface $route_match) {
return $this->configFactory->get('system.theme')->get('admin');
}
}
Mã này khá dễ hiểu: applies()
Phương thức trả về TRUE
khi tuyến hiện tại là tuyến mà mô-đun của bạn muốn thay đổi chủ đề; các determineActiveTheme()
phương thức trả về tên máy chủ đề của chủ đề để áp dụng.
Xem thêm ThemeNegotoder :: notifyActiveTheme () không nên yêu cầu RouteMatch được thông qua để có thể thay đổi các đối số nhận được từ các phương thức được sử dụng bởi các nhà đàm phán chủ đề; nếu bản vá đó được áp dụng, bạn cũng sẽ cần thay đổi mã nhà đàm phán chủ đề của mình.