मैं प्रोग्राम को सक्रिय रूप से कैसे बदल सकता हूं?


20

मैं प्रोग्रामिक रूप से सक्रिय Drupal 8 थीम को कैसे बदल सकता हूं?

Drupal 6 में, हमने निम्नलिखित कोड का उपयोग किया।

global $custom_theme;
$custom_theme = 'garland';

ड्रुपल 7 में, हमने उपयोग किया hook_custom_theme()

Drupal 8 में, ऐसा करने का सही तरीका क्या है?

जवाबों:


22

Drupal 8 में, आप थीम वार्ताकारों का उपयोग करते हैं, जो अनिवार्य रूप से एक विशिष्ट टैग का उपयोग करने वाली सेवाएं हैं। द्रुपाल द्वारा कार्यान्वित थीम वार्ताकारों को देखें, यह समझने के लिए कि वे कैसे काम करते हैं; परिवर्तन रिकॉर्ड में दिए गए उदाहरण को अपडेट नहीं किया गया है।

user.services.yml

  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 }

AdminNegotiator.php

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 () थीम वार्ताकारों द्वारा उपयोग किए जाने वाले तरीकों से प्राप्त तर्कों पर संभावित बदलाव के लिए किसी रूटमेक को पारित करने की आवश्यकता नहीं होनी चाहिए ; यदि वह पैच लागू होता है, तो आपको अपना थीम वार्ताकार कोड भी बदलना होगा।


लागू नहीं किया जाना चाहिए () के रूप में लिखा जाना चाहिए ($ path_match) उपरोक्त उदाहरण में? लिंक किए गए पृष्ठ पर एक ही प्रश्न पोस्ट करें। धन्यवाद!
स्टेफानोस पेट्राकिस

@StefanosPetrakis हम्म् ... कोई भी मौजूदा कार्यान्वयन पैरामीटर के रूप में मिलता है, जो उस रिकॉर्ड को बदलने के विपरीत कहता है।
kiamlaluno

मैंने उत्तर को अपडेट कर दिया है, कोड ड्रुपल कोर का उपयोग वास्तव में अपने थीम वार्ताकारों में से एक में उपयोग कर रहा है।
kiamlaluno
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.