노드가 추가 또는 편집 된 후 사용자 정의 페이지로 리디렉션


15

을 사용하여 hook_form_alter만들거나 편집 한 노드 대신 노드를 만들거나 편집 한 후 사용자를 사용자 정의 페이지로 리디렉션하려면 어떻게해야합니까?

현재 코드 hook_form_alter()는 다음과 같습니다.

function custom_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#id'] == 'custom-node-form') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
  }
}

"해당 모듈이 있습니다": 노드 대상 ( drupal.org/project/node_destination )이지만 D6에서만 사용할 수 있습니다. 아마도 적응할 수 있습니다.
Benj

답변:


16
function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

코드는 양식을 제출하기 위해 클릭 한 버튼과 독립적으로 양식을 리디렉션합니다. 특정 제출 단추를 클릭 할 때만 양식을 리디렉션하려면 다음 코드를 사용해야합니다.

function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['actions']['submit']['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

 

  • 양식 ID에는 하이픈이 포함되어 있지 않습니다. 양식 ID는 양식 (일명 양식 작성기)을 생성하는 PHP 함수의 이름이며 PHP 함수는 이름에 하이픈을 포함 할 수 없습니다.
  • 양식 ID는 hook_form_alter () , hook_form_BASE_FORM_ID_alter ()hook_form_FORM_ID_alter () 의 구현으로 전달됩니다 . hook_form_FORM_ID_alter()특정 양식에 대해 호출되기 때문에 실제로는 필요하지 않지만 다른 두 후크는 둘 이상의 양식에 대해 호출됩니다.
  • 첫 번째 함수는 hook_form_BASE_FORM_ID_alter () 구현입니다 . 이 경우 기본 양식 ID는 노드 편집 양식의 기본 양식 인 "node_form"입니다.
  • 노드 편집 양식에는 $form['#node']편집중인 객체의 노드 객체 인가 포함됩니다. "custom"은 사용자가 노드를 편집 한 후 사용자를 리디렉션하려는 컨텐츠 유형의 짧은 ID입니다.
  • 변경 $form_state['redirect']에서하는 것은 hook_form_alter()영향을주지 않는다; 제출 핸들러에서 설정해야합니다.

고마워 것을 주 &에서이 function custom_node_submit($form, &$form_state) {매우 중요합니다. 그렇지 않으면 상태를 참조로 전달하지 않으며 수동으로 편집 한 내용은 적용되지 않습니다.
Bram

9

이 코드는 Drupal 7 사이트에서 작동합니다.

/**
 * Implements hook_form_alter()
 */

function custom_form_alter(&$form, &$form_state, $form_id) {    
  if ($form_id == 'article_node_form') {
    $form['actions']['submit']['#submit'][] = 'mysubmit_node_submit';
  }     
}

function mysubmit_node_submit($form, &$form_state) {
  $form_state['redirect'] = '/homepage';
}

당신은 어느 대답을 # 4라고합니까?
Елин Й.

왜 이것이 작동하지 않습니까? 같은 코드를 사용하고 있습니다
ruby

캐시 @ruby를 지웠습니까?
coderama

기존 노드의 경우 대상을 먼저 설정 해제하는 것이 좋습니다. 일반적으로 페이지 에서 편집 단추 ( drupal.stackexchange.com/a/192271/15055) 를 클릭하면 URL에 추가됩니다 . admin/content
leymannx

4

$form_state['redirect']예를 들어 다음 행 중 하나를 사용하여 를 설정 하면됩니다.

$form_state['redirect'] = "some-internal-path";
$form_state['redirect'] = array($path, $options_array, $http_code);

전달할 인수와 동일한 인수 drupal_goto()입니다.


의견 @Shoaib Nawaz에 감사드립니다. 운이없이 $ form_state [ 'redirect']를 hook_form_alter 훅에 추가했습니다.
Citricguy

내 인생에서 나는 $ form_state [ 'redirect']를 어디서나 적용 할 수 없다.
Citricguy

이 것 없는 당신이 노드를 추가하거나 편집 한 후 리디렉션하려고하면 작동합니다. 이유를 확인하려면 노드 양식 submit을 살펴보십시오 . TRUE로 평가 $form_state['redirect']되면 할당 한 값을 덮어 씁니다 ($node->nid).
Free Radical

2

이것이 옵션인지 확실하지 않지만 이것이 컨텐츠 유형 인 경우 특정 컨텐츠 유형의 업데이트 또는 작성시 규칙이 트리거되도록 규칙 모듈을 사용하여이를 매우 빠르게 달성 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.