양식을 제출 한 후 페이지로 리디렉션하는 방법


24

양식을 표시하는 사용자 지정 모듈이 있습니다.

양식을 제출하면 사용자를 다른 페이지로 리디렉션하고 싶습니다.

어떻게해야합니까?

답변:


31

제출 핸들러에서

드루팔 7 :

$form_state['redirect'] = 'url';

드루팔 8 :

$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);

이 작업을 수행하는 다른 방법이 있습니까? 리디렉션 해야하는 양식은 자체 #submit 처리기 (제출 처리기가 사용자 정의 모듈에 배치되어 있지 않음)로 작성되므로 코드에 액세스 할 수 없습니다.
Carlos Muñiz 2016 년

@Charlie는 form_alter를 사용하여 자신을 추가하십시오.
googletorp

@Charlie for 링크에 주로 액세스 할 수있는 경우 URL에 destination 매개 변수를 입력하십시오 /my-form?destination=node/123.
tostinni

D7에서는 작동하지 않지만 그 일을 발견했습니다. 아래에서 내 메시지를 확인하십시오.
Ignacio Segura Postigo

D7에 대한 답변에 감사의 말씀을 전하고 5 년 후 D8의 답변을 업데이트하기 위해 다시 방문해 주셔서 감사합니다. <3
개미

17

리디렉션을 방해 할 수있는 몇 가지 트리거가 있습니다.

  • $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: 리디렉션없이 양식을 다시 작성해야 함을 의미합니다.

7

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


4

Drupal 8에서 외부 URL로 리디렉션하려면 TrustedRedirectResponse다음 코드와 같이 클래스를 사용하십시오 .

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);

도움이 될 수 있다면 use키워드와 네임 스페이스를 사용하여이 클래스를 포함시켜야 합니다.use Drupal\Core\Routing\TrustedRedirectResponse;
Sébastien Gicquel

2

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 );
}

이것이 도움이되기를 바랍니다.


1

들어 드루팔 7 당신은 같은 PARAMS와 URL로 리디렉션하려면someurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.