Como renderizo um formulário?

20

Qual é a alternativa para drupal_get_form('user_login'). no Drupal 8?

Estou usando o seguinte código no theme_name.theme, mas não funciona.

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

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

Respostas:

33

drupal_get_form() foi substituído pelo serviço de criação de formulários, por exemplo:

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

Veja o Change Record para mais detalhes.

Na verdade, não - esse registro de alteração está incorreto. Ele diz para você passar o ID do formulário, quando na verdade você precisa passar a string da classe.

Clive
fonte
obrigado pela sua resposta, mas eu já o usei enquanto você escreve e também sei drupal_get_form mudar para o construtor de formulários, mas eu quero saber como usá-lo no meu gancho de pré-processo do tema.
Kamal Oberoi
1
Não tenho certeza do que você quer dizer, a menos que $variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');seja?
Clive
2
O argumento é uma classe, não um form_id. Algo como UserLoginForm :: class.
Berdir 30/11/2015
1
Eu recomendo que você use a PHP 5.5 :: class. É muito mais fácil (uso obras) e evita irritante erro de digitação de
Berdir
1
Faça uma nova pergunta para um tópico não relacionado @KamalOberoi - fornecerá mais ajuda para futuros visitantes dessa maneira. Mas, como regra geral, procure nos logs de erros do servidor e no watchdog quando vir essa mensagem
Clive
15

Você pode criar um formulário na pasta de formulários. E então você pode chamar seu formulário em qualquer lugar e passar o paramater como mostrado.

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

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

Shreya Shetty
fonte
1
Como obter um formulário de adição de nó, por exemplo: adicionar formulário de artigo (/ node / add / article)?
JayKandari
2
+1, você pode passá-lo sem o parâmetro $ no controlador também.
Mr.T
5

Existem duas opções para retornar (D8) ou renderizar (D7) um formulário. Estes são \Drupal::formBuilder()->getForme Drupal::formBuilder()->buildForm. Eu uso \Drupal::formBuilder()->getFormcomo abaixo.

Use isto se você não estiver passando um parâmetro:

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

Use isso se você estiver passando um parâmetro:

$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 Equivalente ao acima:

$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}

Felicidades. Deixe-me saber se isso ajuda.

Ngatia Frankline
fonte
2

A documentação também permite uma instância da classe. então

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

também está correto.

MICHAEL MWEBAZE
fonte
Provavelmente não faça isso. Caso a classe de formulário use injeção de dependência, você a contornou aqui. É melhor deixar o criador de formulários instanciar a classe, a menos que você tenha um bom motivo para fazê-lo.
Aaronbauman 17/08/19
0

Supondo que a seguir seja sua classe de formulário

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

Você precisa criar uma nova instância da sua classe de formulário primeiro e passá-la para o getForm do formBuilder.

$form_obj = new \Drupal\demo\Form\MyForm();
$form = \Drupal::formBuilder()->getForm($form_obj);
Muhammad Reda
fonte
2
Você não "precisa criar uma nova instância" - isso está errado. Você deve passar a string da classe.
Christian
0

Ok, se tudo mais falhar aqui, é um truque sorrateiro, definindo um novo objeto de estado do formulário.

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;

... então, no método de formulário buildForm, você pode ...

 // Get form state.
 $name = $form_state->get('name');
 if (!empty($name)) {
    $form['name'] = [
      '#type' => 'item',
      '#markup' => $name,
    ];
  }
Taggart Jensen
fonte