ルールを使用してこれを実現できることはわかっていますが、残念ながら、Drupal 8のルールが適切に役割を追加するのを妨げる既知の問題がいくつかあります。
したがって、Webフォームを送信した後で、認証されたユーザーにいくつかのロールをプログラムで追加および削除できるかどうか疑問に思っていました。
とりあえず、ログインしているユーザーにstyled
というロールを追加しようとしているだけなので、webform_handler_role
という「Webform Handler」を作成し、UIを介してWebフォームに追加しましたが、次のコードを使用してロールを追加することはまだできません(WebフォームでAjaxを有効にしていることにも注意してください)。
<?php
namespace Drupal\webform_handler_role\Plugin\WebformHandler;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\WebformSubmissionInterface;
/**
* Webform submission action handler.
*
* @WebformHandler(
* id = "userrole",
* label = @Translation("User Role"),
* category = @Translation("User Role"),
* description = @Translation("Adds a user role after submission"),
* cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_UNLIMITED,
* results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
* submission = \Drupal\webform\Plugin\WebformHandlerInterface::SUBMISSION_OPTIONAL,
* )
*/
class UserRoleHandler extends WebformHandlerBase {
/**
* {@inheritdoc}
*/
public function postSave(WebformSubmissionInterface $webform_submission, $update = TRUE) {
$user = \Drupal::currentUser();
$user->addRole('styled');
$user->save();
}
}
フォームの送信後、次のエラーが発生します。
「エラー:Drupal\webform_handler_role\Plugin\WebformHandler\UserRoleHandler-> postSave()の未定義のメソッドDrupal\Core\Session\AccountProxy :: addRole()への呼び出し(/ modules/custom/webform_handler_role/src/Plugin/WebformHandlerの28行目/UserRoleHandler.php)。 ")"
\Drupal::currentUser()
は Account のみをロードしますが、ユーザーを変更して保存するには、完全にロードされたエンティティが必要です。
$account = \Drupal::currentUser();
$user = \Drupal\user\Entity\User::load($account->id());
$user->addRole('styled');
$user->save();