ノードの保存または削除後にカスタムページへのリダイレクトを実行する方法


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

1
[ drupal.org/project/rules](Rules)モジュールを使用できます。
Sumit Aggarwal 2016年

1
カスタム送信関数が呼び出されてもよろしいですか?
Eyal 2017

1
また、別の送信関数が後でカスタムリダイレクトをオーバーライドする場合もあります。
Eyal 2017

回答:


7

基本的にコードは送信アクションだけで機能しますが、drupalノードの保存フォームには多くのアクションがあります。管理者としてログインして試してから、以下のコードに従ってください。

これを他のアクションでも機能させたい場合は、管理者としてログインしてノードの保存ボタンを表示することを選択し、「保存して公開」、「保存して非公開」のオプションを選択します。述べたように

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を使用して、2つのことを行う必要があります

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と比較して、現在のユーザーのアクセス許可に基づいて、正規のノードページまたはフロントページに移動できます。

この動作を変更して現在のノードフォームに留まるようにするには、次のようにします。

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');

/ admin / contentページなど、「destination」の$ _GETパラメータがある場合、これは上書きされないことに注意してください。

/ 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()を参照してください。


0

この機能には常にNode Save Redirectモジュールを使用します。「新しいコンテンツを保存した後どうするか」というオプションをコンテンツタイプに追加します。

これは何ですか?

このモジュールは、コンテンツを保存した後にユーザーを連れて行く場所を指定する方法を提供します。


このモジュールはまだDrupal 8に完全には移植されていません。
dxvargas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.