Est-il possible de créer une deuxième page «modifier le compte» qui permet uniquement aux utilisateurs de modifier certains champs de profil?

14

Voici donc ma situation: les utilisateurs de mon site doivent remplir un assez grand nombre de champs lors de l'inscription. Cependant, après leur inscription, seuls quatre (sur une vingtaine) de ces champs doivent être modifiés régulièrement. Je voudrais créer une page "d'édition" distincte pour permettre aux utilisateurs de modifier uniquement ces quatre champs pour garder les choses simples.

  • field_checkbox_a
  • field_checkbox_b
  • field_checkbox_c
  • field_checkbox_d

Ces champs sont tous contenus dans un groupe de champs, donc idéalement la page afficherait ce groupe de champs, les quatre cases à cocher à l'intérieur, puis aurait un bouton soumettre et annuler, c'est tout.

Je veux le faire comme une page distincte, pas une modification sur place comme le module Quick Edit .

Les utilisateurs doivent toujours pouvoir accéder à la page de modification du compte d'origine pour modifier leur fuseau horaire, leur adresse e-mail, etc., mais je pourrais vraiment utiliser un écran séparé pour leur permettre de modifier les options de compte les plus courantes.

Patrick Kenny
la source

Réponses:

8

J'ai eu la même situation auparavant et je l'ai géré avec une fonction druapl pleine de puissance hook_form_alter , nous avons 2 formulaires pour l'utilisateur, l'enregistrement et la modification de l'utilisateur

  • user_profile_form (en cours d'édition)
  • user_register_form (en inscription)

Nous avons juste besoin de cacher vos champs spécifiés de manière éditée Donc dans votre module personnalisé

function yourmodule_form_alter(&$form, &$form_state, $form_id)
{
    global $user;

    if ($form_id == "user_profile_form") {
       // ym($form);
       // you also can perform this action for specified roles 
        //if (!(in_array('blogger', $user->roles) || in_array('administrator', $user->roles))) {
            hide($form['field_mytest']);
            // hide other field with this method
        //}
    }

}

Après que ce champ existe dans l'enregistrement, comme vous pouvez le voir ci-dessous

entrez la description de l'image ici

et ne pas exister (masquer) de manière éditée

entrez la description de l'image ici

Vous pouvez également les définir en lecture seule au lieu de les masquer avec$form['field']['#access'] = FALSE;

Et une autre solution utilise le module d' autorisation de champ

Le module Autorisations de champ permet aux administrateurs de site de définir des autorisations au niveau des champs pour modifier, afficher et créer des champs sur n'importe quelle entité. Fonctionnalités:

  • Activez les autorisations de champ sur n'importe quelle entité, pas seulement sur les nœuds.
  • Autorisations de champ basées sur les rôles permettant différents modèles d'affichage en fonction de l'accès dont dispose l'utilisateur.
  • Les autorisations au niveau de l'auteur permettent d'afficher et de modifier des champs en fonction de l'identité du propriétaire de l'entité.
  • Les autorisations pour chaque champ ne sont pas activées par défaut. Au lieu de cela, les administrateurs peuvent activer ces autorisations explicitement pour les champs où cette fonctionnalité est nécessaire.

En tant que fonctionnalités que ce module fournit pour nous utilisateur anonyme (l'utilisateur non enregistré peut modifier ces champs et enregistrer l'utilisateur uniquement voir (en lecture seule).

Yusef
la source
6

Au lieu d'avoir deux formulaires, vous pouvez utiliser celui par défaut et ajouter une case à cocher "Afficher tous les paramètres", comme le suivant.

$form['show_all_settings'] = array(
  '#type' => 'checkbox',
  '#title' => t('Show all settings'),
);

Ensuite, vous pouvez modifier les champs de formulaire que vous souhaitez afficher lorsque la case à cocher est activée et inclure la propriété suivante pour ces champs de formulaire.

'#states' => array(
  'invisible' => array(
   ':input[name="show_all_settings"]' => array('checked' => FALSE),
  ),
),

De cette façon, les utilisateurs pourraient basculer entre un formulaire affichant tous les paramètres et un formulaire affichant un ensemble minimal de paramètres, sans passer d'une page à une autre.

Les références

kiamlaluno
la source
5

Vous pouvez utiliser le module Profile2 pour cela.

  • Créez un type de profil ou utilisez le profil principal par défaut.
  • Ajoutez ces champs à ce type de profil et définissez-les pour qu'ils s'affichent sur le formulaire d'inscription.

Pour que ces champs soient disponibles sur le formulaire d'inscription parmi les autres champs du compte utilisateur . Mais pour modifier ces champs, l'utilisateur doit accéder à la page de modification du profil au lieu de la page de modification de l' utilisateur .

Елин Й.
la source
Je souhaite afficher les quatre cases à cocher sur la page de modification de l'utilisateur et leur propre page personnalisée; Je ne veux pas les supprimer de la page de modification principale de l'utilisateur.
Patrick Kenny
1

Essayez le module VBO , vous pouvez créer une page VBO, ajouter une relation UTILISATEUR en vue, ajouter les champs disponibles pour l'utilisateur au mod, définir l'autorisation. Assurez-vous de sélectionner le contenu "appartient" à l'utilisateur ACTUEL uniquement (via le filtre contextuel)

gilzero
la source
Comment puis-je autoriser l'utilisateur à modifier ces champs? VBO me permet d'afficher les valeurs, mais j'ai besoin qu'elles soient modifiables.
Patrick Kenny
Ajouter un champ vbo puis cocher l'opération de «modifier les valeurs d'entité» (quelque chose comme ça, je ne me souviens plus exactement de son nom)
gilzero
Merci, cela s'appelle modifier les valeurs d'entité . Malheureusement, cela ne fonctionne pas pour mon cas, mais cela peut être une solution utile pour d'autres.
Patrick Kenny
1

Sur la base de la réponse de zhilevan à cette question et à cette question et à cette discussion sur drupal.org , voici le code réel qui fonctionne pour moi:

function MYMODULE_menu() {
  $items = array();
  $items['user/editpurposes'] = array(
    'title' => t('Change your purposes'),
    'page callback' => 'MYMODULE_purpose_edit_form',
    'access callback' => TRUE,
    'access arguments' => array('access content'),
    'description' => t('Purpose Edit Form'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

function MYMODULE_purpose_edit_form() {
  // Needed to load AJAX.
  module_load_include('inc', 'user', 'user.pages');
  global $user;
  $account = user_load($user->uid); // Load a user object
  $form = drupal_get_form('user_profile_form', $account, 'account', 'purposes');
  return $form;
}

function MYMODULE_form_user_profile_form_alter(&$form, &$form_state) {
  if(isset($form_state['build_info']['args'][2]) && $form_state['build_info']['args'][2] == 'purposes') {

    // Remove name, email, password, etc.
    $form['account']['#access'] = FALSE;
    // Remove language.
    $form['locale']['#access'] = FALSE;
    $form['timezone']['#access'] = FALSE;
    // Remove various custom fields.
    $form['field_acc_displayname']['#access'] = FALSE;
    $form['field_acc_code_agree']['#access'] = FALSE;

    // Needed to load AJAX.
    form_load_include($form_state, 'inc', 'user', 'user.pages');
  }
}
Patrick Kenny
la source
puis-je demander pourquoi Profile2 n'était pas une option, comme je l'ai suggéré dans ma réponse?
Елин Й.
0

Je pense que vous devriez pouvoir ranger un peu les choses avec le module de groupe de champs , par exemple mettre les champs sous différents onglets. Les plus communs sous un onglet et le reste sous un autre onglet.

enzipher
la source
Merci pour cette idée, mais j'utilise déjà le module Field Group. C'est bien, mais je veux vraiment montrer quatre options à l'utilisateur, pas tout.
Patrick Kenny
0

essayez ce code. et masquez les autres champs que vous ne souhaitez pas afficher.

<?php
global $user;
$user=user_load($user->uid);
module_load_include('inc', 'user', 'user.pages');
$user_form = drupal_get_form('user_profile_form', $user);
print(drupal_render($user_form));
?>
monymirza
la source