2016-12-13 8 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); 
    } 
} 
関連する問題