web-dev-qa-db-ja.com

カスタムフォームのブロックを作成するにはどうすればよいですか?

カスタムフォームモジュールを作成します。次に、フォームをブロックで表示します。これどうやってするの ?

注:MymoduleBlock.phpを/ modules/my-module/src/Plugin/Blockパスに次のコードで作成しますが、機能しません。

<?php

namespace Drupal\my-module\Plugin\Block;

use Drupal\Core\Form\FormInterface;
use Drupal\Core\Block\BlockBase;

class MymoduleBlock extends BlockBase {
  public function build() {
    $form = \Drupal::formBuilder()->getForm('Drupal\my-module\Form\MymoduleForm');
    return $form;
   }
}
3
RobinSon

MymoduleBlock::build()のコードは正しいもので、Drupalコアが UserLoginBlock::build() でコアが行うことです。

_  $form = \Drupal::formBuilder()->getForm('Drupal\user\Form\UserLoginForm');
  unset($form['name']['#attributes']['autofocus']);
  // When unsetting field descriptions, also unset aria-describedby attributes
  // to avoid introducing an accessibility bug.
  // @todo Do this automatically in https://www.drupal.org/node/2547063.
  unset($form['name']['#description']);
  unset($form['name']['#attributes']['aria-describedby']);
  unset($form['pass']['#description']);
  unset($form['pass']['#attributes']['aria-describedby']);
  $form['name']['#size'] = 15;
  $form['pass']['#size'] = 15;
_

ブロック定義が欠落しているのは、そのクラスをプラグインとして識別するためにDrupalを許可する注釈(クラスの前のコメント)です。 Block API を参照してください。 (エンファシスは私のものです)

ブロックは、構成エンティティとpluginの組み合わせです。構成エンティティは、配置情報(テーマ、リージョン、ウェイト)およびブロックに固有のその他の構成を格納します。block pluginは、ブロックのコンテンツを表示するためのレンダリングを行います。

ブロックプラグインは、 _\Drupal\Core\Block\Annotation\Block_ によって定義されるthe Annotationsを使用します。注釈の詳細については、 注釈トピック を参照してください。

例として使用したブロッククラスでは、アノテーションは次のようになります。

_/*
 * @Block(
 *   id = "user_login_block",
 *   admin_label = @Translation("User login"),
 *   category = @Translation("Forms")
 * )
 */
_

また、PHP関数では許可されないハイフンをモジュールのマシン名に含めることはできません。フック名は、マシンのマシン名から派生するため、フックを実装するときに問題が発生します。たとえば、モジュールの hook_page_attachments() の実装はmy-module_page_attachments()であり、これは許容できないPHP関数名。
モジュールがフックを実装しないと思われる場合は、大部分のモジュールが少なくとも hook_update_N() を実装していることを覚えておいてください。モジュールマシン名の大文字。

7
kiamlaluno

すべてのコードを投稿している場合、Blockクラスにアノテーションがありません。注釈は、プラグインを登録するためにDrupal 8によって使用されます。

カスタムブロックを開始するには、このリンクを確認してください。

https://www.drupal.org/docs/8/creating-custom-modules/create-a-custom-block

ブロックプラグインを作成したら、必ずキャッシュをクリアしてください。

追伸モジュールに「my-module」という名前を付けたようです。モジュール名にはダッシュを使用できません。アンダースコアを使用してください。モジュールの命名の詳細については、以下を参照してください。 https://www.drupal.org/docs/8/creating-custom-modules/naming-and-placing-your-drupal-8-module

2
mvdgun