保存或删除节点后如何执行重定向到自定义页面?


10

我尝试执行的操作不起作用,但仍然重定向到/ node / {id}:

function hook_form_alter(&$form, $form_state, $form_id) {
  $form['actions']['submit']['#submit'][] = 'callback_set_redirect';
}
function callback_set_redirect($form, FormStateInterface $form_state) {
  $form_state->setRedirect('custom.landing.page');
}

2
这就是我在/core/modules/node/src/NodeForm.php中 找到的内容If saving is an option, privileged users get dedicated form submit buttons to adjust the publishing status while saving in one go. @todo This adjustment makes it close to impossible for contributed modules to integrate with "the Save operation" of this form. Modules need a way to plug themselves into 1) the ::submit() step, and 2) the ::save() step, both decoupled from the pressed form button.
olsav 2015年


1
您确定您的自定义提交功能被调用了吗?
Eyal

1
也可能是另一个提交功能稍后会覆盖您的自定义重定向。
Eyal

Answers:


7

基本上,代码将仅适用于提交动作,但是drupal节点保存表单具有许多动作,我想您已经以admin身份登录并尝试过,然后按照以下代码进行操作。

如果您还希望其他操作也可以使用,这意味着以admin身份登录并看到节点保存按钮,则可以选择“保存并发布”,“保存并取消发布”选项。如之前提到

use Drupal\Core\Form\FormStateInterface;

//hook_form_alter
function hook_form_alter(&$form, $form_state, $form_id) {
  foreach (array_keys($form['actions']) as $action) {
    if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
      $form['actions'][$action]['#submit'][] = 'callback_submit';
    }
  }
}


function callback_submit($form, FormStateInterface $form_state) {
  $form_state->setRedirect('custom.page');
}

4

使用hook_form_alter,您需要做两件事

1)确保它是节点表单2)向每个提交按钮添加一个自定义提交处理程序。

function mymodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  if (isset($form['#entity_type']) && $form['#entity_type'] == 'node') {
    foreach (array_keys($form['actions']) as $action) {
      if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
        $form['actions'][$action]['#submit'][] = 'mymodule_node_form_submit';
      }
    }
  }
}

然后对于提交功能,您可以使用所需的任何逻辑。您可以与NodeForm :: save进行比较,在NodeForm :: save中,它可以根据当前用户的访问权限将您发送到规范的节点页面或首页。

如果要更改此行为以使其保留在当前节点窗体上,则可以执行以下操作:

function mymodule_node_form_submit($form, FormStateInterface $form_state) {
  $node = $form_state->getFormObject()->getEntity();
  if ($node->id()) {
    if ($node->access('edit')) {
      $form_state->setRedirect(
        'entity.node.edit_form',
        ['node' => $node->id()]
      );
    }
    else {
      $form_state->setRedirect('<front>');
    }
  }
}

如果要使用自定义登录页面,只需将重定向替换为已经使用的代码:

$form_state->setRedirect('custom.landing.page');

请注意,当存在“目标” $ _GET参数时(例如在/ admin / content页面上),该值不会被覆盖。

要从/ admin / content页面中删除目标参数,您需要取消选中该视图字段中“内容:操作链接(操作)”下的“目标”复选框。

在此处输入图片说明


1

我使用Symfony RedirectResponse成功:

function callback_set_redirect($form, FormStateInterface $form_state) {
  $url = Url::fromRoute("custom.landing.page")->toString();
  $response = new RedirectResponse($url);
  $response->send();
}

您不应使用响应,因为它不允许悬停模块更改重定向(如有必要)。
kiamlaluno

也为我工作。
Insasse

0

我找不到原始代码有什么问题,所以其他地方可能不对劲。这对我来说可以。

但是,custom.landing.page必须是已定义的路由,并且需要像这样传递参数(如果有):

  $form_state->setRedirect("custom.landing.page", [
    'parameter1' => 42,
  ]);

有关详细信息,请参见FormState :: setRedirect()


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.