フォームをレンダリングするにはどうすればよいですか?


20

に代わるものは何ですかdrupal_get_form('user_login')。Drupal 8で?

theme_name.themeで次のコードを使用していますが、機能しません。

// Include namespace for userLoginForm.
use \Drupal\Core\core\modules\user\src\Form;

function MYTHEMENAME_preprocess_page(&$variables) {
  $form = UserLoginForm::create();
} 

回答:


33

drupal_get_form() フォームビルダーサービスに置き換えられました。例:

$form = \Drupal::formBuilder()->getForm(\Drupal\user\Form\UserLoginForm::class);

詳細については、変更レコードを参照してください。

実際には、しないでください-その変更レコードは間違っています。実際にクラス文字列を渡す必要がある場合、フォームIDを渡すように指示されます。


あなたの返信に感謝しますが、私はあなたが書いているときにすでにそれを使用しており、drupal_get_formがフォームビルダーに変更されていることも知っていますが、テーマのプリプロセスフックでそれを使用する方法を知りたいです。
カマルオベロイ

1
それがそうでない限り、私はあなたが何を意味するのか分かりませんか$variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');
クライブ

2
引数は、form_idではなくクラスです。UserLoginForm :: classのようなもの。
ベルディール

1
PHP 5.5 :: classを使用することをお勧めします。それははるかに簡単で(使用する)、迷惑なタイプミスを回避します
-Berdir

1
関係のないトピック@KamalOberoiについては、新しい質問をしてください。今後の訪問者により多くの助けを提供します。しかし、一般的なルールとして、サーバーのエラーログを見て、ウォッチドッグは、あなたはそのメッセージを参照するとき
クライヴ

15

フォームフォルダの下にフォームを作成できます。そして、どこからでもフォームを呼び出して、図のようにパラメーターを渡すことができます。

Drupal 7$form = drupal_get_form('form_id',$parameter);

Drupal 8$form = \Drupal::formBuilder()->getForm('Drupal\custom_module\Form\CustomModuleForm',$parameter);


1
ノード追加フォームを取得する方法、たとえば、記事フォームを追加する(/ node / add / article)?
JayKandari

2
+1、コントローラーの$ parameterなしでも渡すことができます。
Mr.T

5

フォームを返す(D8)またはレンダリングする(D7)には2つのオプションがあります。これらは\Drupal::formBuilder()->getFormDrupal::formBuilder()->buildFormです。\Drupal::formBuilder()->getForm以下のように使用します。

パラメータを渡さない場合はこれを使用します。

$form = \Drupal::formBuilder()->getForm('\Drupal\example\Form\ExampleForm');
return $form;

パラメーターを渡す場合は、これを使用します。

$parameter = "your_parameter";
$form = \Drupal::formBuilder()->getForm('\Drupal\example\Form\ExampleForm', $parameter);
return $form;
//pass to formbuild function
public function buildForm(array $form, FormStateInterface $form_state, $parameter = NULL){//form code}


Drupal 7上記と同等:

$parameter = 'your_parameter';
$form = drupal_get_form('form_id', $parameter);
print drupal_render($form);
//pass to form function
function form_id ($form, &$form_state, $parameter){//form code}

乾杯。役立つかどうか教えてください。


2

ドキュメントでは、クラスのインスタンスも許可されています。そう

$formObj = new \Drupal\demo\Form\MyForm();
$form = \Drupal::formBuilder()->getForm($formObj);

正しいです。


おそらくこれをしないでください。フォームクラスが依存性注入を使用する場合は、ここで回避しました。正当な理由がない限り、フォームビルダーがクラスをインスタンス化できるようにしてください。
アーロンバウマン

0

以下がフォームクラスであると仮定します

namespace Drupal\demo\Form;
use \Drupal\Core\Form\FormBase;
class MyForm extends FormBase {
}

最初にフォームクラスから新しいインスタンスを作成し、formBuilderのgetFormに渡す必要があります。

$form_obj = new \Drupal\demo\Form\MyForm();
$form = \Drupal::formBuilder()->getForm($form_obj);

2
「新しいインスタンスを作成する必要はありません」-これは間違っています。クラス文字列を渡す必要があります。
クリスチャン

0

ここで他のすべてが失敗した場合は、新しいフォームステートオブジェクトを設定することによる巧妙なトリックです。

use Drupal\Core\Form\FormState;
...

$form_state = new FormState();
$form_state->set('name', $name);
$form_state->set('user', $user);
$render_array = \Drupal::formBuilder()->buildForm('\Drupal\mod\Form\MyForm', $form_state);
...
// Example render.
$response = new AjaxResponse();
// Show a dialog box.
$dialogText['#attached']['library'][] = 'core/drupal.dialog.ajax';
$response->addCommand(new OpenModalDialogCommand("Dialog Title", $render_array, ['width' => '300']));
return $response;

...次に、フォームメソッドbuildFormで次のことができます...

 // Get form state.
 $name = $form_state->get('name');
 if (!empty($name)) {
    $form['name'] = [
      '#type' => 'item',
      '#markup' => $name,
    ];
  }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.