Drupal 8 自定义模块未显示在块布局中

Posted

技术标签:

【中文标题】Drupal 8 自定义模块未显示在块布局中【英文标题】:Drupal 8 custom module not showing up in block layout 【发布时间】:2020-06-11 00:46:46 【问题描述】:

我有一个 Drupal 8 的自定义块模块。它在我的本地主机版本的 drupal(版本 8.7.8)上工作。当我将它上传到 Web 服务器(版本 8.7.11)时,我可以启用该模块,但是当我尝试将块放置在块布局页面上时它没有显示。我对 Web 服务器没有太多控制 - 文件是通过 git 存储库上传的,但我添加的其他模块可以正常工作。

我的模块只有 2 个文件:

modules/custom/ischool_section_title_level_two/ischool_section_title_level_two.info.yml

name: iSchool Section Title Level Two
description: Provides a block that shows the Level Two title, or Level One if there is no Level Two.
core: 8.x
package: Custom
dependencies:
  - block
type: module

modules/custom/ischool_section_title_level_two/src/plugin/block/iSchoolSectionTitlelevel_two.php

<?php

namespace Drupal\ischool_section_title_level_two\Plugin\Block;
use Drupal\Core\Block\BlockBase;

/**
 * Provides a block that shows the Level Two section title, or Level One title if there is no level Two
 *
 * @Block(
 *   id = "ischool_section_title_level_two",
 *   admin_label = @Translation("iSchool Section Title Level Two"),
 *   category = @Translation("Custom"),
 *   context_definitions = 
 *     "node" = @ContextDefinition("entity:node", label = @Translation("Node"))
 *   
 * )
 */


//code adapted from http://hussainweb.me/an-easier-way-to-get-the-current-node-in-a-block-plugin-in-drupal-8/
//and https://design.briarmoon.ca/tutorials/drupal-8/getting-the-parent-node-of-a-drupal-8-node
class iSchoolSectionTitlelevel_two extends BlockBase 

  public function build() 
    $node = $this->getContextValue('node');
    if (empty($node))     
      return [
        '#markup' => "",
      ];
    

    $L1_Title = $node->getTitle();
    $L2_Title = $node->getTitle();
    $currentNode = $node;

    while (true) 
      $parent_node = $this->getParentNode($currentNode);
      if (empty($parent_node))
      break;
    
      $L2_Title = $L1_Title;
      $L1_Title = $parent_node->getTitle();

      $currentNode = $parent_node;
   

    return [
      '#markup' => $L2_Title,
    ];
  

  private function getParentNode($node)


    if (empty($node)) return null;
    $menu_link_manager = \Drupal::service('plugin.manager.menu.link');
    $links = $menu_link_manager->loadLinksByRoute('entity.node.canonical', ['node' => $node->id()]);

    // Because loadLinksByRoute() returns an array keyed by a complex id
    // it is simplest to just get the first result by using array_pop().
    /** @var \Drupal\Core\Menu\MenuLinkInterface $link */
    $link = array_pop($links);
    if (empty($link)) return null;



    /** @var \Drupal\Core\Menu\MenuLinkInterface $parent */
     if ($link->getParent() && $parent = $menu_link_manager->createInstance($link->getParent())) 
        if (!method_exists($parent, "getUrlObject")) return null;
        $urlObj = $parent->getUrlObject();
        if (is_null($urlObj)) return null;
        if (!method_exists($urlObj, "getRouteParameters")) return null;
        $route = $urlObj->getRouteParameters();
        if (empty($route)) return null;
        if (!isset($route['node'])) return null;
        $parent_node = \Drupal::entityManager()->getStorage('node')->load($route['node']);
        return $parent_node;
     
     else return null;
  

  // cache this block for a definite time.
  public function getCacheMaxAge() 
    return 43200;
  




【问题讨论】:

【参考方案1】:

这是文件夹大小写的问题。

第二个文件应该在 /src/Plugin/Block/ 文件夹中,但在 /src/plugin/block/ 文件夹中(缺少初始大写)。

在本地 Windows 机器上,这没有任何区别。在 LAMP 堆栈机器上,它导致该块未显示。

【讨论】:

以上是关于Drupal 8 自定义模块未显示在块布局中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Drupal 8 中自定义/样式/主题自定义内容类型的输出?

如何在 Drupal 视图块中自定义 HTML 结构

如何 - 构建自定义 drupal 8 模块表单

Wordpress 自定义块未显示在块插入器中

当自定义模板已应用于节点的内容类型时,如何在 Drupal 6 中自定义特定节点?

PHP 在Drupal 6中自定义块搜索表单