我需要改变几种内容类型的编辑表单的行为。
目标是: - 按下更新按钮后,不要更新节点,而是使用旧节点的值创建一个新节点。我可以通过将旧节点的字段值传递给" / 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 :(得分:0)
如果要在向现有节点提交编辑时创建一个全新的节点,则需要使用hook_node_presave()
,它允许您在节点对象保存到数据库之前设置它的任何属性。
在此示例中取消设置nid
和vid
,并明确设置is_new
属性将实现此目的:
function my_module_node_presave($node) {
unset($node->nid);
unset($node->vid);
$node->is_new = TRUE;
}
这将保持现有节点不受影响和未经编辑,而是创建一个全新的节点。
答案 1 :(得分: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);
}
}