私がやろうとしていることはうまくいきません、それでも/ 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');
}
基本的にコードは送信アクションだけで機能しますが、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ページから宛先パラメーターを削除するには、ビューのフィールドの[コンテンツ:操作リンク(操作)]にある[宛先]チェックボックスをオフにします。
Symfony RedirectResponseを使用して成功しました:
function callback_set_redirect($form, FormStateInterface $form_state) {
$url = Url::fromRoute("custom.landing.page")->toString();
$response = new RedirectResponse($url);
$response->send();
}
私は常にこの機能に Node Save Redirect モジュールを使用します。 「新しいコンテンツを保存した後どうするか」というオプションをコンテンツタイプに追加します。
これは何ですか?
このモジュールは、コンテンツを保存した後にユーザーを連れて行く場所を指定する方法を提供します。
元のコードに問題はないので、他のコードが間違っている可能性があります。それは私にとってはうまくいきます。
しかしながら、 custom.landing.page
は定義されたルートである必要があり、パラメータ(存在する場合)は次のように渡される必要があります。
$form_state->setRedirect("custom.landing.page", [
'parameter1' => 42,
]);
詳細は FormState :: setRedirect() を参照してください。