답변:
제출 핸들러에서
드루팔 7 :
$form_state['redirect'] = 'url';
드루팔 8 :
$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
/my-form?destination=node/123
.
리디렉션을 방해 할 수있는 몇 가지 트리거가 있습니다.
$form_state['redirect'] === FALSE
: 설정되면 양식 작성기 기능 또는 양식 유효성 검증 / 제출 핸들러가 사용자를 경로 재지 정하지 않기 drupal_goto()
때문에 호출되지 않습니다. 대부분의 형식의 경우 리디렉션 논리 $form_state['redirect']
는 정의되지 않았 는지 FALSE 인지에 관계없이 동일 합니다. 그러나 정의되지 않고 현재 요청에 '대상'쿼리 문자열이 포함 된 경우 drupal_goto()
지정된 대상으로 대신 리디렉션됩니다. 만 설정 $form_state['redirect']
하는 FALSE
모든 리디렉션을 방지 할 수 있습니다.$form_state['no_redirect'] === TRUE
: 설정되면 원래 양식을 작성한 콜백은의 리디렉션 값에 관계없이 리디렉션을 명시 적으로 허용하지 않습니다 $form_state['redirect']
. 예를 들어, 리디렉션을 방지하기 위해 AJAX 콜백에서 양식을 작성할 때 ajax_get_form()
정의합니다 $form_state['no_redirect']
. $form_state['no_redirect']
양식 빌더 기능 또는 양식 유효성 검증 / 제출 핸들러로 변경해서는 안됩니다.$form_state['programmed'] === TRUE
: 양식 제출이 일반적을 통해 호출 drupal_form_submit()
되므로 모든 리디렉션은 호출 된 스크립트를 손상시킵니다 drupal_form_submit()
.$form_state['rebuild'] === TRUE
: 리디렉션없이 양식을 다시 작성해야 함을 의미합니다.Drupal 7의 경우 사용자 정의 모듈 에서이 작업을 시도했지만 작동합니다. 테마에서도 사용할 수 있습니다.
function my_theme_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'contact_site_form') {
$form['#submit'][] = 'contact_form_submit_handler';
}
}
function contact_form_submit_handler(&$form, &$form_state) {
$form_state['redirect'] = 'thank-you-page-alias';
}
BTW, 나는이 발췌 문장을 여기에서 발견했다 : https://gist.github.com/postrational/5768796
Drupal 8에서 외부 URL로 리디렉션하려면 TrustedRedirectResponse
다음 코드와 같이 클래스를 사용하십시오 .
$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
use
키워드와 네임 스페이스를 사용하여이 클래스를 포함시켜야 합니다.use Drupal\Core\Routing\TrustedRedirectResponse;
D8에서 나는 이것을 좋아했지만 (이것은 작동하지 않습니다 ... 아래 참조) :
/**
* Implements hook_form_FORM_ID_alter().
*/
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {
// Force redirect to "/thankyou" page
$url = "/thankyou";
$path = \Drupal::service('path.alias_manager')->getPathByAlias($url);
if(preg_match('/node\/(\d+)/', $path, $matches)) {
$form_state->setRedirect('entity.node.canonical',
array('node' => $matches[1])
);
}
}
편집하다/
모듈이 제출 된 후에 setRedirect / setRedirectUrl이 작동한다는 것을 놓쳤습니다. 따라서 이것은 D8에서 작동하는 솔루션입니다.
/**
* Implements hook_form_FORM_ID_alter().
*/
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {
$form['actions']['submit']['#submit'][] = 'MYFORM_redirect_handler';
}
function MYFORM_redirect_handler($form, FormStateInterface $form_state) {
// Force redirect to "/sent"
$dest_url = "/sent";
$url = Url::fromUri('internal:' . $dest_url);
$form_state->setRedirectUrl( $url );
}
이것이 도움이되기를 바랍니다.