2010-09-16 5 views
1

Je recherche un comportement particulier permettant d'afficher un ou plusieurs champs cck en fonction de la date et heure de création du noeud.Accès à la date de création de champ par noeud en Drupal avec CCK

En particulier, je dois:

Grant au rôle A: Accès complet à tous CCK (ancien et nouveau) Grant au rôle B: L'accès à tous CCK, mais seulement à ceux présents dans le nœud plus de 1 an Utilisateur anonyme: Aucun accès au champ CCK

Comment puis-je obtenir ce résultat?

Répondre

0

Il est facile, créer node- {} YOURTYPE .tpl.php, thème, et ajouter des conditions à afficher les champs dépendance de dates ...

+0

Je ne pense pas que cela fonctionnerait, car les champs CCK ne sont pas disponibles séparément dans le modèle de noeud, mais sont déjà rendus dans la variable $ content. Mais l'approche générale peut fonctionner si l'on trouve le modèle de champ CCK approprié (ou la fonction de thème), remplaçant ceci à la place du modèle de nœud. –

+0

Cela fonctionnerait et c'est un moyen de masquer les champs (sans utiliser de modules personnalisés (hook_nodeapi)).Supprimez simplement le contenu $ - ce n'est pas bon pour les thèmes. Utilisez $ node-> field_FIELDNAME [0] ['# value'], recherchez "$ node" via les fonctions print_r() ou dsm (devel module). – Nikit

+0

@Nikit: Je vois - bien sûr, si vous jetez la variable $ content et affichez les champs des noeuds directement, vous pouvez faire à peu près tout ce que vous voulez. Mais vous contourneriez également les principales parties du système thématique de Drupals en éliminant les personnalisations que d'autres modules pourraient avoir apportées au contenu! Je considérerais ceci comme assez hackish et je ne le recommanderais pas, car il pourrait simplement casser d'autres fonctionnalités. –

1

Je hook_nodeapi() mettre en œuvre dans un module personnalisé, et $op == 'view' contrôle pour le type de noeud approprié et le rôle de l'utilisateur. En fonction du rôle, je supprimerais l'entrée de champ en question du tableau `$ node-> content '. Notez que le module personnalisé doit être appelé après CCK pour que cela fonctionne, sinon les champs CCK ne sont pas encore disponibles dans le tableau `$ node-> content '. Donc, en fonction de son nom, il peut être nécessaire de modifier le poids des modules personnalisés à une valeur supérieure à celle de CCK.

Si la même logique doit être appliquée pour les formulaires d'édition de nœud, on fera de même sur $op == 'prepare'.

2

Vous voulez contrôler les autorisations sur un terrain donc j'éviter d'utiliser hook_nodeapi() Au lieu de cela, je vous suggère d'utiliser hook_field_access (ou utiliser une combinaison de hook_nodeapi et hook_field_access()

exemple pseudocode:

mymodule_hook_field_access($op, $field, $account = NULL, $node = NULL){ 

    if($field['field_name'] == 'field_xyz'){ 
     switch($op){ 
      case 'view': 
       if($node->created was less than a year ago && $account role is A){ 
        return FALSE; 
       } 

       if($node->created was less than a year ago && $account role is B){ 
       return TRUE; 
       } 

       return FALSE; 
       break; 
      case 'edit': 
       ... 
       ... 
     }  
    } 

    return TRUE; 
} 

Voir pour voir le crochet étant appelé http://api.lullabot.com/content_access

hook_field_access() est disponible sur Drupa l 6 du module CCK. Dans Drupal 7, c'est dans le noyau.

+1

+1 - Je ne connaissais pas ce hook - beaucoup plus facile que ma suggestion hook_nodeapi! –

1

Merci à tous pour vos suggestions!

Le hook_field_access() est la solution que je recherche.

J'utilisait auparavant le $ node-> field_FIELDNAME [0] [ « # valeur »] mais je n'aime pas mettre dans mon thème fonctions (ou dans template.php) pour l'accès des utilisateurs. Il y avait aussi le problème du thème, cette solution n'a pas donné ma possibilité pour une sortie HTML facile et propre utilisant Semantic CCK module!

Merci encore! Salut!

Ps. pourquoi mon post n'est pas après le dernier ?? !!

+1

Votre message n'est pas après le dernier parce que la commande est basée sur les votes ici sur stackoverflow. Vous pouvez augmenter (et réduire) les questions ainsi que les réponses via les petites flèches autour des chiffres à gauche. Donc, vous devriez upvote réponse NoParrots, car il était utile pour vous. En tant que questionneur, vous pouvez également accepter une réponse comme correcte. Cela mettra cette réponse au sommet (indépendamment des votes), de sorte que les autres peuvent le trouver plus facilement. Les upvotes et l'acceptation des réponses donnent des points de réputation aux auteurs, alors soyez libéraux dans le vote - le système de vote est la principale raison pour laquelle stackoverflow fonctionne! –

+0

+1 pour le suivi. (Bien que normalement, vous ne devriez pas poster le suivi comme une réponse séparée, mais simplement accepter la réponse comme la bonne et ajouter vos remarques dans un commentaire à cette réponse). –

+0

Puisque vous avez semblé aimer ma réponse le plus, pourquoi ne pas le marquer comme "correct" :-). Vous pouvez aussi lui donner un vote positif! –

Questions connexes