web-dev-qa-db-ja.com

ログインフォームのレンダリング

テーマでユーザーログインフォームを呼び出したいのですが、できません。

Drupal 7では、これを行いました。

$elements = drupal_get_form("user_login"); 
$form = drupal_render($elements);    
echo utf8_decode($form);

Drupal 8でこれをどのように行うことができますか?

私はこれを試しました。

Drupal::formBuilder()->getForm(Drupal\user\Form\UserLoginForm::class) 

これをどのようにレンダリングしますか?

次のコードでは、ログインフォームを表示できますが、ログインフォームでログインできません。機能させるには何を追加すればよいですか?

$form = Drupal::formBuilder()->getForm(Drupal\user\Form\UserLoginForm::class) ; 
$render = Drupal::service('renderer');
$render->renderPlain($form); 
5
Agriesean

コードは正常に動作しているようです。何らかの理由で機能しない場合は、テーマまたはモジュールに、これを妨げる可能性のあるものがないことを確認してください。

ここでは、プリプロセス関数を介してレンダリングされたログインフォームを提供する方法を説明します。 (このコードはYOUR_THEME.themeファイル。)

function YOUR_THEME_preprocess_page(&$variables) {
  // You will most likely want to show and render the form for anonymous users.
  $variables['login_form'] = FALSE;
  if (!\Drupal::currentUser()->id()) {
    $form = Drupal::formBuilder()->getForm(Drupal\user\Form\UserLoginForm::class) ; 
    $render = Drupal::service('renderer');
    $variables['login_form'] = $render->renderPlain($form);
  }
}

次に、page.html.twigテンプレートで、次のコードを使用してレンダリング(および使用)できます。

{{ login_form }}
8
Aram Boyajyan

代わりに\Drupal::service('renderer')->renderRoot()を使用する必要があります drupal_render() Drupal 8で廃止予定です。例:.

$output = \Drupal::service('renderer')->renderRoot($form);
2
kenorb

D8では、コントローラーでレンダー配列を作成します(Drupal\Core\Controller\ControllerBaseを拡張)。必要に応じて、次のコードを使用してそれを行うことができます。

$fb = $this->formBuilder();
return $fb->getForm("Drupal\user\Form\UserLoginForm");
1
Rainer Feike