Drupalモジュールでブロックをプログラム的に作成する
Drupal 8のブロックはブロックプラグインのインスタンスです。
Drupalのブロックマネージャーは、モジュール内の@Blockアノテーションを含むクラスをスキャンします。
以下のコード例では、@Blockアノテーションを「id」および「admin_label」プロパティとともに使用して、カスタムブロックを定義しています。
前に作成したモジュールスケルトンにsrc/Plugin/Block/HelloBlock.phpファイルを作成し、以下のコードを追加します。
Drupalサイトがこの新しいクラスを認識するには、キャッシュをクリアする必要があります。
<?php
namespace Drupal\hello_world\Plugin\Block;
use Drupal\Core\Block\BlockBase;
/**
* Provides a 'Hello' Block.
*
* @Block(
* id = "hello_block",
* admin_label = @Translation("Hello block"),
* category = @Translation("Hello World"),
* )
*/
class HelloBlock extends BlockBase {
/**
* {@inheritdoc}
*/
public function build() {
return [
'#markup' => $this->t('Hello, World!'),
];
}
}
「Hello block」を追加するには、Structure -> Block Layout(admin/structure/block)に移動し、各利用可能なリージョンに関連付けられた「Place block」ボタンをクリックします。
任意のリージョンの「Place block」ボタンをクリックすると、利用可能なすべてのブロックのリストを含む「Place block」ダイアログボックスがポップアップ表示されます。自分のブロックをすばやく見つけるには、「Filter by block name」オプションを使用するか、マウススクロールで「Hello block」を見つけます。これで、サイトのどこにでもカスタムブロックのインスタンスをいくつでも追加できます。
トラブルシューティング
- クラス名とファイル名は同じでなければなりません(HelloBlockクラスと/src/Plugin/Block/HelloBlock.php)。クラス名が異なる場合、ブロックは利用可能なブロックのリストに表示されますが、追加することはできません。
- すべてのパスとファイル名を再確認してください。.phpファイルは正しいディレクトリ(/src/Plugin/Block/)に配置する必要があります。そうしないとDrupalに検出されません。
- ブロックが画面またはwatchdogにエラーなしで配置されない場合は、PHP/Apacheのエラーログを確認してください。
- ブロックがリストにない場合は、Drupalキャッシュを必ず再構築してください(例:drush cr)。
- モジュールの命名規則がすべて小文字であることを確認してください。camelCaseの命名規則を持つモジュールではブロックが表示されないという報告が一部のユーザーからあります。たとえば、myModuleは特定のブロックを表示しないため、my_moduleにする必要があります。これはDrupal 8.8.1で最後に確認されています。
注:カスタムブロックでのTwigテンプレートの使用
1. .moduleファイルにhook_themeを追加します。
注:テーマ関数を「block __...」と名付けないでください。Twigテンプレートに変数が渡されません。代わりに、モジュール名をプレフィックスとして使用できます。
2. ビルドメソッドのレンダー配列で「#theme」を使用し、「#theme」と同じレベルで変数を渡します - 「#varname」。