2010-11-19 21 views
2

J'ai un type de nœud qui ne doit être édité par les utilisateurs que dans certaines circonstances qui dépassent les autorisations de leur rôle. Je le fais dans un module personnalisé.Comment créer une fonction d'accès personnalisée pour éditer un type de noeud dans Drupal?

Je voudrais supprimer la possibilité de voir même l'onglet d'édition, et pas simplement ajouter une fonction de validation au formulaire qui alertera l'utilisateur après que le formulaire est soumis.

Je dois ajouter une sorte de fonction d'accès. Quelqu'un sait-il comment faire ça?

Merci d'avance.

--Update--

J'ai maintenant 2 façons qui devraient fonctionner.

1) En utilisant hook_nodeapi:

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { 
    switch($op) { 
    case 'prepare': 
     if(!mymodule_access_function($node)) { 
     $_REQUEST['destination'] = 'my_access_denied_page'; 
     // rest of function 

2) I peut insérer une fonction de rappel d'accès dans l'élément de menu en utilisant hook_menu_alter.

Pour mes fins, 2 a plus de sens. J'ai pensé que j'épelperais le code pour (1) bien que puisque c'était la réponse donnée sur cette page et cela fonctionne.

Répondre

3

Pour la visibilité des onglets, vous pouvez modifier la sortie thématique à partir du crochet du module vers un modèle de thème ou un patch css. Selon les exigences de visibilité des données et les problèmes de performance, certaines solutions sont meilleures que d'autres. Nous avons besoin de plus de détails sur le type de traitement dont vous avez besoin.

Pour y accéder, hook_nodeapi(), $ op est « préparer », exécutez votre code personnalisé contre noeud $ à ce stade, et de décider ce que vous voulez faire (comme rediriger vers une autre forme si une exigence est pas présent, ou à une page d'accès refusé).

Edit: Rediriger est généralement fait avec $ _REQUEST [ 'destination'] = 'destination/alias'(ne rompt pas l'exécution), parfois drupal_goto ('destination/alias')(pauses exécution est approprié mais souvent cela ne fonctionne pas. Veuillez garder les redirections suivies sur votre projet, car avec plusieurs conditions logiques, vous pourriez vous retrouver avec un comportement indésirable et difficile à déboguer.

+0

Il s'agit d'un contact, mais la fonction d'accès est déjà écrite. Mon module gère une ligue sportive, où les capitaines d'équipe peuvent entrer les scores des matchs. Le contrôle d'accès (1) vérifie si vous avez la permission de gérer les ligues, ce qui permet toujours, (2) vérifie ensuite si vous êtes le capitaine de l'une des équipes qui joue et si c'est le cas (3) vérifie s'il a été plus de 48 heures depuis le début du match. Si (2) &&! (3) alors autoriser. – Ted

+0

Je sais comment tester en utilisant hook_nodeapi (j'ai déjà la fonction écrite) mais je ne sais pas comment rediriger vers une page d'accès refusé. Comment cela est-il fait? – Ted

+0

J'ai compris.Mise à jour ma question – Ted

1

Chaque type de contenu possède des paramètres d'autorisation par défaut dans admin/user/permissions pour créer, modifier ou supprimer un noeud. Vous pouvez attribuer à des utilisateurs anonymes ou authentifiés. Si vous voulez assigner au groupe, créez un autre rôle et assignez la permission comme mentionné ci-dessus.

+0

Merci, mais ce que j'essaie de faire est beaucoup plus complexe que les autorisations par défaut le permettent. J'ai besoin de vérifier quelques valeurs CCK, faire des requêtes et des comparaisons sur eux, puis décider si l'utilisateur a accès. – Ted