$ form_state는 무엇을 위해 사용됩니까?


33

$form_state인수로 사용되는 경우 Form API의 컨텍스트에서 일반적으로 사용되는 것은 무엇입니까 ?

특히, 언제 사용되는지에 대한 예를 찾고 있습니다.

답변:


48

$form_state양식 제출 핸들러 또는 양식 유효성 검증 핸들러에 전달 된 인수 중 하나입니다. 주요 사용법은 사용자가 입력 한 값을 형식으로 검색하는 것입니다 ( $form_state['values']) 의 내용 참조 ). 그러나 다른 목적으로 사용할 수있는 다른 값이 포함되어 있습니다. drupal_build_form ()에
대한 설명서 에는 해당 배열에 포함 된 다른 값 목록이 포함되어 있으며 여기에는 다음 값이 포함됩니다.

  • 재 구축 : 일반적으로 전체 양식 처리가 완료되고 제출 핸들러가 실행 된 후 양식이 완료된 것으로 간주되며 drupal_redirect_form ()은 GET 요청을 사용하여 사용자를 새 페이지로 리디렉션하므로 브라우저 새로 고침이 다시 제출되지 않습니다. 양식). 그러나 'rebuild'가 TRUE로 설정된 경우 새 양식의 복사본이 즉시 리디렉션되어 브라우저 대신 빌드되어 브라우저로 전송됩니다. 마법사 및 확인 양식과 같은 다단계 양식에 사용됩니다. 일반적으로 $form_state['rebuild']제출 핸들러는 양식이 수행되는지 또는 다른 단계가 필요한지를 판별하는 제출 핸들러 내의 논리이므로 일반적으로 제출 핸들러에 의해 설정됩니다. 그러나 유효성 검증 핸들러는 $form_state['rebuild']유효성 검증 오류가없는 경우에도 양식 처리가 제출 핸들러를 무시하고 양식을 재 빌드하도록 이미 설정 되어있을 수 있습니다.
  • 리디렉션 : 제출시 양식을 리디렉션하는 데 사용됩니다. 도착 URL이 포함 된 문자열이거나와 호환되는 인수 배열 일 수 있습니다 drupal_goto(). 자세한 내용 drupal_redirect_form()은 참조하십시오 .
  • 캐시 : TRUE원본으로 설정하면 처리되지 않은 양식 구조가 캐시되므로 전체 양식을 캐시에서 다시 작성할 수 있습니다. 일반적인 양식 워크 플로에는 두 가지 페이지 요청이 있습니다. 먼저, 사용자가 작성하기 위해 양식이 작성되고 렌더링됩니다. 그런 다음 사용자가 양식을 작성하여 제출하여 양식을 작성하고 처리해야하는 두 번째 페이지 요청을 트리거합니다. 기본적으로, $form그리고 $form_state이러한 페이지 요청의 각시 처음부터 내장되어 있습니다. 초기 페이지 요청에서 제출을 처리하는 요청까지 $form$form_state변수 를 유지해야하는 경우가 종종 있습니다. 이를 위해 'cache'를 TRUE로 설정할 수 있습니다. 눈에 띄는 예는 Ajax 지원 양식입니다.ajax_process_form()#ajax 속성을 가진 요소를 포함하는 모든 양식에 대해 양식 캐싱을 사용합니다. (아약스 핸들러는 이렇게 캐시 된 버전에 의존해야, 양식 자체를 구축 할 수있는 방법이 없습니다.)의 지속성주의 $form$form_state관계없이 값은 '다시'플래그 세트를 가진 (다단계) 형태의 자동 발생을 '은닉처'.
  • storage : $form_state['storage']는 특별한 키가 아니며 Form API에서 특별한 지원이 제공되지 않습니다. 전통적으로 제출, 유효성 검증 및 양식 빌더 기능 간 통신을 위해 특히 특정 단계 스타일 양식으로 애플리케이션 특정 데이터가 저장된 위치였습니다. 양식 구현은 $form_state이러한 종류의 저장소에 대해 (여기에 나열된 키 및 Form API 내부에서 사용하는 다른 예약 된 키 이외 의) 키를 사용할 수 있습니다 . 선택한 키가 Form API 또는 다른 모듈에서 사용하는 키와 충돌하지 않도록하는 권장 방법은 모듈 이름을 키 이름 또는 키 이름의 접두어로 사용하는 것입니다. 예를 들어, 노드 모듈은$form_state['node'] 노드 편집 양식에서 편집중인 노드에 대한 정보를 저장하며,이 정보는 "미리보기"단추를 연속해서 클릭 할 때뿐만 아니라 "저장"단추를 클릭 할 때에도 계속 사용할 수 있습니다.

$form_state인수로 받는 다른 함수 는 hook_form_alter ()hook_form_FORM_ID_alter () 입니다.

해당 인수를 사용하는 코드의 예로 다음 코드가 포함 된 comment_form_submit ()을 볼 수 있습니다 .

function comment_form_submit($form, &$form_state) {
  $node = node_load($form_state['values']['nid']);
  $comment = comment_form_submit_build_comment($form, $form_state);
  if (user_access('post comments') && (user_access('administer comments') || $node->comment == COMMENT_NODE_OPEN)) {
    // Save the anonymous user information to a cookie for reuse.
    if (user_is_anonymous()) {
      user_cookie_save(array_intersect_key($form_state['values'], array_flip(array('name', 'mail', 'homepage'))));
    }

    comment_save($comment);
    $form_state['values']['cid'] = $comment->cid;

    // Add an entry to the watchdog log.
    watchdog('content', 'Comment posted: %subject.', array('%subject' => $comment->subject), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid)));

    // Explain the approval queue if necessary.
    if ($comment->status == COMMENT_NOT_PUBLISHED) {
      if (!user_access('administer comments')) {
        drupal_set_message(t('Your comment has been queued for review by site administrators and will be published after approval.'));
      }
    }
    else {
      drupal_set_message(t('Your comment has been posted.'));
    }
    $query = array();
    // Find the current display page for this comment.
    $page = comment_get_display_page($comment->cid, $node->type);
    if ($page > 0) {
      $query['page'] = $page;
    }
    // Redirect to the newly posted comment.
    $redirect = array('node/' . $node->nid, array(
        'query' => $query,
        'fragment' => 'comment-' . $comment->cid,
      ));
  }
  else {
    watchdog('content', 'Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject), WATCHDOG_WARNING);
    drupal_set_message(t('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject)), 'error');
    // Redirect the user to the node they are commenting on.
    $redirect = 'node/' . $node->nid;
  }
  $form_state['redirect'] = $redirect;
  // Clear the block and page caches so that anonymous users see the comment
  // they have posted.
  cache_clear_all();
}

$form_state['values']포함 된 내용을 이해하려면 comment_form ()$form 에 추가 된 값을 확인해야합니다 . 예를 들어, 이 포함되어 있기 때문에 포함되어 있습니다 . 일반적으로 양식 필드 인 경우을 포함합니다 .$form_state$form_state['values']['name']$form$form['author']['name']$form['field']$form_state$form_state['values']['field']


양식 값을 변경하거나 hook_form_alter를 사용하여 다중 값 필드 단추를 사용하지 않으려면 $ form 또는 $ from_state? (AJAX를 사용하거나 AJAX없이 구현할 때)로 변경해야하는 변수는 무엇입니까? $ form_state가 아약스에 특별히 사용됩니까?
8:27에

1
@kiranking 일반적으로 AJAX 콜백은 $form배열 의 일부를 반환합니다 . 의 내용을 확인하는 양식 작성기입니다 $form_state. 이것이 올바른 일을하는 모듈로 구현 된 모든 AJAX 콜백에서 본 것입니다.
kiamlaluno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.