dépublier tous les nodes d'un auteur quand son compte est supprimé avec hook_user

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.

Bonjour à tous
Sur notre projet actuel je dois faire en sorte que lorsqu'un compte est supprimé, tous les nodes de cet auteur soient automatiquement supprimés également ou mieux: dépubliés.
J'ai donc utiliser le hook_user mais le code suivant ne fonctionne pas, est ce que quelqu'un sait pourquoi? Voici mon module :
A noter que le code fonctionne lorsque $op=='view' donc il ne s'agit pas d'un probleme de codage; je dois plutôt me planter sur la bonne manière d'utiliser le hook_delete?

<?php
/**
 * Dépublier et mettre en "retirer de la vente" les oeuvres d'un compte supprimé
 */
function actions_desabonnement_user($op, &$edit, &$account){
    global
$user;
  if(
$op=='delete'){                                          //Quand un compte est supprimé
  
$sql="SELECT * FROM {node} WHERE type='ebook' AND uid=%d"//chercher tous les nodes e-book écrit par cet auteur
 
$result=db_query($sql, $account->uid);
  while(
$data = db_fetch_object($result)){
      
$node=node_load($data->nid);                    // Charger le node en question
     
$node->field_retirer_de_la_vente[0]['value']=1; // Le mettre en "quarantaine" pour pouvoir le distinguer des nodes non publiés
     
$node->status=0;                                // Dépublier le node
       
node_save($node);                               // Sauver les changements du node
     
}
     
watchdog('suppresion compte', "tous les livre de $account->name ont été dépubliés automatiquement");
    }
 
}
?>
Forum : 

ok en fait c'est tout simplement impossible car le hook_user en mode delete est appelé APRES la suppression de l'utilisateur; donc impossible de connaitre les nodes associés à cet utilisateur au moment du hook : les nodes sont déjà marqués en anonymes à ce moment.
La seule solution semblerait de changer le moment où le hook est appelé dans le module core de user
ici on voit que le hook est appelé après

<?php
function user_delete($edit, $uid) {
 
$account = user_load(array('uid' => $uid));
 
sess_destroy_uid($uid);
 
db_query('DELETE FROM {users} WHERE uid = %d', $uid);
 
db_query('DELETE FROM {users_roles} WHERE uid = %d', $uid);
 
db_query('DELETE FROM {authmap} WHERE uid = %d', $uid);
 
$array = array('%name' => $account->name, '%email' => '<'. $account->mail .'>');
 
watchdog('user', t('Deleted user: %name %email.', $array), WATCHDOG_NOTICE);
 
drupal_set_message(t('%name has been deleted.', $array));
 
module_invoke_all('user', 'delete', $edit, $account);
}
?>

je suppose qu'en faisant ça

<?php
function user_delete($edit, $uid) {

 
$account = user_load(array('uid' => $uid));
 
sess_destroy_uid($uid);
 
module_invoke_all('user', 'delete', $edit, $account);
 
db_query('DELETE FROM {users} WHERE uid = %d', $uid);
 
db_query('DELETE FROM {users_roles} WHERE uid = %d', $uid);
 
db_query('DELETE FROM {authmap} WHERE uid = %d', $uid);
 
$array = array('%name' => $account->name, '%email' => '<'. $account->mail .'>');
 
watchdog('user', t('Deleted user: %name %email.', $array), WATCHDOG_NOTICE);
 
drupal_set_message(t('%name has been deleted.', $array));

}
?>

ça résoud mon probleme mais j'espère ne pas perturber les autres modules...

hello davidM
Je suis drupal 5, je ne connais pas ce module, je vais voir si il existe pour ma version. J'ai testé avec workflow-ng qui rencontre le même souci que mon module

le probleme c'est le fonctionnement même du module user de drupal : Il efface un compte, marque tous ses nodes comme étant anonymes et APRES il appelle les hooks : à ce moment là mon hook ne peut plus retrouver les nodes de cet utilisateurs puisque dans la BDD ils sont désormais marqués comme appartenant à l'utilisateur 0 (= anonyme dans drupal).

Le seul moyen c'est de déplacer l'appel du hook pour que les modules soient appelés AVANT la suppression réelle de l'utilisateur. (ainsi un module peut récupérer les nodes correspondant à un utilisateur, les effacer et ensuite le module user poursuit la suppression classique du compte)
http://drupal.org/node/218189