[],
'error' => [],
'admin_error' => [],
];
public $data = [];
public $errors = [];
private $current_form;
const SUCCESS = 'success';
const ERROR = 'error';
const FIELD_REQUIRED = 'required_field';
const INVALID_FORM = 'invalid_form';
const SERVER_ERROR = 'server_error';
const SUBSCRIBER_ALREADY_EXISTS = 'subscriber_already_exists';
const NONCE_ACTION = 'ehp-form-submission';
public static function get_default_messages(): array {
return [
self::SUCCESS => esc_html__( 'Your submission was successful.', 'hello-plus' ),
self::ERROR => esc_html__( 'Your submission failed because of an error.', 'hello-plus' ),
self::FIELD_REQUIRED => esc_html__( 'This field is required.', 'hello-plus' ),
self::INVALID_FORM => esc_html__( 'Your submission failed because the form is invalid.', 'hello-plus' ),
self::SERVER_ERROR => esc_html__( 'Your submission failed because of a server error.', 'hello-plus' ),
self::SUBSCRIBER_ALREADY_EXISTS => esc_html__( 'Subscriber already exists.', 'hello-plus' ),
];
}
public static function get_default_message( $id, $settings ): string {
if ( ! empty( $settings['custom_messages'] ) ) {
$field_id = $id . '_message';
if ( isset( $settings[ $field_id ] ) ) {
return $settings[ $field_id ];
}
}
$default_messages = self::get_default_messages();
return $default_messages[ $id ] ?? esc_html__( 'Unknown error.', 'hello-plus' );
}
public function ajax_send_form() {
check_ajax_referer( self::NONCE_ACTION, 'nonce' );
// $post_id that holds the form settings.
$post_id = filter_input( INPUT_POST, 'post_id', FILTER_SANITIZE_NUMBER_INT );
$queried_id = filter_input( INPUT_POST, 'queried_id', FILTER_SANITIZE_NUMBER_INT );
// $queried_id the post for dynamic values data.
if ( ! $queried_id ) {
$queried_id = $post_id;
}
// Make the post as global post for dynamic values.
Utils::elementor()->db->switch_to_post( $queried_id );
$form_id = filter_input( INPUT_POST, 'form_id', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
$elementor = Utils::elementor();
$document = $elementor->documents->get( $post_id );
$form = null;
$template_id = null;
if ( $document ) {
$form = Module::find_element_recursive( $document->get_elements_data(), (string) $form_id );
}
if ( ! empty( $form['templateID'] ) ) {
$template = Utils::elementor()->documents->get( $form['templateID'] );
if ( ! $template ) {
return false;
}
$template_id = $template->get_id();
$form = $template->get_elements_data()[0];
}
if ( empty( $form ) ) {
$this
->add_error_message( self::get_default_message( self::INVALID_FORM, [] ) )
->send();
}
// restore default values
$widget = $elementor->elements_manager->create_element_instance( $form );
$form['settings'] = $widget->get_settings_for_display();
$form['settings']['id'] = $form_id;
$form['settings']['form_post_id'] = $template_id ? $template_id : $post_id;
// TODO: Should be removed if there is an ability to edit "global widgets"
$form['settings']['edit_post_id'] = $post_id;
$this->current_form = $form;
if ( empty( $form['settings']['form_fields'] ) ) {
$this
->add_error_message( self::get_default_message( self::INVALID_FORM, $form['settings'] ) )
->send();
}
// the fields are not fixed so they will be validated afterwards
$form_fields = filter_input(
INPUT_POST,
'form_fields',
FILTER_SANITIZE_FULL_SPECIAL_CHARS,
FILTER_REQUIRE_ARRAY
);
$record = new Form_Record( $form_fields, $form );
if ( ! $record->validate( $this ) ) {
$this
->add_error( $record->get( 'errors' ) )
->add_error_message( self::get_default_message( self::ERROR, $form['settings'] ) )
->send();
}
$record->process_fields( $this );
//check for process errors
if ( ! empty( $this->errors ) ) {
$this->send();
}
$module = Module::instance();
$actions = $module->actions_registrar->get();
$errors = array_merge( $this->messages['error'], $this->messages['admin_error'] );
foreach ( $actions as $action ) {
$exception = null;
try {
$action->run( $record, $this );
$this->handle_bc_errors( $errors );
} catch ( \Exception $e ) {
$exception = $e;
// Add an admin error.
if ( ! in_array( $exception->getMessage(), $this->messages['admin_error'], true ) ) {
$this->add_admin_error_message( "{$action->get_label()} {$exception->getMessage()}" );
}
// Add a user error.
$this->add_error_message( $this->get_default_message( self::ERROR, $this->current_form['settings'] ) );
}
$errors = array_merge( $this->messages['error'], $this->messages['admin_error'] );
}
$this->send();
}
public function add_success_message( $message ) {
$this->messages['success'][] = $message;
return $this;
}
public function add_response_data( $key, $data ) {
$this->data[ $key ] = $data;
return $this;
}
public function add_error_message( $message ) {
$this->messages['error'][] = $message;
$this->set_success( false );
return $this;
}
public function add_error( $field, $message = '' ) {
if ( is_array( $field ) ) {
$this->errors += $field;
} else {
$this->errors[ $field ] = $message;
}
$this->set_success( false );
return $this;
}
public function add_admin_error_message( $message ) {
$this->messages['admin_error'][] = $message;
$this->set_success( false );
return $this;
}
public function set_success( $is_success ) {
$this->is_success = $is_success;
return $this;
}
public function send() {
if ( $this->is_success ) {
wp_send_json_success( [
'message' => $this->get_default_message( self::SUCCESS, $this->current_form['settings'] ),
'data' => $this->data,
] );
}
if ( empty( $this->messages['error'] ) && ! empty( $this->errors ) ) {
$this->add_error_message( $this->get_default_message( self::INVALID_FORM, $this->current_form['settings'] ) );
}
$post_id = filter_input( INPUT_POST, 'post_id', FILTER_SANITIZE_NUMBER_INT );
$error_msg = implode( '
', $this->messages['error'] );
if ( current_user_can( 'edit_post', $post_id ) && ! empty( $this->messages['admin_error'] ) ) {
$this->add_admin_error_message( esc_html__( 'This message is not visible to site visitors.', 'hello-plus' ) );
$error_msg .= '