Cum se redă un formular? (Drupal, Formulare, 8)

Kamal Oberoi a intrebat.

Care este alternativa la drupal_get_form('user_login'). în Drupal 8?

Folosesc următorul cod în theme_name.theme, dar nu funcționează.

// Include namespace for userLoginForm.
use DrupalCorecoremodulesusersrcForm;

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

6 răspunsuri
Clive

drupal_get_form() a fost înlocuit cu serviciul form builder, de ex:

$form = Drupal::formBuilder()->getForm(DrupaluserFormUserLoginForm::class);

Consultați pagina Modificare înregistrare pentru mai multe detalii.

De fapt, nu – acea înregistrare a modificărilor este incorectă. Vă va spune să treceți ID-ul formularului, când, de fapt, trebuie să treceți șirul clasei.

Shreya Shetty

Puteți crea un formular în folderul Form . Și apoi puteți să apelați formularul oriunde și să treceți parametrii așa cum se arată.

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

Drupal 8 : $form = Drupal::formBuilder()->getForm('Drupalcustom_moduleFormCustomModuleForm',$parameter);

Comentarii

  • Cum se obține un formular de adăugare a unui nod, de exemplu: formular de adăugare a unui articol (/node/add/article)? –  > Por JayKandari.
  • +1, îl puteți trece fără $parametru în controler, de asemenea. –  > Por Mr.T.
Ngatia Frankline

Există două opțiuni pentru a returna(D8) sau a reda(D7) un formular. Acestea sunt Drupal::formBuilder()->getForm și Drupal::formBuilder()->buildForm. Eu folosesc Drupal::formBuilder()->getForm ca mai jos.

Utilizați acest lucru dacă nu treceți un parametru:

$form = Drupal::formBuilder()->getForm('DrupalexampleFormExampleForm');
return $form;

Utilizați acest lucru dacă treceți un parametru:

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


Drupal 7 Echivalentul de mai sus:

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

Noroc. Anunțați-mă dacă vă ajută.

Comentarii

  • Doamne, iar mi-a luat o veșnicie, deși în răspunsul tău chiar ai acoperit acest aspect, că parametrul suplimentar transmis către buildForm trebuie să fie întotdeauna inițiat cu NULL. –  > Por leymannx.
MICHAEL MWEBAZE

Documentația permite și o instanță a clasei. Așadar,

$formObj = new DrupaldemoFormMyForm();
$form = Drupal::formBuilder()->getForm($formObj);

este, de asemenea, corect.

Comentarii

  • Probabil că nu faceți acest lucru. În cazul în care clasa formularului folosește injecția de dependență, ați ocolit-o aici. Este mai bine să lăsați constructorul de formulare să instanțieze clasa, dacă nu aveți un motiv întemeiat pentru a face acest lucru. –  > Por aaronbauman.
taggartJ

Bine, dacă toate celelalte eșuează, iată un truc șiretlic prin setarea unui nou obiect de stare a formularului.

use DrupalCoreFormFormState;
...

$form_state = new FormState();
$form_state->set('name', $name);
$form_state->set('user', $user);
$render_array = Drupal::formBuilder()->buildForm('DrupalmodFormMyForm', $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;

… apoi, în metoda buildForm a formularului, puteți…

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

Muhammad Reda

Presupunând că cea de mai jos este clasa dvs. de formular

namespace DrupaldemoForm;
use DrupalCoreFormFormBase;
class MyForm extends FormBase {
}

Trebuie să creați mai întâi o nouă instanță din clasa dvs. de formular și să o treceți la getForm a lui formBuilder.

$form_obj = new DrupaldemoFormMyForm();
$form = Drupal::formBuilder()->getForm($form_obj);

Comentarii

  • Nu „trebuie să creați o nouă instanță” – acest lucru este greșit. Ar trebui să transmiteți șirul de caractere al clasei. –  > Por Christian.

Tags:,