File 中止对模块中节点的更改

File 中止对模块中节点的更改,file,drupal,transactions,drupal-6,File,Drupal,Transactions,Drupal 6,我正在为Drupal 6构建一个模块(它所做的并不十分重要;我花了很长时间寻找这个问题的其他解决方案,而使用我自己的解决方案无疑是最简单的),我遇到了一些概念上的障碍 很像uploadpath模块,我正在基于节点的属性(通过替换模式)创建一个目录。例如,创建一个名为“Foobar”的“assignmentindex”内容类型的节点时,我的模块将创建一个文件夹sites/default/files/assignmentindex/Foobar 问题(可以预见)出现在update事件期间,目标目录已

我正在为Drupal 6构建一个模块(它所做的并不十分重要;我花了很长时间寻找这个问题的其他解决方案,而使用我自己的解决方案无疑是最简单的),我遇到了一些概念上的障碍

很像
uploadpath
模块,我正在基于节点的属性(通过替换模式)创建一个目录。例如,创建一个名为“Foobar”的“assignmentindex”内容类型的节点时,我的模块将创建一个文件夹
sites/default/files/assignmentindex/Foobar

问题(可以预见)出现在
update
事件期间,目标目录已经存在,或者由于其他奇怪的原因无法创建(我现在唯一能想到的是索引节点用完了,但我确信还有其他故障情况)。显然,为了避免丢失数据,需要单独保留原始文件夹,但这会破坏目录和节点之间的关联。因此,我看到了3种不同的可能性:

  • 回滚整个节点
  • 仅回滚更改的标题
  • 不回滚任何内容(但显示错误)
首先问题是哪一个是最好的?回滚整个节点会消除潜在的大量工作,仅回滚标题会让人困惑,而不回滚任何内容则意味着名称不同步。我目前的偏好是将标题向后滚动,但我真的很感谢大家的想法

第二个问题是:如何解决?我已经将相关的
$op
切换到
预保存
(从
更新
),这样原始节点就可以通过

要回滚单个字段,可能只需要

$node->title = $old_node-title;
但这似乎是次优的,我很好奇是否有更好的方法来实现这一点


很抱歉提出了这么长的问题,非常感谢您的帮助。

作为上述讨论的替代方案:如果您不关心导入的/以编程方式创建的节点,您可以在节点表单提交上添加验证处理程序。验证可以访问新节点和旧节点,并且可以以更标准的方式拒绝提交给用户

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'];
}

有什么理由不只是以节点ID(nid)命名目录?这样关联就不会受到节点更新的影响,因为初始节点创建后nid不会更改?此外,要否决(或回滚)对节点的更改,您通过
$op==“presave”
的方法对我来说似乎没问题。谢谢您的输入!没有特别好的理由这样做。文件夹名称向用户公开;这是在创建/编辑时的复杂性(如上所述)或每个相关页面加载的复杂性之间的选择–将
nid
映射到
title
似乎也是不必要的数据库命中。
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'];
}