web-dev-qa-db-ja.com

新しいクラスで登録フォームをカスタマイズする:なぜこのエラーが発生するのですか?

登録フォームをカスタマイズしようとしています。ユーザーにはタイプAのコンテンツへの参照フィールドがあります。しかし、特定の条件を満たすAの値のみを許可したいと思います。これを達成するために、私はコードを https://www.foreach.be/blog/how-manipulate-forms-drupal-8 に基づいています。

以下のサービスでモジュールを作成しました。

services:
  travels.route_subscriber:
    class: Drupal\travels\Routing\RouteSubscriber
    tags: 
      - {name: event_subscriber }

RouteSubscriberクラスを定義しました。

class RouteSubscriber extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection) {
     if ($route = $collection->get('user.register')) {
        $route->setDefault('_form', '\Drupal\travels\ExtendedRegisterForm');
     }

   }
}

また、次のように定義されたExtendedRegisterFormクラスがあります。

class ExtendedRegisterForm extends RegisterForm {
     public function buildForm(array $form, FormStateInterface $form_state) {
         $form['test'] = [
            '#type' => 'email',
            '#default_value' => 'test'
          ];
         return $form;
      }
}

ページをロードして新しいユーザーを登録すると、次のエラーが発生します。

致命的なエラー:77行目のxxxx\core\lib\Drupal\Core\Entity\EntityForm.phpのnullに対するメンバー関数getEntityTypeId()の呼び出し

(登録後に)エンティティを作成する必要があるため、エンティティが指定されていないと想定しています。これを機能させるために私がまだ何をする必要があるかについての提案はありますか?

1

あなたが得るエラーは、それを呼び出さずに EntityForm::buildForm() をオーバーライドしているためです。実際には、次のコードが含まれています。

_  // During the initial form build, add this form object to the form state and
  // allow for initial preparation before form building and processing.
  if (!$form_state->has('entity_form_initialized')) {
    $this->init($form_state);
  }
_

次に、エンティティオブジェクトを初期化するために EntityForm::init() になります。

本当に、あなたは間違ったメソッドをオーバーライドしています: RegisterForm クラスがオーバーライドするのと同じように、実装する必要があるのはform()です AccountForm::form()

hook_form_alter()の実装またはコードの実装と同様に、いくつかのフィールドを追加するか、フィールドのいずれかを変更する必要がある場合は、最初の方法をお勧めします。登録フォームの背後にあるロジックを変更する場合は、実装したコードの方が良いでしょう。別のモジュールでも同じことができることを覚えておいてください。ただし、両方のモジュールで登録フォームの背後にあるロジックを大きく変更する必要がある場合は、それらも考えられます。相互に互換性がありません。

0
kiamlaluno

Hook_form_alterを使用して複雑さを軽減し、参照フィールドのオプションを操作できるようです。

0
Kevin