web-dev-qa-db-fra.com

Comment rendre un formulaire dans un modèle personnalisé?

Je cherche à ajouter un formulaire à l'intérieur d'un modèle personnalisé. Le formulaire, si j'ouvre le chemin enregistré dans le fichier cmodule.routing.yml, fonctionne mais si j'essaie de l'utiliser dans un modèle personnalisé, cela ne fonctionne pas: avec un vidage (formulaire) ou un vidage (form.anyfield) i obtenez NULL.

cmodule.routing.yml:

cmodule.manageform:
  path: '/cmodule/manageform'
  defaults:
    _title: 'Documents'
    _form: '\Drupal\cmodule\Forms\RequestForm'
  requirements:
    _permission: 'access content'
cmodule.manage:
  path: '/cmodule/manage'
  defaults:
    _controller: '\Drupal\cmodule\Controller\CmoduleController::manageAction'
    _title: 'Custom Documents'
  requirements:
    _permission: 'access content'

RequestForm.php:

/**
 * {@inheritdoc}
 *
 */
public function buildForm(array $form, FormStateInterface $form_state) {

    $form['type'] = array(
        '#type' => 'radios',
        '#options' => array(
            '0' =>t('DOC'),
            '1' =>t('PDF')
        ),
    );
    $form['pid'] = array(
        '#type' => 'textfield',
        '#title' => t('ID:'),
        '#required' => FALSE
    );
    $form['submit'] = array(
        '#type' => 'submit',
        '#value' => $this->t('Submit'),
        '#attributes'=> ['class'=>['glyphicon', 'glyphicon-search']],
    );


    return $form;
}

cmodule.module:

/**
 * Implements hook_theme().
 */
function cmodule_theme(){

    $templates = array(
        'manage_cmodule_page' => array(
            'variables' =>
                [
                    'id' => NULL,
                    'form' => NULL
                ],
            'template' =>'manage_cmodule',
            'render element' => 'form'
        )
    );

    return $templates;
}

le contrôleur contient:

public function manageAction() {

        $id = 1;

        $form = \Drupal::formBuilder()->getForm('Drupal\cmodule\Forms\RequestForm');

        $form['type']['#title_display'] = 'invisible';

        return [ '#theme' => 'manage_cmodule_page',
            '#form' => $form,
            '#id' => $id,
        ];
    }

puis le modèle/vue (contient):

<div>
 {{ form.form_token }}
{{ form.form_build_id }}
{{ form.form_id }} 
{{form.type}}
{{form.submit}}
</div>
etc..

Mais comme je l'ai dit ci-dessus, le modèle n'affiche pas le formulaire, mais montre (si je l'imprime) la valeur #id passée par le contrôleur. Avez-vous des suggestions?!


MISE À JOUR # 1 J'ai aussi essayé de suivre la suggestion de Beebee, puis this et this donc le code est:

manette:

controller contains:

public function manageAction() {

        $form = \Drupal::formBuilder()->getForm('Drupal\cmodule\Forms\RequestForm');

        $render['#form'] = $form;
        $render['theme'] = 'manage_cmodule_page';
        return $render;;
    }

et l'implémentation de hook_theme dans le fichier .module est:

return [
    'manage_cmodule_page' => [
        'template' =>'manage_cmodule',
        'render element' => 'form',
    ]
];

Le résultat est une page vide avec une erreur dans le journal Apache:

[php7: erreur] [pid 12660: tid 1592] [client :: 1: 59521] PHP Erreur fatale: Mémoire insuffisante (allouée 270532608) (a tenté d'allouer 266354688 octets) dans C:\drupal\vendor\twig\twig\lib\Twig\Extension\Debug.php on line 60, referer: http: // localhost/drupal /

si je supprime la ligne suivante du contrôleur

$render['theme'] = 'manage_atps_page';

la page se charge, mais elle est vide (sans aucun formulaire).

MISE À JOUR # 2

J'ai corrigé mon problème en suivant aussi l'idée de Alex Kuzava . J'ai donc utilisé le code de UPDATE 1, avec le nouveau répertoire du formulaire, puis j'ai ajouté ces 3 lignes à l'intérieur de la partie de mon modèle (sinon le bouton soumettre ne fonctionne pas).

{{ form.form.form_build_id }} 
{{ form.form.form_id }}
{{ form.form.form_token }}
3
que le

'render element' => 'formulaire'

Votre élément de rendu est formulaire ce qui signifie que toutes les variables fournies y seront passées.

Dans votre modèle twig vous pouvez rendre votre formulaire comme ici

<div>{{ form.form }}</div>

MISE À JOUR # 1

Wow man, vous avez un mauvais espace de noms Drupal\cmodule\Forms\RequestForm

Doit être Drupal\cmodule\Form\RequestForm

Veuillez renommer Forms en Form (le même pour le répertoire) et vider le cache. Cela devrait vous aider.

5
Alex Kuzava

Voir: https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Render!theme.api.php/function/hook_theme/8.2.x

Chaque tableau d'informations doit contenir soit un élément 'variables' (pour utiliser un élément #theme) soit un élément 'render element' (pour les éléments render), mais pas les deux .

Votre manage_cmodule_page attend à la fois variables et render element ce qui n'est pas autorisé. La suppression du tableau variables de votre hook_theme devrait fonctionner, à condition que le reste du code soit fonctionnel.

2
Beebee