ホームページ >バックエンド開発 >PHPチュートリアル >Drupal 8モジュールの構築:ブロックとフォーム
コアポイント
このシリーズの最初の部分では、基本から始めてDrupal 8モジュール開発を学びます。 Drupalがモジュールに必要なファイルをどのように理解しているか、ルーティングプロセスの仕組み、および構成方法でプログラムでメニューリンクを作成する方法を学びました。 このチュートリアルでは、このリポジトリにあるサンドボックスモジュールをさらに見て、ブロックとフォームの2つの重要な機能を調べます。これを行うには、構成可能なテキストを返すカスタムブロックを作成します。その後、ユーザーがサビされた値を画面に印刷するためのシンプルなフォームを作成します。
drupal 8ブロックD8のブロックAPIのクールな新しい変更は、プラグインとしてそれらを作成することにより、ブロックをより顕著にすることです(まったく新しい概念)。これは、UIにブロックを作成してサイト全体で再利用できるため、再利用可能な機能(バックグラウンド)であることを意味します。1回だけのブロックを使用することに限定されなくなりました。 デフォルトで画面に印刷するシンプルなブロックタイプを作成しましょう
hello world!。モジュールのルートにあるSRC/プラグイン/ブロックフォルダーでクラスファイルを使用する必要があります。もちろん、新しいブロックタイプのデモブロックに名前を付けましょう。もちろん、demoblock.phpという名前のファイルにある必要があります。このファイルでは、以下から始めることができます。
<code class="language-php"><?php namespace Drupal\demo\Plugin\Block; use Drupal\block\BlockBase; use Drupal\Core\Session\AccountInterface; /** * Provides a 'Demo' block. * * @Block( * id = "demo_block", * admin_label = @Translation("Demo block"), * ) */ class DemoBlock extends BlockBase { /** * {@inheritdoc} */ public function build() { return array( '#markup' => $this->t('Hello World!'), ); } /** * {@inheritdoc} */ public function access(AccountInterface $account) { return $account->hasPermission('access content'); } }</code>
他のすべてのクラスファイルと同様に、クラスの最初の名前を付けます。次に、ブロックベースクラスを使用して、拡張できるようにし、AccountInterfaceクラスを使用して、現在ログインしているユーザーにアクセスできるようにします。次は、Drupal 7:コメントで確かに見たことがないものです。
アノテーションは、クラス定義と同じファイルのコメントブロックにあるPHPディスカバリーツールです。これらのアノテーションを使用して、Drupalに、ID demo_blockおよびadmin_labelをdemo block(翻訳システムに渡す)で新しいブロックタイプ(@block)を登録したいことを知らせます。
次に、ブロックベースクラスを独自のデモブロックに拡張し、2つの方法(実装する最も一般的な方法)を実装します。 Build()メソッドは、ブロックが印刷するレンダリング可能な配列を返すため、最も重要です。 Access()メソッドは、アクセスを制御してこのブロックを表示します。それに渡された引数は、AccountInterfaceクラスのインスタンスであり、その場合は現在のユーザーです。注意すべきもう1つの興味深いことは、翻訳にグローバルにt()関数を使用せず、代わりにクラスの親クラスで実装されているt()メソッドを参照することです。
それだけです。キャッシュをクリアして、ブロックレイアウト構成ページに移動できます。クールなことは、右側にブロックタイプがあること(それらを通してフィルタリングできる)で、これらの種類のブロックの1つ以上をサイトのさまざまな領域に配置できることです。
DRUPAL 8ブロック構成 UIで使用する新しいブロックタイプを作成する方法を学んだので、APIをより深く掘り下げて、構成フォームを追加しましょう。ブロックを編集し、テキストフィールドに名前を指定することを可能にします。ブロックは、world
に挨拶するのではなく、その名前に挨拶します。最初に、テキストフィールドを含むフォームを定義する必要があります。したがって、デモブロッククラスでは、blockform()と呼ばれる新しいメソッドを追加できます。
このフォームAPI実装は、Drupal 7に非常によく似ている必要があります。ただし、ここにはいくつかの新しいコンテンツがあります。最初に、親クラスから$フォーム配列を取得します(したがって、独自のフィールドを追加して既存のフォームを構築します)。標準のoopのもの。次に、このブロックの構成を取得して保存します。ブロックベースクラスは、これを行うgetConfiguration()メソッドを定義します。 demo_block_settings値を#default_valueが設定された場合に備えて配置します。次に、このフォームの提出ハンドラーであり、フィールドの値を処理し、Chunkの構成に保存します。
<code class="language-php">/** * {@inheritdoc} */ public function blockForm($form, &$form_state) { $form = parent::blockForm($form, $form_state); $config = $this->getConfiguration(); $form['demo_block_settings'] = array( '#type' => 'textfield', '#title' => $this->t('Who'), '#description' => $this->t('Who do you want to say hello to?'), '#default_value' => isset($config['demo_block_settings']) ? $config['demo_block_settings'] : '', ); return $form; }</code>
このメソッドはデモブロッククラスにもあり、それが行うのは、Demo_block_settingsフィールドの値をブロック構成の新しいアイテムとして保存することだけです(一貫性のためのキーと同じ名前を使用)。
最後に、尋ねる名前を含めるには、build()メソッドを調整する必要があります:
<code class="language-php"><?php namespace Drupal\demo\Plugin\Block; use Drupal\block\BlockBase; use Drupal\Core\Session\AccountInterface; /** * Provides a 'Demo' block. * * @Block( * id = "demo_block", * admin_label = @Translation("Demo block"), * ) */ class DemoBlock extends BlockBase { /** * {@inheritdoc} */ public function build() { return array( '#markup' => $this->t('Hello World!'), ); } /** * {@inheritdoc} */ public function access(AccountInterface $account) { return $account->hasPermission('access content'); } }</code>
これまでのところ、これは非常に簡単に見えるはずです。私たちは、ブロックの構成を検索し、フィールドの値が設定されている場合は、印刷されたステートメントに使用します。そうでない場合、一般的なステートメントが使用されます。ゾーンに割り当てたブロックを編集し、要求する名前を追加することで、キャッシュをクリアしてテストできます。注意すべきことの1つは、画面に印刷する際にユーザーの入力をクリーンアップする責任がまだあるということです。簡潔にするために、私はこれらの手順を含めませんでした。
drupal 8 form
このチュートリアルで探索する最後のことは、シンプルなフォームを作成する方法です。スペースの制限のため、その構成管理の側面(フォームで送信された構成値を保存する)をカバーしません。代わりに、送信された値が画面に単純に印刷されて、どのように機能するかを示す単純なフォーム定義を説明します。
Drupal 8では、フォーム定義関数がクラスにグループ化されています。それでは、src/form/demoform.phpで単純なDemoformクラスを定義しましょう。OOPの側面とは別に、すべてがDrupal 7に非常に似ている必要があります。フォームAPIはほとんど変更されていません(いくつかの新しいフォーム要素とそのようなカプセル化を追加することを除きます)。では、上記で何が起こったのでしょうか?
<code class="language-php">/** * {@inheritdoc} */ public function blockForm($form, &$form_state) { $form = parent::blockForm($form, $form_state); $config = $this->getConfiguration(); $form['demo_block_settings'] = array( '#type' => 'textfield', '#title' => $this->t('Who'), '#description' => $this->t('Who do you want to say hello to?'), '#default_value' => isset($config['demo_block_settings']) ? $config['demo_block_settings'] : '', ); return $form; }</code>
最初に、クラスに名前を付け、
コアフォームベースクラスを使用して、独自のDemoFormクラスで拡張できるようにします。次に、4つのメソッドを実装します。そのうち3つは非常に馴染みがあるはずです。 getFormid()メソッドは新しくて必須であり、フォームのマシン名を返すためにのみ使用されます。 buildform()メソッドは再び必須であり、フォームを構築します。どうやって? Drupal 7から慣れているように。 VALIDATEFORM()メソッドはオプションであり、その目的もD7から非常に明確にする必要があります。最後に、submitform()メソッドはコミット処理を実行します。非常に論理的で整理されています。では、このフォームで何を達成したいですか?ユーザーに記入したい電子メールフィールド(Drupal 8の新しいフォーム要素)があります。デフォルトでは、Drupalは入力された値が実際に電子メールアドレスであるかどうかをチェックします。しかし、検証関数では、それが.comの電子メールアドレスであることを確認し、そうでない場合は、そのフィールドにフォームエラーを設定します。最後に、送信ハンドラーはページにメッセージを印刷するだけです。
このフォームを使用するために必要な最後のことは、ルートを提供することです。したがって、demo.routing.ymlファイルを編集して、次を追加します。これは、前の投稿で簡単なページをルーティングしたものと似ている必要があります。唯一の重要な違いは、デフォルトでは_FORMを使用して、ターゲットがフォームクラスであることを指定することです。したがって、値は作成したクラス名です。
キャッシュをクリアしてデモ/フォームに移動してフォームを表示してテストします。
<code class="language-php">/** * {@inheritdoc} */ public function blockSubmit($form, &$form_state) { $this->setConfigurationValue('demo_block_settings', $form_state['values']['demo_block_settings']); }</code>
Drupal_get_form()に精通していて、以前にDrupal 7で行ったようなフォームをロードする方法を知りたい場合、答えはグローバルDrupalクラスにあります。フォームを取得するには、そのformbuilder()メソッドを使用して、次のことを行うことができます。
<code class="language-php"><?php namespace Drupal\demo\Plugin\Block; use Drupal\block\BlockBase; use Drupal\Core\Session\AccountInterface; /** * Provides a 'Demo' block. * * @Block( * id = "demo_block", * admin_label = @Translation("Demo block"), * ) */ class DemoBlock extends BlockBase { /** * {@inheritdoc} */ public function build() { return array( '#markup' => $this->t('Hello World!'), ); } /** * {@inheritdoc} */ public function access(AccountInterface $account) { return $account->hasPermission('access content'); } }</code>
$フォームを返すことができます。これは、フォームのレンダリング可能な配列になります。
結論
この記事では、Drupal 8モジュールの開発を調査し、ブロックとフォームの2つの新しいトピックを紹介し続けます。 UIでブロックを作成するために使用できる独自のブロックタイプを作成する方法を学びました。また、カスタム構成を追加し、後で使用するために値を保存する方法も学びました。フォームに関しては、Formbaseクラスの簡単な実装が見られました。これは、ユーザーがサビされた値を画面に印刷するために使用しています。次のチュートリアルでは、構成フォームについてすぐに学びます。 Drupal 8構成システムを使用して、ユーザーがサビされた値を保存します。さらに、サービスコンテナと依存関係の注入と、Drupal 8での作業方法について学びます。じゃあね。
Drupal 8モジュールの構築に関するよくある質問:ブロックとフォーム(FAQ)
Drupal 8モジュールの基本構造は何ですか?Drupal 8でカスタムブロックを作成する方法は?
Drupal 8でカスタムフォームを作成する方法は?
Drupal 8サイトの特定の領域にブロックを表示する方法は?
Drupal 8カスタムフォームの入力を確認する方法は?
Drupal 8の既存のフォームを変更するには、モジュールに「hook_form_form_id_alter()」関数を実装できます。この関数は、フォームを構築するときに呼び出されます。これにより、フォームアレイを変更できます。 「form_id」は、変更するフォームのIDに置き換える必要があります。
Drupal 8のフォームをプログラム的に送信するには、フォームクラスのインスタンスを作成し、「submitform()」メソッドを呼び出すことができます。ただし、このメソッドを呼び出す前に、フォーム状態オブジェクトを準備し、フォーム要素の値を設定する必要があります。
Drupal 8で構成フォームを作成するには、「Formbase」クラスの代わりに「configformbase」クラスを拡張するフォームクラスを定義できます。 「configformbase」クラスは、「geteditableconfignames()」や「config()」など、構成データを処理する他の方法を提供します。構成データはDrupal構成システムに保存され、コードのどこからでもアクセスできます。
Drupal 8でマルチステップフォームを作成するには、FormStateInterfaceオブジェクトを使用してステップ間でデータを保存できます。 「buildform()」メソッドでは、フォーム状態の現在のステップを確認し、各ステップの別のフォームアレイを返すことができます。 「submitform()」メソッドでは、現在のステップを確認してから、データを保存して次のステップに移動するか、最終的なコミットを処理できます。
Drupal 8にAjaxフォームを作成するには、「burtionform()」メソッドのフォーム要素に「#ajax」属性を追加できます。このプロパティは、要素がトリガーされたときに呼び出されるコールバック関数を指定する配列である必要があります。コールバック関数は、更新するフォームの一部またはAJAXコマンドのセットを返す必要があります。
この改訂された出力は、元の画像形式と配置を維持し、FAQSセクションは繰り返しを避け、妥当な長さを維持するために大幅に凝縮されています。
以上がDrupal 8モジュールの構築:ブロックとフォームの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。