Creating a route with a form and some content
-
23-02-2021 - |
Question
i have created a route with a form:
amu_404_redirect_import.admin:
path: '/admin/config/amu_404_redirect_import/upload'
defaults:
_form: '\Drupal\amu_404_redirect_import\Form\Amu404RedirectImportForm'
\Amu404RedirectImportController::content'
_title: '404 redirect Import'
requirements:
_permission: 'administrer AMU 404 redirection import'
if now i am creating a controller to display some content to the same page , the form is not displayed anymore
amu_404_redirect_import.admin:
path: '/admin/config/amu_404_redirect_import/upload'
defaults:
_form: '\Drupal\amu_404_redirect_import\Form\Amu404RedirectImportForm'
_controller: '\Drupal\amu_404_redirect_import\Controller\Amu404RedirectImportController::content'
_title: '404 redirect Import'
requirements:
_permission: 'administrer AMU 404 redirection import'
how could i have both content displayed ?
Solution
As it mentioned in @Hudri answer it's not possible to define _form
and a _controller
in the same route.
I think the solution for your use case is to define only route for the controller and embed the form inside it, like the following:
amu_404_redirect_import.admin:
path: '/admin/config/amu_404_redirect_import/upload'
defaults:
_controller: '\Drupal\amu_404_redirect_import\Controller\Amu404RedirectImportController::content'
_title: '404 redirect Import'
requirements:
_permission: 'administrer AMU 404 redirection import'
and your controller should be something like:
namespace Drupal\ amu_404_redirect_import\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Render\Markup;
class Amu404RedirectImportController extends ControllerBase {
public function content() {
$myForm = $this->formBuilder()
->getForm('Drupal\d8_api_exp\Form\Amu404RedirectImportForm');
$renderer = \Drupal::service('renderer');
$myFormHtml = $renderer->render($myForm);
// Add other markups here ....
return [
'#markup' => Markup::create("
{$myFormHtml}
"),
];
}
}
OTHER TIPS
As doc states
defaults (required): Defines the default properties of a route. Provide one of the following to specify how the output is generated:
_controller
_form
_entity_view
_entity_list
_entity_form
_route
you can't list a _form
and a _controller
in the same routing.yml
entry, only one of those keys is allowed. Either append that content via form API to your form, or render the form manually in your controller.