클릭 후 제출 버튼을 비활성화하는 방법은 무엇입니까?


13

Drupal은 노드 페이지에서도 여러 양식 제출을 막지 않는 것 같습니다. 이 QA 에서는 서버 측에서 수정하는 것이 좋습니다.

클릭 후 제출 버튼을 비활성화하려면 어떻게해야합니까?

다른 솔루션?


Drupal의 Form API가 양식 토큰 값 확인으로 인해 이중 제출을 막지 않습니까? 동일한 토큰이있는 양식을 두 번 제출할 수 없습니까?
Johnathan Elmore

답변:


12

개발자 전용이지만 제출 제출 모듈이 트릭을 수행합니다. 기능 중 하나는 다음과 같습니다.

제출 단추를 클릭 한 후 숨기기 (또는 비활성화)

방금 개발 사이트에 설치했으며 노드 추가 양식에 잘 작동하는 것 같습니다. 제출 버튼을 클릭하면 양식이 최종적으로 제출되기 전에 숨겨져 로딩 이미지와 '기다려주십시오 ...'메시지로 대체됩니다. 그래도 다른 형태로는 시도하지 않았습니다.


숨기기 제출 모듈이 사용자 정의 모듈의 양식에서 작동하도록하는 방법에 대한 아이디어가 있습니까? 나는 그것이 사이트 전체에 있기를 바랐지만 그것은 사실이 아닌 것 같습니다.
user785179

@ user785179 구현 방법을 살펴보십시오. hook_form_alter()사용중인 경우 hook_form_FORMID_alter()generic으로 전환하십시오 hook_form_alter(). hook_form_alter()내부에 일반적인 경우 여기 에 일부를 추가 or하십시오 if.
Mołot

이 솔루션에주의하십시오. 숨기기 제출 모듈은 아약스 업로드를 중단하고 자동 완성 문제를 야기하며 경우에 따라 처음 클릭시 제출 버튼이 전혀 수행하지 않는 경우가 있습니다. 방금 사이트에서 제거해야했습니다.
jenlampton

@Jen Strange, 나는 그런 문제를 보지 않고 수십 년 동안 수십 개의 사이트에서 사용해 왔습니다. 아마도 당신은 그것을 방해하는 다른 모듈을 설치했을 것입니다
Clive

10

다음은 Drupal 7 솔루션입니다. 코드는 숨기기 제출 모듈의 단순화 된 버전입니다.

이 코드는 "추가"버튼과 AJAX 양식에서도 잘 작동합니다.

Drupal.behaviors.hideSubmitButton = {
  attach: function(context) {
    $('form.node-form', context).once('hideSubmitButton', function () {
      var $form = $(this);
      $form.find('input.form-submit').click(function (e) {
        var el = $(this);
        el.after('<input type="hidden" name="' + el.attr('name') + '" value="' + el.attr('value') + '" />');
        return true;
      });
      $form.submit(function (e) {
        if (!e.isPropagationStopped()) {
          $('input.form-submit', $(this)).attr('disabled', 'disabled');
          return true;
        }  
      });
    });
  }
};

나는 이것을 관리자 테마로 구현하고 싶습니다. sitename.js 파일을 만들고 위 코드를 복사했습니다. 그것은 작동하지 않습니다. 조정해야합니까?
Justme

@Justme sitename.js 파일을 어디에 넣었습니까? 모듈 또는 서브 테마에있는 경우로드 할 수 있도록 .info 파일에 추가하거나 drupal_add_js ()를 호출하여 페이지에서 가져 오십시오. 페이지 소스에 추가 된 것을 볼 수 있습니까?
jenlampton

Thxs가 해결했습니다. 나는 이것이 사이에 있어야한다는 것을 몰랐다 : (function ($) {and}) (jQuery); js 파일에서. sharm처럼 작동합니다!
Justme

0

가장 쉬운 방법은 테마 제출 자바 스크립트 솔루션을 사용하여 양식 제출 후 버튼을 비활성화하는 것입니다. theme.info 파일에서 javascript 파일을 테마 api에서로드 할 수 있도록 넣으십시오.

scripts[] = js/themename-script.js

이제 themename-script.js에서 Drupal.behaviors.themename 섹션에 다음과 같이 추가하십시오.

Drupal.behaviors.themename = function()
{
  $('.node-form').submit(function(){
    $('#edit-submit').attr("disabled", "disabled");
    $('#edit-preview').attr("disabled", "disabled");
  });
}

흐름은 다음과 같습니다.

  1. 테마는 자바 스크립트를로드합니다
  2. Drupal.behaviors.themename은 페이지로드시 시작됩니다.
  3. 노드 추가 양식의 제출 양식 (위의 예제에 기반한 클래스는 양식 유형에 따라 사용자 정의 가능)에서 제출 단추 (제출 및 미리보기)를 사용 불가능하게하여 다시 클릭 할 수 없게합니다.

위의 내용이 위험 할 수있는 일부 아약스 처리가 있는지, form_api 유효성 검사에서 오류가 발생하면 양식 제출을 다시 수행 할 수 없다고 확신하므로이를 테스트하고 필요에 맞게 사용자 정의하십시오. 제출 버튼이 비활성화 된 상태에서 미리보기 버튼을 클릭 할 수 있으므로 두 버튼을 모두 비활성화했습니다. 분명히 당신의 마일리지는 다양합니다.


2
이전 Drupal.behaviors선언 스타일을 사용하고 있습니다. Drupal 7에서는 작동하지 않습니다 Drupal.behaviors.themename = { attach: function (context, settings) { // .... 참조 드루팔 7에서 자바 스크립트를 관리 추가 정보를 원하시면
클라이브

선언 스타일은 고정
유진 Fidelin

이 스크립트 'node-form'에서 어떤 값을 대체해야합니까?
pal4life

나는 이것을 관리 테마에서 작동 시키려고했지만 운이 없다. 테마 이름을 관리자로 바꾸고 sitename.js에서 전체 코드를 복사하여 테마 정보 파일에 추가했습니다. 여전히 같은 양식을 더 쉽게 제출할 수 있습니다.
Justme
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.