Catégories:
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");
}
}
?>- Vous devez vous identifier ou créer un compte pour écrire des commentaires

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
<?phpfunction 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
<?phpfunction 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…
http://formation.ideia.fr/formation/drupal-la-carte | http://twitter.com/nyl_auster
nyl auster
838
Question bête pourquoi ne pas utiliser Rules pour mettre ça au point ?
Je pense que ça doit être possible…
Software is like sex, it’s better when it’s free (Linus Torvalds)
http://twitter.com/davidm_fr
davidm
631
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
http://formation.ideia.fr/formation/drupal-la-carte | http://twitter.com/nyl_auster
nyl auster
838
Effectivement Rules n’existe pas pour D5… OK je comprend mieux ton problème…
Software is like sex, it’s better when it’s free (Linus Torvalds)
http://twitter.com/davidm_fr
davidm
631