web-dev-qa-db-fra.com

Comment modifier / masquer le libellé de l'élément d'entrée dans le formulaire (créer / modifier)?

On peut thématiser le libellé de n'importe quel champ en tpl ou même simplement en changeant l'option de gestion de l'affichage mais en se demandant comment faire de même dans la forme (lors de la création ou de l'édition d'un contenu)?

Je cherche la bonne façon de modifier/masquer l'étiquette, en particulier avec les champs de collecte de champs lorsque le contenu est créé ou modifié.

7
pown

Vous pouvez le faire avec hook_form_alter() ou hook_form_FORM_ID_alter() dans votre module personnalisé ou également dans le fichier template.php de votre thème.

function YOURMODULE_form_alter(&$form, &$form_state, $form_id) {
  // Check the form_id
  if ($form_id == 'YOUR_FORM_ID') {
    // To hide the label
    $form['your_form_element']['#title_display'] = 'invisible';
    // To alter the label
    $form['your_form_element']['#title'] = t('Your new title');
  }
}

Si vous utilisez hook_form_FORM_ID_alter() à la place, vous n'avez pas besoin de vérifier le form_id.

Vous pouvez trouver plus d'informations sur Form API Reference pour les attributs #title Et #title_display, Ainsi que tous les autres éléments de formulaire et leurs attributs.

En cas de Field Collection , cela peut être un peu compliqué. Voici un exemple de code:

function YOURMODULE_form_YOUR_FORM_ID_alter(&$form, &$form_state, $form_id) {
  $your_field_collection = element_children($form['your_field_collection'][LANGUAGE_NONE];
  foreach ($your_field_collection as $key => $value) {
    if (is_numeric($value)) {
      $form['your_field_collection'][LANGUAGE_NONE][$val]['your_field_collection_field']['#title'] = t('Your new title');
      $form['your_field_collection'][LANGUAGE_NONE][$val]['your_field_collection_field']['#title_display'] = 'invisible';
    }
  }
}

Explication du code ci-dessus:

J'ai d'abord assigné la collection de champs elle-même à une variable, pour la rendre un peu lisible. J'ai utilisé LANGUAGE_NONE Pour plus de simplicité, mais une meilleure pratique serait d'utiliser $form['your_field_collection']['#language'], Il est vrai que cela rend le code plus compliqué à lire.

Deuxièmement, j'ai utilisé un foreach, car la plupart du temps nous utilisons une collection de champs si nous voulons avoir plusieurs valeurs d'une collection de champs. Ainsi, la boucle foreach prendrait en charge toutes les instances de la collection de champs.

Troisième piratage, est un sale truc que j'ai appris de quelqu'un sur Drupal.org, peut-être qu'il y aurait une meilleure approche, mais cela fonctionne, donc je n'ai pas creusé. Je vérifie si le $value Est numérique, pour exclure tous les autres attributs meta et boucler uniquement à travers les éléments.

Puis, enfin, dans chaque élément, je modifie le champ dans la collection de champs.

20
Елин Й.

Le module field_display_label résout ce problème en ajoutant une étiquette d'affichage distincte.

De cette façon, l'étiquette de champ d'origine apparaît exclusivement sur le formulaire de création/modification, tandis que l'étiquette d'affichage (si elle est définie) apparaît exclusivement sur la page d'affichage. Ainsi, en ne définissant rien sur l'étiquette du champ d'origine, vous pouvez supprimer l'étiquette dans le formulaire de création/modification uniquement.

1
giorgio79

Cela vous aidera.

/**
 * Implements hook_field_widget_form_alter().
 */
function YOURMODULE_field_widget_form_alter(&$element, &$form_state, $context) {
  if (isset($element['#entity_type']) && $element['#entity_type'] == 'field_collection_item' && $element['#bundle'] == 'YOUR FIELD COLLECTION') {
    $element['value']['#title_display'] = 'invisible';
  }
}
1
Dmytro Danylevskyi

En utilisant hook_form_FORM_ID_alter () en essayant d'agir sur le formulaire d'édition de nœud, cela a fonctionné pour moi:

function MYMODULE_form_NODE_TYPE_node_form_alter(&$form, &$form_state, $form_id) {
  $form['field_MY_FIELD']['und']['#title_display'] = 'invisible';
}

(Remplacez vos valeurs par des valeurs dans TOUS LES MAJUSCULES.)

0
byronveale