diff --git a/cleantalkantispam.php b/cleantalkantispam.php
index f974ef9..c6b43a7 100644
--- a/cleantalkantispam.php
+++ b/cleantalkantispam.php
@@ -192,6 +192,21 @@ public function hookActionFrontControllerInitAfter(&$params)
// Getting data from the request
$form_data = Tools::getAllValues();
+ // Form Builder Pro (gformbuilderpro) integration
+ if (isset($form_data['idform']) && isset($form_data['gSubmitForm']) && $form_data['gSubmitForm'] == '1') {
+ $data = $this->extractFormBuilderData($form_data);
+ $data['ct_bot_detector_event_token'] = Tools::getValue('ct_bot_detector_event_token', '');
+ $data['post_info']['comment_type'] = 'contact_form_gformbuilderpro';
+ $cleantalk_check = $this->checkSpam($data);
+ if ($cleantalk_check['allow'] == 0) {
+ if (!empty($form_data['usingajax']) && $form_data['usingajax'] == '1') {
+ $this->doBlockFormBuilderAjax($cleantalk_check['comment']);
+ } else {
+ $this->doBlockPage($cleantalk_check['comment']);
+ }
+ }
+ }
+
// Contact Form integration
if ( Tools::isSubmit('submitMessage') && isset($params['controller']) && $params['controller'] instanceof \ContactController ) {
$data['email'] = isset($form_data['from']) ? $form_data['from'] : '';
@@ -262,6 +277,34 @@ private function doBlockAjax($message)
]));
}
+ /**
+ * Block Form Builder Pro AJAX request with JSON error response.
+ * Format compatible with gformbuilderpro module.
+ *
+ * @param string $message
+ * @return void
+ */
+ private function doBlockFormBuilderAjax($message)
+ {
+ header('Content-Type: application/json');
+ header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
+
+ $error_html = '
' .
+ '
' .
+ '' .
+ htmlspecialchars($message, ENT_QUOTES, 'UTF-8') .
+ '
' .
+ '
';
+
+ die(json_encode([
+ 'errors' => '1',
+ 'thankyou' => $error_html,
+ 'autoredirect' => false,
+ 'timedelay' => 0,
+ 'redirect_link' => '',
+ ]));
+ }
+
public function hookActionValidateOrder($params)
{
$order = $params['order'];
@@ -312,10 +355,19 @@ public function hookActionNewsletterRegistrationBefore($params)
}
}
+ /**
+ * @param array $data
+ * @param bool $is_check_register
+ * @return array
+ */
private function checkSpam($data, $is_check_register = false)
{
+ // Return default "allowed" result if API key is not configured
if ( ! Configuration::get('CLEANTALKANTISPAM_API_KEY') ) {
- return true;
+ return [
+ 'allow' => 1,
+ 'comment' => '',
+ ];
}
$sender_nickname = $data['nickname'] ?? '';
@@ -399,4 +451,87 @@ private function getSenderInfo()
'REFFERRER' => Server::get('HTTP_REFERER'),
];
}
+
+ /**
+ * Extract email, name and message from Form Builder Pro form data.
+ * Searches through all fields for typical field names.
+ *
+ * @param array $form_data
+ * @return array
+ */
+ private function extractFormBuilderData($form_data)
+ {
+ $data = [];
+
+ // Common field name patterns for email
+ $email_fields = ['email', 'mail', 'e-mail', 'from'];
+ // Common field name patterns for message
+ $message_fields = ['message', 'comment', 'comments', 'text', 'body', 'content'];
+
+ foreach ($form_data as $key => $value) {
+ if (!is_string($value)) {
+ continue;
+ }
+
+ $key_lower = strtolower($key);
+
+ if (empty($data['email'])) {
+ foreach ($email_fields as $pattern) {
+ if (strpos($key_lower, $pattern) !== false && filter_var($value, FILTER_VALIDATE_EMAIL)) {
+ $data['email'] = $value;
+ break;
+ }
+ }
+ }
+
+ if (empty($data['firstname'])) {
+ if (strpos($key_lower, 'first') !== false || $key_lower === 'name') {
+ $data['firstname'] = $value;
+ }
+ }
+
+ if (empty($data['lastname'])) {
+ if (strpos($key_lower, 'last') !== false) {
+ $data['lastname'] = $value;
+ }
+ }
+
+ if (empty($data['message'])) {
+ foreach ($message_fields as $pattern) {
+ if (strpos($key_lower, $pattern) !== false) {
+ $data['message'] = $value;
+ break;
+ }
+ }
+ }
+ }
+
+ // If no email found by field name, try to find any valid email in form data
+ if (empty($data['email'])) {
+ foreach ($form_data as $key => $value) {
+ if (is_string($value) && filter_var($value, FILTER_VALIDATE_EMAIL)) {
+ $data['email'] = $value;
+ break;
+ }
+ }
+ }
+
+ // Build message from all text fields if no specific message field found
+ if (empty($data['message'])) {
+ $message_parts = [];
+ $skip_fields = ['idform', 'id_lang', 'id_shop', 'Conditions', 'ConditionsHide',
+ 'gSubmitForm', 'usingajax', 'ct_bot_detector_event_token'];
+ foreach ($form_data as $key => $value) {
+ if (is_string($value) && !empty($value) && !in_array($key, $skip_fields)
+ && strpos($key, 'input_') === 0) {
+ $message_parts[] = $value;
+ }
+ }
+ if (!empty($message_parts)) {
+ $data['message'] = implode(' ', $message_parts);
+ }
+ }
+
+ return $data;
+ }
}