$ 메시지가 한 페이지 새로 고침을 지연시키는 이유는 무엇입니까?


10

매우 간단한 템플릿이있는 페이지가 있습니다.

<!DOCTYPE html>
<html>
<head><title>TEST REGISTRATION PAGE</title></head>
<body>
    <?php 
        print drupal_get_form('user_register');
        print $messages;
        print $closure;
        print $main_content;
    ?>
</body></html>

기본적으로 등록 양식을 표시하고 다른 것은 표시하지 않습니다.

  1. 이미 사용 된 사용자 이름 (관리자)이며 이메일 주소가없는 양식에 잘못된 데이터를 입력했습니다.
  2. "새 계정 만들기"를 클릭합니다.
  3. 페이지가 제출 및 다시로드 된 것으로 보이지만 아무런 오류 메시지도 표시되지 않습니다 .
  4. 페이지를 새로 고칩니다 (F5).
  5. Firefox는 "이 페이지를 표시하기 위해 Firefox는 이전에 수행 된 모든 작업을 반복하는 정보를 보내야합니다"를 표시합니다. 따라서 POST가 이전에 진행되었음을 알고 있습니다.
  6. 해당 대화창에서 "재전송"을 클릭합니다.
  7. "이메일 주소 필드는 필수입니다", "이름 관리자는 이미 사용되었습니다"라는 오류 메시지가 나타납니다.

이것은 등록 양식뿐만 아니라 지금까지 테스트 한 모든 양식에서 발생합니다 .

왜 이런 일이 발생합니까? 오류 메시지가 처음 표시되도록 수정하려면 어떻게해야합니까?

나는 이것을 디버깅하는 데 필요한 모든 것을 기뻐하지만, 조사를 시작할 방향이 필요하다. :)

답변:


4

메시지가 이미 작성되었을 때 양식을 호출하는 것이 문제 일 가능성이 높습니다. drupal_get_messages를 사용하여 페이지를 작성하거나 메시지를받는 프로세스 초기에 양식을 호출해야합니다.

실제로해야 할 일은 모듈 에서이 기능을 만들고 테마에서이를 수행하는 대신 페이지를 테마로 만드는 것입니다. 이와 같은 더 많은 문제가 발생할 수 있습니다.


좋아, 나는 이것을 마침내 고쳤을 것이라고 생각한다. 나는 'my_register_form'이라는 모듈을 작성했지만에 반환 drupal_get_form('user_register')하는 것 외에는 아무것도하지 않습니다 $block['content']. 컨텍스트를 통해 해당 모듈을 포함시킨 다음 제출 후 등록 오류 메시지가 올바르게 표시됩니다. 지나치게 복잡해 보이지만 작동하며 로그인 / 등록 양식을 원하는 방식으로 포함시킬 수 있습니다. 도와 주셔서 감사합니다.
조지

3

양식 검증 문제 (메시지가 렌더링 된 후 발생하고 다음 요청에 표시되는 양식 검증)를 해결했습니다.

hook_node_view에서 양식 유효성 검증 강제

/**
 * This is a fix for a bug where the validation error messages lag a 
 * full request behind form submissions
 */
function your_module_node_view($node, $view_mode){
  // check that form id is the form you want
  if ( !isset( $_POST['form_id'] ) || $_POST['form_id'] != 'your_form_id' ){
    return;
  }
  // this forces validation of the form 
  drupal_get_form('your_form_id');
}

2

나는 또한이 문제로 고통 받았다. @googletorp의 답변으로 문제를 해결했습니다.

페이지 시작 부분 tpl. 내 경우를 위해 양식의 렌더링 된 내용을 가져옵니다.

$register_form = drupal_get_form('user_register_form');
$register_form_content = render($register_form);

$form_user_pass = drupal_get_form('user_pass');
$form_user_pass_content = drupal_render($form_user_pass);

$login_form = drupal_get_form('user_login_block');
$login_form_content = render($login_form);

그런 다음 메시지 인쇄 섹션에서 tpl 페이지의 drupal_get_messages ()를 호출하는 메시지를 가져 오십시오. $ messages는 다른 페이지 새로 고침 없이도 메시지를 가져올 수 없습니다.

<?php 
    $messages = drupal_get_messages('error');
    if(is_array($messages['error']) && count($messages['error'])) {
?>
    <div id="messages">
        <div class="section clearfix">
            <div class="messages error">
                <ul>
                    <?php 
                    foreach($messages['error'] as $item) {
                        echo '<li>'.$item.'</li>';
                    }
                    ?>
                </ul>
            </div>
        </div>
    </div>
<?php
    }
?>

그런 다음 렌더링 된 양식 내용을 적절한 섹션에 인쇄하면 해결되었습니다. :)


1

질문에 대한 직접적인 해결책은 아니지만 동일한 문제가 발생했을 때이 문제가 발생했습니다.

양식 블록이 tpl.php 파일에서 직접 호출되면 (아마도 레이아웃 이유로) 지연된 메시지가 표시됩니다.

즉, 템플릿 파일에 다음 코드가 포함 된 블록을로드했습니다.

$vars['contact_details'] = module_invoke('viewusercontact', 'block_view', 0);

그런 다음 tpl.php 파일로 렌더링하십시오.

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