Restreindre l'accès à un node en filtrant les uid

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Ami(e)s Drupalien(ne)s,

Je vais presque finir mon 1er module et là j'ai un blocage .
Ce que veux faire à l'air tout simple :

Je veux autoriser la modification d'un node si l'uid de l'utilisateur est bien dans ma liste de personnes autorisées. (cette liste dépendant du nid du node, chaque node ayant sa propre liste de users/uid autorisées...)

Vu que j'ai déjà un array avec les bons uid... Çà doit pas être compliqué de filtrer ?

Les exemples que j'ai lus ont l'air bien compliqués.

Merci d'avance !

Forum : 
Version de Drupal : 

Salut,

Si j'ai bien compris ce que tu veux, et bien c'est exactement ce que je cherche à faire depuis hier..

J'ai pu trouver des modules déjà développés qui sont proches de la solution :

http://drupal.org/project/node_privacy_byrole
http://drupal.org/project/content_access
http://drupal.org/project/acl

J'ai fait un break depuis hier mais je vais m'y remettre demain.. Si d'ici là ces modules ont pu te porter conseil, n'hésite pas à reply ici :o

Bonne nouvelle, je suis à peu de choses près persuadé que c'est possible :o

j ai rajouté une ligne dans le node.module dans le methode node_access et qui fait appelle à une fonction de 'estAutorisé ($node)' de mon module. (insérée line #1720)
Si le noeud a plusieurs uid autorisés et que l uid de $user en fait partie alors ca renvoie true dans node_access.
(on check dans une BD), sinon node_access continue sons processus normal.

C est ce que j ai trouvé de plus simple dans mon cas.

bravo :o il me semble aussi qu'une fonction type boolean est la meilleure solution. il ne reste plus qu'à partager ton module :o

seule question à se poser, comment prévoir l'administration de ce module pour l'utilisateur final ; à savoir la mise en relation entre les users autorisés et les nodes 'confidentiels'. un système de tableau similaire aux 'Droits d'accès' (par rôles) pourrait convenir..

dans cette hypothèse, on trouverai dans un sens les nodes en question et dans l'autre le 'real name' (correspondant à l'uid). de cette façon, (et par un système de checklist), on pourrait facilement autoriser l'affichage du node X ou Y par plusieurs users.

ou bien (autre hypothèse) insérer, dans la création d'un node, une checklist des users ayant le droit d'afficher ce node (éventuellement ceux ayant un rôle précis).

à voir en fonction de ta motivation :o

Mon module que j ai fini etait vraiment special... sera surement sur Drupal.

Sinon lLe plus simple est de créer un nouveau type de noeud.
(content-type).
Il propose une liste de users à autoriser .
Et à partir de là , utiliser le hook_access qui est fait pour cela et qui renvoie true ou false si le user est ok ou pas.
Une simple table nid/user fait l affaire pour stocker ca.

Comment démarrer son module Drupal ... la Base De Données ?
Pour créer une base de données avec Drupal , nous avons deux solutions :

soit on la crée à la main (en tapant les commandes sql).
Mais c"est pas pratique surtout si l'on veut distribuer un module à de nombreux utilisateurs ...

Il faut donc faire un .install qui va se charger de créer un bd au chargement du module Drupal.
Dans ce fichier , que nous pouvons appeler monmodule.install,
il faut y définir en général 2 fonctions qui utilisent 2 hooks:
_install qui crée la bd pour la premiere fois
_uninstall qui supprime la bd , (le module doit etre desactivé avant)

Rien qu'un exemple pour comprendre:

Par exemple : si je veux faire une base de données qui associe des n° de noeuds (nid) à des n)de users (uid) , voici ce qu'on pourrait écrire:
(extrait de mon module "multi authors" ):

<?php
 
// $Id$

/<strong>
*
*
Karim HAJY - Copyright 2008
* Module multi authors
*/


/</
strong> Install*/
function
multi_authors_install() {
 
drupal_set_message(t('Beginning installation of multi authors.'));
  switch (
$GLOBALS['db_type']) {
    case
'mysql':
    case
'mysqli':
    case
'pgsql':
     
db_query("CREATE TABLE multi_authors_assoc (
        nid int NOT NULL,
        uid int NOT NULL,
        PRIMARY KEY  (nid,uid)
        ) ;"
     
);
     
$success = TRUE;
      break;
    default:
  
drupal_set_message(t('Unsupported database.'));
  }
  
  if (
$success) {
   
drupal_set_message("Multi_authors: ".t('The module installed tables successfully.'));
  }
  else {
   
drupal_set_message("Multi_authors: ".t('The installation of the module was unsuccessful.'),'error');
  }
}
   
/** Uninstall*/
function  multi_authors_uninstall() {
db_query("DROP TABLE multi_authors_assoc ;");
drupal_set_message(t('multi authors uninstalled'));
}
?>

Si j'ai le temps (j'ai plein de projets autres qui attendent à la porte ...), j expliquerai comment proposer une liste d utilisateurs via un formulaire et expliquer le hook_access .
(pour info la monmondule_access() doit s'écrire dans le fichier .module :-))