web-dev-qa-db-ja.com

ユーザーアカウントを作成するWebフォームを作成する

Drupal 8サイトに複数の明確に定義されたセクション(おそらく別のページ)がある)にユーザー登録フォームを作成しようとしています。

私はこれをアカウント設定で標準のDrupal登録フォーム構築ツールで実行してみましたが、アカウント設定だけを使用してそのようなレイアウトでフォームを作成することはできないようです(私が間違っている)。

Webformモジュールを使用すると、希望どおりのスタイルのフォームを作成できますが、webformに入力されたデータを使用してユーザーアカウントを作成する方法がわかりません。これに使用できる別のモジュールはありますか、それともwebformモジュール内から実行できますか?

6
Robert Nixon

コメントで述べたように、これを実現する適切な方法は、Handlersadmin/structure/webform/manage/[WebformName]/handlersに表示するためのカスタムモジュールが必要なため、WebformのHandler機能を使用することです。

正しいことを確認する必要があることの1つは、モジュールフォルダーの構造です。これにより、webformはそれをhandlerとして読み取ります。ここでは、モジュール名はwebform_handler_user_creationであると想定しているため、構造は次のようになります。 this:webform_handler_user_creation>src>Plugin>WebformHandler>UserCreationHandler.php with the webform_handler_user_creation.info.yml file in the root of the module directory.

以上のことから、 これは私のgithubページにあるモジュールの例です

したがって、最初に行う必要があるのは、Webフォームの送信を保存した後で確実に実行し、送信値をロードし、マシン名に基づいてそれらを使用してユーザー作成のものに入力することです。これがコードです。

<?php
namespace Drupal\webform_handler_user_creation\Plugin\WebformHandler;

use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\WebformSubmissionInterface;
use Drupal\webform\Entity\WebformSubmission;
/**
 * Webform submission action handler.
 *
 * @WebformHandler(
 *   id = "usercreate",
 *   label = @Translation("User Create"),
 *   category = @Translation("Action"),
 *   description = @Translation("Creates a user after submission"),
 *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_UNLIMITED,
 *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 *   submission = \Drupal\webform\Plugin\WebformHandlerInterface::SUBMISSION_OPTIONAL,
 * )
 */

class UserCreationHandler extends WebformHandlerBase {
  /**
   * {@inheritdoc}
   */
  public function postSave(WebformSubmissionInterface $webform_submission, $update = TRUE) {
        $user = \Drupal\user\Entity\User::create();
        $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
        $user_name = $webform_submission->getElementData('user_name');
        // Mandatory user creation settings
        $user->enforceIsNew();
        $user->setPassword('testPassword');
        $user->setEmail('[email protected]');
        $user->setUsername($user_name); // This username must be unique and accept only a-Z,0-9, - _ @ .
        $user->set("langcode", $language);
        // Optional settings
        $user->set("init", 'email');
        $user->set("preferred_langcode", $language);
        $user->set("preferred_admin_langcode", $language);
        $user->activate();
        // Add a custom role in case you need one
        $user->addRole('CustomRoleName');
        //Save user
        $user->save();

  }
}

また、ファイルの先頭にある名前空間にも注意してください。これは、次の画像のように、Webフォームの管理領域に読み込まれる場所です。 enter image description here

この例では、Webフォームの送信から動的に入力される唯一のフィールドとして$user_nameを使用していることに注意してください。Webフォームフィールドのマシン名に従って残りを置き換える必要があります。

2
Sohail
There is a module for that.

フォームステップ は、フォームモードを使用してフォームワークフローを作成するためのUIを提供します。それは迅速かつ構成可能なマルチステップフォームを作成します。

3
jrockowitz

Drupal Answersへようこそ!

ここでスタイリングが唯一の懸念事項である場合、Drupalのデフォルトの登録プロセスではなくWebフォームを使用しないことを強くお勧めします。アカウント設定からユーザーにフィールドを追加するだけで、登録時にそれらのフィールドを表示できます。利点:

  1. 登録後もデータはユーザーエンティティに添付されたままです。つまり、ユーザーは登録中に提供された値を編集する機能を利用できます。
  2. 意図した場合は、簡単にそれらを使用してプロファイルページを作成できます。
  3. これらのフィールドは、ユーザーリストページのフィルターとして使用できます。
  4. サイトに応じて他の多くのケース。

フォームのテーマについては、簡単な検索を行ったところ、いくつかの便利なリンクが見つかりました。

  1. Drupal 8:フォームのテーマを設定する方法
  2. フォームをtwigテンプレート に送信します。
  3. カスタムフォームのテーマを設定するにはどうすればよいですか
  4. Drupal 8 のフォーム要素のテーマ設定。
2
AjitS

複数のDrupal 8サイトでこれを達成でき、Drupalとcivicrmの両方でユーザーを作成できました。いくつかのカスタムコードを使用して、送信された値を取得することにより、Drupalでユーザーを作成しました。

これはスレッドですが、古く、Drupal 8.6.xとは異なるアプローチをとっている可能性があります

https://www.drupal.org/forum/support/module-development-and-code-questions/2015-03-04/how-to-programmatically-create-a-user

これは、Webフォームが送信された後にコードでユーザーを作成することです。テンプレートについては、これを確認してください: https://www.drupal.org/docs/8/theming/twig

0
Bhavin Joshi