Je suggère de décrire votre problème plus en détail et de dire ce que vous avez déjà essayé. Cela montrera une certaine initiative et aidera les autres à vous donner une meilleure réponse.
Aram Boyajyan
Réponses:
16
Ouvrez votre fichier YOURTHEMENAME.theme et ajoutez le code suivant:
Vous pouvez simplement thème chaque forme comme vous le souhaitez. Je n'aime pas la méthode de @rpayanm, car elle est difficile à maintenir et difficile à lire, avec de grandes formes, ce n'est pas le cas, juste un emballage simple et une structure simple.
Chaque formulaire essayant d'utiliser le thème est égal à leur nom de machine. Vous pouvez trouver ce nom de modèle $form['#theme']simplement en le modifiant, il est toujours (ou dans la plupart des cas) identique au nom de la machine id du formulaire. Ce que vous devez faire, c'est d'enregistrer un modèle. Vous devez mettre en œuvre hook_theme(). Vous pouvez l'écrire dans CUSTOMMODULE.module ou dans THEMENAME.theme. La clé de thème doit être la même que dans $form['#theme'], donc elle l'utilise automatiquement, sinon vous devez en ajouter une nouvelle via le formulaire.
Drupal passe la variable $ form avec le formulaire.
Ensuite, vous devez créer custom-form-template-name.html.twig(avec le nom de votre modèle à partir de hook_theme ()).
Le modèle minimal est
{{ form }}
Vous pouvez également imprimer chaque champ du formulaire où vous le souhaitez
{{ form.field_name }}
Ici, vous pouvez faire ce que vous voulez avec le balisage.
Vous pouvez également transmettre des données supplémentaires au modèle en implémentant template_preprocess_TEMPALTENAME
function template_preprocess_FORM_ID_THEME(&$variables){
$variables['example']='This is added via preprocess';}
Et puis utiliser dans le modèle
{{ example }}<div class="first-field">{{ form.first_field }}</div><div class="second-field">{{ form.second_field }}</div><div class="buttons">{{ form.submit }}{{ form.preview }}</div>{#Don't forget to add printing form special info at the end.
Without this data form will not working propertly.
#}
{{ form.form_build_id }}
{{ form.form_token }}
{{ form.form_id }}
Je pense que cette méthode est plus flexible, propre et puissante.
Ps désolé pour mon anglais, j'espère que quelqu'un modifiera et corrigera mes erreurs :)
Exemple de formulaire complexe utilisant cette méthode.
Notez que pour moi, je devais changer {{ form.submit }}pour{{ form.actions.submit }}
mikeDOTexe
@Niklan: J'ai suivi le même code ci-dessus pour mon formulaire de groupe d'entités personnalisé. Si j'utilise {{ form }}, il imprime tout le formulaire, mais si j'utilise un champ spécifique comme {{ form.my_field }}, rien ne s'affiche. Une idée comment pouvons-nous afficher chaque champ du formulaire de groupe d'entités personnalisé?
kalidasan
@kalidasan essaie d'imprimer chaque champ sans imprimer {{ form }}. Je suggère qu'après l'impression, {{ form }}tous les éléments du formulaire seront marqués comme '#rendered' => TRUEet ne seront pas rendus bientôt. Si vous ne souhaitez pas utiliser cette méthode de formulaire de thème, vous devez imprimer chaque champ individuellement. Il n'y drupal_render_children()en a pas dans Drupal 8, sauf si vous l'écrivez par vous-même. Quoi qu'il en soit par défaut, cela provoquera des doublons, essayez donc d'imprimer chaque champ manuellement.
Niklan
@Niklan: Je n'ai pas utilisé {{ form }} & {{ form.my_field }}ensemble. D'abord essayé avec seulement {{ form }}, ici je peux voir la forme entière. Ensuite, retiré {{ form }}du modèle, puis essayé séparément pour chacun des champs du formulaire, comme ceci {{ form.my_field }}, etc , mais il ne faut pas en sortir. Rien affiché.
kalidasan
1
@kalidasan, vous pouvez désactiver les titres template_preprocess_FORM_ID_THEME(&$variables). Dans ce prétraitement, vous pouvez ajouter de nouvelles variables, modifier les éléments de formulaire existants, y compris. Je n'ai jamais vu ça {{ form.field_name.widget }}et je thématise souvent les formulaires. Il semble que ce champ soit créé ou ajouté par un module tiers? Je pense que c'est permis, mais pas de règle pour les autres. Je vous recommande de commencer par le crochet de prétraitement et de regarder $variables['form']ce qu'il contient à l'intérieur.
Réponses:
Ouvrez votre fichier YOURTHEMENAME.theme et ajoutez le code suivant:
Et voici votre résultat:
N'oubliez pas de vider vos caches;)
la source
Vous pouvez simplement thème chaque forme comme vous le souhaitez. Je n'aime pas la méthode de @rpayanm, car elle est difficile à maintenir et difficile à lire, avec de grandes formes, ce n'est pas le cas, juste un emballage simple et une structure simple.
Chaque formulaire essayant d'utiliser le thème est égal à leur nom de machine. Vous pouvez trouver ce nom de modèle
$form['#theme']
simplement en le modifiant, il est toujours (ou dans la plupart des cas) identique au nom de la machine id du formulaire. Ce que vous devez faire, c'est d'enregistrer un modèle. Vous devez mettre en œuvrehook_theme()
. Vous pouvez l'écrire dans CUSTOMMODULE.module ou dans THEMENAME.theme. La clé de thème doit être la même que dans$form['#theme']
, donc elle l'utilise automatiquement, sinon vous devez en ajouter une nouvelle via le formulaire.Drupal passe la variable $ form avec le formulaire.
Ensuite, vous devez créer
custom-form-template-name.html.twig
(avec le nom de votre modèle à partir de hook_theme ()).Le modèle minimal est
Vous pouvez également imprimer chaque champ du formulaire où vous le souhaitez
Ici, vous pouvez faire ce que vous voulez avec le balisage.
Vous pouvez également transmettre des données supplémentaires au modèle en implémentant
template_preprocess_TEMPALTENAME
Et puis utiliser dans le modèle
Je pense que cette méthode est plus flexible, propre et puissante.
Ps désolé pour mon anglais, j'espère que quelqu'un modifiera et corrigera mes erreurs :)
Exemple de formulaire complexe utilisant cette méthode.
la source
{{ form.submit }}
pour{{ form.actions.submit }}
{{ form }}
, il imprime tout le formulaire, mais si j'utilise un champ spécifique comme{{ form.my_field }}
, rien ne s'affiche. Une idée comment pouvons-nous afficher chaque champ du formulaire de groupe d'entités personnalisé?{{ form }}
. Je suggère qu'après l'impression,{{ form }}
tous les éléments du formulaire seront marqués comme'#rendered' => TRUE
et ne seront pas rendus bientôt. Si vous ne souhaitez pas utiliser cette méthode de formulaire de thème, vous devez imprimer chaque champ individuellement. Il n'ydrupal_render_children()
en a pas dans Drupal 8, sauf si vous l'écrivez par vous-même. Quoi qu'il en soit par défaut, cela provoquera des doublons, essayez donc d'imprimer chaque champ manuellement.{{ form }} & {{ form.my_field }}
ensemble. D'abord essayé avec seulement{{ form }}
, ici je peux voir la forme entière. Ensuite, retiré{{ form }}
du modèle, puis essayé séparément pour chacun des champs du formulaire, comme ceci{{ form.my_field }}, etc
, mais il ne faut pas en sortir. Rien affiché.template_preprocess_FORM_ID_THEME(&$variables)
. Dans ce prétraitement, vous pouvez ajouter de nouvelles variables, modifier les éléments de formulaire existants, y compris. Je n'ai jamais vu ça{{ form.field_name.widget }}
et je thématise souvent les formulaires. Il semble que ce champ soit créé ou ajouté par un module tiers? Je pense que c'est permis, mais pas de règle pour les autres. Je vous recommande de commencer par le crochet de prétraitement et de regarder$variables['form']
ce qu'il contient à l'intérieur.