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