web-dev-qa-db-ja.com

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

私がやろうとしていることはうまくいきません、それでも/ 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');
}
10
olsav

基本的にコードは送信アクションだけで機能しますが、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');
}

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ページなどに「宛先」の$ _GETパラメータがある場合、これは上書きされないことに注意してください。

/ admin/contentページから宛先パラメーターを削除するには、ビューのフィールドの[コンテンツ:操作リンク(操作)]にある[宛先]チェックボックスをオフにします。

enter image description here

3
oknate

Symfony RedirectResponseを使用して成功しました:

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

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

これは何ですか?

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

0

元のコードに問題はないので、他のコードが間違っている可能性があります。それは私にとってはうまくいきます。

しかしながら、 custom.landing.pageは定義されたルートである必要があり、パラメータ(存在する場合)は次のように渡される必要があります。

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

詳細は FormState :: setRedirect() を参照してください。

0
colan