143 lines
4.3 KiB
PHP
143 lines
4.3 KiB
PHP
<?php
|
|
/**
|
|
* @package ogre-captcha
|
|
* @author cleverogre
|
|
* @copyright 2026 CleverOgre
|
|
* @license GLP-3.0-or-later
|
|
* @version 1.1.0
|
|
* @since 1.1.0
|
|
*/
|
|
|
|
namespace Ogre\Captcha\GravityForms;
|
|
|
|
use Ogre\Singleton;
|
|
use Ogre\Captcha as Plugin;
|
|
use GFForms;
|
|
use GFAddOn;
|
|
use Ogre\Captcha\API;
|
|
use Ogre\Captcha\Settings;
|
|
use Ogre\Captcha\Widget;
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
GFForms::include_addon_framework();
|
|
|
|
final class Addon extends GFAddOn {
|
|
use Singleton;
|
|
|
|
protected $_min_gravityforms_version = '2.6.3.2';
|
|
|
|
public static function get_instance(): Addon {
|
|
return self::instance();
|
|
}
|
|
|
|
public function pre_init() {
|
|
$this->_version = Plugin::get_version();
|
|
$this->_slug = Plugin::get_id();
|
|
$this->_path = sprintf(
|
|
'%1$s/%1$s.php',
|
|
Plugin::get_id()
|
|
);
|
|
$this->_full_path = Plugin::get_file();
|
|
$this->_title = sprintf(
|
|
Plugin::__('%s Add-On'),
|
|
Plugin::get_title()
|
|
);
|
|
$this->_short_title = Plugin::get_title();
|
|
}
|
|
|
|
public function init() {
|
|
add_filter('gform_submit_button', [$this, 'submit_button'], 10, 2);
|
|
add_filter('gform_validation', [$this, 'validation'], 10, 2);
|
|
}
|
|
|
|
public function get_menu_icon() {
|
|
return 'gform-icon--lock';
|
|
}
|
|
|
|
public function plugin_settings_fields() {
|
|
return [
|
|
[
|
|
'title' => esc_html(sprintf(
|
|
Plugin::__('%s Settings'),
|
|
Plugin::get_title()
|
|
)),
|
|
'description' => sprintf(
|
|
Plugin::__('Looking to configure your CAPTCHA connection? You can find the settings on <a href="%s">this page</a>.'),
|
|
esc_url(Settings::get_url())
|
|
),
|
|
'fields' => [
|
|
[
|
|
'label' => sprintf(
|
|
Plugin::esc_html__('Enable %s'),
|
|
Plugin::get_title()
|
|
),
|
|
'type' => 'checkbox',
|
|
'name' => 'enabled',
|
|
'choices' => [
|
|
[
|
|
'label' => Plugin::esc_html__('Enable CAPTCHA on all forms by default.'),
|
|
'name' => 'enabled',
|
|
]
|
|
]
|
|
]
|
|
]
|
|
]
|
|
];
|
|
}
|
|
|
|
public function form_settings_fields($form) {
|
|
return [
|
|
[
|
|
'title' => esc_html(sprintf(
|
|
Plugin::__('%s Settings'),
|
|
Plugin::get_title()
|
|
)),
|
|
'fields' => [
|
|
[
|
|
'type' => 'checkbox',
|
|
'name' => 'disabled',
|
|
'choices' => [
|
|
[
|
|
'label' => Plugin::esc_html__('Disable CAPTCHA for this form.'),
|
|
'name' => 'disabled',
|
|
]
|
|
]
|
|
]
|
|
]
|
|
]
|
|
];
|
|
}
|
|
|
|
public function is_enabled(array|null $form = null): bool {
|
|
$plugin_enabled = (bool) $this->get_plugin_setting('enabled');
|
|
if (is_null($form) || !$plugin_enabled) return $plugin_enabled;
|
|
|
|
$form_settings = $this->get_form_settings($form);
|
|
$form_disabled = (bool) rgar($form_settings, 'disabled');
|
|
return !$form_disabled;
|
|
}
|
|
|
|
public function submit_button(string $button_input, array $form): string {
|
|
if (!Settings::is_connected() || !$this->is_enabled($form)) return $button_input;
|
|
ob_start();
|
|
Widget::render();
|
|
return ob_get_clean() . $button_input;
|
|
}
|
|
|
|
public function validation(array $validation_result, string $context): array {
|
|
if ($context != 'form-submit') return $validation_result;
|
|
|
|
if (!Settings::is_connected() || !$this->is_enabled(rgar($validation_result, 'form'))) return $validation_result;
|
|
|
|
$errors = API::process(Widget::get_token());
|
|
if ($errors->has_errors()) {
|
|
$validation_result['is_valid'] = false;
|
|
}
|
|
|
|
// TODO: Mark as spam (optional)
|
|
return $validation_result;
|
|
}
|
|
|
|
}
|