আমি কীভাবে প্রোগ্রামিয়ালি থিমটি পরিবর্তন করতে পারি?


20

আমি কীভাবে প্রোগ্রামটিভভাবে সক্রিয় ড্রুপাল 8 থিম পরিবর্তন করতে পারি?

ড্রুপাল 6 এ, আমরা নিম্নলিখিত কোডটি ব্যবহার করেছি।

global $custom_theme;
$custom_theme = 'garland';

ড্রুপাল 7 এ, আমরা ব্যবহার করেছি hook_custom_theme()

ড্রুপাল 8-এ, এটি করার সঠিক উপায় কী?

উত্তর:


22

ড্রুপাল 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()পদ্ধতি প্রয়োগ করতে থিম এর থিম মেশিন নাম ফেরৎ।

থিমনিগোটিএটারটিও দেখুন :: নির্ধারণকৃত থিম () থিম আলোচকদের দ্বারা ব্যবহৃত পদ্ধতিগুলি থেকে প্রাপ্ত যুক্তিগুলিতে সম্ভাব্য পরিবর্তনের জন্য কোনও রুটম্যাচ পাস করার প্রয়োজন হবে না ; যদি সেই প্যাচটি প্রয়োগ করা হয় তবে আপনার থিম আলোচনার কোডটিও পরিবর্তন করতে হবে।


উপরোক্ত উদাহরণে প্রয়োগ () ($ রুট_ম্যাচ) হিসাবে প্রয়োগ করা উচিত নয়? একই প্রশ্নটি লিঙ্কিত ডো পৃষ্ঠায় পোস্ট করেছে। ধন্যবাদ!
স্টেফানোস পেট্রাকিস

@ স্টেফানোস পেট্রাকিস হুমম ... যে কোনও বর্তমান বাস্তবায়ন প্যারামিটার হিসাবে পেয়েছে, সেই পরিবর্তনের রেকর্ড যা বলেছে তার বিপরীতে।
কিমলালুনো

আমি উত্তরটি আপডেট করেছি, কোডটি ড্রুপাল কোর ব্যবহার করে এর থিম আলোচকদের মধ্যে আসলে ব্যবহার করছে।
কিমলালুনো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.