代码之家  ›  专栏  ›  技术社区  ›  gagarine Alex G

加载节点的上一版本

  •  2
  • gagarine Alex G  · 技术社区  · 15 年前

    当您得到一个节点时,如何加载以前的版本(修订版)?

    我知道如何加载修订,但不知道如何获取以前的修订号($node->vid是当前版本)。

    3 回复  |  直到 4 年前
        1
  •  3
  •   avpaderno    15 年前

    假设你有一个节点对象 $node

    $previous_vid = db_result( 
      db_query('SELECT MAX(vid) AS vid FROM {node_revisions} WHERE vid < %d AND nid = %d', $node->vid, $node->nid)
    );
    

    拥有上一个修订版后,可以使用 node_load(array('nid' => $node-nid, 'vid' => $previous_vid)) .

    代码应该检查 db_result() FALSE ,以防没有以前的版本。 要注意的是 vid 对于每个节点是全局的;对于不同的节点,它不包含相同的值。

        2
  •  2
  •   gagarine Alex G    15 年前

    谢谢大家。

    我还找到了另一个解决方案:

      $revisions = node_revision_list($node);
      next($revisions);
      if ($preview_key = key($revisions)) {
        $preview_revision = $revisions[$preview_key];
        $old_node = node_load($node->nid, $preview_revision->vid);
      }
    

        3
  •  1
  •   user113292 user113292    15 年前

    如果我明白你想做什么;您想在有人提交更改后预览节点吗?

    node_form_build_preview() . 在那里,它使用中的数据创建一个新的节点对象 $form_state 然后跑 node_preview()

    如果希望在用户单击预览按钮时捕获该预览,则需要使用 hook_form_alter

    $['form']['buttons']['preview']['#submit'][] = 'mymodule_custom_preview';
    

    但您的提交函数将如下所示:

    function mymodule_custom_preview($form, &$form_state) {
      $node = node_form_submit_build_node($form, $form_state);
      $preview = node_preview($node);
    }
    

    node_form() ,从而了解节点窗体的结构。完成后,模块中的代码将如下所示:

    function mymodule_form_alter(&$form, $form_state, $form_id) {
      if (strstr($form_id, '_node_form') !== FALSE) {
        $['form']['buttons']['preview']['#submit'][] = 'mymodule_custom_preview';
      }
    }
    
    function mymodule_custom_preview($form, &$form_state) {
      $node = node_form_submit_build_node($form, $form_state);
      $preview = node_preview($node);
    
      // Do what you will with $preview.
    }