mirror of
https://github.com/proelements/proelements.git
synced 2026-05-05 17:15:58 +00:00
v4.0.4.1
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
<?php
|
||||
namespace ElementorPro\Modules\AtomicForm\Actions;
|
||||
|
||||
use ElementorPro\Core\Utils;
|
||||
use ElementorPro\Modules\Forms\Submissions\Database\Query;
|
||||
use ElementorPro\Modules\Forms\Submissions\Database\Repositories\Form_Snapshot_Repository;
|
||||
use Elementor\Utils as ElementorUtils;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
class Collect_Submissions_Action extends Action_Base {
|
||||
|
||||
public function get_type(): string {
|
||||
return Action_Type::COLLECT_SUBMISSIONS;
|
||||
}
|
||||
|
||||
public function execute( array $form_data, array $widget_settings, array $context ): array {
|
||||
$metadata_keys = $this->normalize_metadata_keys( $widget_settings['submissions_metadata'] ?? [] );
|
||||
|
||||
$field_metadata = $context['field_metadata'] ?? [];
|
||||
$fields = $this->prepare_fields( $form_data, $field_metadata );
|
||||
|
||||
$submission_id = Query::get_instance()->add_submission(
|
||||
[
|
||||
'main_meta_id' => 0,
|
||||
'post_id' => $context['post_id'],
|
||||
'referer' => $this->get_referer(),
|
||||
'referer_title' => $this->get_referer_title(),
|
||||
'element_id' => $context['form_id'],
|
||||
'form_name' => $context['form_name'],
|
||||
'campaign_id' => 0,
|
||||
'user_id' => get_current_user_id(),
|
||||
'user_ip' => in_array( 'remote_ip', $metadata_keys, true ) ? Utils::get_client_ip() : '',
|
||||
'user_agent' => in_array( 'user_agent', $metadata_keys, true ) ? $this->get_user_agent() : '',
|
||||
'actions_count' => 0,
|
||||
'actions_succeeded_count' => 0,
|
||||
'meta' => wp_json_encode( [] ),
|
||||
],
|
||||
$fields
|
||||
);
|
||||
|
||||
if ( ! $submission_id ) {
|
||||
return $this->failure( __( 'Failed to save submission to database', 'elementor-pro' ) );
|
||||
}
|
||||
|
||||
$this->store_form_snapshot( $context, $fields );
|
||||
|
||||
return $this->success(
|
||||
__( 'Submission saved successfully', 'elementor-pro' ),
|
||||
[ 'submissionId' => $submission_id ]
|
||||
);
|
||||
}
|
||||
|
||||
private function normalize_metadata_keys( array $raw ): array {
|
||||
$allowed = [ 'remote_ip', 'user_agent' ];
|
||||
|
||||
return array_values( array_intersect( $raw, $allowed ) );
|
||||
}
|
||||
|
||||
private function prepare_fields( array $form_data, array $field_metadata = [] ): array {
|
||||
$fields = [];
|
||||
|
||||
foreach ( $form_data as $key => $value ) {
|
||||
$meta = $field_metadata[ $key ] ?? [];
|
||||
$label = ! empty( $meta['label'] ) ? $meta['label'] : ucwords( str_replace( [ '_', '-' ], ' ', $key ) );
|
||||
$type = ! empty( $meta['type'] ) ? $meta['type'] : $this->guess_field_type( $key, $value );
|
||||
|
||||
$fields[] = [
|
||||
'id' => $key,
|
||||
'type' => $type,
|
||||
'label' => $label,
|
||||
'value' => is_array( $value ) ? implode( ', ', $value ) : $value,
|
||||
];
|
||||
}
|
||||
|
||||
return $fields;
|
||||
}
|
||||
|
||||
private function guess_field_type( string $key, $value ): string {
|
||||
$key_lower = strtolower( $key );
|
||||
|
||||
if ( strpos( $key_lower, 'email' ) !== false ) {
|
||||
return 'email';
|
||||
}
|
||||
|
||||
if ( strpos( $key_lower, 'phone' ) !== false || strpos( $key_lower, 'tel' ) !== false ) {
|
||||
return 'tel';
|
||||
}
|
||||
|
||||
if ( is_array( $value ) ) {
|
||||
return 'checkbox';
|
||||
}
|
||||
|
||||
if ( strpos( $key_lower, 'message' ) !== false || ( is_string( $value ) && strlen( $value ) > 100 ) ) {
|
||||
return 'textarea';
|
||||
}
|
||||
|
||||
if ( strpos( $key_lower, 'url' ) !== false || strpos( $key_lower, 'website' ) !== false ) {
|
||||
return 'url';
|
||||
}
|
||||
|
||||
return 'text';
|
||||
}
|
||||
|
||||
private function store_form_snapshot( array $context, array $fields ): void {
|
||||
$snapshot_fields = array_map(
|
||||
function ( $field ) {
|
||||
return [
|
||||
'id' => $field['id'],
|
||||
'type' => $field['type'],
|
||||
'label' => $field['label'],
|
||||
];
|
||||
},
|
||||
$fields
|
||||
);
|
||||
|
||||
Form_Snapshot_Repository::instance()->create_or_update(
|
||||
$context['post_id'],
|
||||
$context['form_id'],
|
||||
[
|
||||
'name' => $context['form_name'],
|
||||
'fields' => $snapshot_fields,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
private function get_referer(): string {
|
||||
$referer = ElementorUtils::get_super_global_value( $_SERVER, 'HTTP_REFERER' );
|
||||
if ( $referer ) {
|
||||
return esc_url_raw( wp_unslash( $referer ) );
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
private function get_referer_title(): string {
|
||||
// For now, return empty as we don't have access to the frontend page title
|
||||
return '';
|
||||
}
|
||||
|
||||
private function get_user_agent(): string {
|
||||
$user_agent = ElementorUtils::get_super_global_value( $_SERVER, 'HTTP_USER_AGENT' );
|
||||
if ( $user_agent ) {
|
||||
return sanitize_textarea_field( wp_unslash( $user_agent ) );
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user