【问题标题】:Drupal 7, save new node while editing oldDrupal 7,在编辑旧节点时保存新节点
【发布时间】:2016-12-13 13:19:54
【问题描述】:

我需要为几种内容类型更改编辑表单的行为。

目标是: - 按下更新按钮后,不要更新节点,而是使用旧节点的值创建一个新节点。我可以通过将旧节点的字段值传递给“/node/add/my_content”表单来做到这一点,但这需要大量工作(表单非常复杂),并且在编辑页面上,我的字段中已经准备好所有值。

所以我已经尝试了 hook_form_alter

function mymodule_form_alter (&$form, &$form_state, $form_id) {
  switch ($form_id) {
    case 'my_not_update_form':
      $node = $form_state['node'];
      if (!isset($node->nid) || isset($node->is_new)) {
      // This is a new node.
      }
      else {
        $new_node = new StdClass();
        $new_node->type = 'my_not_update_form';
        node_object_prepare($new_node);
        $new_node->uid = $user->uid;
        $new_node->language = 'und';
        $new_node->title = NULL;

        $form['vid']['#value'] = NULL;
        $form['nid']['#value'] = NULL;
        $form['created']['#value'] = $new_node->created;
        $form['changed']['#default_value'] = NULL;

        $form['#node'] = $new_node;
        $form['#entity'] = $new_node;
        $form_state['node'] = $new_node;
        $form_state['build_info']['args'][0] = $new_node;
      }
      break;
  }
}

因此,使用上面的代码,我可以创建一个新节点,但“创建日期”参数始终与旧节点的创建日期参数相同,并且上述行都不能解决该问题。

【问题讨论】:

    标签: drupal drupal-7


    【解决方案1】:

    如果您想在向现有节点提交编辑时创建一个全新的节点,那么您想使用hook_node_presave(),它允许您在节点对象保存到数据库之前设置它的任何属性。

    在此示例中,取消设置 nid 和 vid,并显式设置 is_new 属性将实现此目的:

    function my_module_node_presave($node) {
      unset($node->nid);
      unset($node->vid);
      $node->is_new = TRUE;
    }
    

    这将使现有节点保持不变和不编辑,而是创建一个全新的节点。

    【讨论】:

    • 这不是我的问题的重点。我不是通过常规方式创建新节点。我正在更新节点并想覆盖 $form 和 $form_state 变量来欺骗 node_form_submit() 这个函数会认为要保存的数据是新节点而不是旧节点。
    • 我已对代码进行了更改,希望它能解决您的评论。
    【解决方案2】:

    所以为了完全改变表单更新的行为,我放弃了 hook_form_alter() 而是使用了 hook_node_presave

    function mymodule_node_presave($node) {
      if($node->is_new == FALSE || isset($node->nid)) {
        unset($node->nid);
        unset($node->vid);
        unset($node->vuuid);
        $node -> created = time();
        $node -> timestamp = time();
        $node-> is_new = TRUE;
        $node -> changed = time();
        unset($node->revision_timestamp);
        unset($node->num_revisions);
        unset($node->current_revision_id);
        unset($node->is_current);
        unset($node->is_pending);
        unset($node->revision_moderation);
        unset($node->date);
        unset($node->vuuid);
        unset($node->data);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多