Для семерки можете посмотреть другую статью.
Обычно правят поведение существующих форм через hook_form_alter, добавляя туда еще один обработчик submit. Специальный метод setRedirectUrl объекта FormStateInterface позволяет настроить адрес перенаправления.
Например, добавим редирект в форму user_login_form.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/** * Implements hook_form_alter(). * @param $form * @param \Drupal\Core\Form\FormStateInterface $form_state * @param $form_id */ function MYMODULE_form_alter( &$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) { if ($form_id == 'user_login_form') { $form['#submit'][] = '_mymodule_user_redirect'; } } function _mymodule_user_redirect( &$form, \Drupal\Core\Form\FormStateInterface $form_state) { $form_state->setRedirectUrl(Url::fromUri('internal:/YOUR-INTERNAL-URL')); } |
Выполнится весь код, который предусмотрен штатно, потом будет произведен редирект. При необходимости, можно передать также и GET параметры:
1 2 3 4 5 6 7 8 9 10 |
function _mymodule_user_redirect( &$form, \Drupal\Core\Form\FormStateInterface $form_state) { $name = $form_state->getValue('name'); $form_state->setRedirectUrl( Url::fromUri( 'internal:/YOUR-INTERNAL-URL', ['name' => $name])); } |
Они читаются в контроллере, который формирует страницу, соответствующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
namespace Drupal\my_module\Controller; use Drupal\Core\Controller\ControllerBase; /** * Provides route responses for the module. */ class MyWebsiteController extends ControllerBase { public function message() { $name = \Drupal::request()->query->get('name'); return [ '#name' => $name, '#theme' => 'MY_TEMPLATE', ]; } } |
Если требуется перенаправить ввод формы, то можно использовать другой код в обработчике submit:
1 2 3 4 5 6 7 8 9 10 11 |
use Drupal\Core\Routing\TrustedRedirectResponse; function _mymodule_user_redirect( &$form, \Drupal\Core\Form\FormStateInterface $form_state) { $response = new TrustedRedirectResponse( Url::fromUri('internal:/YOUR-INTERNAL-URL')->toString() ); $response->send(); } |
Это прервет штатную обработку формы, но отправит её данные по другому URL.