2010-09-22 4 views
1

Je construis un module pour Drupal 6 (ce qu'il fait n'est pas très important, j'ai passé un temps long à chercher d'autres solutions à ce problème et à lancer mon propre est certainement le plus simple), et j'ai rencontré quelque chose d'un barrage routier conceptuel.Annulation d'une modification d'un module à partir d'un module

Tout comme le module uploadpath, je crée un répertoire basé sur (via un modèle de remplacement) propriétés d'un nœud. Par exemple, en créant un noeud avec le type de contenu "assignmentindex" appelé "Foobar", mon module créera un dossier sites/default/files/assignmentindex/Foobar. Le problème vient (de manière prévisible) pendant update événements, lorsque le répertoire cible existe déjà, ou ne peut pas être créé pour une autre raison étrange (le seul que je puisse imaginer maintenant est à court d'inodes, mais je suis sûr qu'il y a d'autres conditions d'échec). Évidemment, pour éviter de perdre des données, le dossier original doit être laissé seul, mais cela rompt l'association entre le répertoire et le noeud. Ainsi, je vois 3 possibilités:

  • Faire reculer le tout nœud
  • arrière juste rouler le titre a changé
  • quoi que ce soit ne me roule pas en arrière (mais montrant une erreur)

Première La question est de savoir lequel est le meilleur? Rétablir tout le nœud efface une quantité de travail potentiellement énorme, reculer le titre est déroutant et rien ne signifie que les noms ne sont plus synchronisés. Ma préférence actuelle est juste pour le retour du titre, mais j'apprécierais vraiment les réflexions à ce sujet.

La deuxième question est: comment? Je l'ai déjà changé le $op pertinent pour presave (de update) de telle sorte que le nœud d'origine est disponible via

$old_node = node_load($node->id); 

et de faire reculer un seul champ, peut potentiellement faire juste

$node->title = $old_node-title; 

mais cela semble sous-optimal, et je suis curieux de savoir s'il existe une meilleure façon d'y parvenir.

Désolé pour la question longue, et merci beaucoup d'avance pour votre aide.

+0

Quel est le motif de ne pas nommer simplement les répertoires après le nœud ids (JNV) - cette façon, l'association est pas affectée par les mises à jour de nœud, comme JNV ne change pas après la création du noeud initial? –

+0

En plus de cela, pour veto (ou rollback) un changement au nœud, votre approche via '$ op == 'presave'' me semble ok. –

+0

Merci pour votre contribution! Il n'y a pas de raison particulière pour le faire de cette façon.Les noms de dossier sont exposés aux utilisateurs; c'était un choix entre la complexité au moment de la création/édition (comme décrit ci-dessus) ou la complexité sur chaque chargement de page pertinent - le mappage 'nid' à' title' semblait aussi être un hit de base de données inutile. – supervacuo

Répondre

0

En alternative à celles décrites ci-dessus: si vous ne vous souciez pas des noeuds importés/créés par programme, vous pouvez ajouter un gestionnaire de validation sur la soumission du formulaire de noeud. La validation a accès aux nœuds nouveaux et anciens et peut rejeter la soumission à l'utilisateur de manière plus standard.

function custom_form_alter(&$form, &$form_state, $form_id) { 
    if ($form['#id'] == 'node-form') { 
    $form['#validate'][] = '_custom_node_form_validate'; 
    } 
} 

function _custom_node_form_validate(&$form, &$form_state) { 
    $old_node = $form['#node']; 
    $new_node = $form_state['values']; 
} 
Questions connexes