Comment masquer et / ou empêcher l'accès aux champs d'un formulaire, tels que group_audience pour les groupes organiques

9

Cela me dérange depuis un certain temps. Lorsque j'essaie de masquer des champs comme le champ d'audience de groupe ou le paramètre de publication d'un formulaire, lors de la validation, le formulaire définit ces deux champs sur une valeur nulle, même si la valeur par défaut est été correctement déclaré.

J'ai essayé d'utiliser Invisible, #access, unset cache rien de travail! C'est très problématique car pour mon projet actuel, les utilisateurs ne peuvent modifier que de petits morceaux de leur profil à la fois, par exemple juste l'adresse ou l'image, donc si je cache l'audience du groupe, l'utilisateur finit par être expulsé des groupes auxquels il appartient à chaque fois. Éditer.

J'ai fini par utiliser le code ci-dessous pour masquer ces champs tout en gardant l'utilisateur dans son groupe.

$variables['user_edit_about']['group_audience']= $temp['group_audience'];       
$variables['user_edit_about']['group_audience']['#prefix'] = '<div style="display:none;">';
$variables['user_edit_about']['group_audience']['#suffix'] = '</div>';

Quelqu'un pourrait-il penser à une meilleure façon d'y parvenir?

Merci

soieAdmin
la source
Cette réponse n'est pas parfaite car l'utilisation peut toujours changer la valeur avec la manipulation DOM
iStryker

Réponses:

6

Éditer:

Ok je l'ai compris. Mettez ceci dans votre module personnalisé:

function example_form_alter(&$form, &$form_state, $form_id) {
    if($form_id == 'story_node_form') {
        $form['title']['#value'] = 'hot stuff';
        $form['title']['#access'] = FALSE;

    }
}

Cela définira le titre du nœud de l'histoire sur «hot stuff» et il ne sera PAS affiché sur la page car #access = FALSE;

Vous pouvez ajouter plus de contrôle de granularité dans hook_form_alter () comme

  global $user;

  // Check to see if $user has does not have the administrator role.
  if (!in_array('administrator', array_values($user->roles))) {
    $form['title']['#access'] = FALSE;
  }

Cela fonctionne pour Drupal 6 & 7.

Ancienne réponse (ignorer):

Cela fait un moment que je n'ai pas fait quelque chose comme ça, donc je peux me tromper. Si vous définissez l' [#value]élément d'un formulaire, il ne sera pas visible sur le formulaire.

Je l'ai fait dans Drupal 6, hook_form_alter()dans un module personnalisé. Je ne sais pas si cela fonctionnera dans Drupal 7 et je ne sais pas si vous pouvez le faire dans une fonction de prétraitement

iStryker
la source
Merci pour votre réponse, bien que cela n'ait malheureusement pas fonctionné dans mon cas, les champs de formulaire ont déjà une #value pré déposée car ils sont des formulaires d'édition
silkAdmin
@silkAdmin Veuillez voir les nouvelles modifications
iStryker
Merci Stryker d'avoir pris le temps de creuser autour de cela, même si votre technique ci-dessus fonctionne, masque les champs, il semble que la valeur par défaut ne soit pas prise en compte lors de la soumission non plus. Je me retrouve donc avec l'utilisateur toujours expulsé de son groupe à chaque modification de profil. Jusqu'à présent, seule l'astuce du suffixe #prefix # semble faire en sorte qu'elle se comporte normalement.
silkAdmin
do $ form ['title'] ['# value'] = $ form ['title'] ['# default_value']
iStryker
5

Vous pouvez également simplement ajouter la classe CSS «élément caché» à l'élément de formulaire

$form['user_edit_about']['group_audience']['#attributes']['class'][] = 'element-hidden';

Comme iStryker l'a mentionné précédemment, il serait toujours possible de modifier la valeur via la manipulation DOM. Cependant, c'est un moyen simple et agréable de masquer un champ de formulaire (ou tout autre élément de rendu). La element-hiddenclasse est définie dans system.base.css.

Chaulky
la source
Mon pote, tu m'as sauvé. Merci. Toutes les autres méthodes que j'ai vues ne produisent pas les éléments sur le formulaire lui-même. Dans mon cas, je souhaite masquer les éléments de formulaire dans un module contrib qui attend que ces éléments soient dans le formulaire, sinon il ne fonctionnera pas correctement. Votre correctif CSS masque les éléments indésirables, mais tout fonctionne toujours. Merci de noter également que ce n'est pas "à l'épreuve des pirates" et ne fonctionne que lorsque vous n'avez besoin que de simplifier l'interface que vous présentez aux utilisateurs de l'éditeur de confiance.
Mario Awad