web-dev-qa-db-fra.com

Désactiver les onglets verticaux par type de contenu ou rôle d'utilisateur

Certains utilisateurs peuvent uniquement avoir la possibilité de modifier l'un des ensembles de champs qui s'affiche dans les onglets verticaux du formulaire de modification de nœud. Dans un tel cas, il semble plutôt idiot d'utiliser des onglets verticaux car il n'y a qu'un seul onglet vertical à choisir. Voir capture d'écran:

screenshot

Alors, est-il possible de désactiver les onglets verticaux par rôle d'utilisateur? Ou, à moins que cela, les désactiver complètement pour certains types de contenu? Pour mon cas d'utilisation, je veux juste que l'emplacement ne soit pas affiché dans les onglets verticaux.

J'ai essayé Renderable Fields et Field Group ensemble mais ils ont mal géré le formulaire (buggy, je pense). Les champs d'organisation ne peuvent pas séparer les onglets verticaux.

10
Jay

Il existe plusieurs façons de procéder:

  1. Vous pouvez utiliser le module Renderable Elements (comme vous l'avez mentionné ci-dessus). Il vous permet d'enregistrer n'importe quel élément de build sur votre installation et de gérer l'affichage via Field UI. Il mettra à disposition des éléments (supplémentaires) des entités existantes sur les formulaires de gestion/écrans d'affichage ou vous pouvez par exemple enregistrer le formulaire de contact et réorganiser les champs via Field UI. Fonctionne actuellement très bien sur les formulaires, le support des autres arrive dans une deuxième itération.

  2. Ou ajoutez ce qui suit à votre module personnalisé:

    $config['yourcontenttype_node_form'] = FALSE;
    variable_set('vertical_tabs_forms', $config);
    
  3. A module sandbox qui désactive les onglets verticaux

Voici ce problème principal qui fait référence à cela.

7
user842

Vous pouvez également utiliser la vérification #access pour empêcher les utilisateurs de voir les onglets verticaux.

$form['additional_settings']['#access'] = FALSE;

Ajoutez simplement cela à un crochet ou modifiez le chargement et le rendu d'un formulaire. Après cela, vous pouvez appeler render ($ form) pour obtenir le balisage.

6
Derek Webb

J'ai écrit une solution possible simple dans le fil déjà mentionné: https://drupal.org/node/1048644#comment-7822687 . Pour plus de commodité, je vais le coller ici.

Il existe un moyen simple de désactiver les onglets verticaux d'un formulaire, en modifiant simplement le $form['additional_settings']['#type'] la valeur de la variable à 'fieldset' dans une implémentation de hook_form_alter () ou hook_form_FORM_ID_alter () , si elle est égale à 'vertical_tabs'.
Vous n'avez pas besoin de modifier les paramètres d'accès ou de parcourir l'ensemble $form array récursivement, ce dernier consomme inutilement trop de ressources.
(Testé en Drupal 7.23.)

/**
 * Disable Vertical tabs on a form with simply changing the value of $form['additional_settings']['#type']
 * @see https://drupal.org/node/1048644
 */
function form_disable_vertical_tabs(&$form){
  // originally $form['additional_settings']['#type'] equals to 'vertical_tabs'
  if(isset($form['additional_settings']['#type']) && ($form['additional_settings']['#type'] === 'vertical_tabs')){
    $form['additional_settings']['#type'] = 'fieldset';
  }
}

/**
 * Implements hook_form_alter().
 */
function MYMODULEORTHEMENAME_form_alter(&$form, &$form_state, $form_id) {

  if($form_id == 'my_form_id'){
    // disable vertical tabs for this form
    form_disable_vertical_tabs($form);
  }
}

C'est tout, bien sûr, substituez MYMODULEORTHEMENAME au nom de votre propre module ou thème (ce dernier dans un template.php fichier), et my_form_id à l'ID de votre formulaire.


Vous pouvez également désactiver les champs verticaux uniquement pour les utilisateurs qui n'ont PAS le rôle d'administrateur :

/**
 * Implements hook_form_alter().
 */
function MYMODULEORTHEMENAME_form_alter(&$form, &$form_state, $form_id) {

  global $user;
  $is_administrator = in_array('administrator', array_values($user->roles));

  if($form_id == 'my_form_id'){
    // if $user does NOT have the administrator role.
    if (!$is_administrator) {
      // disable vertical tabs for this form
      form_disable_vertical_tabs($form);
    }
  }
}

Si quelqu'un est intéressé, j'ai attaché un patch (qui fait la même chose que ci-dessus) au module sandbox de Dripman : # 2080739: Simplifiez la méthode de désactivation des onglets verticaux en changeant simplement le $form['additional_settings']['#type'] à 'fieldset' .

2
Sk8erPeter

Les éléments capables de rendu ne sont actuellement pas pris en charge et reconnaissent sur la page du projet qu'ils se heurtent à d'autres modules contribués, donc je ne compterais pas dessus pour les sites de production.

La question de savoir comment désactiver complètement les onglets verticaux est abordée dans ce fil .

Dripman a créé un module sandbox simple pour désactiver complètement les onglets verticaux.

En fonction de votre niveau d'engagement souhaité avec le codage, le module de Dripman devrait être facilement personnalisable pour être sélectif en fonction des champs/rôles.

Toutes mes excuses pour le chevauchement avec une réponse succincte de @nicoz

0
autopoietic

Vous pouvez utiliser le module Visibilité des onglets verticaux .

Ce module permet de gérer la visibilité des onglets verticaux sur les formulaires d'ajout/modification de type de contenu.

Pour gérer la visibilité des onglets verticaux sur les types de contenu, ajoutez/modifiez des formulaires. visitez simplement /admin/config/user-interface/vertical-tabs-visibility page et sélectionnez les types de contenu. Les onglets verticaux du formulaire d'ajout/modification de noeud seront désactivés pour les types de contenu cochés.

Le module est actuellement dans le bac à sable

0
milkovsky

Pour mon cas d'utilisation, j'essayais de désactiver les onglets verticaux appliqués sur la section Options de publication sur un formulaire de modification de nœud (car c'était le seul jeu de champs auquel un ensemble particulier d'utilisateurs avait accès):

// Place somewhere in MYMODULE_form_alter()...
$form['additional_settings']['#type'] = 'fieldset';
$form['additional_settings']['#collapsible'] = FALSE;
$form['options']['#collapsible'] = FALSE;

Pour plus de précision, vous devez non seulement définir additional_settings#collapsible à FALSE, tous les éléments à l'intérieur doivent également avoir #collapsibleset toFAUX, in my case that was theoptions` élément.

0
tyler.frankenstein