ブロックに設定フォームを追加する
ここで、サイトビルダーがカスタムブロックの各インスタンスに設定の一部を入力できるようにしたいとしましょう。Drupal 8では、すべてのサイト構築設定を開発サイトからエクスポートして本番サイトにインポートできることに常に留意してください(設定の管理と呼ばれます)。モジュール開発者として、サイトビルダーが新しいブロックを作成するときにフォームに自動入力するデフォルト設定を提供することもできます。
前のページの既存のHelloBlockクラスに、既存のものに続いて次のuseステートメントを追加します:
use Drupal\Core\Block\BlockPluginInterface;
use Drupal\Core\Form\FormStateInterface;
BlockPluginInterfaceの実装を含むようにクラス宣言を更新します:
class HelloBlock extends BlockBase implements BlockPluginInterface {
次に、次のメソッドをクラスに追加します。同様の完全なファイルはここにありますが、フォーム名と設定名がこのガイドと一致しないことに注意してください。
このコードはフォームを追加するだけで、フォームの処理と結果の保存は次のページで説明します。
/**
* {@inheritdoc}
*/
public function blockForm($form, FormStateInterface $form_state) {
$form = parent::blockForm($form, $form_state);
$config = $this->getConfiguration();
$form['hello_block_name'] = [
'#type' => 'textfield',
'#title' => $this->t('Who'),
'#description' => $this->t('Who do you want to say hello to?'),
'#default_value' => isset($config['hello_block_name']) ? $config['hello_block_name'] : '',
];
return $form;
}
この例では、フォームは最初に$form = parent::blockForm($form, $form_state );というコードで親クラスを参照して定義されます。次に、フォームに新しいフィールドを追加します。このプロセスはポリモーフィズムと呼ばれ、オブジェクト指向プログラミング(OOP)のメソッドを使用する重要な利点の1つです。
次に、Drupalにフォームの値をこのブロックの設定に保存するように指示する必要があります。例:
/**
* {@inheritdoc}
*/
public function blockSubmit($form, FormStateInterface $form_state) {
parent::blockSubmit($form, $form_state);
$values = $form_state->getValues();
$this->configuration['hello_block_name'] = $values['hello_block_name'];
}
フォームを表示するには、admin-> Structure-> Block Layoutで以前に追加したインスタンスに移動し、(Hello World)ブロックの「Configure」をクリックします。
同じフォームに複数の送信ボタンを追加するには:
/**
* {@inheritdoc}
*/
public function blockForm($form, FormStateInterface $form_state) {
$form = parent::blockForm($form, $form_state);
$config = $this->getConfiguration();
$form['hello_block_name'] = [
'#type' => 'textfield',
'#title' => $this->t('Who'),
'#description' => $this->t('Who do you want to say hello to?'),
'#default_value' => isset($config['hello_block_name']) ? $config['hello_block_name'] : '',
];
$form['actions']['custom_submit'] = [
'#type' => 'submit',
'#name' => 'custom_submit',
'#value' => $this->t('Custom Submit'),
'#submit' => [[$this, 'custom_submit_form']],
];
return $form;
}
新しいカスタム送信アクション
/**
* Custom submit actions.
*/
public function custom_submit_form($form, FormStateInterface $form_state) {
$values = $form_state->getValues();
// Perform the required actions.
}