Создаем Google reCAPTCHA field

reCAPTCHA защищает интернет-пользователей от спама, где бы они ни находились. В данной статье мы создадим CaptchaField, который вы можете установить например в форму логина для защиты от ботов.

Чтобы начать работу, вам нужно будет зарегистрировать свой сайт на этой странице. Зарегистрируйте URL-адрес своего сайта и получите ключ. Добавьте следующий код в заголовок вашего файла index.html.

<header>
...
...
    <sript src="https://www.google.com/recaptcha/api.js?onload=recaptchaOnload&render=explicit" async defer></script>
    <script type="text/javascript">
        function recaptchaOnload() {
            Ext.GlobalEvents.fireEvent('GreCaptchaLoad');
        }
    </script>
...
...
</header>

Поле создает следующие события:

  • RecaptchaInValid
  • RecaptchaValid
  • RecaptchaExpired
  • RecaptchaErrorCallback
Ext.define('CaptchaField', {
    extend: 'Ext.form.field.Base',

    alias: 'widget.captchafield',

    fieldSubTpl: [
        '<div id="{captchaId}" class="{gRecaptcha}" data-sitekey="{dataSiteKey}"></div>'
    ],

    isCaptchaValid: false,

    initComponent: function() {
        Ext.GlobalEvents.on('GreCaptchaLoad', this.renderGCaptcha, this);
        this.callParent()
    },

    getSubTplData: function(fieldData) {
        fieldData.dataSiteKey = this.dataSiteKey;
        fieldData.gRecaptcha = 'g-recaptcha';
        fieldData.captchaId = this.getGCaptchaDivId();
        return fieldData;
    },

    getGCaptchaDivId: function() {
        return this.getId() + '-greCaptchaDiv';
    },

    renderGCaptcha: function() {
        var me = this;
        grecaptcha.render(this.getGCaptchaDivId(), {
          'sitekey' : this.dataSiteKey,
          'callback' : function(response) {me.verifyCallback.call(me, response)},
          'expired-callback': function() {me.onRecaptchaExpired.call(me)},
          'error-callback': function() {me.onErrorCallback.call(me)},
          'theme' : 'dark'
        });
    },

    verifyCallback: function(response) {
        this.isCaptchaValid = (response.length > 0);
        this.fireEvent('validitychange', this, this.isCaptchaValid);
        if(this.isCaptchaValid) {
            this.fireEvent('RecaptchaInValid', this);
        } else {
            this.fireEvent('RecaptchaValid', this);
        }
    },

    onRecaptchaExpired: function() {
        console.log('onRecaptchaExpired');
        this.isCaptchaValid = false;
        this.fireEvent('validitychange', this, this.isCaptchaValid);
        this.fireEvent('RecaptchaExpired', this);
    },

    onErrorCallback: function() {
        this.isCaptchaValid = false;
        this.fireEvent('validitychange', this, this.isCaptchaValid);
        this.fireEvent('RecaptchaErrorCallback', this);
    },

    isValid : function() {
        var me = this;
        return me.disabled || this.isCaptchaValid;
    },
});

Fiddle:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *