Come si visualizza un modulo?


20

Qual è l'alternativa a drupal_get_form('user_login'). in Drupal 8?

Sto usando il seguente codice in theme_name.theme, ma non funziona.

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

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

Risposte:


33

drupal_get_form() è stato sostituito dal servizio di creazione del modulo, ad esempio:

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

Vedere il registro delle modifiche per ulteriori dettagli.

In realtà no: il record di modifica non è corretto. Ti dirà di passare l'ID del modulo, quando in realtà devi passare la stringa di classe.


grazie per la tua risposta, ma l'ho già usato mentre scrivi e so anche che drupal_get_form passa al form builder ma voglio sapere come usarlo nel mio hook di pre-elaborazione del tema.
Kamal Oberoi,

1
Non sono sicuro di cosa intendi, a meno $variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');che non lo sia?
Clive

2
L'argomento è una classe, non un form_id. Qualcosa come UserLoginForm :: class.
Berdir,

1
Ti consiglio di usare la classe PHP 5.5 ::. È molto più semplice (usa le opere) ed evita fastidiosi
errori di

1
Per favore, fai una nuova domanda per un argomento non correlato @KamalOberoi - fornirà più aiuto ai futuri visitatori in quel modo. Ma come regola generale, guarda nei log degli errori del tuo server e nel watchdog quando vedi quel messaggio
Clive

15

È possibile creare un modulo nella cartella dei moduli. E poi puoi chiamare il tuo modulo ovunque e passare il parametro come mostrato.

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

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


1
Come ottenere un modulo di aggiunta nodo, ad esempio: aggiungi modulo articolo (/ nodo / aggiungi / articolo)?
JayKandari,

2
+1, puoi passarlo anche senza $ parametro nel controller.
Mr.T

5

Esistono due opzioni per restituire (D8) o renderizzare (D7) un modulo. Questi sono \Drupal::formBuilder()->getForme Drupal::formBuilder()->buildForm. Uso \Drupal::formBuilder()->getFormcome di seguito.

Utilizzare questo se non si passa un parametro:

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

Utilizzare questo se si passa un parametro:

$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 di quanto sopra:

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

Saluti. Fatemi sapere se aiuta.


2

La documentazione consente anche un'istanza della classe. Così

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

è anche corretto.


Probabilmente non farlo. Nel caso in cui la classe del modulo utilizzi l'iniezione di dipendenza, l'hai elusa qui. Meglio lasciare che il costruttore di moduli crei un'istanza della classe a meno che tu non abbia una buona ragione per farlo.
aaronbauman,

0

Supponendo quanto segue è la tua classe di modulo

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

Devi prima creare una nuova istanza dalla tua classe form e passarla a getForm di formBuilder.

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

2
Non "devi creare una nuova istanza" - questo è sbagliato. Dovresti passare la stringa di classe.
Christian,

0

Ok se tutto il resto fallisce qui è un trucco subdolo impostando un nuovo oggetto stato modulo.

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;

... quindi nel tuo modulo form buildForm puoi quindi ...

 // Get form state.
 $name = $form_state->get('name');
 if (!empty($name)) {
    $form['name'] = [
      '#type' => 'item',
      '#markup' => $name,
    ];
  }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.