Làm cách nào để thay đổi chủ đề đang hoạt động theo chương trình?


20

Làm cách nào để thay đổi chủ đề Drupal 8 đang hoạt động theo chương trình?

Trong Drupal 6, chúng tôi đã sử dụng mã sau đây.

global $custom_theme;
$custom_theme = 'garland';

Trong Drupal 7, chúng tôi đã sử dụng hook_custom_theme().

Trong Drupal 8, cách chính xác để làm điều này là gì?

Câu trả lời:


22

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.

user.service.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 }

AdminNegotenser.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');
  }

}

Mã này khá dễ hiểu: applies()Phương thức trả về TRUEkhi 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.


Không nên áp dụng () được viết là áp dụng ($ route_match) trong ví dụ trên? Đăng cùng một câu hỏi đến trang làm liên kết. Cảm ơn!
Stefanos Petrakis

@StefanosPetrakis Hmmm ... Bất kỳ triển khai hiện tại nào cũng lấy đó làm tham số, trái với những gì bản ghi thay đổi nói.
kiamlaluno

Tôi đã cập nhật câu trả lời, sử dụng mã Drupal cốt lõi thực sự đang sử dụng trong một trong những nhà đàm phán chủ đề của nó.
kiamlaluno
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.