代码之家  ›  专栏  ›  技术社区  ›  supervacuo

中止对模块中节点的更改

  •  1
  • supervacuo  · 技术社区  · 15 年前

    我正在为Drupal6构建一个模块(它所做的并不重要;我花了 长的 找其他的解决办法和滚动我自己的肯定是最简单的),我遇到了一些概念性的障碍。

    很像 uploadpath 模块,我创建的目录基于( 通过 替换模式)节点的属性。例如,使用名为“foobar”的“assignmentindex”contenttype创建一个节点,我的模块将创建一个文件夹。 sites/default/files/assignmentindex/Foobar .

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

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

    弗斯特 问题是哪一个最好?回滚整个节点会删除大量潜在的工作,仅回滚标题会造成混乱,回滚任何内容都不意味着名称不同步。我现在最喜欢的是恢复标题,但我真的很感激你的想法。

    这个 第二 问题是:如何?我已经换了相关的 $op presave (从 更新 )使原始节点可用 通过

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

    如果要回滚一个字段,可能只需要

    $node->title = $old_node-title;
    

    但这似乎是次优,我很好奇是否有更好的方法来实现这一点。

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

    1 回复  |  直到 14 年前
        1
  •  0
  •   Grayside    15 年前

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