添加或编辑节点后,重定向到自定义页面


15

使用hook_form_alter,在创建或编辑节点而不是创建或编辑的节点之后,如何将用户重定向到自定义页面?

的当前代码hook_form_alter()如下:

function custom_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#id'] == 'custom-node-form') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
  }
}

“有一个用于该模块的模块”:节点目标(drupal.org/project/node_destination),但仅适用于D6。也许可以改编。
Benj 2014年

Answers:


16
function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

该代码独立于单击提交表单的按钮来重定向表单。如果仅在单击特定的提交按钮时才希望重定向表单,则应使用以下代码。

function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['actions']['submit']['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

 

  • 表单ID不包含连字符。表单ID是生成表单的PHP函数的名称(又名表单生成器),PHP函数的名称中不能包含连字符。
  • 表单ID传递给hook_form_alter()hook_form_BASE_FORM_ID_alter()hook_form_FORM_ID_alter()的实现hook_form_FORM_ID_alter()实际上并不需要它,因为它被称为一种特定的形式,而另外两个钩子则针对一种以上的形式被调用。
  • 第一个函数是hook_form_BASE_FORM_ID_alter()的实现;在这种情况下,基本表单ID是“ node_form”,它是节点编辑表单的基本表单。
  • 节点编辑表单包含$form['#node'],它是被编辑对象的节点对象;“自定义”是您要在用户编辑节点后重定向用户的内容类型的简短ID。
  • 更改$form_state['redirect']hook_form_alter()没有任何效果;需要从提交处理程序中进行设置。

谢谢你 请注意,&function custom_node_submit($form, &$form_state) {非常重要的。否则,您不会通过状态作为参考,并且您手动进行的编辑不会生效。
Bram

9

该代码在Drupal 7网站上有效。

/**
 * Implements hook_form_alter()
 */

function custom_form_alter(&$form, &$form_state, $form_id) {    
  if ($form_id == 'article_node_form') {
    $form['actions']['submit']['#submit'][] = 'mysubmit_node_submit';
  }     
}

function mysubmit_node_submit($form, &$form_state) {
  $form_state['redirect'] = '/homepage';
}

您将哪个答案称为#4?
ЕлинЙ.

为什么这对我不起作用?我正在使用相同的代码
ruby 2014年

清除了缓存@ruby吗?
coderama

对于现有节点,最好确保先取消设置目标,通常在单击页面上的编辑按钮drupal.stackexchange.com/a/192271/15055时会将其添加到URL 。admin/content
leymannx

4

这可以通过设置来完成$form_state['redirect'],例如使用以下几行之一。

$form_state['redirect'] = "some-internal-path";
$form_state['redirect'] = array($path, $options_array, $http_code);

您将传递给相同的参数drupal_goto()


感谢您对@Shoaib Nawaz的反馈。我在没有运气的情况下将$ form_state ['redirect']添加到了hook_form_alter挂钩中。
Citricguy

在我的一生中,我无法使$ form_state ['redirect']在任何地方生效。
Citricguy 2011年

如果您在添加或编辑节点后尝试重定向,则将无法使用。要了解原因,请查看节点表单Submit$form_state['redirect']如果($node->nid)赋值为TRUE,则分配给您的任何值都将被覆盖。
自由基

2

不知道这是否是您的选择,但是如果这是一种内容类型,则可以通过使用“规则”模块,通过将规则设置为在更新或创建特定内容类型时触发来快速实现此目的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.