web-dev-qa-db-fra.com

Utilisez un modèle twig au lieu d'un tableau de rendu dans une page d'administration de module personnalisé

J'ai un Drupal 8 module personnalisé, et je veux afficher sa page de configuration en utilisant le thème admin.

Habituellement, pour ce type de pages que j'utilise, dans le _controller propriété de mon itinéraire, plutôt:

  • une classe qui étend \Drupal\Core\Form\ConfigFormBase (pour une simple page de configuration de type formulaire)
  • un contrôleur personnalisé qui étend \Drupal\Core\Controller\ControllerBase et renvoie un tableau pouvant être rend

Pour ce module, j'ai besoin d'utiliser une structure HTML complexe et une bibliothèque Javascript pour sa page de configuration. Écrire tout cela directement dans un #markup La propriété d'un tableau de rendu représenterait trop de travail et ne serait pas maintenable.

Est-il possible d'écrire un modèle personnalisé (brindille ou non), de le rendre par programmation et d'insérer le résultat dans un élément container ou dans un #markup propriété ? Et, comme j'utilise le thème d'administration Seven, je voudrais le faire sans affecter le thème.


[Résolu] Solution finale:

En combinant la réponse de leymannx et les éléments mentionnés ci-dessous, je me suis retrouvé avec quelque chose qui répond à mes exigences.

mymodule.routing.xml

mymodule.admin_ro:
  path: '/admin/config/mymodule/readonly'
  defaults:
    _controller: '\Drupal\mymodule\Controller\ReadOnlyController::index'
    _title: 'Module configuration - read only'
  requirements:
    _permission: 'view mymodule configuration'
  options:
    _admin_route: TRUE
    no_cache: TRUE

ReadOnlyController.php

class ReadOnlyController extends ControllerBase {

    public function index(){
        return array(
            '#type' => 'container',
            '#theme' => 'test-template',
            '#test_var' => [ 0, 1, 2, 3 ] // I needed an array type variable
        );
    }

}

mymodule.module

// Implements hook_theme()
function mymodule_theme( $existing, $type, $theme, $path ){
    return [
        'test-template' => [
            'render element' => 'container', // To render a simple container element
            'template' => 'test', // My template file name
            'variables' => [
                'test_var' => [] // Default value for my variable
            ]
        ]
    ];
}

Et enfin, mon modèle de test: templates/test.html.twig

<p>Hello !</p>
<!-- Just to see the content of my variable, after enabling twig debug mode -->
{{ dump(test_var) }}

Documents ou publications associés

5
Eria

Le thème principal change automatiquement de chemin. Donc, si le chemin de votre itinéraire commence par /admin, Il affichera la page dans le thème administrateur.

MYMODULE.MYPAGE:
  path: '/admin/config/MYPAGE'
  defaults:
    _form: '\Drupal\MYMODULE\Form\MYFORM'
    _title: 'MYTITLE'
  requirements:
    _permission: 'administer site configuration'

Pour rendre un formulaire dans votre propre modèle, vous pouvez simplement enregistrer une nouvelle implémentation de thème dans MYMODULE/MYMODULE.module.

/**
 * Implements hook_theme().
 */
function MYMODULE_theme($existing, $type, $theme, $path) {

  return [
    'MYNAME' => [
      'render element' => 'form',
      'template'       => 'MYTEMPLATE',
    ],
  ];
}

Et dans le formulaire, vous définissez ceci comme #theme Du formulaire.

$form['#theme'] = 'MYNAME';

Et dans le modèle MYMODULE/templates/MYTEMPLATE.html.tiwg Vous l'imprimez comme ceci:

<div class="foo bar">
  {{ form }}
</div>

Toute bibliothèque supplémentaire peut également être simplement #attached Directement dans le formulaire.

$form['#attached']['library'][] = 'MYMODULE/MYLIBRARY';

Lire la suite

[drupal.org] Créez des modèles personnalisés twig pour le module personnalisé .

4
leymannx