Рейтинг:-2

Могу ли я использовать две разные формы в одном модуле?

флаг cn

Я новичок в Drupal 8, и мне было интересно, могу ли я использовать две формы, которые находятся внутри папки Form (mymodule/src/Form/). Мои формы называются FormOne.php и FormTwo.php.

Я могу отображать и использовать только FormOne.php во всем моем модуле.

Я исследовал его и не могу найти ответ.

Можете ли вы помочь мне с отображением второй формы?

Рейтинг:2
флаг ru

Вы можете создать пользовательскую форму в MyCustomFormA.php

<?php

пространство имен Drupal\MY_MODULE\Form;

используйте Drupal\Core\Form\FormBase;
используйте Drupal\Core\Form\FormStateInterface;

/**
 * Класс MyCustomFormA.
 */
класс MyCustomFormA расширяет FormBase {

  /**
   * {@inheritdoc}
   */
  публичная функция getFormId() {
    вернуть 'my_custom_form_a';
  }
.....
}

Точно так же вы можете создать другую форму в MyCustomFormB.php

<?php

пространство имен Drupal\MY_MODULE\Form;

используйте Drupal\Core\Form\FormBase;
используйте Drupal\Core\Form\FormStateInterface;

/**
 * Класс MyCustomFormB.
 */
класс MyCustomFormB расширяет FormBase {

  /**
   * {@inheritdoc}
   */
  публичная функция getFormId() {
    вернуть 'my_custom_form_b';
  }
....
}

В вашей MY_MODULE.routing.yml

MY_MODULE.my_custom_form_a:
  путь: '/MY_MODULE/my_custom_form_a'
  значения по умолчанию:
    _form: '\Drupal\MY_MODULE\Form\MyCustomFormA'
    _title: 'Моя пользовательская форма Форма'
  требования:
    _permission: 'доступ к содержимому'
MY_MODULE.my_custom_form_b:
  путь: '/MY_MODULE/my_custom_form_b'
  значения по умолчанию:
    _form: '\Drupal\MY_MODULE\Form\MyCustomFormB'
    _title: 'Моя персонализированная форма B'

  требования:
    _permission: 'доступ к содержимому'
Jeirod avatar
флаг cn
Спасибо за ваш ответ, @Razeem. Что касается `MyCustomFormB.php`, должен ли я также объявить его в routing.yml?
Razeem Ahmad avatar
флаг ru
Если вы хотите отобразить его на определенной странице, тогда да
Jeirod avatar
флаг cn
вам нужны «требования» в каждой форме. Это дает мне «HTTP ERROR 500». Я также пытался очистить кеш, и он дает мне ту же ошибку.
Razeem Ahmad avatar
флаг ru
да, вы также можете добавить это
Jeirod avatar
флаг cn
Большое спасибо @Razeem
Razeem Ahmad avatar
флаг ru
Добро пожаловать @JeirodAbogado.
Рейтинг:2
флаг de

Да, вы можете определить столько форм в модуле, сколько вам нужно.

Если вы хотите включить две формы в одну страницу, вы можете сделать это, используя построитель форм в вашем контроллере для вызова обеих форм и создания массива рендеринга.

Вместо того, чтобы использовать _форма в вашей *.routing.yml файл, вы бы вместо этого использовали _контроллери определите обратный вызов контроллера, а не обратный вызов формы. Тогда ваш контроллер будет выглядеть примерно так:

class ExampleController расширяет Drupal\Core\Controller\ControllerBase {

  функция примерPageCallback() {
    // Примечание. Для внедрения этой службы следует использовать внедрение зависимостей, 
    // вместо этого метода.
    $form_builder = \Drupal::service('form_builder');

    $возврат [
      'form_a' => $form_builder->getForm('Drupal\[MODULE]\Form\FormA'),
      'form_b' => $form_builder->getForm('Drupal\[MODULE]\Form\FormB'),
    ];
  }
}
Jeirod avatar
флаг cn
Спасибо за ваш ответ, @Jaypan. Я задал этот вопрос, потому что заметил, что FormOne можно только использовать и отображать. Кажется, я не могу использовать и отображать FormTwo. Должен ли я объявлять каждую форму в файле routing.yml?
Jaypan avatar
флаг de
Если вы хотите, чтобы форма была доступна на маршруте, да, это один из способов использования второй формы.
Jeirod avatar
флаг cn
Можно ли добавить оба маршрута в routing.yml? `мой модуль.display_form:` `путь: '/моймодуль'` `по умолчанию:` ` _form: '\Drupal\mymodule\Form\FormOne'` ` _form: '\Drupal\mymodule\Form\FormTwo'`
Kevin avatar
флаг in
В этом случае вам нужно создать контроллер, который возвращает массив рендеринга, содержащий обе формы.
Jaypan avatar
флаг de
Я обновил свой ответ.
Jeirod avatar
флаг cn
@Jaypan, спасибо за обновление. Я планирую использовать каждую форму на отдельной странице. Это также возможно?
Jaypan avatar
флаг de
Да, в этом случае вы должны использовать метод, который Разим опубликовал в качестве ответа. Его ответ заключается в том, как иметь отдельные страницы для каждой формы. Мой ответ: как разместить две формы на одной странице.
Jeirod avatar
флаг cn
Спасибо за решение. @Джейпан
Jaypan avatar
флаг de
Вы должны отметить его ответ как правильный, но проголосовать за наши ответы нам обоим. Здесь так принято :) Добро пожаловать.
Jeirod avatar
флаг cn
Конечно, @Jaypan, оба ответа полезны. Спасибо большое.
Jeirod avatar
флаг cn
Спасибо также @Kevin за дополнительную информацию

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.