Как мне сделать форму?


20

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

Я использую следующий код в theme_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 изменился в построителе форм, но я хочу знать, как использовать его в моем обработчике препроцессора темы.
Камаль Оберой

1
Я не уверен, что ты имеешь в виду, разве $variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');не так?
Клайв

2
Аргумент - это класс, а не form_id. Что-то вроде UserLoginForm :: class.
Бердир

1
Я рекомендую вам использовать PHP 5.5 :: class. Это намного проще (использовать работает) и позволяет избежать раздражающих
опечаток

1
Пожалуйста, задайте новый вопрос по несвязанной теме @KamalOberoi - таким образом, будущие посетители получат больше помощи. Но, как правило, просмотрите журналы ошибок вашего сервера и сторожевой таймер, когда увидите это сообщение
Клайв

15

Вы можете создать форму в папке формы. И тогда вы можете позвонить в вашу форму в любом месте и передать параметр, как показано.

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

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


1
Как получить форму добавления узла, например, для добавления формы статьи (/ node / add / article)?
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.