我正在Drupal 8中开发一个自定义模块。它显示了一些使用我们服务的组织的数据。为此,我创建了一个Controller,显示数据库中的数据,由另一个模块放在那里。根据Drupal 8开发中可用的稀缺信息和教程,我已经能够创建以下内容。在.routing.yml文件中,我创建了一个这样的概述表的路径(它没有在这里正确复制,但缩进是可以的):
OrganizationOverview.world:
path: '/world'
defaults:
_controller: 'Drupal\OrganizationOverview\Controller\OrganizationOverviewController::overview'
_title: 'World'
requirements:
_role: 'administrator'
_permission: 'access content'
现在可以使用网址site.com/world
访问概述。但我们想要的是在首页上展示它或在网站的任何其他地方展示它。为此,它需要是一个块。为此,我在OrganizationOverviewBlock
中创建了一个OrganizationOverview/src/Plugin/Block/OrganizationOverviewBlock.php
类,这是根据PSR-4标准的正确方法。该课程如下:
<?php
namespace Drupal\OrganizationOverview\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Session\AccountInterface;
/**
* Provides a 'OrganizationOverviewBlock' block.
*
* @Block(
* id = "organization_overview_block",
* admin_label = @Translation("OrganizationOverviewBlock"),
* category = @Translation("Custom")
* )
*/
class OrganizationOverviewBlock extends BlockBase
{
public function build()
{
return array(
'#markup' => 'Hello World',
);
}
public function blockAccess(AccountInterface $account)
{
return $account->hasPermission('access content');
}
}
所以现在它应该出现在块布局页面中(在我一致地刷新缓存之后)site.com/admin/structure/block/
作为&#34;组织概述块&#34;根据大量来源(Create custom Block,Block API Drupal 8),我应该在哪里启用它。但它并没有出现在那里。我尝试用其中一些方法实现ContainerFactoryPluginInterface,但没有任何改变。它没有显示出来。我尝试使用具有相同代码但名称更简单的块创建一个新的测试模块,但它没有显示出来。我已将代码复制到另一个平台(生产网站),但它也没有显示在那里。我究竟做错了什么?有人能帮我吗?我知道Drupal 8是新的,但这个模块确实需要很快发布。
答案 0 :(得分:4)
您将在Drupal示例项目中找到构建自定义块的工作示例。所以:
有了这个,你应该在你自己的模块中使用你的块
您还可以利用解释here的内容,其中单个php文件执行所有工作。检查文件和文件夹路径。
答案 1 :(得分:1)
您应该遵守Drupal编码标准建议: 模块名称中没有camelCase命名约定。
OrganizationOverview实际上是一个错误,您应该使用organization_overview(小写/下划线)命名约定。
答案 2 :(得分:0)
不需要自定义块的路由文件。
<pre>
class TestBlock extends BlockBase {
/*
** {@inheritdoc}
*/
public function build() {
return array(
'#markup' => $this->t('Welcome page!'),
);
}
}
</pre>
http://drupalasia.com/article/drupal-8-how-create-custom-block-programatically