web-dev-qa-db-fra.com

Comment puis-je modifier le comportement des champs de formulaire contenus dans le champ de paragraphe?

En utilisant le module Paragraphs dans Drupal 8, j'essaie de modifier le comportement des champs de formulaire contenus dans le champ de paragraphe. C'est pour que je puisse ajouter un comportement comme = AJAX rappels, masquer afficher d'autres champs à l'aide d'états, etc.

Je peux accéder au champ parent du paragraphe à l'aide de cette fonction:

function hook_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) { 
}

Mais comment accéder aux champs à l'intérieur du paragraphe?

J'ai essayé hook_field_widget_form_alter mais en vain.

Comment puis-je faire cela?

Remarque: Je suis encore assez nouveau pour le développement Drupal.

17
bart_88

Depuis les paragraphes ^ 1.3, vous pouvez utiliser hook_field_widget_WIDGET_TYPE_form_alter () (J'ai lié la version 8.2 car il y a un bon commentaire sur l'utilisation du hook).

Vous pouvez voir l'exemple suivant dans modules/contrib/paragraphs/tests/modules/paragraphs_test/paragraphs_test.module

/**  
 * Implements hook_field_widget_WIDGET_TYPE_form_alter().  
 */  
function paragraphs_test_field_widget_entity_reference_paragraphs_form_alter(&$element, &$form_state, $context) {
  if ($element['#paragraph_type'] == 'altered_paragraph') {
    $element['subform']['field_text']['widget'][0]['#title'] = 'Altered title';
  }
}
14
Lars Jendrzejewski

En utilisant hook_form_alter vous pouvez modifier n'importe quoi dans le formulaire, même des éléments provenant de widgets. Il peut facilement devenir un peu salissant et il a tendance à se briser facilement lorsque vous jouez avec des widgets.

Si vous souhaitez modifier les widgets, vous pouvez créer votre propre widget. Les widgets sont des plugins (classe PHP), vous pouvez donc créer votre propre sous-classe, celle que vous avez et la modifier soit en remplaçant complètement les fonctions, soit en étendant les fonctions.

Les widgets utilisent un système d'annotation, vous devez donc définir le nom, l'identifiant, etc. en tant que commentaires au-dessus de la classe. Le moyen le plus simple consiste simplement à copier le widget d'origine et à le modifier en lui donnant un nouveau nom et un nouvel identifiant, le reste devrait être comme il se doit.

N'oubliez pas de vider le cache pour faire Drupal trouver le nouveau plugin.

1
googletorp

Si vous utilisez le navigateur de paragraphes comme widget de champ, les choses ont une autre tournure pour vous. Le crochet qui convient s'appelle hook_field_widget_paragraphs_browser_form_alter() Il m'a fallu un certain temps pour comprendre ...

0
eigentor