2016-12-13 48 views
0

我的需求是改變編輯表單的行爲,爲幾種內容類型。Drupal 7,保存新節點,同時編輯舊

其目的是: - 按下更新按鈕後,不要更新節點,而是使用舊節點的值創建新節點。我可以通過將舊節點的字段值傳遞給「/ 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; 
    } 
} 

因此,與上面的代碼我能夠創建一個新的節點,但在「創建日期」參數始終保持不變爲創建舊節點的日期參數,上述任何一條都不能解決這個問題。

回答

0

如果要在將編輯提交到現有節點時創建一個全新節點,那麼您希望使用hook_node_presave(),它允許您在節點對象保存到數據庫之前設置節點對象的任何屬性。

在這個例子中取消設置nidvid,並明確設置is_new屬性將實現這一點:

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

這將使現有節點原封不動,未編輯的,而會創造一個全新的節點。

+0

這不是我的問題點。我沒有通過常規方式創建新節點。我正在更新節點,並且想要覆蓋$ form和$ form_state變量來欺騙node_form_submit(),這個函數會認爲將要保存的數據是新節點而不是舊節點。 – szikael

+0

我已經對代碼進行了更改,以便它能夠滿足您的評論。 – timgeek

0

因此完全改變形式更新的我放棄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); 
    } 
} 
相關問題