queueService = $queueService; $this->connectionRepository = $connectionRepository; } /** * @inheritDoc */ public function getId(): string { return 'forminator'; } /** * @inheritDoc */ public function getName(): string { return __('Forminator', '1-click-form-sync'); } /** * @inheritDoc */ public function isAvailable(): bool { return class_exists('Forminator') || class_exists('Forminator_API') || function_exists('forminator'); } /** * @inheritDoc */ public function register(): void { if (!$this->isAvailable()) { return; } // Hook into Forminator custom form submit before field set or save entry add_action('forminator_custom_form_submit_before_set_fields', [$this, 'processSubmission'], 10, 3); add_action('forminator_custom_form_after_save_entry', [$this, 'processEntrySave'], 10, 2); } /** * Process submission from Forminator before set fields hook. * * @param object|array $entry * @param int $form_id * @param array $field_data * @return void */ public function processSubmission($entry, int $form_id, array $field_data): void { $settings = get_option('oneclickformsync_forminator_settings_' . $form_id, []); // Ensure create_headers defaults to true if not explicitly specified if (!isset($settings['create_headers'])) { $settings['create_headers'] = true; } // If explicitly disabled for this form, return if (isset($settings['enabled']) && ($settings['enabled'] === false || $settings['enabled'] === '0')) { return; } $allowedIntegrations = get_option('oneclickformsync_allowed_integrations', ['elementor', 'wpforms', 'forminator']); if (is_array($allowedIntegrations) && !in_array('forminator', $allowedIntegrations, true)) { return; } $connectionId = $settings['connection_id'] ?? ''; $spreadsheetId = $settings['spreadsheet_id'] ?? ''; $worksheetName = $settings['worksheet_name'] ?? 'Sheet1'; if (empty($connectionId)) { $connections = $this->connectionRepository->findAll(); if (!empty($connections)) { $connectionId = $connections[0]->getId(); $settings['connection_id'] = $connectionId; } } if (empty($connectionId) || empty($spreadsheetId) || empty($worksheetName)) { return; } $rawData = [ 'form_id' => (string)$form_id, 'field_data' => $field_data, 'entry' => $entry, ]; $submission = $this->normalizeSubmission($rawData, $settings); $submission = apply_filters('oneclickformsync_normalized_submission', $submission, $settings); $this->queueService->enqueue($submission, $settings); } /** * Process submission from Forminator after save entry hook fallback. * * @param int $form_id * @param object|array $entry * @return void */ public function processEntrySave(int $form_id, $entry): void { // Handled via processSubmission to prevent duplicate rows if both hooks trigger } /** * @inheritDoc */ public function normalizeSubmission($submission, array $settings): NormalizedSubmission { $normalizer = new ForminatorSubmissionNormalizer(); $customParams = $settings['custom_utm_params'] ?? ''; return $normalizer->normalize($submission, $customParams); } }