web-dev-qa-db-ja.com

登録時にユーザーを特定のノードにリダイレクトするにはどうすればよいですか?

ユーザーが_node/2_にログインしたときにユーザーをリダイレクトしたい。 Drupal 7の場合、これはdrupal_goto()ですが、 8から削除されました です。これは私が試したものです:

_function mymodule_form_user_register_form_alter(&$form, &$form_state, $form_id) {
  $form_state->setRedirect('node/2');
}
_

エラーは発生しませんが、リダイレクトも発生しません。

編集:次に、Berdirのコメントに基づいて、私はこれを試しました:

_function mymodule_form_user_register_form_alter(&$form, &$form_state, $form_id) {
  $form['#submit'][] = 'mymodule_user_register_submit_handler';
}

function mymodule_user_register_submit_handler($form, &$form_state) {
  $form_state->setRedirect('entity.node.canonical', ['node' => 2]);
}
_

ただし、これにより整合性エラーが発生します。

_Drupal\Core\Entity\EntityStorageException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '16-0-0-ja' for key 'PRIMARY': INSERT INTO {user__field_agree} (entity_id, revision_id, bundle, delta, langcode, field_agree_value) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5); Array ( [:db_insert_placeholder_0] => 16 [:db_insert_placeholder_1] => 16 [:db_insert_placeholder_2] => user [:db_insert_placeholder_3] => 0 [:db_insert_placeholder_4] => ja [:db_insert_placeholder_5] => 1 ) in Drupal\Core\Entity\Sql\SqlContentEntityStorage->save() (line 757 of core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php).
Drupal\Core\Database\Statement->execute(Array, Array)
Drupal\Core\Database\Connection->query('INSERT INTO {user__field_agree} (entity_id, revision_id, bundle, delta, langcode, field_agree_value) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5)', Array, Array)
Drupal\Core\Database\Driver\mysql\Connection->query('INSERT INTO {user__field_agree} (entity_id, revision_id, bundle, delta, langcode, field_agree_value) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5)', Array, Array)
Drupal\Core\Database\Driver\mysql\Insert->execute()
Drupal\Core\Entity\Sql\SqlContentEntityStorage->saveToDedicatedTables(Object, , Array)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doSaveFieldItems(Object, Array)
Drupal\user\UserStorage->doSaveFieldItems(Object)
Drupal\Core\Entity\ContentEntityStorageBase->doSave(NULL, Object)
Drupal\Core\Entity\EntityStorageBase->save(Object)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->save(Object)
Drupal\Core\Entity\Entity->save()
Drupal\user\RegisterForm->save(Array, Object)
call_user_func_array(Array, Array)
Drupal\Core\Form\FormSubmitter->executeSubmitHandlers(Array, Object)
Drupal\Core\Form\FormSubmitter->doSubmitForm(Array, Object)
Drupal\Core\Form\FormBuilder->processForm('user_register_form', Array, Object)
Drupal\Core\Form\FormBuilder->buildForm(Object, Object)
Drupal\Core\Controller\FormController->getContentResult(Object, Object)
call_user_func_array(Array, Array)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array, Array)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
call_user_func_array(Object, Array)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1)
Drupal\page_cache\StackMiddleware\PageCache->pass(Object, 1, 1)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1)
Stack\StackedHttpKernel->handle(Object, 1, 1)
Drupal\Core\DrupalKernel->handle(Object)
_
2
Patrick Kenny

リダイレクトは、送信ハンドラで設定できます。

function mymodule_user_register_submit_handler($form, &$form_state) {
  $form_state->setRedirect('entity.node.canonical', ['node' => 2]);
}

ただし、新しい送信ハンドラは、フォームのルート '#submit'ではなく、送信ボタンの '#submit'値に追加する必要があります。

function mymodule_form_user_register_form_alter(&$form, &$form_state, $form_id) {
  $form['actions']['submit']['#submit'][] = 'mymodule_user_register_submit_handler';
}
3

だからあなたのように、私は可能な限りあらゆる方法でベルディルの答えを試しました。何らかの理由で、mymodule_form_user_register_form_alterフックの使用は機能しませんでしたが、条件付きのmymodule_form_alterフックは次のようになりました。

function mymodule_user_register_custom_submit_handler($form, 
FormStateInterface $form_state) {
    $form_state->setRedirect('entity.node.canonical', ['node' => 1]);
}
function mymodule_form_alter(array &$form, FormStateInterface $form_state, 
$form_id) {
  if ($form_id == 'user_register_form') {
    $form['actions']['submit']['#submit'][] = 'mymodule_user_register_custom_submit_handler';
  }
}
2
George Potter

Drupal 7.と比較して変更されていない、フォームの変更でsetRedirect()を使用することはできません。これにより、ユーザーを遠ざけることになりますwhileフォームの作成/表示。

Drupal 7の場合と同様に、送信コールバックを追加してリダイレクトを設定する必要がありますthere

また、setRedirect()はパスではなくルート名と引数を想定していることにも注意してください。あなたの場合、それは$form_state->setRedirect('entity.node.canonical', ['node' => 2]));または$form_state->setRedirectUrl($node->toUrl())になります。

1
Berdir