Question

Je veux éviter d'accéder à utilisateur /% user / view , alors que les administrateurs peuvent voir les profils. Au début, j'essayé avec la modification du user_view_access d'autorisation sans chance.

J'ai essayé d'utiliser le hook_menu_alter crochet:

53 function mymenu_menu_alter(&$items) {
54   $items['user'] = array(
55     'access callback' => 'user_access',                                                                                                                                                                                                  
56     'access arguments' => array('access administration pages'),                                                                                                                                                                         
57     'type' => MENU_NORMAL_ITEM,
58   );
59   $items['user/%user_uid_optional'] = array(
60     'access callback' => 'user_access',
61     'access arguments' => array('access administration pages'),
62      'type' => MENU_NORMAL_ITEM,
63   );
64   $items['user/%user/view'] = array(
65     'access callback' => 'user_edit_access',
66     'access arguments' => array('access administration pages'),
67     'type' => MENU_NORMAL_ITEM,
68   );

Il ne fonctionne pas non plus. Avez-vous une astuce?

Était-ce utile?

La solution

Il y a quatre problèmes avec le code que vous avez déclaré:

  • Le code est en train de changer le type de menu, quand il ne doit pas le faire.
  • Le code est en train de changer les valeurs qu'il ne faut pas toucher, si le but est de changer seulement qui peut accéder aux profils d'utilisateur.
  • user_edit_access () et user_access () attendre la l'argument qu'ils reçoivent pour être un objet utilisateur, pas une chaîne. Il est erroné de définir des « arguments d'accès » à array('access administration pages'), comme vous le faites.
  • Même si vous définiriez « arguments d'accès » à array(1), user_edit_access() permet aux utilisateurs de voir leur propre profil d'utilisateur; si vous voulez éviter de montrer aux utilisateurs leur propre profil d'utilisateur, cette fonction n'est pas la fonction j'utiliser comme rappel d'accès.
  • Comme l'a dit jhedstrom, il est nécessaire d'utiliser le code dans ce cas, quand il suffit de ne pas donner l'autorisation aux profils utilisateur d'accès à ces rôles que vous ne voulez pas être en mesure de voir tout profil d'utilisateur . La réponse que je vais donner prend l'hypothèse que vous ne voulez pas que les utilisateurs de voir tout profil d'utilisateur, y compris le leur; dans ce cas, retirer la permission d'accéder à des profils d'utilisateur ne dispose pas de l'aide, comme Drupal permet encore aux utilisateurs de voir leur propre profil d'utilisateur.
function mymenu_menu_alter(&$items) {
  $items['user/%user/view']['access callback'] = FALSE;
}

function mymenu_user_view_access($account) {
  return $account && $account->uid && user_access('administer users');
}

Autres conseils

Enfin, je voulais obtenir ce que je avec:

  function mymenu_menu_alter(&$items) {
   $items['user/%user_uid_optional'] = array(
      'page callback' => '_mymenu_profile_view',
      'page arguments' => array(1),
      'type' => MENU_LOCAL_TASK,
    );  
  }

  function _mymenu_profile_view($account) {
    global $user;
    if (user_access('administer users')) {
      include_once(drupal_get_path('module', 'user').'/user.pages.inc');
      return user_view($account);
    } else {
      return drupal_not_found();
    }   
  }

Merci pour vos suggestions!

Cela vient un peu tard, mais je vais laisser cela ici au cas où quelqu'un d'autre a le même problème:)

Il est Chemin d'accès :

  

Bien qu'un grand nombre de modules Drupal fournissent un certain degré d'accès   autorisations de contrôle, il ne couvre jamais tous les utilisateurs possibles exigences   avoir. Path_access fournit les moyens de limiter les pages en fonction de leur   alias de chemin - ce qui signifie que vous pouvez verrouiller certains groupes de rôles utilisateur de   sections entières d'un site en utilisant des caractères génériques.

Mais la meilleure option, et un module qui est maintenant au sommet de mon fichier .make maître est Rabbit Hole -. qui prend en charge les réoriente personnalisés pour les noeuds, les utilisateurs et les termes de taxonomie

  

Rabbit Hole est un module qui ajoute la capacité de contrôler ce qui doit   en se produire lorsque l'entité est en cours de visualisation à sa propre page.

     

Peut-être vous avez un type de contenu qui ne devrait être affiché sur son   propre page, comme un type de contenu d'image qui est affichée dans un carrousel.   Rabbit Hole peut empêcher ce nœud d'être accessible sur son propre   page à travers le noeud / xxx.

Pour cette astuce, j'ai utilisé chain_menu_access module. Code ci-dessous.

/**
 * Implements hook_menu_alter().
 */
function mymodule_menu_alter(&$items) {
  chain_menu_access_chain($items, 'user/%user', '_mymodule_check_permission');
}

function _mymodule_check_permission() {
  global $user;

  $own_profile = $user->uid == arg(1);
  $has_access = user_access('administer users');

  return (!$has_access && !$own_profile) ? FALSE : TRUE;
}

Si vous voulez un utilisateur de pouvoir modifier leur propre profil, mais pas l'afficher:

Si vous utilisez déjà le module Les panneaux vous pouvez simplement créer une deuxième variante dans la vue de l'utilisateur override (dans les règles de sélection) un utilisateur n'a pas l'autorisation nécessaire pour afficher le panneau habituelle (comme l'utilisateur: Permission => Connecté utilisateur « Voir les profils utilisateur »). Vous choisissez un code de réponse HTTP et sélectionnez une redirection 301 à user/%user:uid/edit.

Vous pouvez ensuite masquer le bouton de vue avec CSS ou mettre en œuvre le code mentionné ci-dessus:

function mymodule_menu_alter(&$items) {
  $items['user/%user/view']['access callback'] = '_mymodule_user_view_access';
  $items['user/%user/view']['access arguments'] = array(1);
}

function _mymodule_user_view_access($account) {
  return $account && $account->uid && user_access('administer users');
}

ou utiliser plusieurs méthodes pour supprimer des onglets. Je suppose que les éléments suivants devraient travailler dans Drupal 7, mais peut-être ce n'est pas la bonne façon de le faire ou il a des effets secondaires.

function mymodule_menu_local_tasks_alter(&$data) {
  foreach ($data['tabs'][0]['output'] as $key => $value) {
    if ($value['#link']['path'] == "user/%/view") {
      unset($data['tabs'][0]['output'][$key]);
    }
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à drupal.stackexchange
scroll top