양식을 어떻게 렌더링합니까?


20

무엇에 대한 대안입니다 drupal_get_form('user_login'). 드루팔 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');.
Clive

2
인수는 form_id가 아닌 클래스입니다. UserLoginForm :: class와 같은 것.
Berdir

1
PHP 5.5 클래스를 사용하는 것이 좋습니다. 훨씬 쉬우 며 (사용 방법) 성가신 오타를 피합니다
Berdir

1
관련이없는 주제 @KamalOberoi에 대해 새로운 질문을 해주세요. 향후 방문자에게 더 많은 도움을 줄 것입니다. 그러나 일반적으로 서버의 오류 로그와 워치 독에서 다음 메시지가 표시 될 경우
Clive

15

양식 폴더에서 양식을 만들 수 있습니다. 그런 다음 그림과 같이 어디서나 양식을 호출하고 매개 변수를 전달할 수 있습니다.

드루팔 7 :$form = drupal_get_form('form_id',$parameter);

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


1
노드 추가 양식을 얻는 방법 (예 : 기사 양식 추가 // node / add / article)?
JayKandari

2
+1, 컨트롤러에서 $ parameter없이 전달할 수 있습니다.
Mr.T

5

폼을 반환 (D8) 또는 렌더링 (D7)하는 두 가지 옵션이 있습니다. 이들은 \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);

또한 맞습니다.


아마 이것을하지 마십시오. 폼 클래스가 의존성 주입을 사용하는 경우 여기에서 우회했습니다. 적절한 이유가 없다면 폼 빌더가 클래스를 인스턴스화하도록하는 것이 좋습니다.
aaronbauman

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
"새 인스턴스를 만들어야합니다"– 이것은 잘못된 것입니다. 클래스 문자열을 전달해야합니다.
Christian

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.