Як мені надати форму?


20

Яка альтернатива drupal_get_form('user_login'). в Drupal 8?

Я використовую наступний код у topic_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);

Докладніше див. У записі змін .

Насправді, не слід робити, щоб запис змін був невірним. Він підкаже вам передати ідентифікатор форми, коли насправді вам потрібно передати рядок класу.


дякую за вашу відповідь, але я вже використовував її під час написання, а також я знаю, що змінити drupal_get_form до конструктора форм, але я хочу знати, як це використовувати в моїй гачці попередньої обробки теми.
Kamal Oberoi

1
Я не впевнений, що ти маєш на увазі, якщо $variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');це не так?
Клайв

2
Аргумент - це клас, а не form_id. Щось на кшталт UserLoginForm :: class.
Бердір

1
Я рекомендую вам використовувати клас PHP 5.5 ::. Це набагато простіше (використовуйте твори) і уникає набридливих друкарських
помилок

1
Будь ласка, задайте нове запитання щодо не пов’язаної теми @KamalOberoi - це допоможе майбутнім відвідувачам таким чином. Але, як правило, загляньте в журнали помилок вашого сервера та сторожову собаку, коли побачите це повідомлення
Clive

15

Ви можете створити форму в папці форми. А потім ви можете зателефонувати у свою форму де завгодно і передати параметр, як показано.

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

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


1
Як отримати форму додавання вузла, наприклад: додати форму статті (/ вузол / додати / статтю)?
JayKandari

2
+1, ви можете передавати його без параметра $ в контролері.
Mr.T

5

Є два варіанти повернення (D8) або надання форми (D7). Це є \Drupal::formBuilder()->getFormі Drupal::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 {
}

Спершу потрібно створити новий екземпляр із класу форм та передати його до getForm formBuilder.

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

2
Вам не потрібно "створювати новий екземпляр" - це неправильно. Ви повинні передавати рядок класу.
Крістіан

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,
    ];
  }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.