Drupal 8 में, आप थीम वार्ताकारों का उपयोग करते हैं, जो अनिवार्य रूप से एक विशिष्ट टैग का उपयोग करने वाली सेवाएं हैं। द्रुपाल द्वारा कार्यान्वित थीम वार्ताकारों को देखें, यह समझने के लिए कि वे कैसे काम करते हैं; परिवर्तन रिकॉर्ड में दिए गए उदाहरण को अपडेट नहीं किया गया है।
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');
}
}
कोड को समझना बहुत आसान है: applies()
विधि TRUE
तब लौटती है जब वर्तमान मार्ग वह होता है जिसके लिए आपका मॉड्यूल थीम बदलना चाहता है; determineActiveTheme()
विधि को लागू करने के विषय के विषय मशीन नाम देता है।
यह भी देखें ThemeNegotiator :: निर्धारक Theme () थीम वार्ताकारों द्वारा उपयोग किए जाने वाले तरीकों से प्राप्त तर्कों पर संभावित बदलाव के लिए किसी रूटमेक को पारित करने की आवश्यकता नहीं होनी चाहिए ; यदि वह पैच लागू होता है, तो आपको अपना थीम वार्ताकार कोड भी बदलना होगा।