2016-12-13 6 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(), что позволяет вам установить любое свойство узла, прежде чем оно будет сохранено в базе данных.

В этом примере снятия с охраной nid и vid и явно устанавливая 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); 
    } 
}