web-dev-qa-db-fra.com

Comment puis-je ajouter un formulaire personnalisé à la sortie d'une classe de contrôleur?

J'ai un contrôleur dans mon module personnalisé. À l'intérieur de ce contrôleur, j'ai besoin de rendre tout un tas de choses différentes (du HTML de base, des formulaires multiples, etc.). Mon principal problème est que je ne sais pas comment

  1. Chargez correctement un formulaire personnalisé Drupal 8
  2. Obtenez ensuite ce formulaire dans un format acceptable pour le passer à la sortie #markup du contrôleur.
  3. Gardez à l'esprit que ce formulaire est mélangé avec d'autres fichiers html qui seront un méli-mélo de beaucoup de choses non présentées ici (je l'ai réduit pour montrer un exemple de base)

Mon code de contrôleur ressemble à ceci actuellement:

<?php

namespace Drupal\my_module\Controller;
use Drupal\Core\Controller\ControllerBase;

class SingleNodeProcessor extends ControllerBase {

  public function processSingle($nid) {    
    $markup = '<div class="process-heading">' . $this->t('My custom Form Is below but there will be alot more html than just the form. So this is just an example.') . '</div>';

    $form = $this->formBuilder()->getForm('Drupal\my_module\Form\MyFormClassGoesHere', $nid);
    $markup .= $form; //this is a render array, how do I turn it to html so it can pass to #markup??

    return [
      '#type' => 'markup',
      '#markup' => $markup,
    ];
  }
}
2
Bobby

Je pense que vous voulez retourner un tableau de rendu, au lieu d'un balisage. Parce que le from doit rester en tant que tableau de rendu, il vaut mieux le mettre pour que votre contenu soit au même format que dans l'autre sens. Dans votre exemple:

public function processSingle($nid) {
  $build = [];
  $build['heading'] = [
    '#type' => 'markup',
    '#markup' => '<div class="process-heading">' . $this->t('My custom Form Is below but there will be alot more html than just the form. So this is just an example.') . '</div>',
  ];
  $build['form'] = $this->formBuilder()->getForm('Drupal\my_module\Form\MyFormClassGoesHere', $nid);
  return $build;
}
8
Dave Reid

Le problème est que les tableaux de rendu du type #markup exécutent le balisage résultant via le filtrage XSS, filtrant ainsi de nombreuses balises. ( voir la documentation de l'API de rend ). Dans ce cas, il filtrera les balises du formulaire.

La façon correcte de le faire, selon les documents:

Si votre balisage nécessite l'une des balises ne figurant pas dans cette liste blanche, vous pouvez implémenter un hook de thème et/ou une bibliothèque de ressources. Vous pouvez également utiliser la clé #allowed_tags pour modifier les balises filtrées.

La solution consiste donc à passer des balises à #allowed_tags dans le tableau de rendu ou (la meilleure solution), à utiliser #theme dans votre tableau de rendu au lieu du simple #markup.

2
Bobby