"양식이 구식이되었습니다"오류 발생


12

다단계 노드 양식이 있습니다. 팝업 대화 상자를 통해 양식의 중간 쯤에 사용자가 이전에 로그인하지 않은 경우 로그인하라는 메시지가 표시됩니다.

노드 양식의 다음 페이지를 진행할 때 성공적으로 로그인하면이 유효성 검사 오류가 발생합니다.

양식이 오래되었습니다. 저장하지 않은 작업 물을 아래 양식으로 복사 한 다음이 페이지를 다시로드하십시오.

drupal_validation_form()확인 $form['#token']하고 $form_state['values']['form_token']동일 하기 때문에 이해합니다 .

이것은 특별한 유스 케이스이기 때문에 어떻게 피할 수 있습니까 (그리고 일부 외부 물건에 의해 위조되지는 않습니다).

이 전선에 어떤 입력이 있습니까?


1
어쩌면 대답하기에는 너무 늦었지만 같은 문제를 제기했습니다. $ form [ "# token"] = drupal_get_token ($ form [ '# form_id']);에 문제가 있습니다. $ 폼을 준비 할 때

1
실제로 양식을 페이지에 하드 코딩하고 토큰을 추가해야했습니다. <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>양식 을 추가 하면 제대로 제출할 수있었습니다.
thirdender

답변:


2

당신의 게시물은 심각한 불행에서 나를 구했습니다. 연결 방법을 모르지만 게시물로 인해 모듈 코드가 약간 변경되었습니다. "양식이 오래되었습니다"오류가 발생한 이유를 쉽게 이해할 수 있습니다. 이것이 당신의 생각을 자극하고 사건에 도움이 될 수 있는지 확인하십시오.

내 페이지 admin / mymod에는 다음을 포함하는 메뉴 항목이 설정되었습니다.

'page callback' => 'drupal_get_form', 
'page arguments' => 'mymod_main',

에서 mymod_main($op = '')내가 조건부 두 형태 중 하나를 구축하고 있지만, 각 빌드는 물론 새로운 형태의 예이다 $build['mymod_admin'] = drupal_get_form('mymod_admin')$build['mymod_delete'] = drupal_get_form('mymod_delete').

페이지 admin / mymod가 처음로드되고 mymod_admin이 호출 될 때 문제가 없습니다. 그러나 mymod_admin에서 작성된 제출 단추를 클릭하면 mymod_delete가 호출되고 양식이 작성됩니다. 양식 처리를 망친 "양식이 오래되었습니다"오류가 발생합니다. 수정은 단순히 mymod_main()페이지 콜백 으로 사용 하는 것입니다.

이제 manu 콜백에서 시작 양식이없고에 정의 된 두 번째 양식이 없기 때문에 각 양식에 대해 admin / mymod 페이지가 다시로드 될 때 양식이 교차되지 않습니다 $build.


당신의 '수정'을 설명해 주시겠습니까, 나는 같은 문제가 있다고 생각하지만 '---'및 '+++'의 의미를 이해하지 못합니다. 감사합니다
iain maitland

페이지 콜백이로 변경되었음을 의미합니다 mymod_main().
kiamlaluno

0

오류는 form_token필요가 유효하지 않고 재생성되어야 함을 의미합니다 . 이것은 기본적으로 숨겨진 양식 필드입니다 (일반적으로 사이트 간 위조를 방지하기 위해 사용됨).

일반적으로 토큰 요소는에 의해 각 Drupal 양식에 자동으로 추가 drupal_prepare_form()되므로 고유 코드를 작성하지 않는 한 일반적으로 직접 추가 할 필요가 없습니다.

일부 다중 페이지 양식을 프로그램하려는 경우, 당신은 아마 각 토큰이 사용 제출할 재 - 생성 할 필요가 drupal_get_token()같이 예를 들어, 여기 :

$form_state['input']['form_token'] = drupal_get_token($form['#token']);

form_alter에서 양식 토큰을 강제로 재생하는 해결 방법은 다음 예제를 확인하십시오.

/**
 * Implements hook_form_alter().
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
    if ($form_id === 'your_form_entityform_edit_form' && !empty($form_state['input']['form_id'])) {
      $form_id = $form_state['input']['form_id'];
      $form ['#token'] = $form_id;
      $form ['form_token'] = array(
        '#id' => drupal_html_id('edit-' . $form_id . '-form-token'),
        '#type' => 'token',
        '#default_value' => drupal_get_token($form['#token']),
        '#parents' => array('form_token'),
      );
    }
}

문제 해결

  • 양식이 하드 코딩되지 않았는지 다시 확인하십시오. 그렇지 않으면 @thirdender가 제안한대로 토큰을 추가하십시오 .

    <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
  • 다른 양식 (예 : 양식 내의 양식)에서와 같이 양식에서 오류가 발생하는지 확인하십시오.

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