从模块中止对节点的更改

时间:2010-09-22 12:00:26

标签: file drupal transactions drupal-6

我正在为Drupal 6构建一个模块(它的作用并不是非常重要;我已经花费了很长时间来寻找其他解决方案来解决这个问题并且自己滚动我的肯定是最简单的),我遇到了一个概念性的障碍。

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

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

  • 回滚整个节点
  • 仅回滚已更改的标题
  • 不回滚任何东西(但显示错误)

第一个问题是哪个最好?回滚整个节点消除了潜在的大量工作,只回滚标题令人困惑并且回滚没有任何意味着名称不同步。我目前的偏好只是回滚标题,但我真的很感激这方面的想法。

第二个问题是:如何?我已将相关的$op切换为presave(来自update),以便原始节点通过

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

并回滚单个字段,可能只是做

$node->title = $old_node-title;

但这似乎不太理想,我很好奇是否有更好的方法来实现这一目标。

很抱歉这个问题很长,非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

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