노드 저장 또는 삭제 후 사용자 정의 페이지로 리디렉션하는 방법은 무엇입니까?


10

내가하려고하는 것이 작동하지 않지만 여전히 / 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');
}

2
이것은 내가 /core/modules/node/src/NodeForm.php 에서 찾은 것입니다If saving is an option, privileged users get dedicated form submit buttons to adjust the publishing status while saving in one go. @todo This adjustment makes it close to impossible for contributed modules to integrate with "the Save operation" of this form. Modules need a way to plug themselves into 1) the ::submit() step, and 2) the ::save() step, both decoupled from the pressed form button.
olsav

1
[ drupal.org/project/rules ] ( 규칙) 모듈을 사용할 수 있습니다 .
Sugar Aggarwal

1
사용자 정의 제출 기능이 호출 되었습니까?
Eyal

1
다른 제출 함수가 나중에 사용자 정의 경로 재 지정을 대체 할 수도 있습니다.
Eyal

답변:


7

기본적으로 코드는 작업 제출 전용으로 작동하지만 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');
}

4

hook_form_alter를 사용하면 두 가지 작업을 수행해야합니다.

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 페이지에서 대상 매개 변수를 제거하려면 해당보기 필드에서 "컨텐츠 : 작업 링크 (작업)"아래의 "대상"확인란을 선택 취소해야합니다.

여기에 이미지 설명을 입력하십시오


1

Symfony RedirectResponse를 사용하여 성공했습니다.

function callback_set_redirect($form, FormStateInterface $form_state) {
  $url = Url::fromRoute("custom.landing.page")->toString();
  $response = new RedirectResponse($url);
  $response->send();
}

필요한 경우 호버 모듈이 경로 재 지정을 변경할 수 없으므로 응답을 사용하지 않아야합니다.
kiamlaluno

나도 일했다.
Insasse

0

원래 코드에서 잘못된 것을 찾을 수 없으므로 다른 것이 잘못되었을 수 있습니다. 그것은 나를 위해 잘 작동합니다.

그러나 custom.landing.page정의 된 경로와 매개 변수 (있는 경우)는 다음과 같이 전달되어야합니다.

  $form_state->setRedirect("custom.landing.page", [
    'parameter1' => 42,
  ]);

자세한 내용은 FormState :: setRedirect () 를 참조하십시오.


0

이 기능 에는 항상 노드 저장 리디렉션 모듈을 사용합니다 . "새 컨텐츠를 저장 한 후 수행 할 작업"이라는 컨텐츠 유형에 옵션을 추가합니다.

이게 뭐야?

이 모듈은 컨텐츠를 저장 한 후 사용자를 가져갈 위치를 지정하는 방법을 제공합니다.


이 모듈은 아직 Drupal 8로 완전히 포팅되지 않았습니다.
dxvargas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.