¿Cómo renderizo un formulario?

20

¿Cuál es la alternativa a drupal_get_form('user_login'). en Drupal 8?

Estoy usando el siguiente código en theme_name.theme, pero no funciona.

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

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

Respuestas:

33

drupal_get_form() ha sido reemplazado por el servicio de creación de formularios, por ejemplo:

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

Vea el registro de cambios para más detalles.

En realidad, no, ese registro de cambio es incorrecto. Le indicará que pase el ID del formulario, cuando de hecho necesite pasar la cadena de clase.

Clive
fuente
gracias por su respuesta, pero ya lo he usado mientras escribe y también sé que drupal_get_form cambia al generador de formularios, pero quiero saber cómo usarlo en mi enlace de preproceso de tema.
Kamal Oberoi
1
No estoy seguro de lo que quieres decir, a menos que $variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');sea ​​así.
Clive
2
El argumento es una clase, no un form_id. Algo así como UserLoginForm :: class.
Berdir
1
Te recomiendo que uses PHP 5.5 :: class. Es mucho más fácil (usar trabajos) y evita
errores
1
Por favor, haga una nueva pregunta para un tema no relacionado @KamalOberoi: de ese modo, proporcionará más ayuda a los futuros visitantes. Pero como regla general, mire en los registros de errores de su servidor y en el perro guardián cuando vea ese mensaje
Clive
15

Puede crear un formulario en la carpeta de formularios. Y luego puede llamar a su formulario en cualquier lugar y pasar el parámetro como se muestra.

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

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

Shreya Shetty
fuente
1
¿Cómo obtener un formulario de agregar nodo, por ejemplo: agregar formulario de artículo (/ node / add / article)?
JayKandari
2
+1, también puede pasarlo sin el parámetro $ en el controlador.
Mr.T
5

Hay dos opciones para devolver (D8) o representar (D7) un formulario. Estos son \Drupal::formBuilder()->getFormy Drupal::formBuilder()->buildForm. yo suelo\Drupal::formBuilder()->getForm como a continuación.

Use esto si no está pasando un parámetro:

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

Use esto si está pasando un 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 de lo anterior:

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

Salud. Avísame si te ayuda.

Ngatia Frankline
fuente
2

La documentación también permite una instancia de la clase. Entonces

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

También es correcto.

MICHAEL MWEBAZE
fuente
Probablemente no hagas esto. En caso de que la clase de formulario use inyección de dependencia, la ha evitado aquí. Es mejor dejar que el generador de formularios cree una instancia de la clase a menos que tenga una buena razón para hacerlo.
aaronbauman
0

Asumiendo que lo siguiente es tu clase de formulario

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

Primero debe crear una nueva instancia a partir de su clase de formulario y pasarla a getForm de formBuilder.

$form_obj = new \Drupal\demo\Form\MyForm();
$form = \Drupal::formBuilder()->getForm($form_obj);
Muhammad Reda
fuente
2
No tiene que "crear una nueva instancia", esto está mal. Deberías pasar la cadena de clase.
Christian
0

Ok, si todo lo demás falla aquí, es un truco astuto al establecer un nuevo objeto de estado de formulario.

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;

... luego en su método de formulario buildForm puede entonces ...

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