D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
home
/
everqlsh
/
www
/
wp-admin
/
user
/
577040
/
Filename :
helpers.tar
back
Copy
helper-calculator.php 0000644 00000000163 15162502316 0010664 0 ustar 00 <?php /** * Calculator helper functions. * * @package Forminator */ if ( ! defined( 'ABSPATH' ) ) { die(); } helper-core.php 0000644 00000161453 15162502316 0007475 0 ustar 00 <?php /** * Core helper functions. * * @package Forminator */ /** * Return needed cap for admin pages * * @since 1.0 * @return string */ function forminator_get_admin_cap() { $cap = 'manage_options'; if ( is_multisite() && is_network_admin() ) { $cap = 'manage_network'; } if ( current_user_can( 'manage_forminator' ) ) { // phpcs:ignore WordPress.WP.Capabilities.Unknown -- false positive $cap = 'manage_forminator'; } return apply_filters( 'forminator_admin_cap', $cap ); } /** * Checks if user is allowed to perform the ajax actions * * @since 1.0 * @since 1.28 Added $slug param. * * @param string $slug The page slug that will be used for identifying permission. * * @return bool */ function forminator_is_user_allowed( $slug = '' ) { return current_user_can( forminator_get_permission( $slug ) ); } /** * Check if array value exists * * @since 1.0 * * @param array $array_values Array for check value exists. * @param string $key - the string key. * * @return bool */ function forminator_array_value_exists( $array_values, $key ) { return isset( $array_values[ $key ] ) && ( ! empty( $array_values[ $key ] ) || in_array( $array_values[ $key ], array( 0, '0' ), true ) ); } /** * Check for theme and return key. * * @since 1.36.0 * * @param string $key - default key value. * @param string $theme - current theme of the form. * @since 1.0 * @return string */ function forminator_get_prefixed_key_name( $key, $theme ) { // If the theme is 'basic', modify the key to have the prefix. if ( 'basic' === $theme ) { $key = 'basic-' . $key; } return $key; } /** * Check if array value exists * * @since 1.14.7 * * @param array $properties All properties. * @param string $key Key. */ function forminator_echo_font_weight( $properties, $key ) { $styles = array( 'italic', 'oblique' ); $weight = str_replace( 'None', 'inherit', $properties[ $key ] ); $weight = str_replace( 'regular', 'normal', $weight ); // if 400italic. $style = str_replace( (int) $weight, '', $weight ); if ( in_array( $style, $styles, true ) ) { // if just italic. $weight = intval( $weight ) ? intval( $weight ) : 'normal'; echo 'font-weight: ' . esc_attr( $weight ) . ';'; echo 'font-style: ' . esc_attr( $style ) . ';'; } else { echo 'font-weight: ' . esc_attr( $weight ) . ';'; } } /** * Convert object to array * * @since 1.0 * * @param object $object_values Object for convert to array. * * @return array */ function forminator_object_to_array( $object_values ) { $array = array(); if ( empty( $object_values ) ) { return $array; } foreach ( $object_values as $key => $value ) { $array[ $key ] = $value; } return $array; } /** * Return AJAX url * * @since 1.0 * @return mixed */ function forminator_ajax_url() { return admin_url( 'admin-ajax.php', is_ssl() ? 'https' : 'http' ); } /** * Checks if the AJAX call is valid * For logged-in usage only. * * @since 1.0 * @since 1.17 Added $query_arg * @since 1.28 Added $page_slug For determining capability to check. * * @param string $action Ajax action. * @param mixed $query_arg Query arguments. * @param string $page_slug Page slug. */ function forminator_validate_ajax( $action, $query_arg = false, $page_slug = '' ) { if ( ! check_ajax_referer( $action, $query_arg, false ) || ! forminator_is_user_allowed( $page_slug ) ) { wp_send_json_error( esc_html__( 'Invalid request, you are not allowed to do that action.', 'forminator' ) ); } } /** * Checks if the AJAX call is valid * * @param string $action Action name. * @param string|bool $query_arg Query arg. * * @return void */ function forminator_validate_nonce_ajax( $action, $query_arg = false ) { if ( ! check_ajax_referer( $action, $query_arg, false ) ) { wp_send_json_error( esc_html__( 'Invalid request, you are not allowed to do that action.', 'forminator' ) ); } } /** * Enqueue admin fonts * * @since 1.0 */ function forminator_admin_enqueue_fonts() { $version = '1.0'; wp_enqueue_style( 'forminator-roboto', 'https://fonts.bunny.net/css?family=Roboto+Condensed:300,300i,400,400i,700,700i|Roboto:300,300i,400,400i,500,500i,700,700i', array(), $version ); // cache as long as you can. wp_enqueue_style( 'forminator-opensans', 'https://fonts.bunny.net/css?family=Open+Sans:400,400i,700,700i', array(), $version ); // cache as long as you can. wp_enqueue_style( 'forminator-source', 'https://fonts.bunny.net/css?family=Source+Code+Pro', array(), $version ); // cache as long as you can. } /** * Enqueue admin styles * * @since 1.0 * @since 1.1 Remove forminator-admin css after migrate to shared-ui */ function forminator_admin_enqueue_styles() { wp_enqueue_style( 'shared-ui', forminator_plugin_url() . 'build/css/shared-ui.min.css', array(), FORMINATOR_VERSION, false ); } /** * Enqueue jQuery UI scripts on admin * * @since 1.13 Loaded locally * @since 1.0 */ function forminator_admin_jquery_ui() { wp_enqueue_script( 'jquery-ui-core' ); } /** * Load admin scripts * * @since 1.0 */ function forminator_admin_jquery_ui_init() { wp_enqueue_script( 'jquery-ui-core' ); wp_enqueue_script( 'jquery-ui-widget' ); wp_enqueue_script( 'jquery-ui-mouse' ); wp_enqueue_script( 'jquery-ui-tabs' ); wp_enqueue_script( 'jquery-ui-sortable' ); wp_enqueue_script( 'jquery-ui-draggable' ); wp_enqueue_script( 'jquery-ui-droppable' ); wp_enqueue_script( 'jquery-ui-datepicker' ); wp_enqueue_script( 'jquery-ui-resize' ); wp_enqueue_style( 'wp-color-picker' ); } /** * Enqueue SUI scripts on admin * * @since 1.1 */ function forminator_sui_scripts() { $chartjs_version = '2.7.2'; $sanitize_version = str_replace( '.', '-', FORMINATOR_SUI_VERSION ); $sui_body_class = "sui-$sanitize_version"; wp_enqueue_script( 'shared-ui', forminator_plugin_url() . 'build/js/shared-ui.min.js', array( 'jquery', 'clipboard' ), $sui_body_class, true ); } /** * Remove select2 script of PMPro on admin * * @since 1.36 */ function forminator_remove_pmpro_scripts() { if ( class_exists( 'PMPro_Field' ) ) { $screen = get_current_screen(); if ( ! str_contains( $screen->id, 'pmpro' ) ) { wp_deregister_script( 'pmpro_admin' ); wp_dequeue_script( 'pmpro_admin' ); wp_deregister_script( 'select2' ); wp_dequeue_script( 'select2' ); wp_deregister_style( 'select2' ); wp_dequeue_style( 'select2' ); } } } /** * Enqueue common admin scripts * * @since 1.0 * @param bool $is_new_page Load scripts for new page classes. */ function forminator_common_admin_enqueue_scripts( $is_new_page = false ) { // Load jquery ui. forminator_admin_jquery_ui_init(); // Load shared-ui scripts. forminator_sui_scripts(); // Load admin fonts. forminator_admin_enqueue_fonts(); // Load admin styles. forminator_admin_enqueue_styles(); // Remove PMPro plugin scripts. forminator_remove_pmpro_scripts(); // LOAD: Forminator UI – Select2. wp_enqueue_script( 'select2-forminator', forminator_plugin_url() . 'assets/forminator-ui/js/select2.full.min.js', array( 'jquery' ), FORMINATOR_VERSION, false ); wp_enqueue_script( 'ace-editor', forminator_plugin_url() . 'assets/js/library/ace/ace.js', array( 'jquery' ), FORMINATOR_VERSION, false ); wp_enqueue_script( 'google-charts', 'https://www.gstatic.com/charts/loader.js', array( 'jquery' ), FORMINATOR_VERSION, false ); if ( function_exists( 'wp_enqueue_editor' ) ) { wp_enqueue_editor(); } if ( function_exists( 'wp_enqueue_media' ) ) { wp_enqueue_media(); } wp_enqueue_script( 'forminator-admin-layout', forminator_plugin_url() . 'requirejs/admin/layout.js', array( 'jquery' ), FORMINATOR_VERSION, false ); $forminator_data = new Forminator_Admin_Data(); $forminator_l10n = new Forminator_Admin_L10n(); $data = $forminator_data->get_options_data(); $l10n = $forminator_l10n->get_l10n_strings(); wp_localize_script( 'forminator-admin', 'forminatorData', $data ); wp_localize_script( 'forminator-admin', 'forminatorl10n', $l10n ); wp_enqueue_script( 'forminator-admin' ); if ( $is_new_page ) { forminator_enqueue_color_picker_alpha(); // Load front scripts for preview_form. forminator_print_front_styles(); forminator_print_front_scripts(); } } /** * Enqueue color picker alpha scripts * * @since 1.14 */ function forminator_enqueue_color_picker_alpha() { wp_enqueue_script( 'wp-color-picker-alpha', forminator_plugin_url() . 'assets/js/library/wp-color-picker-alpha.min.js', array( 'wp-color-picker' ), FORMINATOR_VERSION, true ); wp_localize_script( 'wp-color-picker-alpha', 'wpColorPickerL10n', array( 'clear' => esc_html__( 'Clear', 'forminator' ), 'clearAriaLabel' => esc_html__( 'Clear color', 'forminator' ), 'defaultString' => esc_html__( 'Default', 'forminator' ), 'defaultAriaLabel' => esc_html__( 'Select default color', 'forminator' ), 'pick' => esc_html__( 'Select Color', 'forminator' ), 'defaultLabel' => esc_html__( 'Color value', 'forminator' ), ) ); } /** * Enqueue front-end styles * * Only use core here, if the style dynamically loaded, then load on model * * @since 1.0 */ function forminator_print_front_styles() { // Load old styles. // Remove on v1.12.0 quizzes migrate to Forminator UI. Forminator_Assets_Enqueue::fui_enqueue_style( 'forminator-ui-icons', forminator_plugin_url() . 'assets/forminator-ui/css/forminator-icons.min.css', array(), FORMINATOR_VERSION ); Forminator_Assets_Enqueue::fui_enqueue_style( 'forminator-ui-utilities', forminator_plugin_url() . 'assets/forminator-ui/css/src/forminator-utilities.min.css', array(), FORMINATOR_VERSION ); Forminator_Assets_Enqueue::fui_enqueue_style( 'forminator-ui-grid-open', forminator_plugin_url() . 'assets/forminator-ui/css/src/grid/forminator-grid.open.min.css', array(), FORMINATOR_VERSION ); Forminator_Assets_Enqueue::fui_enqueue_style( 'forminator-ui-grid-enclosed', forminator_plugin_url() . 'assets/forminator-ui/css/src/grid/forminator-grid.enclosed.min.css', array(), FORMINATOR_VERSION ); Forminator_Assets_Enqueue::fui_enqueue_style( 'forminator-ui-basic', forminator_plugin_url() . 'assets/forminator-ui/css/forminator-base.min.css', array(), FORMINATOR_VERSION ); Forminator_Assets_Enqueue::fui_enqueue_style( 'forminator-ui', forminator_plugin_url() . 'assets/forminator-ui/css/src/forminator-ui.min.css', array(), FORMINATOR_VERSION ); } /** * Enqueue front-end script * * Only use core here, if the style dynamically loaded, then load on model * * @since 1.0 */ function forminator_print_front_scripts() { global $wp_locale; // LOAD: ChartJS. wp_enqueue_script( 'forminator-chartjs', forminator_plugin_url() . 'assets/js/front/Chart.min.js', array( 'jquery' ), '2.8.0', false ); $save_global_color = "if (typeof window !== 'undefined' && typeof window.Color !== 'undefined') {window.notChartColor = window.Color;}"; $restore_global_color = "if (typeof window !== 'undefined' && typeof window.notChartColor !== 'undefined') {window.Color = window.notChartColor;}"; wp_add_inline_script( 'forminator-chartjs', $save_global_color, 'before' ); wp_add_inline_script( 'forminator-chart', $save_global_color, 'before' ); wp_add_inline_script( 'forminator-chartjs', $restore_global_color ); wp_add_inline_script( 'forminator-chart', $restore_global_color ); // LOAD: Datalabels plugin for ChartJS. wp_enqueue_script( 'chartjs-plugin-datalabels', forminator_plugin_url() . 'assets/js/front/chartjs-plugin-datalabels.min.js', array( 'jquery' ), '0.6.0', false ); // LOAD: Forminator UI Select2. wp_enqueue_script( 'select2-forminator', forminator_plugin_url() . 'assets/forminator-ui/js/select2.full.min.js', array( 'jquery' ), FORMINATOR_VERSION, false ); // LOAD: Forminator UI Global Scripts. wp_enqueue_script( 'forminator-ui', forminator_plugin_url() . 'assets/forminator-ui/js/forminator-ui.min.js', array( 'jquery' ), '1.7.1', false ); // TODO : check if its always needed. wp_enqueue_script( 'forminator-jquery-validate', forminator_plugin_url() . 'assets/js/library/jquery.validate.min.js', array( 'jquery' ), FORMINATOR_VERSION, false ); wp_enqueue_script( 'forminator-front-scripts', forminator_plugin_url() . 'build/front/front.multi.min.js', array( 'jquery', 'forminator-ui', 'forminator-jquery-validate' ), FORMINATOR_VERSION, false ); wp_localize_script( 'forminator-front-scripts', 'ForminatorFront', forminator_localize_data() ); // localize Datepicker js. $datepicker_date_format = str_replace( array( 'd', 'j', 'l', 'z', // Day. 'F', 'M', 'n', 'm', // Month. 'Y', 'y', // Year. ), array( 'dd', 'd', 'DD', 'o', 'MM', 'M', 'm', 'mm', 'yy', 'y', ), get_option( 'date_format' ) ); $datepicker_data = array( 'monthNames' => array_values( $wp_locale->month ), 'monthNamesShort' => array_values( $wp_locale->month_abbrev ), 'dayNames' => array_values( $wp_locale->weekday ), 'dayNamesShort' => array_values( $wp_locale->weekday_abbrev ), 'dayNamesMin' => array_values( $wp_locale->weekday_initial ), 'dateFormat' => $datepicker_date_format, 'firstDay' => absint( get_option( 'start_of_week' ) ), 'isRTL' => $wp_locale->is_rtl(), ); wp_localize_script( 'forminator-front-scripts', 'datepickerLang', $datepicker_data ); } /** * Return front-end localization data * * @since 1.0 */ function forminator_localize_data() { $data = array( 'ajaxUrl' => forminator_ajax_url(), 'cform' => array( 'processing' => esc_html__( 'Submitting form, please wait', 'forminator' ), 'error' => esc_html__( 'An error occurred while processing the form. Please try again', 'forminator' ), 'upload_error' => esc_html__( 'An upload error occurred while processing the form. Please try again', 'forminator' ), 'pagination_prev' => esc_html__( 'Previous', 'forminator' ), 'pagination_next' => esc_html__( 'Next', 'forminator' ), 'pagination_go' => esc_html__( 'Submit', 'forminator' ), 'gateway' => array( 'processing' => esc_html__( 'Processing payment, please wait', 'forminator' ), 'paid' => esc_html__( 'Success! Payment confirmed. Submitting form, please wait', 'forminator' ), 'error' => esc_html__( 'Error! Something went wrong when verifying the payment', 'forminator' ), ), 'captcha_error' => esc_html__( 'Invalid CAPTCHA', 'forminator' ), 'no_file_chosen' => esc_html__( 'No file chosen', 'forminator' ), // This is the file "/build/js/utils.js" found into intlTelInput plugin. Renamed so it makes sense within the "js/library" directory context. 'intlTelInput_utils_script' => forminator_plugin_url() . 'assets/js/library/intlTelInputUtils.js', 'process_error' => esc_html__( 'Please try again', 'forminator' ), 'payment_failed' => esc_html__( 'Payment failed. Please try again.', 'forminator' ), 'payment_cancelled' => esc_html__( 'Payment was cancelled', 'forminator' ), ), 'poll' => array( 'processing' => esc_html__( 'Submitting vote, please wait', 'forminator' ), 'error' => esc_html__( 'An error occurred saving the vote. Please try again', 'forminator' ), ), 'quiz' => array( 'view_results' => esc_html__( 'View Results', 'forminator' ), ), 'select2' => array( 'load_more' => esc_html__( 'Loading more results…', 'forminator' ), 'no_result_found' => esc_html__( 'No results found', 'forminator' ), 'searching' => esc_html__( 'Searching…', 'forminator' ), 'loaded_error' => esc_html__( 'The results could not be loaded.', 'forminator' ), ), ); /** * Filter localize data * * @param array $data Current data array. */ return apply_filters( 'forminator_localize_data', $data ); } /** * Return existing templates * * @since 1.0 * * @param string $path Path. * @param array $args Arguments. * * @return mixed */ function forminator_template( $path, $args = array() ) { $file = forminator_plugin_dir() . "admin/views/$path.php"; $content = ''; if ( is_file( $file ) ) { ob_start(); if ( isset( $args['id'] ) ) { $args['template_class'] = $args['class']; $args['template_id'] = $args['id']; $title = $args['title']; $header_callback = $args['header_callback']; $main_callback = $args['main_callback']; $footer_callback = $args['footer_callback']; } include $file; $content = ob_get_clean(); } return $content; } /** * Return if template exist * * @since 1.0 * * @param string $path Path. * * @return bool */ function forminator_template_exist( $path ) { $file = forminator_plugin_dir() . "admin/views/$path.php"; return is_file( $file ); } /** * Return if paypal settings are filled * * @since 1.0 * @return bool */ function forminator_has_paypal_settings() { $config = get_option( 'forminator_paypal_configuration', array() ); if ( empty( $config ) ) { return false; } return true; } /** * Return if captcha settings are filled * * @since 1.0 * @return bool */ function forminator_has_captcha_settings() { $key = get_option( 'forminator_captcha_key', false ); $secret = get_option( 'forminator_captcha_secret', false ); if ( empty( $key ) || empty( $secret ) ) { return false; } return true; } /** * Return if captcha v2 settings are filled * * @since 1.0 * @return bool */ function forminator_has_v2_captcha_settings() { $key = get_option( 'forminator_captcha_key', false ); $secret = get_option( 'forminator_captcha_secret', false ); if ( empty( $key ) || empty( $secret ) ) { return false; } return true; } /** * Return if captcha v2 invisible settings are filled * * @since 1.0 * @return bool */ function forminator_has_v2_invisible_captcha_settings() { $key = get_option( 'forminator_v2_invisible_captcha_key', false ); $secret = get_option( 'forminator_v2_invisible_captcha_secret', false ); if ( empty( $key ) || empty( $secret ) ) { return false; } return true; } /** * Return if captcha v3 settings are filled * * @since 1.0 * @return bool */ function forminator_has_v3_captcha_settings() { $key = get_option( 'forminator_v3_captcha_key', false ); $secret = get_option( 'forminator_v3_captcha_secret', false ); if ( empty( $key ) || empty( $secret ) ) { return false; } return true; } /** * Return if hCaptcha keys are filled * * @since 1.15.5 * @return bool */ function forminator_has_hcaptcha_settings() { $key = get_option( 'forminator_hcaptcha_key', false ); $secret = get_option( 'forminator_hcaptcha_secret', false ); if ( empty( $key ) || empty( $secret ) ) { return false; } return true; } /** * Return if Cloudflare Turnstile keys are filled * * @return bool */ function forminator_has_turnstile_settings(): bool { $key = get_option( 'forminator_turnstile_key', false ); $secret = get_option( 'forminator_turnstile_secret', false ); if ( empty( $key ) || empty( $secret ) ) { return false; } return true; } /** * Return if Stripe is is_connected * * @since 1.7 * @return bool */ function forminator_has_stripe_connected() { if ( class_exists( 'Forminator_Gateway_Stripe' ) ) { try { $stripe = new Forminator_Gateway_Stripe(); if ( $stripe->is_test_ready() && $stripe->is_live_ready() ) { return true; } } catch ( Forminator_Gateway_Exception $e ) { return false; } } return false; } /** * Return form ID * * @since 1.0 * @return int */ function forminator_get_form_id_helper() { $screen = get_current_screen(); $ids = forminator_get_page_ids_helper(); if ( ! in_array( $screen->id, $ids, true ) ) { return 0; } $form_id = (int) filter_input( INPUT_GET, 'form_id', FILTER_VALIDATE_INT ); return $form_id; } /** * Get Page IDs * * @since 1.2 * @return array */ function forminator_get_page_ids_helper() { // Sanitize is requied when user uses space inside the translation. $name = sanitize_title( esc_html__( 'forminator', 'forminator' ) ); if ( FORMINATOR_PRO ) { $title = sanitize_title( esc_html__( 'Forminator Pro', 'forminator' ) ); return array( $title . '_page_forminator-quiz-view', $title . '_page_forminator-cform-view', $title . '_page_forminator-poll-view', $title . '_page_forminator-entries', ); } else { // Free version. $title = sanitize_title( esc_html__( 'Forminator', 'forminator' ) ); return array( $title . '_page_forminator-quiz-view', $title . '_page_forminator-cform-view', $title . '_page_forminator-poll-view', $title . '_page_forminator-entries', ); } } /** * Return form type * * @param mixed $common_name Common name. * * @since 1.0 * @return int|null|string */ function forminator_get_form_type_helper( $common_name = false ) { $screen = get_current_screen(); $ids = forminator_get_page_ids_helper(); if ( ! in_array( $screen->id, $ids, true ) ) { return 0; } $form_type = ''; $page = Forminator_Core::sanitize_text_field( 'page', null ); if ( is_null( $page ) ) { return null; } switch ( $page ) { case 'forminator-quiz-view': $form_type = 'quiz'; break; case 'forminator-poll-view': $form_type = 'poll'; break; case 'forminator-cform-view': $form_type = 'cform'; break; case 'forminator-entries': $form_type = Forminator_Core::sanitize_text_field( 'form_type' ); switch ( $form_type ) { case 'forminator_forms': if ( ! $common_name ) { $form_type = 'cform'; } else { $form_type = 'form'; } break; case 'forminator_polls': $form_type = 'poll'; break; case 'forminator_quizzes': $form_type = 'quiz'; break; default: break; } break; default: break; } return $form_type; } /** * Forminator get exporter info * * @since 1.0 * * @param string $info Exporter Info. * @param string $key Key. * * @return mixed */ function forminator_get_exporter_info( $info, $key ) { $data = get_option( 'forminator_entries_export_schedule', array() ); if ( 'email' === $info && ! empty( $data[ $key ][ $info ] ) && ! is_array( $data[ $key ][ $info ] ) ) { return array( $data[ $key ][ $info ] ); } return isset( $data[ $key ][ $info ] ) ? $data[ $key ][ $info ] : null; } /** * Return current logged in username * * @since 1.0 * @return string */ function forminator_get_current_username() { $current_user = wp_get_current_user(); if ( ! ( $current_user instanceof WP_User ) || empty( $current_user->user_login ) ) { return ''; } $username = ! empty( $current_user->user_firstname ) ? $current_user->user_firstname : $current_user->user_login; return $username; } /** * Delete export logs * * @since 1.0 * * @param int $form_id Form Id. * * @return bool */ function delete_export_logs( $form_id ) { if ( ! $form_id ) { return false; } $data = get_option( 'forminator_exporter_log', array() ); $delete = false; if ( isset( $data[ $form_id ] ) ) { unset( $data[ $form_id ] ); $delete = update_option( 'forminator_exporter_log', $data ); } return $delete; } /** * Forminator get export logs * * @since 1.0 * * @param int $form_id Form Id. * * @return array */ function forminator_get_export_logs( $form_id ) { if ( ! $form_id ) { return array(); } $data = get_option( 'forminator_exporter_log', array() ); $row = isset( $data[ $form_id ] ) ? $data[ $form_id ] : array(); foreach ( $row as &$item ) { $item['time'] = gmdate( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $item['time'] ); } return $row; } /** * Return current page url * * @since 1.0.3 * * @return mixed */ function forminator_get_current_url() { if ( ! empty( $_SERVER['REQUEST_URI'] ) && false !== strpos( esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ), 'admin-ajax.php' ) ) { $post_id = url_to_postid( wp_get_referer() ); } else { $post_id = get_the_ID(); } return esc_url( get_permalink( $post_id ) ); } /** * Detect whether current request comes from any page builder preveiw page * * @since 1.13 * * @return bool */ function forminator_is_page_builder_preview() { static $decision; if ( isset( $decision ) ) { return $decision; } $decision = false; global $wp; // Check Pro theme by Themeco https://theme.co/. if ( defined( 'X_TEMPLATE_PATH' ) && 'cornerstone-endpoint' === $wp->request ) { $decision = true; return $decision; } // Check DIVI theme page builder. // Note : following lines of codes are perfect to detect DIVI builder. // But DIVI builder is not showing Forminator forms in preview mood. // So commenting out these code for now. /* // $et_pb_preview = Forminator_Core::sanitize_text_field( 'et_pb_preview' ); // if( defined( 'ET_CORE_VERSION' ) && $et_pb_preview ) { // $decision = true; // return $decision; // } */ // Check Elementor plugin. $action = Forminator_Core::sanitize_text_field( 'action' ); $editor_post_id = (int) Forminator_Core::sanitize_text_field( 'editor_post_id' ); if ( defined( 'ELEMENTOR_VERSION' ) && 'elementor_ajax' === $action && $editor_post_id ) { $decision = true; return $decision; } return $decision; } /** * Return week day from number * * @since 1.0 * * @param string $day Day. * * @return string */ function forminator_get_day_translated( $day ) { $days = array( 'mon' => esc_html__( 'Monday', 'forminator' ), 'tue' => esc_html__( 'Tuesday', 'forminator' ), 'wed' => esc_html__( 'Wednesday', 'forminator' ), 'thu' => esc_html__( 'Thursday', 'forminator' ), 'fri' => esc_html__( 'Friday', 'forminator' ), 'sat' => esc_html__( 'Saturday', 'forminator' ), 'sun' => esc_html__( 'Sunday', 'forminator' ), ); return isset( $days[ $day ] ) ? $days[ $day ] : $day; } /** * Add log of forminator * * By default it will check `WP_DEBUG` and `FORMINATOR_DEBUG` * Then will check `filters` * * @since 1.1 * @since 1.3 add FORMINATOR_DEBUG as enabled flag */ function forminator_maybe_log() { $wp_debug_enabled = ( defined( 'WP_DEBUG' ) && WP_DEBUG ); $enabled = ( defined( 'FORMINATOR_DEBUG' ) && FORMINATOR_DEBUG ); $enabled = ( $wp_debug_enabled && $enabled ); /** * Filter log enable for forminator * * By default it will check `WP_DEBUG`, `FORMINATOR_DEBUG` must be true * * @since 1.1 * * @param bool $enabled current enable status. */ $enabled = apply_filters( 'forminator_enable_log', $enabled ); if ( $enabled ) { $args = func_get_args(); $message = wp_json_encode( $args ); if ( false !== $message ) { error_log( '[Forminator] ' . $message );// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log } } } /** * Helper to cast variable to target type * * @since 1.6 * * @param mixed $variable Variable. * @param string $type Variable type. * * @return mixed */ function forminator_var_type_cast( $variable, $type ) { switch ( $type ) { case 'bool': if ( ! is_bool( $variable ) ) { $variable = filter_var( $variable, FILTER_VALIDATE_BOOLEAN ); } break; case 'str': if ( ! is_string( $variable ) ) { if ( is_array( $variable ) ) { $variable = implode( ', ', $variable ); } else { // juggling. $variable = (string) $variable; } } break; case 'num': if ( ! is_numeric( $variable ) ) { // juggling. $variable = (int) $variable; } $variable = $variable + 0; break; case 'array': if ( ! is_array( $variable ) ) { // juggling. $variable = (array) $variable; } break; default: break; } return $variable; } /** * Get chart colors combination for Polls * * @since 1.5.3 * * @param int $poll_id Poll Id. * @param bool $accessibility_enabled Enable accessibility. * * @return array */ function forminator_get_poll_chart_colors( $poll_id = null, $accessibility_enabled = false ) { $chart_colors = $accessibility_enabled ? array( 'rgba(137, 137, 137, 0.2)', // Monochrome Blue. 'rgba(149, 149, 149, 0.2)', // Monochrome Red. 'rgba(207 ,207 , 207, 0.2)', // Monochrome Yellow. 'rgba(156, 156, 156, 0.2)', // Monochrome Green. 'rgba(177 ,177 , 177, 0.2)', // Monochrome Orange. 'rgba(134 ,134 , 134, 0.2)', // Monochrome Purple. 'rgba(129 ,129 , 129, 0.2)', // Monochrome Blue Alt. 'rgba(133 ,133 , 133, 0.2)', // Monochrome Red Alt. 'rgba(206 ,206 , 206, 0.2)', // Monochrome Yellow Alt. 'rgba(162 ,162 , 162, 0.2)', // Monochrome Green Alt. 'rgba(156 ,156 , 156, 0.2)', // Monochrome Orange Alt. 'rgba(114 ,114 , 114, 0.2)', // Monochrome Purple Alt. 'rgba(0, 0, 0, 0.2)', // Monochrome Black. 'rgba(136, 136, 136, 0.2)', // Monochrome Black Alt. ) : array( 'rgba(54, 162, 235, 0.2)', // Blue. 'rgba(255, 99, 132, 0.2)', // Red. 'rgba(255, 206, 86, 0.2)', // Yellow. 'rgba(75, 192, 192, 0.2)', // Green. 'rgba(255, 159, 64, 0.2)', // Orange. 'rgba(153, 102, 255, 0.2)', // Purple. 'rgba(102, 137, 161, 0.2)', // Blue Alt. 'rgba(234, 86, 118, 0.2)', // Red Alt. 'rgba(216, 220, 106, 0.2)', // Yellow Alt. 'rgba(107, 193, 146, 0.2)', // Green Alt. 'rgba(235, 130, 88, 0.2)', // Orange Alt. 'rgba(153, 93, 129, 0.2)', // Purple Alt. 'rgba(0, 0, 0, 0.2)', // Black. 'rgba(136, 136, 136, 0.2)', // Black Alt. ); /** * Filter chart colors to be used for polls * * @since 1.5.3 * * @param array $chart_colors * @param int $poll_id */ $chart_colors = apply_filters( 'forminator_poll_chart_colors', $chart_colors, $poll_id ); return $chart_colors; } /** * Return CAPTCHA languages * * @since 1.5.4 * @return array */ function forminator_get_captcha_languages() { return apply_filters( 'forminator_captcha_languages', array( 'ar' => esc_html__( 'Arabic', 'forminator' ), 'af' => esc_html__( 'Afrikaans', 'forminator' ), 'am' => esc_html__( 'Amharic', 'forminator' ), 'hy' => esc_html__( 'Armenian', 'forminator' ), 'az' => esc_html__( 'Azerbaijani', 'forminator' ), 'eu' => esc_html__( 'Basque', 'forminator' ), 'bn' => esc_html__( 'Bengali', 'forminator' ), 'bg' => esc_html__( 'Bulgarian', 'forminator' ), 'ca' => esc_html__( 'Catalan', 'forminator' ), 'zh-HK' => esc_html__( 'Chinese (Hong Kong)', 'forminator' ), 'zh-CN' => esc_html__( 'Chinese (Simplified)', 'forminator' ), 'zh-TW' => esc_html__( 'Chinese (Traditional)', 'forminator' ), 'hr' => esc_html__( 'Croatian', 'forminator' ), 'cs' => esc_html__( 'Czech', 'forminator' ), 'da' => esc_html__( 'Danish', 'forminator' ), 'nl' => esc_html__( 'Dutch', 'forminator' ), 'en-GB' => esc_html__( 'English (UK)', 'forminator' ), 'en' => esc_html__( 'English (US)', 'forminator' ), 'et' => esc_html__( 'Estonian', 'forminator' ), 'fil' => esc_html__( 'Filipino', 'forminator' ), 'fi' => esc_html__( 'Finnish', 'forminator' ), 'fr' => esc_html__( 'French', 'forminator' ), 'fr-CA' => esc_html__( 'French (Canadian)', 'forminator' ), 'gl' => esc_html__( 'Galician', 'forminator' ), 'ka' => esc_html__( 'Georgian', 'forminator' ), 'de' => esc_html__( 'German', 'forminator' ), 'de-AT' => esc_html__( 'German (Austria)', 'forminator' ), 'de-CH' => esc_html__( 'German (Switzerland)', 'forminator' ), 'el' => esc_html__( 'Greek', 'forminator' ), 'gu' => esc_html__( 'Gujarati', 'forminator' ), 'iw' => esc_html__( 'Hebrew', 'forminator' ), 'hi' => esc_html__( 'Hindi', 'forminator' ), 'hu' => esc_html__( 'Hungarain', 'forminator' ), 'is' => esc_html__( 'Icelandic', 'forminator' ), 'id' => esc_html__( 'Indonesian', 'forminator' ), 'it' => esc_html__( 'Italian', 'forminator' ), 'ja' => esc_html__( 'Japanese', 'forminator' ), 'kn' => esc_html__( 'Kannada', 'forminator' ), 'ko' => esc_html__( 'Korean', 'forminator' ), 'lo' => esc_html__( 'Laothian', 'forminator' ), 'lv' => esc_html__( 'Latvian', 'forminator' ), 'lt' => esc_html__( 'Lithuanian', 'forminator' ), 'ms' => esc_html__( 'Malay', 'forminator' ), 'ml' => esc_html__( 'Malayalam', 'forminator' ), 'mr' => esc_html__( 'Marathi', 'forminator' ), 'mn' => esc_html__( 'Mongolian', 'forminator' ), 'no' => esc_html__( 'Norwegian', 'forminator' ), 'fa' => esc_html__( 'Persian', 'forminator' ), 'pl' => esc_html__( 'Polish', 'forminator' ), 'pt' => esc_html__( 'Portuguese', 'forminator' ), 'pt-BR' => esc_html__( 'Portuguese (Brazil)', 'forminator' ), 'pt-PT' => esc_html__( 'Portuguese (Portugal)', 'forminator' ), 'ro' => esc_html__( 'Romanian', 'forminator' ), 'ru' => esc_html__( 'Russian', 'forminator' ), 'rs' => esc_html__( 'Serbian', 'forminator' ), 'si' => esc_html__( 'Sinhalese', 'forminator' ), 'sk' => esc_html__( 'Slovak', 'forminator' ), 'sl' => esc_html__( 'Slovenian', 'forminator' ), 'es' => esc_html__( 'Spanish', 'forminator' ), 'es-419' => esc_html__( 'Spanish (Latin America)', 'forminator' ), 'sw' => esc_html__( 'Swahili', 'forminator' ), 'sv' => esc_html__( 'Swedish', 'forminator' ), 'ta' => esc_html__( 'Tamil', 'forminator' ), 'te' => esc_html__( 'Telugu', 'forminator' ), 'th' => esc_html__( 'Thai', 'forminator' ), 'tr' => esc_html__( 'Turkish', 'forminator' ), 'uk' => esc_html__( 'Ukrainian', 'forminator' ), 'ur' => esc_html__( 'Urdu', 'forminator' ), 'vi' => esc_html__( 'Vietnamese', 'forminator' ), 'zu' => esc_html__( 'Zulu', 'forminator' ), ) ); } /** * Flag whether doc link should shown or not * * @since 1.6 * @return bool */ function forminator_is_show_documentation_link() { if ( Forminator::is_wpmudev_member() ) { return ! apply_filters( 'wpmudev_branding_hide_doc_link', false ); } return true; } /** * Flag whether branding should shown or not * * @since 1.6 * @return bool */ function forminator_is_show_branding() { if ( Forminator::is_wpmudev_member() ) { return ! apply_filters( 'wpmudev_branding_hide_branding', false ); } return true; } /** * Check if whitelabel enable. * * @return bool */ function forminator_can_whitelabel() { if ( ! class_exists( '\WPMUDEV_Dashboard' ) || ! isset( \WPMUDEV_Dashboard::$whitelabel ) || ( method_exists( \WPMUDEV_Dashboard::$whitelabel, 'can_whitelabel' ) && ! \WPMUDEV_Dashboard::$whitelabel->can_whitelabel() ) ) { return false; } return true; } /** * Get Dashboard settings * * @since 1.6.3 * * @param string|null $widget Widget. * @param mixed $default_value Default value. * * @return array|mixed */ function forminator_get_dashboard_settings( $widget = null, $default_value = array() ) { $settings = array(); $dashboard_settings = get_option( 'forminator_dashboard_settings', $default_value ); if ( ! is_null( $widget ) ) { if ( isset( $dashboard_settings[ $widget ] ) ) { $settings = $dashboard_settings[ $widget ]; } else { $settings = $default_value; } } /** * Filter Dashboard settings * * @since 1.6.3 * * @param mixed $settings * @param string widget * @param mixed $default_value * * @return mixed */ $settings = apply_filters( 'forminator_dashboard_settings', $settings, $widget, $default_value ); return $settings; } /** * Reset Forminator Settings * * @see forminator_delete_custom_options() * @see forminator_delete_addon_options() * @see forminator_delete_custom_posts() * @since 1.6.3 */ function forminator_reset_settings() { global $wpdb; /** * Fires before Settings reset * * @since 1.6.3 */ do_action( 'forminator_before_reset_settings' ); // Permissions option is deleted inside this function too. forminator_delete_permissions(); /** * Forminator_delete_custom_options * * @see forminator_delete_custom_options() */ delete_option( 'forminator_pagination_listings' ); delete_option( 'forminator_pagination_entries' ); delete_option( 'forminator_captcha_key' ); delete_option( 'forminator_captcha_secret' ); delete_option( 'forminator_v2_invisible_captcha_key' ); delete_option( 'forminator_v2_invisible_captcha_secret' ); delete_option( 'forminator_v3_captcha_key' ); delete_option( 'forminator_v3_captcha_secret' ); delete_option( 'forminator_captcha_language' ); delete_option( 'forminator_captcha_theme' ); delete_option( 'forminator_captcha_tab_saved' ); delete_option( 'forminator_hcaptcha_key' ); delete_option( 'forminator_hcaptcha_secret' ); delete_option( 'forminator_welcome_dismissed' ); delete_option( 'forminator_version' ); delete_option( 'forminator_retain_votes_interval_number' ); delete_option( 'forminator_retain_votes_interval_unit' ); delete_option( 'forminator_retain_submissions_interval_number' ); delete_option( 'forminator_retain_submissions_interval_unit' ); delete_option( 'forminator_enable_erasure_request_erase_form_submissions' ); delete_option( 'forminator_form_privacy_settings' ); delete_option( 'forminator_poll_privacy_settings' ); delete_option( 'forminator_retain_ip_interval_number' ); delete_option( 'forminator_retain_ip_interval_unit' ); delete_option( 'retain_geolocation_forever' ); delete_option( 'forminator_retain_geolocation_interval_number' ); delete_option( 'forminator_retain_geolocation_interval_unit' ); delete_option( 'forminator_retain_poll_submissions_interval_number' ); delete_option( 'forminator_retain_poll_submissions_interval_unit' ); delete_option( 'forminator_posts_map' ); delete_option( 'forminator_retain_quiz_submissions_interval_number' ); delete_option( 'forminator_retain_quiz_submissions_interval_unit' ); delete_option( 'forminator_dashboard_settings' ); delete_option( 'forminator_sender_email_address' ); delete_option( 'forminator_sender_name' ); delete_option( 'forminator_enable_accessibility' ); delete_option( 'forminator_entries_export_schedule' ); delete_option( 'forminator_paypal_api_mode' ); delete_option( 'forminator_paypal_secret' ); delete_option( 'forminator_currency' ); delete_option( 'forminator_exporter_log' ); delete_option( 'forminator_uninstall_clear_data' ); delete_option( 'forminator_custom_upload' ); delete_option( 'forminator_custom_upload_root' ); delete_option( 'forminator_stripe_configuration' ); delete_option( 'forminator_stripe_payment_intents' ); delete_option( 'forminator_paypal_configuration' ); delete_option( 'forminator_usage_tracking' ); /** * Forminator_delete_addon_options * * @see forminator_delete_addon_options() */ delete_option( 'forminator_activated_addons' ); $registered_addons = forminator_get_registered_addons(); foreach ( $registered_addons as $addon_slug => $registered_addon ) { delete_option( "forminator_addon_{$addon_slug}_version" ); delete_option( "forminator_addon_{$addon_slug}_settings" ); } /** * Forminator_delete_custom_posts * * @see forminator_delete_custom_posts() */ // Now we delete the custom posts. $entry_table = Forminator_Database_Tables::get_table_name( Forminator_Database_Tables::FORM_ENTRY ); $entry_meta_table = Forminator_Database_Tables::get_table_name( Forminator_Database_Tables::FORM_ENTRY_META ); $views_table = Forminator_Database_Tables::get_table_name( Forminator_Database_Tables::FORM_VIEWS ); $reports_table = Forminator_Database_Tables::get_table_name( Forminator_Database_Tables::FORM_REPORTS ); $forms_sql = "SELECT `ID` FROM {$wpdb->posts} WHERE `post_type` = %s"; $form_types = forminator_form_types(); foreach ( $form_types as $type ) { $query = $wpdb->prepare( $forms_sql, $type ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $ids = $wpdb->get_col( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( $ids ) { foreach ( $ids as $id ) { Forminator_Form_Entry_Model::delete_form_entry_cache( $id ); wp_delete_post( $id ); } } } $wpdb->query( "TRUNCATE TABLE {$entry_table}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery $wpdb->query( "TRUNCATE TABLE {$entry_meta_table}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery $wpdb->query( "TRUNCATE TABLE {$views_table}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery $wpdb->query( "TRUNCATE TABLE {$reports_table}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery /** * Fires after Settings reset * * @since 1.27.0 */ do_action( 'forminator_after_reset_settings' ); } /** * Get Forminator CPT names * * @return array */ function forminator_form_types() { $form_types = array( 'forminator_forms', 'forminator_polls', 'forminator_quizzes', ); return $form_types; } /** * DON'T USE IT!!! It's only for backward compatibility * Get prefix based on module slug. * * @param string $module_slug Module slug. * @param string $form_prefix Optional. Prefix before Custom Form type or `post_type` value. * @param bool $ucfirst Optional. With capital the first letter. * @param bool $plural Optional. Plural or singular. * @return string */ function forminator_get_prefix( $module_slug, $form_prefix = '', $ucfirst = false, $plural = false ) { if ( 'post_type' === $form_prefix ) { $prefix = ''; switch ( $module_slug ) { case 'form': $prefix = 'forminator_forms'; break; case 'poll': $prefix = 'forminator_polls'; break; case 'quiz': $prefix = 'forminator_quizzes'; break; default: break; } return $prefix; } $prefix = $module_slug; if ( $ucfirst ) { $prefix = ucfirst( $prefix ); } if ( ! empty( $form_prefix ) && 'form' === $module_slug ) { $prefix = $form_prefix . $prefix; } if ( $ucfirst ) { // for getting CForm, Custom_Form, Custom-Form, etc. $prefix = ucfirst( $prefix ); } if ( $plural ) { if ( 'quiz' === $module_slug ) { $prefix .= 'ze'; } $prefix .= 's'; } return $prefix; } /** * Reset plugin to fresh install * * @since 1.6.3 */ function forminator_reset_plugin() { global $wpdb; /** * Fires before Plugin reset * * @since 1.6.3 */ do_action( 'forminator_before_reset_plugin' ); forminator_reset_settings(); /** * Forminator_clear_module_views * * @see forminator_clear_module_views() */ $wpdb->query( "TRUNCATE {$wpdb->prefix}frmt_form_views" ); /** * Forminator_clear_module_submissions * * @see forminator_clear_module_submissions() */ $max_entry_id = $wpdb->get_var( "SELECT MAX(`entry_id`) FROM {$wpdb->prefix}frmt_form_entry" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( $max_entry_id && is_numeric( $max_entry_id ) && $max_entry_id > 0 ) { for ( $i = 1; $i <= $max_entry_id; $i++ ) { wp_cache_delete( $i, Forminator_Form_Entry_Model::FORM_ENTRY_CACHE_GROUP ); } } $wpdb->query( "TRUNCATE {$wpdb->prefix}frmt_form_entry" ); $wpdb->query( "TRUNCATE {$wpdb->prefix}frmt_form_entry_meta" ); wp_cache_delete( 'all_form_types', Forminator_Form_Entry_Model::FORM_COUNT_CACHE_GROUP ); wp_cache_delete( 'custom-forms_form_type', Forminator_Form_Entry_Model::FORM_COUNT_CACHE_GROUP ); wp_cache_delete( 'poll_form_type', Forminator_Form_Entry_Model::FORM_COUNT_CACHE_GROUP ); wp_cache_delete( 'quizzes_form_type', Forminator_Form_Entry_Model::FORM_COUNT_CACHE_GROUP ); /** * Fires after Plugin reset * * @since 1.6.3 */ do_action( 'forminator_after_reset_plugin' ); } /** * Add Slash in string * * @since 1.8 * * @param string $value Values to add slashes. * @param string $char Character. * * @return string */ function forminator_addcslashes( $value, $char = '"\\/' ) { $value = esc_html( $value ); return addcslashes( $value, $char ); } /** * Return URL link. * * @since 1.13 * * @param string $link_for Accepts: 'docs', 'plugin', 'rate', 'support', 'roadmap'. * @param string $campaign Utm campaign tag to be used in link. Default: ''. * @param string $adv_path Advanced path. Default: ''. * * @return string */ function forminator_get_link( $link_for, $campaign = '', $adv_path = '' ) { $domain = 'https://wpmudev.com'; $wp_org = 'https://wordpress.org'; $utm_tags = "?utm_source=forminator&utm_medium=plugin&utm_campaign={$campaign}"; switch ( $link_for ) { case 'docs': $link = "{$domain}/docs/wpmu-dev-plugins/forminator/{$utm_tags}"; break; case 'plugin': $link = "{$domain}/project/forminator-pro/{$utm_tags}"; break; case 'rate': $link = "{$wp_org}/support/plugin/forminator/reviews/#new-post"; break; case 'support': $link = FORMINATOR_PRO ? "{$domain}/get-support/" : "{$wp_org}/support/plugin/forminator/"; break; case 'roadmap': $link = "{$domain}/roadmap/"; break; case 'pro_link': $link = "{$domain}/$adv_path"; break; default: $link = ''; break; } return $link; } /** * Check if the plugin is active network wide. * * @since 1.13 forminator_membership_status * @since 1.18.2 Change how membership is detected * * @return bool */ function forminator_can_install_pro() { // Dashboard is active. if ( class_exists( 'WPMUDEV_Dashboard' ) && method_exists( WPMUDEV_Dashboard::$upgrader, 'user_can_install' ) ) { $has_access = WPMUDEV_Dashboard::$upgrader->user_can_install( 2097296, true ); } else { $has_access = false; } return apply_filters( 'forminator_wpmudev_can_install_pro', $has_access ); } /** * Check if the plugin is active network wide. * * @since 1.13 * * @return bool */ function forminator_is_networkwide() { if ( is_multisite() ) { // Makes sure the plugin is defined before trying to use it. if ( ! function_exists( 'is_plugin_active_for_network' ) ) { require_once ABSPATH . '/wp-admin/includes/plugin.php'; } $active = is_plugin_active_for_network( plugin_basename( FORMINATOR_PLUGIN_BASENAME ) ); } else { $active = false; } return $active; } /** * Check if user is a WPMU DEV admin. * * @since 3.1.4 * * @return bool */ function is_wpmu_dev_admin() { if ( class_exists( 'WPMUDEV_Dashboard' ) ) { if ( method_exists( 'WPMUDEV_Dashboard_Site', 'allowed_user' ) ) { $user_id = get_current_user_id(); return WPMUDEV_Dashboard::$site->allowed_user( $user_id ); } } return false; } /** * Check membership status * * Possible return values: * 'free' - Free hub membership. * 'single' - Single membership (i.e. only 1 project is licensed) * 'unit' - One or more projects licensed * 'full' - Full membership, no restrictions. * 'paused' - Membership access is paused. * 'expired' - Expired membership. * '' - (empty string) If user is not logged in or with an unknown type. * * @since 1.24.1 * * @return mixed */ function forminator_get_wpmudev_membership() { if ( class_exists( 'WPMUDEV_Dashboard' ) ) { if ( method_exists( 'WPMUDEV_Dashboard_Api', 'get_membership_status' ) ) { return WPMUDEV_Dashboard::$api->get_membership_status(); } } return ''; } /** * Check if site is connected * * @since 1.24.1 * * @return bool */ function forminator_is_site_connected_to_hub() { switch ( forminator_get_wpmudev_membership() ) { case 'free': case 'single': case 'unit': case 'full': case 'paused': case 'expired': $status = true; break; default: $status = false; break; } return $status; } /** * Global tracking * * @return mixed|null */ function forminator_global_tracking() { return apply_filters( 'forminator_global_tracking', true ); } /** * Get forminator capabilities. * * @return array */ function forminator_get_capabilities() { return array( 'manage_forminator_modules', 'manage_forminator_submissions', 'manage_forminator_templates', 'manage_forminator_addons', 'manage_forminator_integrations', 'manage_forminator_reports', 'manage_forminator_settings', ); } /** * Apply forminator capabilities. * * @param object $subject Either WP_User or WP_Role object. * @param array $permission The current permission setting. * * @return [type] */ function forminator_apply_capabilities( $subject, $permission ) { if ( false === $subject || is_null( $subject ) ) { return; } $caps = forminator_get_capabilities(); foreach ( $caps as $cap ) { if ( $permission[ $cap ] ) { $subject->add_cap( $cap, true ); } else { $subject->remove_cap( $cap ); } } } /** * Get the appropriate capability based on Permission settings. * * @param string $page_slug Used for determining capability. * Can also be used for getting cap for 'current_user_can' function. * * @return string */ function forminator_get_permission( $page_slug ) { $default_cap = forminator_get_admin_cap(); // If current user is admin, allow on all Forminator pages. if ( current_user_can( $default_cap ) || empty( $page_slug ) ) { return $default_cap; } // If current user a guest, return the default admin cap because they don't have any capabilities anyway. $user = wp_get_current_user(); if ( empty( $user->ID ) ) { return $default_cap; } $permissions = get_option( 'forminator_permissions', array() ); if ( empty( $permissions ) ) { return $default_cap; } // Assign appropriate cap based on page_slug. switch ( $page_slug ) { case 'forminator': case 'forminator-cform': case 'forminator-cform-wizard': case 'forminator-cform-view': case 'forminator-poll': case 'forminator-poll-wizard': case 'forminator-poll-view': case 'forminator-quiz': case 'forminator-nowrong-wizard': case 'forminator-knowledge-wizard': case 'forminator-quiz-view': $cap = 'manage_forminator_modules'; break; case 'forminator-entries': $cap = 'manage_forminator_submissions'; break; case 'forminator-templates': $cap = 'manage_forminator_templates'; break; case 'forminator-addons': $cap = 'manage_forminator_addons'; break; case 'forminator-integrations': $cap = 'manage_forminator_integrations'; break; case 'forminator-reports': $cap = 'manage_forminator_reports'; break; case 'forminator-settings': $cap = 'manage_forminator_settings'; break; default: $cap = $default_cap; break; } $user_allowed = false; $role_allowed = false; // Check permissions for excluded users. foreach ( $permissions as $permission ) { // If role. if ( 'role' === $permission['permission_type'] ) { if ( empty( $permission['exclude_users'] ) ) { $role_allowed = true; continue; } // If current user is in excluded users, return the default admin cap. if ( in_array( intval( $user->ID ), array_map( 'intval', $permission['exclude_users'] ), true ) ) { $role_allowed = false; } else { $role_allowed = true; } } // If user. if ( 'specific' === $permission['permission_type'] && in_array( intval( $user->ID ), array_map( 'intval', $permission['specific_user'] ), true ) ) { if ( isset( $permission[ $cap ] ) && $permission[ $cap ] ) { $user_allowed = true; } else { $user_allowed = false; } } } if ( ( $user_allowed || $role_allowed ) || ( $user_allowed && ! $role_allowed ) ) { return $cap; } elseif ( ! $user_allowed || ! $role_allowed ) { return $default_cap; } } /** * Delete forminator permissions and revoke caps. * Used on uninstallation and * * @since 1.28.0 */ function forminator_delete_permissions() { $permissions = get_option( 'forminator_permissions', array() ); if ( empty( $permissions ) ) { return; } // Get the Forminator caps. $caps = forminator_get_capabilities(); foreach ( $permissions as $permission ) { // If specific user. if ( 'specific' === $permission['permission_type'] ) { // Remove caps from users. foreach ( $permission['specific_user'] as $email ) { $user = get_user_by( 'email', $email ); if ( false !== $user ) { foreach ( $caps as $cap ) { $user->remove_cap( $cap ); } } } // If role. } else { $role = get_role( $permission['user_role'] ); // Remove caps from the role. if ( ! is_null( $role ) ) { foreach ( $caps as $cap ) { $role->remove_cap( $cap ); } } } } // Finally, delete the option. delete_option( 'forminator_permissions' ); } /** * Searches for $needle in the multidimensional array $haystack. * * @url https://stackoverflow.com/a/28473219 * * @param mixed $needle The item to search for. * @param array $haystack The array to search. * * @return array|bool The indices of $needle in $haystack across the * various dimensions. FALSE if $needle was not found. */ function forminator_recursive_array_search( $needle, $haystack ) { foreach ( $haystack as $key => $value ) { if ( ! is_array( $value ) && (string) $needle === (string) $value ) { return array( $key ); } elseif ( is_array( $value ) ) { $subkey = forminator_recursive_array_search( $needle, $value ); if ( $subkey ) { array_unshift( $subkey, $key ); return $subkey; } } } return null; // Return null if the needle is not found. } /** * Get Accessible user roles * * @return array */ function forminator_get_accessible_user_roles() { // Get the current user object. $current_user = wp_get_current_user(); // Check if user is logged in | Have access to create user. if ( empty( $current_user ) || ! current_user_can( 'create_users' ) ) { return array(); } if ( ! function_exists( 'get_editable_roles' ) ) { require_once ABSPATH . 'wp-admin/includes/user.php'; } // Get roles. $roles = get_editable_roles(); // Allow all roles if the user is a super admin or has the administrator role. if ( ( is_multisite() && is_super_admin() ) || in_array( 'administrator', $current_user->roles, true ) ) { return $roles; } // Allow all roles except `administrator` if the user has the `promote_users` capability. if ( current_user_can( 'promote_users' ) ) { if ( isset( $roles['administrator'] ) ) { unset( $roles['administrator'] ); } } else { // Allow only the default role if the user does not have the `promote_users` capability. $default_role = get_option( 'default_role', 'subscriber' ); if ( $roles[ $default_role ] ) { $roles = array( $default_role => $roles[ $default_role ] ); } else { $roles = array(); } } return $roles; } /** * Validate registration form settings. * * @param array $settings Settings. * @return bool|WP_Error */ function forminator_validate_registration_form_settings( $settings ) { if ( ! empty( $settings['form-type'] ) && 'registration' === $settings['form-type'] ) { $error_message = esc_html__( 'Unfortunately, you do not have the required permissions or user role to perform this action.', 'forminator' ); if ( ! current_user_can( 'create_users' ) ) { return new WP_Error( 'invalid_access', $error_message ); } $roles = forminator_get_accessible_user_roles(); if ( isset( $settings['registration-user-role'] ) && 'fixed' === $settings['registration-user-role'] ) { if ( isset( $settings['registration-role-field'] ) && ! isset( $roles[ $settings['registration-role-field'] ] ) && 'notCreate' !== $settings['registration-role-field'] ) { // Respect the "Don't create a user in the network's main site" option. return new WP_Error( 'invalid_user_role', $error_message ); } } elseif ( ! empty( $settings['user_role'] ) && is_array( $settings['user_role'] ) ) { foreach ( $settings['user_role'] as $user_role ) { if ( isset( $user_role['role'] ) && ! isset( $roles[ $user_role['role'] ] ) && 'notCreate' !== $user_role['role'] ) { // Respect the "Don't create a user in the network's main site" option. return new WP_Error( 'invalid_user_role', $error_message ); } } } } return true; } /** * Can apply forminator default color * * @param array $settings Form settings. * @return bool */ function forminator_can_apply_default_color( $settings ) { $form_style = $settings['form-style'] ?? 'default'; $prefix = ''; if ( 'basic' === $form_style ) { $prefix = 'basic-'; } $color_option_key = $prefix . 'cform-color-option'; // For backward compatible. $default_color_option = empty( $settings[ $color_option_key ] ) ? 'forminator' : 'theme'; $color_option = $settings[ $color_option_key ] ?? $default_color_option; return 'forminator' === $color_option; } /** * Schedule recurring action. * * @param string $action Action name. * @param int $interval Expiration time in seconds. * * @return bool */ function forminator_set_recurring_action( string $action, int $interval ): bool { // Check cache first. if ( get_transient( $action ) ) { return true; } // if tables exist. if ( ! Forminator_Core::check_action_scheduler_tables() ) { return false; } // Clear old cron schedule. if ( wp_next_scheduled( $action ) ) { wp_clear_scheduled_hook( $action ); } $scheduled = as_has_scheduled_action( $action ); if ( $scheduled ) { // Set cache. $expiration = 2 * HOUR_IN_SECONDS; set_transient( $action, true, $expiration ); } else { // Create new schedule using AS. $action_id = as_schedule_recurring_action( time() + 20, $interval, $action, array(), 'forminator', true ); $scheduled = $action_id > 0; } return $scheduled; } /** * Check if cloud templates are disabled * * @return bool */ function forminator_cloud_templates_disabled(): bool { $is_disabled = apply_filters( 'forminator_disable_cloud_templates', false ); if ( ! $is_disabled ) { if ( is_wpmu_dev_admin() ) { $is_disabled = false; } elseif ( forminator_can_whitelabel() ) { $is_disabled = true; } } return $is_disabled; } helper-modules.php 0000644 00000001114 15162502317 0010201 0 ustar 00 <?php /** * Modules helper functions. * * @package Forminator */ if ( ! defined( 'ABSPATH' ) ) { die(); } /** * Return the array of modules objects * * @since 1.0 * @return mixed */ function forminator_get_modules() { $forminator = Forminator_Core::get_instance(); return $forminator->modules; } /** * Return specific module by ID * * @since 1.0 * @param int $id Module Id. * * @return bool */ function forminator_get_module( $id ) { $modules = forminator_get_modules(); return isset( $modules[ $id ] ) && ! empty( $modules[ $id ] ) ? $modules[ $id ] : false; } helper-addon.php 0000644 00000140131 15162502317 0007621 0 ustar 00 <?php /** * Addon helper functions. * * @package Forminator */ /** * Get registered addon instance by `$slug` * * @since 1.1 * * @param string $slug Addon slug. * * @return Forminator_Integration|null */ function forminator_get_addon( $slug ) { return Forminator_Integration_Loader::get_instance()->get_addon( $slug ); } /** * Get Pro Addon List * * @todo : Verify pro addon list from non user modifiable data source (API or similar others) * * @since 1.1 * @return array */ function forminator_get_pro_addon_list() { $pro_addons = array( 'mailchimp' => array( '_image' => 'https://via.placeholder.com/350x150?', '_icon' => 'mailchimp', '_title' => 'Mailchimp', '_short_title' => 'Mailchimp', '_version' => '1.0', '_description' => esc_html__( 'Unlock this as part of a WPMU DEV Membership', 'forminator' ), '_min_forminator_version' => FORMINATOR_VERSION, ), 'webhook' => array( '_image' => 'https://via.placeholder.com/350x150', '_icon' => 'webhook', '_title' => 'Webhook', '_short_title' => 'Webhook', '_version' => '1.0', '_description' => esc_html__( 'Unlock this as part of a WPMU DEV Membership', 'forminator' ), '_min_forminator_version' => FORMINATOR_VERSION, ), ); return $pro_addons; } /** * Get all add-ons as list * * @since 1.1 * @return array */ function forminator_get_registered_addons_list() { $addon_list = Forminator_Integration_Loader::get_instance()->get_addons()->to_array(); usort( $addon_list, 'sort_addons' ); return $addon_list; } /** * Sort addons * * @param array $a Addon. * @param array $b Addon. * * @return mixed */ function sort_addons( $a, $b ) { return $a['position'] - $b['position']; } /** * Get registered addons grouped by connected status * * @since 1.1 * @return array */ function forminator_get_registered_addons_grouped_by_connected() { $addon_list = forminator_get_registered_addons_list(); $connected_addons = array(); $not_connected_addons = array(); // late init properties. foreach ( $addon_list as $addon ) { if ( $addon['is_connected'] ) { $obj = forminator_get_addon( $addon['slug'] ); $multi_global_ids = $obj->get_multi_global_ids(); if ( ! empty( $multi_global_ids ) ) { foreach ( $multi_global_ids as $global_id => $identifier ) { $addon['global_id'] = $global_id; $addon['identifier'] = $identifier; $connected_addons[] = $addon; unset( $addon['global_id'] ); unset( $addon['identifier'] ); } } else { $connected_addons[] = $addon; } } if ( $addon['is_multi_global'] || ! $addon['is_connected'] ) { $addon['is_connected'] = false; if ( ! empty( $addon['new_global_id'] ) ) { $addon['global_id'] = $addon['new_global_id']; } $not_connected_addons[] = $addon; unset( $addon['global_id'] ); } } return array( 'connected' => $connected_addons, 'not_connected' => $not_connected_addons, ); } /** * Get addon instances that connected with a module * * @todo make instances static and available through runtime * * @param int $module_id Module ID. * @param string $module_type Module type. * * @return Forminator_Integration[] */ function forminator_get_addons_instance_connected_with_module( $module_id, $module_type ) { $grouped_addons = forminator_get_registered_addons_grouped_by_module_connected( $module_id, $module_type, true ); $addons = array(); foreach ( $grouped_addons['connected'] as $property ) { $addon = forminator_get_addon( $property['slug'] ); if ( ! empty( $property['global_id'] ) ) { $addon->multi_global_id = $property['global_id']; } if ( ! empty( $property['multi_id'] ) ) { $addon->multi_id = $property['multi_id']; } $addons[] = clone $addon; } return $addons; } /** * Get addon(s) in array format grouped by connected / not connected with $module_id * * Every addon inside this array will be formatted first by @see Forminator_Integration::to_array_with_form() * * @since 1.1 * * @param int $module_id Module ID. * @param string $module_type Module type. * @param bool $connected_only Return connected integrations only. * * @return array */ function forminator_get_registered_addons_grouped_by_module_connected( $module_id, $module_type, $connected_only = false ) { $grouped_addons = array( 'connected' => array(), 'not_connected' => array(), ); $addons = Forminator_Integration_Loader::get_instance()->get_addons()->to_array(); // Get only connected integrations to the module to avoid checking all integrations. if ( $connected_only ) { $post_meta = get_post_meta( $module_id ); // Remove empty integrations. $post_meta = array_filter( $post_meta, function ( $value ) { return ! empty( $value ) && array( 'a:0:{}' ) !== $value; } ); $meta_keys = array_keys( $post_meta ); $addons = array_filter( $addons, function ( $addon ) use ( $meta_keys, $module_type ) { $integration_slug = $addon['slug'] ?? ''; foreach ( $meta_keys as $meta_key ) { // Check if there are relevant settings for this integration - leave it, otherwise - remove it. if ( strpos( $meta_key, 'forminator_addon_' . $integration_slug . '_' . $module_type . '_settings' ) === 0 ) { return true; } } return false; } ); } foreach ( $addons as $slug => $addon_settings ) { $addon = Forminator_Integration_Loader::get_instance()->get_addon( $slug ); $to_array_method = 'to_array_with_' . $module_type; if ( ! method_exists( $addon, $to_array_method ) && method_exists( $addon, 'is_module_connected' ) ) { continue; } $multi_global_ids = $addon->get_multi_global_ids(); if ( $multi_global_ids ) { foreach ( $multi_global_ids as $global_id => $identifier ) { $addon->multi_global_id = $global_id; $addon_settings = $addon->$to_array_method( $module_id ); $addon_settings['global_id'] = $global_id; $addon_settings['global_identifier'] = $identifier; $grouped_addons = forminator_group_addons_by_module( $grouped_addons, $addon, $addon_settings, $module_id, $module_type ); unset( $addon_settings['global_id'], $addon_settings['global_identifier'] ); $addon->multi_global_id = null; } } else { $addon_settings = $addon->$to_array_method( $module_id ); $grouped_addons = forminator_group_addons_by_module( $grouped_addons, $addon, $addon_settings, $module_id, $module_type ); } } return $grouped_addons; } /** * Group addons by module. It's used only for forminator_get_registered_addons_grouped_by_module_connected() * * @param array $grouped_addons Grouped addons. * @param object $addon Addon object. * @param array $addon_settings Addon settings. * @param int $module_id Module ID. * @param string $module_type Module type. * @return array $grouped_addons */ function forminator_group_addons_by_module( $grouped_addons, $addon, $addon_settings, $module_id, $module_type ) { $allow_method = 'is_allow_multi_on_' . $module_type; $is_complete = 'is_multi_id_completed'; /** * Forminator_Integration * * @var Forminator_Integration $addon */ if ( $addon->is_connected() && ( 'quiz' !== $module_type || $addon->is_module_connected( $module_id, 'quiz', true ) ) ) { if ( method_exists( $addon, $allow_method ) && $addon->$allow_method() ) { $addon_array = $addon_settings; if ( $addon->is_module_connected( $module_id, $module_type ) && isset( $addon_array['multi_ids'] ) && is_array( $addon_array['multi_ids'] ) ) { foreach ( $addon_array['multi_ids'] as $multi_id ) { $form_settings_instance = $addon->get_addon_settings( $module_id, $module_type ); if ( $form_settings_instance->$is_complete( $multi_id['id'] ) ) { $addon_array['multi_id'] = $multi_id['id']; $addon_array['multi_name'] = ! empty( $multi_id['label'] ) ? $multi_id['label'] : $multi_id['id']; $grouped_addons['connected'][] = $addon_array; } } } else { $grouped_addons['not_connected'][] = $addon_settings; } } elseif ( $addon->is_module_connected( $module_id, $module_type ) ) { $grouped_addons['connected'][] = $addon_settings; } else { $grouped_addons['not_connected'][] = $addon_settings; } } return $grouped_addons; } /** * Attach default addon hooks for Addon. * * Call when needed only, * defined in @see Forminator_Integration::global_hookable() * and @see Forminator_Integration::admin_hookable on admin mode * * @since 1.1 * * @param Forminator_Integration $addon Addon. */ function forminator_maybe_attach_addon_hook( Forminator_Integration $addon ) { $addon->global_hookable(); // only hooks that available on admin. if ( is_admin() ) { $addon->admin_hookable(); } } /** * Helper Check if addon is active * * @since 1.1 * * @param string $slug Addon slug. * * @return bool */ function forminator_addon_is_active( $slug ) { return Forminator_Integration_Loader::get_instance()->addon_is_active( $slug ); } /** * Get allowed field type available for addon * * @since 1.1 * @return array */ function forminator_get_allowed_field_types_for_addon() { $allowed_field_types = array( 'address-street_address', 'address-address_line', 'address-city', 'address-state', 'address-zip', 'address-country', 'date', // force into one. 'email', 'hidden', 'checkbox', 'consent', 'gdprcheckbox', 'name', // single. 'name-prefix', // multiple. 'name-first-name', 'name-middle-name', 'name-last-name', 'number', 'slider', 'slider-min', 'slider-max', 'phone', 'postdata-post-title', 'postdata-post-content', 'postdata-post-excerpt', 'postdata-post-category', 'postdata-category', 'postdata-post-tags', 'postdata-post_tag', 'postdata-post-image', 'select', 'text', 'time', 'upload', 'url', // 1.6 fields. 'textarea', 'radio', 'checkbox', // 1.7 fields. 'calculation', 'stripe', 'stripe-ocs', 'paypal', 'signature', // 1.15. 'currency', 'rating', ); /** * Filter allowed filed types to be used by addons * * This value will be used by **ALL** addons * * @since 1.1 * * @param array $allowed_field_types current allowed field types. */ $allowed_field_types = apply_filters( 'forminator_addon_allowed_field_types', $allowed_field_types ); return $allowed_field_types; } /** * Format Form Fields * * @since 1.1 * * @param Forminator_Base_Form_Model $custom_form_model Base form model. * * @return array */ function forminator_addon_format_form_fields( Forminator_Base_Form_Model $custom_form_model ) { $formatted_fields = array(); $fields = $custom_form_model->get_real_fields(); $allowed_field_types = forminator_get_allowed_field_types_for_addon(); foreach ( $fields as $field ) { $field_as_array = $field->to_formatted_array(); // check non label fields. if ( empty( $field_as_array['field_label'] ) ) { $field_as_array['field_label'] = $field_as_array['type']; } // handle multiple. $multi_fields = forminator_addon_flatten_mutiple_field( $field_as_array ); if ( false === $multi_fields ) { if ( ! in_array( $field_as_array['type'], $allowed_field_types, true ) ) { continue; } $field_as_array['field_type'] = $field_as_array['type']; $formatted_fields[] = $field_as_array; } else { foreach ( $multi_fields as $multi_field ) { if ( ! in_array( $multi_field['type'], $allowed_field_types, true ) ) { continue; } $multi_field['field_type'] = $field_as_array['type']; $formatted_fields[] = $multi_field; } } } /** * Filter formatted fields to be used by addon * * This value will be used by **ALL** addons * * @since 1.1 * * @param array $formatted_fields current formatted fields. * @param Forminator_Form_Model $custom_form_model Custom form Model. */ $formatted_fields = apply_filters( 'forminator_addon_formatted_fields', $formatted_fields, $custom_form_model ); return $formatted_fields; } /** * Flatten multiple field * * @since 1.1 * * @param array $field_array Field. * * @return array|bool array flatten multi-field or false, when its not considered as multi-field */ function forminator_addon_flatten_mutiple_field( $field_array ) { $multiple_field_types = array( 'name', 'postdata', 'address', 'slider', ); if ( ! in_array( $field_array['type'], $multiple_field_types, true ) ) { return false; } // flatten name. if ( 'name' === $field_array['type'] ) { $is_multiple_name = isset( $field_array['multiple_name'] ) && filter_var( $field_array['multiple_name'], FILTER_VALIDATE_BOOLEAN ) ? true : false; if ( ! $is_multiple_name ) { return false; } $prefix_enabled = isset( $field_array['prefix'] ) && filter_var( $field_array['prefix'], FILTER_VALIDATE_BOOLEAN ) ? true : false; $first_name_enabled = isset( $field_array['fname'] ) && filter_var( $field_array['fname'], FILTER_VALIDATE_BOOLEAN ) ? true : false; $middle_name_enabled = isset( $field_array['mname'] ) && filter_var( $field_array['mname'], FILTER_VALIDATE_BOOLEAN ) ? true : false; $last_name_enabled = isset( $field_array['lname'] ) && filter_var( $field_array['lname'], FILTER_VALIDATE_BOOLEAN ) ? true : false; if ( $prefix_enabled || $first_name_enabled || $middle_name_enabled || $last_name_enabled ) { $multi_fields = array(); if ( $prefix_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'prefix' ); $label = isset( $multi_field['prefix_label'] ) ? $multi_field['prefix_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-prefix'; $multi_field['element_id'] = $multi_field['element_id'] . '-prefix'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } if ( $first_name_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'first-name' ); $label = isset( $multi_field['fname_label'] ) ? $multi_field['fname_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-first-name'; $multi_field['element_id'] = $multi_field['element_id'] . '-first-name'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } if ( $middle_name_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'middle-name' ); $label = isset( $multi_field['mname_label'] ) ? $multi_field['mname_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-middle-name'; $multi_field['element_id'] = $multi_field['element_id'] . '-middle-name'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } if ( $last_name_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'last-name' ); $label = isset( $multi_field['lname_label'] ) ? $multi_field['lname_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-last-name'; $multi_field['element_id'] = $multi_field['element_id'] . '-last-name'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } return $multi_fields; } } elseif ( 'slider' === $field_array['type'] ) { if ( 'range' !== $field_array['slider_type'] ) { return false; } return array( array( 'type' => $field_array['type'] . '-min', 'element_id' => $field_array['element_id'] . '-min', 'field_label' => $field_array['field_label'] . ' - min', ), array( 'type' => $field_array['type'] . '-max', 'element_id' => $field_array['element_id'] . '-max', 'field_label' => $field_array['field_label'] . ' - max', ), ); } elseif ( 'postdata' === $field_array['type'] ) { // flatten POSTDATA. $title_enabled = isset( $field_array['post_title'] ) && ! empty( $field_array['post_title'] ) ? true : false; $content_enabled = isset( $field_array['post_content'] ) && ! empty( $field_array['post_content'] ) ? true : false; $excerpt_enabled = isset( $field_array['post_excerpt'] ) && ! empty( $field_array['post_excerpt'] ) ? true : false; $image_enabled = isset( $field_array['post_image'] ) && ! empty( $field_array['post_image'] ) ? true : false; $post_type = isset( $field_array['post_type'] ) && ! empty( $field_array['post_type'] ) ? $field_array['post_type'] : 'post'; $category_list = forminator_post_categories( $post_type ); if ( $title_enabled || $content_enabled || $excerpt_enabled || $image_enabled || $category_list ) { $multi_fields = array(); if ( $title_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'post-title' ); $label = isset( $multi_field['post_title_label'] ) ? $multi_field['post_title_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-post-title'; $multi_field['element_id'] = $multi_field['element_id'] . '-post-title'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } if ( $content_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'post-content' ); $label = isset( $multi_field['post_content_label'] ) ? $multi_field['post_content_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-post-content'; $multi_field['element_id'] = $multi_field['element_id'] . '-post-content'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } if ( $excerpt_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'post-excerpt' ); $label = isset( $multi_field['post_excerpt_label'] ) ? $multi_field['post_excerpt_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-post-excerpt'; $multi_field['element_id'] = $multi_field['element_id'] . '-post-excerpt'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } if ( ! empty( $category_list ) ) { foreach ( $category_list as $category ) { $category_enabled = isset( $field_array[ $category['value'] ] ) && ! empty( $field_array[ $category['value'] ] ) ? true : false; if ( $category_enabled ) { $multi_field = $field_array; $default_label = $category['label']; $label = isset( $multi_field[ $category['value'] . '_label' ] ) ? $multi_field[ $category['value'] . '_label' ] : ''; $multi_field['type'] = $multi_field['type'] . '-' . $category['value']; $multi_field['element_id'] = $multi_field['element_id'] . '-' . $category['value']; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } } } if ( $image_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'post-image' ); $label = isset( $multi_field['post_image_label'] ) ? $multi_field['post_image_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-post-image'; $multi_field['element_id'] = $multi_field['element_id'] . '-post-image'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } return $multi_fields; } } elseif ( 'address' === $field_array['type'] ) { // flatten ADDRESS. $street_enabled = isset( $field_array['street_address'] ) && filter_var( $field_array['street_address'], FILTER_VALIDATE_BOOLEAN ) ? true : false; $line_enabled = isset( $field_array['address_line'] ) && filter_var( $field_array['address_line'], FILTER_VALIDATE_BOOLEAN ) ? true : false; $city_enabled = isset( $field_array['address_city'] ) && filter_var( $field_array['address_city'], FILTER_VALIDATE_BOOLEAN ) ? true : false; $state_enabled = isset( $field_array['address_state'] ) && filter_var( $field_array['address_state'], FILTER_VALIDATE_BOOLEAN ) ? true : false; $zip_enabled = isset( $field_array['address_zip'] ) && filter_var( $field_array['address_zip'], FILTER_VALIDATE_BOOLEAN ) ? true : false; $country_enabled = isset( $field_array['address_country'] ) && filter_var( $field_array['address_country'], FILTER_VALIDATE_BOOLEAN ) ? true : false; if ( $street_enabled || $line_enabled || $city_enabled || $state_enabled || $zip_enabled || $country_enabled ) { $multi_fields = array(); if ( $street_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'street_address' ); $label = isset( $multi_field['street_address_label'] ) ? $multi_field['street_address_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-street_address'; $multi_field['element_id'] = $multi_field['element_id'] . '-street_address'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } if ( $line_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'address_line' ); $label = isset( $multi_field['address_line_label'] ) ? $multi_field['address_line_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-address_line'; $multi_field['element_id'] = $multi_field['element_id'] . '-address_line'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } if ( $city_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'city' ); $label = isset( $multi_field['address_city_label'] ) ? $multi_field['address_city_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-city'; $multi_field['element_id'] = $multi_field['element_id'] . '-city'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } if ( $state_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'state' ); $label = isset( $multi_field['address_state_label'] ) ? $multi_field['address_state_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-state'; $multi_field['element_id'] = $multi_field['element_id'] . '-state'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } if ( $zip_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'zip' ); $label = isset( $multi_field['address_zip_label'] ) ? $multi_field['address_zip_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-zip'; $multi_field['element_id'] = $multi_field['element_id'] . '-zip'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } if ( $country_enabled ) { $multi_field = $field_array; $default_label = Forminator_Form_Entry_Model::translate_suffix( 'country' ); $label = isset( $multi_field['address_country_label'] ) ? $multi_field['address_country_label'] : ''; $multi_field['type'] = $multi_field['type'] . '-country'; $multi_field['element_id'] = $multi_field['element_id'] . '-country'; $multi_field['field_label'] = ( $label ? $label : $default_label ); $multi_fields [] = $multi_field; } return $multi_fields; } } return false; } /** * Formatted submmiited data of Form to used by addon * * @since 1.1 * @since 1.3 add entry fields as parameter to trace back submit data to entry fields to be added * * @param array $form_fields Existing form fields. * @param array $current_entry_fields Current entry fields. * * @return array */ function forminator_format_submitted_data_for_addon( $form_fields, $current_entry_fields = array() ) { $files_data = $_FILES; // phpcs:ignore WordPress.Security.NonceVerification.Missing $formatted_post_data = array(); $render_id = filter_input( INPUT_POST, 'render_id', FILTER_VALIDATE_INT ); if ( $render_id ) { $formatted_post_data['render_id'] = $render_id; } $page_id = filter_input( INPUT_POST, 'page_id', FILTER_VALIDATE_INT ); if ( isset( $page_id ) ) { $formatted_post_data['page_id'] = $page_id; } $current_url = filter_input( INPUT_POST, 'current_url', FILTER_VALIDATE_URL ); if ( $current_url ) { $formatted_post_data['current_url'] = $current_url; } $_wp_http_referer = filter_input( INPUT_POST, '_wp_http_referer', FILTER_VALIDATE_URL ); if ( $_wp_http_referer ) { $formatted_post_data['_wp_http_referer'] = $_wp_http_referer; } $skipped_keys = array( 'forminator_nonce', 'form_id', 'action' ); // loop on form fields. foreach ( $form_fields as $form_field ) { if ( isset( $_POST[ $form_field['element_id'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing if ( strpos( $form_field['type'], 'category' ) !== false || strpos( $form_field['type'], 'tag' ) !== false ) { $form_value = ''; if ( is_array( $_POST[ $form_field['element_id'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing $form_post_data = filter_input( INPUT_POST, $form_field['element_id'], FILTER_VALIDATE_INT, FILTER_REQUIRE_ARRAY ); } else { $form_post_data = array( filter_input( INPUT_POST, $form_field['element_id'], FILTER_VALIDATE_INT ) ); } if ( ! empty( $form_post_data ) ) { foreach ( $form_post_data as $form_post ) { $form_value .= get_term_by( 'term_taxonomy_id', $form_post )->name . ' (ID=' . $form_post . '), '; } } $value = substr( $form_value, 0, -2 ); } else { $value = Forminator_Core::sanitize_array( $_POST[ $form_field['element_id'] ], $form_field['element_id'] );// phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput } $formatted_post_data[ $form_field['element_id'] ] = $value; } elseif ( 'time' === $form_field['type'] ) { // need to be concatenated. $element_id = $form_field['element_id']; $hours_element_id = $element_id . '-hours'; $minutes_element_id = $element_id . '-minutes'; $ampm_element_id = $element_id . '-ampm'; $hours = filter_input( INPUT_POST, $hours_element_id, FILTER_VALIDATE_INT ); $minutes = filter_input( INPUT_POST, $minutes_element_id, FILTER_VALIDATE_INT ); if ( $hours && $minutes ) { $data = array( 'hours' => $hours, 'minutes' => $minutes, ); $ampm = Forminator_Core::sanitize_text_field( $ampm_element_id ); if ( $ampm ) { $data['ampm'] = $ampm; } $time = Forminator_Form_Entry_Model::meta_value_to_string( $form_field['type'], $data ); $formatted_post_data[ $form_field['element_id'] ] = $time; $skipped_keys = array_merge( $skipped_keys, array( $hours_element_id, $minutes_element_id, $ampm_element_id ) ); } } elseif ( 'signature' === $form_field['type'] ) { $fields_data = wp_list_pluck( $current_entry_fields, 'value', 'name' ); if ( ! empty( $form_field['element_id'] ) && ! empty( $fields_data[ $form_field['element_id'] ] ) && ! empty( $fields_data[ $form_field['element_id'] ]['file'] ) && ! empty( $fields_data[ $form_field['element_id'] ]['file']['file_url'] ) ) { $formatted_post_data[ $form_field['element_id'] ] = $fields_data[ $form_field['element_id'] ]['file']['file_url']; } } elseif ( 'date' === $form_field['type'] ) { $element_id = $form_field['element_id']; $day_element_id = $element_id . '-day'; $month_element_id = $element_id . '-month'; $year_element_id = $element_id . '-year'; $day = Forminator_Core::sanitize_text_field( $day_element_id ); $month = Forminator_Core::sanitize_text_field( $month_element_id ); $year = Forminator_Core::sanitize_text_field( $year_element_id ); if ( $day && $month && $year ) { $data = array( 'day' => $day, 'month' => $month, 'year' => $year, ); if ( ! empty( $form_field['date_format'] ) ) { $data['format'] = datepicker_default_format( $form_field['date_format'] ); } $date = Forminator_Form_Entry_Model::meta_value_to_string( $form_field['type'], $data ); $formatted_post_data[ $form_field['element_id'] ] = $date; $skipped_keys = array_merge( $skipped_keys, array( $day_element_id, $month_element_id, $year_element_id ) ); } } elseif ( isset( $files_data[ $form_field['element_id'] ] ) ) { // $_FILES. $formatted_post_data[ $form_field['element_id'] ] = $files_data[ $form_field['element_id'] ]; foreach ( $current_entry_fields as $current_entry_field ) { if ( isset( $current_entry_field['name'] ) && $form_field['element_id'] === $current_entry_field['name'] ) { if ( isset( $current_entry_field['value'] ) && isset( $current_entry_field['value']['file'] ) ) { $file_props = $current_entry_field['value']['file']; $formatted_post_data[ $form_field['element_id'] ] = array_merge( $formatted_post_data[ $form_field['element_id'] ], $file_props ); break; } } if ( isset( $current_entry_field['value']['value'] ) ) { foreach ( $current_entry_field['value']['value'] as $key => $item ) { if ( isset( $current_entry_field['name'] ) && $form_field['element_id'] === $current_entry_field['name'] . '-' . $key ) { if ( isset( $item['uploaded_file'][0] ) ) { $file_direct_link = $item['uploaded_file'][0]; $formatted_post_data[ $form_field['element_id'] ] = $file_direct_link; break; } } } } } // For ajax multi-upload. } elseif ( 'upload' === $form_field['type'] && 'multiple' === $form_field['file-type'] && ( ! isset( $form_field['upload-method'] ) || 'ajax' === $form_field['upload-method'] ) ) { $entry_key = array_search( $form_field['element_id'], array_column( $current_entry_fields, 'name' ), true ); if ( false !== $entry_key && ! empty( $current_entry_fields[ $entry_key ] ) ) { $formatted_post_data[ $form_field['element_id'] ] = implode( ',', $current_entry_fields[ $entry_key ]['value']['file']['file_url'] ); } } } // add left-over superglobal POST. foreach ( $_POST as $key => $post_datum ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing if ( ! isset( $formatted_post_data[ $key ] ) && ! in_array( $key, $skipped_keys, true ) ) { $formatted_post_data[ $key ] = Forminator_Core::sanitize_array( $post_datum, $key ); } } // add left-over $_FILES. foreach ( $files_data as $key => $files_datum ) { if ( ! isset( $formatted_post_data[ $key ] ) ) { $formatted_post_data[ $key ] = $files_datum; } } /** * Filter formatted form submmitted data to be used by addon * * @since 1.1 * * @param array $formatted_post_data current formatted post data. * @param array $form_fields form fields that exist on the form. */ $formatted_post_data = apply_filters( 'forminator_addon_formatted_submitted_data', $formatted_post_data, $form_fields ); return $formatted_post_data; } /** * Format form settings to used by addon * * @since 1.1 * * @param Forminator_Base_Form_Model $custom_form Base form model. * * @return array formatted and filtered form settings */ function forminator_addon_format_form_settings( Forminator_Base_Form_Model $custom_form ) { $form_settings = $custom_form->settings; /** * Filter form settings to used by addon * * It will be used by all Addons * * @since 1.1 * * @param array $form_settings Current formatted form_settings. * @param Forminator_Base_Form_Model $custom_form Custom Form Model. */ $form_settings = apply_filters( 'forminator_addon_formatted_form_settings', $form_settings, $custom_form ); return $form_settings; } /** * Find addon meta data from entry model that saved on db * * @since 1.1 * * @param Forminator_Integration $connected_addon Connected addon. * @param Forminator_Form_Entry_Model $entry_model Form entry model. * * @return array */ function forminator_find_addon_meta_data_from_entry_model( Forminator_Integration $connected_addon, Forminator_Form_Entry_Model $entry_model ) { $addon_meta_data = array(); $slug = $connected_addon->get_slug(); $addon_meta_data_prefix = 'forminator_addon_' . $slug . '_'; foreach ( $entry_model->meta_data as $key => $meta_datum ) { $addon_info_exist = false !== stripos( $key, $addon_meta_data_prefix ); if ( ! $addon_info_exist && 'webhook' === $slug && false !== stripos( $key, 'forminator_addon_zapier_' ) ) { // Old submission Zapier information. $addon_info_exist = true; } if ( $addon_info_exist ) { $addon_meta_data[] = array( 'title' => $connected_addon->get_title(), 'name' => str_ireplace( $addon_meta_data_prefix, '', $key ), 'value' => $meta_datum['value'], 'banner' => $connected_addon->get_image(), 'banner_x2' => $connected_addon->get_image_x2(), ); } } /** * Filter addon's meta data retrieved from db * * @since 1.1 * * @param array $addon_meta_data Current addon meta data retrieved from db. * @param Forminator_Integration $connected_addon Connected addon. * @param Forminator_Form_Entry_Model $entry_model Entry model. * @param string $addon_meta_data_prefix default prefix of connected addon meta data key. */ $addon_meta_data = apply_filters( 'forminator_addon_meta_data_from_entry_model', $addon_meta_data, $connected_addon, $entry_model, $addon_meta_data_prefix ); return $addon_meta_data; } /** * Generate Html for **single** addon * * Used on Integrations page, and Form Settings Integration Tab * * @param array $addon that already formatted to_array. * @param int $module_id Module Id. * @param string $module_slug Module type. * @param bool $show_pro_info Show PRO info. * @param bool $is_active (show as active addon ?). * * @return string */ function forminator_addon_row_html_markup( $addon, $module_id, $module_slug = 'form', $show_pro_info = true, $is_active = true ) { ob_start(); $single_addon_template_path = forminator_plugin_dir() . 'admin/views/integrations/addon.php'; /** * Filter Template path of single addon html * * @since 1.1 * * @param string $single_addon_template_path current used path. */ $single_addon_template_path = apply_filters( 'forminator_addon_single_' . $module_slug . '_addon_template_path', $single_addon_template_path ); /* @noinspection PhpIncludeInspection */ include $single_addon_template_path; $html = ob_get_clean(); /** * Filter displayed html **single** addon * * @since 1.1 * @since 1.5.1 add $is_active * * @param string $html current html to be displayed. * @param array $addon addon instance that already formatted to_array. * @param int $module_id * @param bool $show_pro_info whether to show pro info. */ $html = apply_filters( 'forminator_addon_' . $module_slug . '_row_html', $html, $addon, $module_id, $show_pro_info, $is_active ); return $html; } /** * Add log of forminator addon related if permitted * * To be this can be active : * - WP_DEBUG : true * - FORMINATOR_ADDON_DEBUG : true * - forminator_addon_enable_log : true * * @see forminator_maybe_log() * * @since 1.1 * @since 1.3 add FORMINATOR_ADDON_DEBUG as enabled flag */ function forminator_addon_maybe_log() { $enabled = ( defined( 'FORMINATOR_ADDON_DEBUG' ) && FORMINATOR_ADDON_DEBUG ); /** * Filter log enable for forminator addon * * By default it will check `WP_DEBUG`, `FORMINATOR_ADDON_DEBUG`, `FORMINATOR_DEBUG` must be true * * @since 1.1 * * @param bool $enabled current enable status. */ $enabled = apply_filters( 'forminator_addon_enable_log', $enabled ); if ( $enabled ) { if ( is_callable( 'forminator_maybe_log' ) ) { $args = array( '[ADDON]' ); $fargs = func_get_args(); $args = array_merge( $args, $fargs ); call_user_func_array( 'forminator_maybe_log', $args ); } } } /** * Replacer custom form vars * * @since 1.2 * * @param string $content Content. * @param array $submitted_data Submitted data. * @param Forminator_Form_Model $custom_form Form model. * @param array $entry_meta Entry meta. * @param bool $allow_html Allow HTML. * @param mixed $entry Entry. * * @return mixed|string */ function forminator_addon_replace_custom_vars( $content, $submitted_data, Forminator_Form_Model $custom_form, $entry_meta, $allow_html = false, $entry = null ) { $entry_model = new Forminator_Form_Entry_Model(); foreach ( $entry_meta as $meta ) { if ( isset( $meta['name'] ) ) { $entry_model->meta_data[ $meta['name'] ] = array( 'id' => $meta['name'], 'value' => wp_unslash( $meta['value'] ), ); } } $content = forminator_replace_variables( $content, $custom_form->id, $entry ); $content = forminator_replace_custom_form_data( $content, $custom_form, $entry_model ); $field_types = Forminator_Core::get_field_types(); // sort by length, so stripos will work by traverse from longest field type first. $field_types_strlen = array_map( 'strlen', $field_types ); array_multisort( $field_types_strlen, $field_types, SORT_DESC ); $field_types = array_reverse( $field_types ); $randomed_field_pattern = 'field-\d+-\d+'; $increment_field_pattern = sprintf( '(%s)-\d+', implode( '|', $field_types ) ); $pattern = '/\{((' . $randomed_field_pattern . ')|(' . $increment_field_pattern . '))(\-[A-Za-z-_]+)?\}/'; // Find all field ID's. if ( preg_match_all( $pattern, $content, $matches ) ) { if ( ! isset( $matches[0] ) || ! is_array( $matches[0] ) ) { return $content; } foreach ( $matches[0] as $match ) { $element_id = forminator_clear_field_id( $match ); $meta_value = array(); $field_type = Forminator_Core::get_field_type( $element_id ); if ( isset( $entry_model->meta_data[ $element_id ] ) ) { $meta_value = $entry_model->meta_data[ $element_id ]['value']; } elseif ( isset( $submitted_data[ $element_id ] ) ) { $meta_value = $submitted_data[ $element_id ]; } $value = Forminator_Form_Entry_Model::meta_value_to_string( $field_type, $meta_value, $allow_html ); $content = str_replace( $match, $value, $content ); } } return $content; } /** * Get admin url of addon integration page * * @since 1.2 * * @param mixed $addon Addon. * @param mixed $section Section. * @param bool $with_nonce With nonce. * @param string $identifier Identifier. * * @return string */ function forminator_addon_integration_section_admin_url( $addon, $section, $with_nonce = true, $identifier = '' ) { $admin_url = admin_url( 'admin.php' ); $query_args = array( 'page' => 'forminator-integrations', 'slug' => $addon->get_slug(), 'section' => $section, ); if ( $addon->is_multi_global ) { if ( $identifier ) { $query_args['identifier'] = rawurlencode( $identifier ); } $query_args['global_id'] = $addon->multi_global_id; } if ( $with_nonce ) { if ( ! class_exists( 'Forminator_Integrations_Page' ) ) { return ''; } $nonce = Forminator_Integrations_Page::get_addon_page_nonce(); $query_args['nonce'] = $nonce; } return add_query_arg( $query_args, $admin_url ); } /** * Get Registered Addons * * @since 1.5.3 * * @return Forminator_Integration[] */ function forminator_get_registered_addons() { $addons = array(); $registered_addons = Forminator_Integration_Loader::get_instance()->get_addons(); foreach ( $registered_addons as $slug => $registered_addon ) { $addon = forminator_get_addon( $slug ); if ( $addon instanceof Forminator_Integration ) { $addons[ $addon->get_slug() ] = $addon; } } return $addons; } /** * Find addon meta data from entry model that saved on db * * @since 1.5.3 * * @param Forminator_Form_Entry_Model $entry_model Form entry model. * * @return array */ function forminator_find_addon_slugs_from_entry_model( Forminator_Form_Entry_Model $entry_model ) { $addon_slugs = array(); $addon_metadata_pattern_prefix = 'forminator_addon_'; foreach ( $entry_model->meta_data as $key => $meta_datum ) { if ( false !== stripos( $key, $addon_metadata_pattern_prefix ) ) { $key = str_ireplace( $addon_metadata_pattern_prefix, '', $key ); $keys = explode( '_', $key, 2 ); if ( isset( $keys[0] ) ) { $slug = $keys[0]; if ( ! in_array( $slug, $addon_slugs, true ) ) { $addon_slugs[] = $slug; } } } } /** * Filter addons slug from entry model retrieved from db * * @since 1.5.3 * * @param Forminator_Form_Entry_Model $entry_model * @param string $addon_meta_data_prefix default prefix of connected addon meta data key. */ $addon_slugs = apply_filters( 'forminator_addon_slugs_from_entry_model', $addon_slugs, $entry_model, $addon_metadata_pattern_prefix ); return $addon_slugs; } /** * Format poll settings to used by addon * * @since 1.6.1 * * @param Forminator_Base_Form_Model $poll Base form model. * * @return array formatted and filtered form settings */ function forminator_addon_format_poll_settings( Forminator_Base_Form_Model $poll ) { $poll_settings = $poll->settings; /** * Filter poll settings to used by addon * * It will be used by all Addons * * @since 1.6.1 * * @param array $poll_settings Current formatted form_settings. * @param Forminator_Base_Form_Model $poll Custom Form Model. */ $poll_settings = apply_filters( 'forminator_addon_formatted_poll_settings', $poll_settings, $poll ); return $poll_settings; } /** * Format Poll Fields (contains poll answers) * * @since 1.6.1 * * @param Forminator_Base_Form_Model $poll Base form model. * * @return array */ function forminator_addon_format_poll_fields( Forminator_Base_Form_Model $poll ) { $formatted_fields = array(); $fields = $poll->get_fields(); foreach ( $fields as $field ) { $field_as_array = $field->to_formatted_array(); $formatted_fields[] = $field_as_array; } /** * Filter formatted fields to be used by addon * * This value will be used by **ALL** addons * * @since 1.1 * * @param array $formatted_fields current formatted fields. * @param Forminator_Form_Model $poll Custom form Model. */ $formatted_fields = apply_filters( 'forminator_addon_formatted_poll_fields', $formatted_fields, $poll ); return $formatted_fields; } /** * Format quiz settings to used by addon * * @since 1.6.2 * * @param Forminator_Quiz_Model $quiz Quiz model. * * @return array formatted and filtered form settings */ function forminator_addon_format_quiz_settings( Forminator_Quiz_Model $quiz ) { $quiz_settings = $quiz->settings; /** * Filter quiz settings to used by addon * * It will be used by all Addons * * @since 1.6.2 * * @param array $quiz_settings Current formatted quiz_settings. * @param Forminator_Quiz_Model $quiz Quiz Model. */ $quiz_settings = apply_filters( 'forminator_addon_formatted_quiz_settings', $quiz_settings, $quiz ); return $quiz_settings; } /** * Lead form data * * @param array $submitted_data Submitted data. * * @return Forminator_Form_Entry_Model|null */ function forminator_lead_form_data( $submitted_data ) { $entry_data = null; $data_entry = isset( $submitted_data['entry_id'] ) ? $submitted_data['entry_id'] : 0; $entries = new Forminator_Form_Entry_Model( $data_entry ); if ( ! empty( $entries ) ) { $entry_data = $entries; } return $entry_data; } /** * Addons lead submitted data * * @param array $form_fields Form fields. * @param mixed $entries Entries. * * @return array */ function forminator_addons_lead_submitted_data( $form_fields, $entries ) { $submitted_data = array(); if ( ! empty( $form_fields ) && ! empty( $entries->meta_data ) ) { foreach ( $form_fields as $form_field ) { foreach ( $entries->meta_data as $meta_key => $entry ) { if ( is_array( $entry['value'] ) && ( strpos( $meta_key, 'postdata-' ) !== false || strpos( $meta_key, 'name-' ) !== false || strpos( $meta_key, 'address-' ) !== false ) ) { if ( strpos( $meta_key, 'postdata-' ) !== false && isset( $entry['value']['value'] ) ) { $meta_entry_value = $entry['value']['value']; } else { $meta_entry_value = $entry['value']; } foreach ( $meta_entry_value as $entry_key => $entry_value ) { $entry_name = $meta_key . '-' . $entry_key; if ( $form_field['element_id'] === $entry_name ) { $submitted_data[ $entry_name ] = $entry_value; } } } else { $submitted_data[ $meta_key ] = $entry['value']; } } } } return $submitted_data; } /** * Get lead data * * @param array $quiz_settings Quiz settings. * @param array $submitted_data Submitted data. * @param array $addons_fields Addon fields. * * @return array */ function get_addons_lead_form_entry_data( $quiz_settings, $submitted_data, $addons_fields ) { if ( isset( $quiz_settings['hasLeads'] ) && $quiz_settings['hasLeads'] ) { $entries = forminator_lead_form_data( $submitted_data ); $submitted_data = forminator_addons_lead_submitted_data( $addons_fields, $entries ); if ( ! empty( $addons_fields ) ) { foreach ( $addons_fields as $form_field ) { if ( array_key_exists( $form_field['element_id'], $submitted_data ) ) { $form_value = Forminator_Form_Entry_Model::meta_value_to_string( $form_field['field_type'], $submitted_data[ $form_field['element_id'] ] ); $submitted_data[ $form_field['element_id'] ] = $form_value; } } } } return $submitted_data; } /** * Get quiz data * * @param mixed $quiz Quiz. * @param array $data Data. * @param array $quiz_entry_fields Quiz entry fields. * * @return mixed */ function get_quiz_submitted_data( $quiz, $data, $quiz_entry_fields ) { if ( is_array( $quiz_entry_fields ) && isset( $quiz_entry_fields[0] ) ) { $quiz_entry = $quiz_entry_fields[0]; if ( isset( $quiz_entry['name'] ) && isset( $quiz_entry['value'] ) && 'entry' === $quiz_entry['name'] ) { if ( is_array( $quiz_entry['value'] ) && ! empty( $quiz_entry['value'] ) ) { if ( 'knowledge' === $quiz->quiz_type ) { $answers = $quiz_entry['value']; $correct_answer_count = 0; $total_answer = 0; foreach ( $answers as $answer ) { $is_correct = isset( $answer['isCorrect'] ) ? $answer['isCorrect'] : false; $is_correct = filter_var( $is_correct, FILTER_VALIDATE_BOOLEAN ); if ( $is_correct ) { ++$correct_answer_count; } ++$total_answer; } $data['correct-answers'] = $correct_answer_count; $data['total-answers'] = $total_answer; } elseif ( 'nowrong' === $quiz->quiz_type ) { $result_content = ''; $meta = $quiz_entry['value']; // i know its complicated as eff, but this is how it saved since day 1. // and migrating this might pita and affect performance. if ( isset( $meta[0] ) && isset( $meta[0]['value'] ) && isset( $meta[0]['value']['result'] ) ) { $result = $meta[0]['value']['result']; $result_content = isset( $result['title'] ) ? esc_html( (string) $result['title'] ) : ''; } $data['result-answers'] = $result_content; } } } } $answers = isset( $data['answers'] ) ? $data['answers'] : array(); if ( is_array( $answers ) && ! empty( $answers ) ) { foreach ( $answers as $question_id => $answer_id ) { $answer = $quiz->getAnswer( $question_id, $answer_id ); $answer_text = isset( $answer['title'] ) ? $answer['title'] : ''; $data[ $question_id ] = $answer_text; } } $data['quiz-name'] = forminator_get_name_from_model( $quiz ); return $data; } /** * Flag whether doc link should shown or not for addons * * @since 1.14.2 * @return bool */ function forminator_is_show_addons_documentation_link() { if ( Forminator::is_wpmudev_member() ) { return ! apply_filters( 'wpmudev_branding_hide_doc_link', false ); } return true; } helper-autofill.php 0000644 00000001337 15162502317 0010357 0 ustar 00 <?php /** * Callable function for Autofill related * * @package Forminator */ /** * Build autofill providers from $slug_attributes array * * @since 1.0.5 * * @param array $slug_attributes Slug attributes. * * @return array */ function forminator_build_autofill_providers( $slug_attributes ) { return Forminator_Autofill_Loader::get_instance()->get_grouped_autofill_providers( $slug_attributes ); } /** * Init autofill provider by its slug * * @since 1.0.5 * * @param string $provider_slug provider slug. * * @return Forminator_Autofill_Provider_Abstract|null */ function forminator_autofill_init_provider( $provider_slug ) { return Forminator_Autofill_Loader::get_instance()->init_provider( $provider_slug ); } helper-importer.php 0000644 00000005475 15162502317 0010410 0 ustar 00 <?php /** * Importer helper functions. * * @package Forminator */ /** * Return status of external plugins for Import/export feature * * If this function return false, Import/export feature for the * plugin will be disabled * * @since 1.7 * @param string $plugin Name of the plugin. * @return bool */ function forminator_is_import_plugin_enabled( $plugin ) { // enable import export feature for entire planet by default. $active = false; switch ( $plugin ) { case 'cf7': if ( function_exists( 'wpcf7_contact_form' ) ) { $active = true; } break; case 'ninjaforms': if ( class_exists( 'Ninja_Forms' ) ) { $active = false; } break; case 'gravityforms': if ( class_exists( 'GFForms' ) ) { $active = false; } break; default: // code... break; } /** * Filter the status of Import/export feature * * @since 1.4 * * @param bool $active current status of the plugin. */ $active = apply_filters( 'forminator_is_import_export_feature_enabled', $active ); return $active; } /** * Get plugin deactivation link * * @param string $plugin Name of the plugin. * @param string $slug Plugin slug. * * @since 1.7 * * @return bool */ function forminator_get_disable_url( $plugin, $slug ) { if ( ! forminator_is_import_plugin_enabled( $plugin ) ) { return false; } if ( is_plugin_active_for_network( $slug ) ) { return wp_nonce_url( trailingslashit( network_admin_url() ) . 'plugins.php?action=deactivate&plugin=' . $slug . '&plugin_status=all', 'deactivate-plugin_' . $slug ); } else { return wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $slug . '&plugin_status=all', 'deactivate-plugin_' . $slug ); } } /** * Return status of external plugins for Import/export feature * * If this function return false, Import/export feature for the * plugin will be disabled * * @since 1.7 * @param array $plugins Name of the plugins. * @return bool */ function forminator_are_import_plugins_enabled( $plugins = array() ) { $active = false; foreach ( $plugins as $key => $plugin ) { if ( true === $active ) { break; } $active = forminator_is_import_plugin_enabled( $plugin ); } $active = apply_filters( 'forminator_are_import_plugins_enabled', $active ); return $active; } /** * Return all the contact forms from thirdparties * * @param string $type type. * * @since 1.7 * @return array list of forms */ function forminator_list_thirdparty_contact_forms( $type ) { // get all forms. $forms = array(); switch ( $type ) { case 'cf7': $forms = get_posts( array( 'post_type' => 'wpcf7_contact_form', 'posts_per_page' => -1, ) ); break; case 'ninjaforms': $forms = Ninja_Forms()->form()->get_forms(); break; case 'gravityforms': $forms = GFAPI::get_forms(); break; } return $forms; } helper-payment.php 0000644 00000003107 15162502320 0010204 0 ustar 00 <?php /** * Payment helper functions. * * @package Forminator */ /** * Check if stripe payment lib loaded * * @since 1.7.0 * * @param string $version Version. * * @return bool */ function forminator_payment_lib_stripe_version_loaded( $version = FORMINATOR_STRIPE_LIB_VERSION ) { $loaded = false; $min_php_version = apply_filters( 'forminator_payments_stripe_min_php_version', '5.6.0' ); if ( version_compare( PHP_VERSION, $min_php_version, 'ge' ) ) { if ( class_exists( '\Forminator\Stripe\Stripe' ) ) { if ( defined( '\Forminator\Stripe\Stripe::VERSION' ) ) { $loaded = \Forminator\Stripe\Stripe::VERSION === $version; } } } return $loaded; } /** * Get stripe php lib version * * @since 1.7.0 * @return int|string */ function forminator_payment_lib_stripe_get_version() { if ( forminator_payment_lib_stripe_version_loaded() ) { return \Forminator\Stripe\Stripe::VERSION; } return 0; } /** * Check if PayPal payment lib loaded * * @since 1.7.1 * * @param string $version Version. * * @return bool */ function forminator_payment_lib_paypal_version_loaded( $version = FORMINATOR_PAYPAL_LIB_VERSION ) { $loaded = false; $min_php_version = apply_filters( 'forminator_payments_paypal_min_php_version', '5.3' ); if ( version_compare( PHP_VERSION, $min_php_version, 'ge' ) ) { if ( class_exists( '\Forminator\PayPal\Core\PayPalConstants' ) ) { if ( defined( '\Forminator\PayPal\Core\PayPalConstants::SDK_VERSION' ) ) { $loaded = \Forminator\PayPal\Core\PayPalConstants::SDK_VERSION === $version; } } } return $loaded; } helper-fields.php 0000644 00000360033 15162502320 0010001 0 ustar 00 <?php /** * Fields helper functions. * * @package Forminator */ if ( ! defined( 'ABSPATH' ) ) { die(); } /** * Return custom form * * @param int $id Id. * @param bool $is_preview Is preview?. * @param bool $hidden Is hidden?. * * @since 1.0 * @return mixed */ function forminator_form( $id, $is_preview = false, $hidden = true ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed $view = new Forminator_CForm_Front(); return $view->render_shortcode( array( 'id' => $id, 'is_preview' => $is_preview, ) ); } /** * Return custom form * * @param int $id Id. * @param bool $is_preview Is preview?. * @param bool $hidden Is hidden?. * * @since 1.0 * @return mixed */ function forminator_poll( $id, $is_preview = false, $hidden = true ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed $view = new Forminator_Poll_Front(); return $view->render_shortcode( array( 'id' => $id, 'is_preview' => $is_preview, ) ); } /** * Return custom form * * @param int $id Id. * @param bool $is_preview Is preview?. * @param bool $hidden Is hidden?. * * @since 1.0 * @return mixed */ function forminator_quiz( $id, $is_preview = false, $hidden = true ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed $view = new Forminator_QForm_Front(); return $view->render_shortcode( array( 'id' => $id, 'is_preview' => $is_preview, ) ); } /** * Return module * * @param int $id Id. * @param string $type Form type. * @param bool $ajax Is Ajax?. * @param mixed $data Data. * * @since 1.0 * @return mixed */ function forminator_preview( $id, $type, $ajax = false, $data = false ) { $class = 'Forminator_CForm_Front'; if ( 'poll' === $type ) { $class = 'Forminator_Poll_Front'; } elseif ( 'quiz' === $type ) { $class = 'Forminator_QForm_Front'; } $view = new $class(); $data = forminator_stripslashes_deep( $data ); return $view->render_shortcode( array( 'id' => $id, 'is_preview' => $ajax, 'preview_data' => $data, ) ); } /** * Return stripslashed string or array * * @param string $val Content to strip slashes. * * @since 1.0 * @return mixed */ function forminator_stripslashes_deep( $val ) { $val = is_array( $val ) ? array_map( 'stripslashes_deep', $val ) : stripslashes( $val ); return $val; } /** * Sanitize field * * @since 1.0.2 * * @param mixed $field Field. * @param null|string $key Key. * * @return array|string */ function forminator_sanitize_field( &$field, $key = null ) { if ( 'question_description' === $key ) { return wp_kses_post( $field ); } // If array map all fields. if ( is_array( $field ) ) { array_walk( $field, 'forminator_sanitize_field' ); return $field; } return sanitize_text_field( $field ); } /** * Forminator sanitation for module settings before saving. * Used for sanitizing form integration settings description field. * * @param array $fields Fields. * * @return mixed */ function forminator_sanitize_array_field( $fields ) { $allow_html = array( 'consent_description', 'variations', 'sc_message', 'hc_invisible_notice', 'ticket_description', 'footer_value', 'value', ); foreach ( $fields as $key => &$value ) { if ( is_array( $value ) ) { $value = forminator_sanitize_array_field( $value ); } elseif ( in_array( $key, $allow_html, true ) ) { $value = wp_kses_post( $value ); } elseif ( 'card_description' === $key || 'gdpr_text' === $key || 'message' === $key ) { $value = sanitize_textarea_field( $value ); } else { $value = sanitize_text_field( $value ); } } return $fields; } /** * Forminator decode HTML entity * * @param array $fields Fields. * * @return mixed */ function forminator_decode_html_entity( $fields ) { foreach ( $fields as &$value ) { if ( is_array( $value ) ) { $value = forminator_decode_html_entity( $value ); } else { $value = wp_specialchars_decode( $value ); } } return $fields; } /** * Sanitize text area * * @param string $field Field value. * * @return string */ function forminator_sanitize_textarea( $field ) { return sanitize_textarea_field( $field ); } /** * Return the array of ALL fields objects * * @since 1.0 * @return mixed */ function forminator_get_fields() { $forminator = Forminator_Core::get_instance(); return $forminator->fields; } /** * Return the array of PRO fields for promotion PRO version * * @return array */ function forminator_get_pro_fields() { $forminator = Forminator_Core::get_instance(); return $forminator->pro_fields; } /** * Return all existing custom fields * * @since 1.0 * @deprecated 1.5.4 * @return mixed */ function forminator_get_existing_cfields() { _deprecated_function( 'forminator_get_existing_cfields', '1.5.4' ); return array(); } /** * Convert array to array compatible with field values * * @since 1.0 * * @param array $array_values Field values. * @param bool $replace_value Replace value. * * @return array */ function forminator_to_field_array( $array_values, $replace_value = false ) { $field_array = array(); if ( ! empty( $array_values ) ) { foreach ( $array_values as $key => $value ) { // Use value instead of key. if ( $replace_value ) { $field_array[] = array( 'value' => $value, 'label' => $value, ); } else { $field_array[] = array( 'value' => $key, 'label' => $value, ); } } } return $field_array; } /** * Return max upload limit from server * * @since 1.6 * @return int Mb */ function forminator_get_max_upload() { $max_upload = wp_max_upload_size(); return (int) ( $max_upload / 1000000 ); // convert to mb;. } /** * Return users list * * @since 1.6 * @return array */ function forminator_list_users() { $users_list = array(); $page = Forminator_Core::sanitize_text_field( 'page' ); if ( 'forminator-cform-wizard' !== $page ) { return $users_list; } $users = get_users( array( 'role__in' => array( 'administrator', 'editor', 'author' ), 'fields' => array( 'ID', 'display_name' ), ) ); foreach ( $users as $user ) { $users_list[] = array( 'value' => $user->ID, 'label' => ucfirst( $user->display_name ), ); } return apply_filters( 'forminator_postdata_users_list', $users_list ); } /** * Return post type list * * @since 1.7 * @return array */ function forminator_post_type_list() { $post_type_list = array(); $post_types = get_post_types( array( 'public' => true ), 'objects' ); unset( $post_types['attachment'] ); unset( $post_types['revision'] ); unset( $post_types['nav_menu_item'] ); unset( $post_types['custom_css'] ); unset( $post_types['customize_changeset'] ); unset( $post_types['oembed_cache'] ); unset( $post_types['user_request'] ); unset( $post_types['wp_block'] ); foreach ( $post_types as $post ) { $post_type_list[] = array( 'value' => $post->name, 'label' => ucfirst( $post->label ), ); } return apply_filters( 'forminator_postdata_post_type_list', $post_type_list ); } /** * Return post type Categories * * @since 1.7 * * @param string $type Type. * * @return array */ function forminator_post_categories( $type = '' ) { $categories = array(); $category = array(); $post_types = forminator_post_type_list(); foreach ( $post_types as $post ) { $post_type = $post['value']; $categories = get_object_taxonomies( $post_type, 'objects' ); if ( ! empty( $categories ) ) { foreach ( $categories as $cat ) { if ( 'post_format' !== $cat->name ) { $category[ $post_type ][] = array( 'value' => $cat->name, 'label' => ucfirst( $cat->label ), 'singular' => $cat->labels->singular_name, ); } } } $categories = $category; } if ( ! empty( $type ) ) { $category_list = isset( $categories[ $type ] ) ? $categories[ $type ] : array(); } else { $category_list = $categories; } return apply_filters( 'forminator_postdata_post_categories', $category_list ); } /** * Return vars * * @since 1.0 * @since 1.5 add `user_id` * * @param bool $for_hidden_field For hidden field. @since 1.15.6. * * @return mixed */ function forminator_get_vars( $for_hidden_field = false ) { $vars_list = array( 'user_ip' => esc_html__( 'User IP Address', 'forminator' ), 'date_mdy' => esc_html__( 'Date (mm/dd/yyyy)', 'forminator' ), 'date_dmy' => esc_html__( 'Date (dd/mm/yyyy)', 'forminator' ), 'submission_id' => esc_html__( 'Submission ID', 'forminator' ), 'submission_time' => esc_html__( 'Submission Time (hh:mm:ss am/pm, timezone)', 'forminator' ), 'submission_date' => esc_html__( 'Submission Date (F d, Y)', 'forminator' ), 'submission_date_mdy' => esc_html__( 'Submission Date (mm/dd/yyyy)', 'forminator' ), 'submission_date_dmy' => esc_html__( 'Submission Date (dd/mm/yyyy)', 'forminator' ), 'embed_id' => esc_html__( 'Embed Post/Page ID', 'forminator' ), 'embed_title' => esc_html__( 'Embed Post/Page Title', 'forminator' ), 'embed_url' => esc_html__( 'Embed URL', 'forminator' ), 'login_url' => esc_html__( 'Login URL', 'forminator' ), 'user_agent' => esc_html__( 'HTTP User Agent', 'forminator' ), 'refer_url' => esc_html__( 'HTTP Refer URL', 'forminator' ), 'user_id' => esc_html__( 'User ID', 'forminator' ), 'user_name' => esc_html__( 'User Display Name', 'forminator' ), 'user_email' => esc_html__( 'User Email', 'forminator' ), 'user_login' => esc_html__( 'User Login', 'forminator' ), ); if ( $for_hidden_field ) { $vars_list['custom_value'] = esc_html__( 'Custom Value', 'forminator' ); $vars_list['query'] = esc_html__( 'Query Parameter', 'forminator' ); } /** * Filter forminator var list * * @see forminator_replace_variables() * * @since 1.0 * * @param array $vars_list */ return apply_filters( 'forminator_vars_list', $vars_list ); } /** * Return Stripe vars * * @since 1.7 * @return mixed */ function forminator_get_payment_vars() { $vars_list = array( 'payment_amount' => esc_html__( 'Amount', 'forminator' ), 'payment_currency' => esc_html__( 'Currency', 'forminator' ), 'payment_mode' => esc_html__( 'Mode', 'forminator' ), 'payment_status' => esc_html__( 'Status', 'forminator' ), 'transaction_id' => esc_html__( 'Transaction ID', 'forminator' ), ); /** * Filter forminator Stripe var list * * @since 1.7 * * @param array $vars_list */ return apply_filters( 'forminator_stripe_vars_list', $vars_list ); } /** * Return Stripe subscription vars * * @since 1.38 * @return array */ function forminator_get_stripe_subscription_vars() { $vars_list = array( 'subscription_id' => esc_html__( 'Subscription ID', 'forminator' ), ); /** * Filter forminator Stripe subscription var list * * @since 1.38 * * @param array $vars_list */ return apply_filters( 'forminator_stripe_subscription_vars_list', $vars_list ); } /** * Return required icon * * @since 1.0 * @return string */ function forminator_get_required_icon() { return '<span class="forminator-required">*</span>'; } /** * Return week days * * @since 1.0 * @return array */ function forminator_week_days() { return apply_filters( 'forminator_week_days', array( 'sunday' => esc_html__( 'Sunday', 'forminator' ), 'monday' => esc_html__( 'Monday', 'forminator' ), 'tuesday' => esc_html__( 'Tuesday', 'forminator' ), 'wednesday' => esc_html__( 'Wednesday', 'forminator' ), 'thursday' => esc_html__( 'Thursday', 'forminator' ), 'friday' => esc_html__( 'Friday', 'forminator' ), 'saturday' => esc_html__( 'Saturday', 'forminator' ), ) ); } /** * Return name prefixes * * @since 1.0 * @return array */ function forminator_get_name_prefixes() { return apply_filters( 'forminator_name_prefixes', array( 'Mr' => esc_html__( 'Mr.', 'forminator' ), 'Mrs' => esc_html__( 'Mrs.', 'forminator' ), 'Ms' => esc_html__( 'Ms.', 'forminator' ), 'Mx' => esc_html__( 'Mx.', 'forminator' ), 'Miss' => esc_html__( 'Miss', 'forminator' ), 'Dr' => esc_html__( 'Dr.', 'forminator' ), 'Prof' => esc_html__( 'Prof.', 'forminator' ), ) ); } /** * Return field id by string * * @since 1.0 * * @param string $field_id Field id. * * @return mixed */ function forminator_clear_field_id( $field_id ) { $field_id = str_replace( '{', '', $field_id ); $field_id = str_replace( '}', '', $field_id ); return $field_id; } /** * Return filtered editor content with form data * * @since 1.0 * @param string $content Content. * @param Forminator_Form_Model|null $custom_form Forminator_Form_Model. * @param Forminator_Form_Entry_Model|null $entry Forminator_Form_Entry_Model. * @param bool $get_labels Optional. Set true for getting labels instead of values for select, radio and checkbox. * @param bool $urlencode Encode URL. * @param mixed $user_meta User meta. * @param bool $is_pdf Is PDF. * @return mixed */ function forminator_replace_form_data( $content, ?Forminator_Form_Model $custom_form = null, ?Forminator_Form_Entry_Model $entry = null, $get_labels = false, $urlencode = false, $user_meta = false, $is_pdf = false ) { if ( is_null( $content ) ) { $content = ''; } $data = Forminator_CForm_Front_Action::$prepared_data; $matches = array(); $field_types = Forminator_Core::get_field_types(); $original_content = $content; if ( $is_pdf ) { $data = recreate_prepared_data( $custom_form, $entry ); } $content = forminator_replace_form_payment_data( $content, $custom_form, $entry ); $randomed_field_pattern = 'field-\d+-\d+'; $increment_field_pattern = sprintf( '(%s)-\d+', implode( '|', $field_types ) ); $pattern = '/\{((' . $randomed_field_pattern . ')|(' . $increment_field_pattern . '))(\-[A-Za-z0-9-_]+)?\}/'; $print_value = ! empty( $custom_form->settings['print_value'] ) ? filter_var( $custom_form->settings['print_value'], FILTER_VALIDATE_BOOLEAN ) : false; // Find all field ID's. if ( preg_match_all( $pattern, $content, $matches ) ) { if ( ! isset( $matches[0] ) || ! is_array( $matches[0] ) ) { return $content; } foreach ( $matches[0] as $match ) { $element_id = forminator_clear_field_id( $match ); $value = ''; // For HTML field we get the relevant field label instead of field value for select, radio and checkboxes and for them themselves. if ( $get_labels && ! $print_value && ( strpos( $element_id, 'radio' ) === 0 || strpos( $element_id, 'select' ) === 0 || strpos( $element_id, 'checkbox' ) === 0 ) ) { $value = forminator_replace_field_data( $custom_form, $element_id, $data, false, $is_pdf ); } elseif ( ( strpos( $element_id, 'postdata' ) !== false || strpos( $element_id, 'upload' ) !== false || strpos( $element_id, 'html' ) !== false || strpos( $element_id, 'section' ) !== false || strpos( $element_id, 'signature' ) !== false ) && $custom_form && $entry ) { $value = forminator_get_field_from_form_entry( $element_id, $custom_form, $entry, $user_meta ); if ( strpos( $element_id, 'html' ) !== false ) { $value = forminator_replace_form_data( $value, $custom_form, $entry, $get_labels ); } } elseif ( isset( $data[ $element_id ] ) ) { if ( strpos( $element_id, 'number' ) !== false || strpos( $element_id, 'currency' ) !== false || strpos( $element_id, 'calculation' ) !== false ) { $field = $custom_form->get_field( $element_id, true ); $value = Forminator_Field::forminator_number_formatting( $field, $data[ $element_id ] ); } elseif ( false !== stripos( $element_id, 'time' ) && ( false !== stripos( $element_id, '-hours' ) || false !== stripos( $element_id, '-minutes' ) ) ) { $value = str_pad( $data[ $element_id ], 2, '0', STR_PAD_LEFT ); } else { $value = $data[ $element_id ]; } } elseif ( false !== stripos( $element_id, 'date' ) ) { // element with suffixes, etc. // use submitted `data` since its possible to disable DB storage,. // causing Forminator_Form_Entry_Model = nothing. // and cant be used as reference. // DATE. $day_element_id = $element_id . '-day'; $month_element_id = $element_id . '-month'; $year_element_id = $element_id . '-year'; $format_element_id = $element_id . '-format'; if ( isset( $data[ $day_element_id ] ) && isset( $data[ $month_element_id ] ) && isset( $data[ $year_element_id ] ) ) { $meta_value = array( 'day' => $data[ $day_element_id ], 'month' => $data[ $month_element_id ], 'year' => $data[ $year_element_id ], 'format' => $data[ $format_element_id ], ); $value = Forminator_Form_Entry_Model::meta_value_to_string( 'date', $meta_value, true ); } } // If array, convert it to string. if ( is_array( $value ) ) { $value = implode( ', ', $value ); } if ( $urlencode ) { $value = rawurlencode( $value ); } $content = str_replace( $match, $value, $content ); } } return apply_filters( 'forminator_replace_form_data', $content, $data, $original_content ); } /** * Replace select, checkbox and radio fields data * * @since 1.23.0 * * @param Forminator_Form_Model $custom_form Forminator_Form_Model. * @param string $element_id Element Id. * @param array $data Data. * @param bool $quiz_mail Quiz mail. * @param bool $is_pdf Is PDF. * * @return mixed */ function forminator_replace_field_data( $custom_form, $element_id, $data, $quiz_mail = false, $is_pdf = false ) { $field_value = isset( $data[ $element_id ] ) ? $data[ $element_id ] : null; $value = ''; if ( ! is_null( $field_value ) ) { $form_fields = $custom_form ? $custom_form->get_fields() : array(); $fields_slugs = wp_list_pluck( $form_fields, 'slug' ); $parent_id = preg_replace( '/(-[^-]+)-[^-]+$/', '$1', $element_id ); $field_key = array_search( $parent_id, $fields_slugs, true ); $field_options = false !== $field_key && ! empty( $form_fields[ $field_key ]->raw['options'] ) ? wp_list_pluck( $form_fields[ $field_key ]->options, 'label', 'value' ) : array(); if ( $quiz_mail ) { if ( false !== strpos( $field_value, ',' ) ) { $field_value = array_map( 'trim', explode( ',', $field_value ) ); } $selected_values = is_array( $field_value ) ? $field_value : array( $field_value ); if ( is_array( $field_value ) ) { $value = array_keys( array_intersect( $field_options, array_map( 'stripslashes', $selected_values ) ) ); } else { $value = implode( ', ', array_keys( array_intersect( $field_options, array_map( 'stripslashes', $selected_values ) ) ) ); } } elseif ( $is_pdf ) { // Since PDFs use entry meta which is already from the database, it has been processed already. if ( is_array( $field_value ) && isset( $field_value['value'] ) ) { $value = $field_value['value']; } else { $value = $field_value; } } else { $selected_values = is_array( $field_value ) ? $field_value : array( $field_value ); $selected_values = array_map( 'htmlspecialchars_decode', $selected_values ); $value = implode( ', ', array_keys( array_intersect( array_flip( $field_options ), array_map( 'stripslashes', $selected_values ) ) ) ); } } return $value; } /** * Format custom form data variables to html formatted * * @since 1.0.3 * * @param string $content Content. * @param Forminator_Form_Model $custom_form Forminator_Form_Model. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * @param array $excluded Excluded. * * @return mixed */ function forminator_replace_custom_form_data( $content, Forminator_Form_Model $custom_form, Forminator_Form_Entry_Model $entry, $excluded = array() ) { $custom_form_datas = array( '{all_fields}' => 'forminator_get_formatted_form_entry', '{all_non_empty_fields}' => 'forminator_get_formatted_form_non_empty_entry', '{form_name}' => 'forminator_get_formatted_form_name', '{submission_id}' => 'forminator_get_submission_id', '{submission_url}' => 'forminator_get_submission_url', '{account_approval_link}' => 'forminator_get_account_approval_link', '{username}' => 'forminator_get_formatted_username', '{line_break}' => 'forminator_get_formatted_line_break', ); foreach ( $custom_form_datas as $custom_form_data => $function ) { if ( in_array( $custom_form_data, $excluded, true ) ) { continue; } if ( strpos( $content, $custom_form_data ) !== false ) { if ( is_callable( $function ) ) { $replacer = call_user_func( $function, $custom_form, $entry ); $content = str_replace( $custom_form_data, $replacer, $content ); } } } return apply_filters( 'forminator_replace_custom_form_data', $content, $custom_form, Forminator_CForm_Front_Action::$prepared_data, $entry, $excluded, $custom_form_datas ); } /** * Get Html Formatted of form entry for email notification * * @since 1.0.3 * * @param Forminator_Form_Model $custom_form Forminator_Form_Model. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * @param boolean $exclude_empty [Optional] Exclude empty form entry. * * @return string */ function forminator_get_formatted_form_entry( Forminator_Form_Model $custom_form, Forminator_Form_Entry_Model $entry, $exclude_empty = false ) { $ignored_field_types = Forminator_Form_Entry_Model::ignored_fields(); $html = forminator_prepare_formatted_form_entry( $custom_form, $entry, $exclude_empty ); $filter_name = $exclude_empty ? 'forminator_get_formatted_form_non_empty_entry' : 'forminator_get_formatted_form_entry'; return apply_filters( $filter_name, $html, $custom_form, Forminator_CForm_Front_Action::$prepared_data, $entry, $ignored_field_types ); } /** * Prepare Html Formatted of form entry for email notification * * @param Forminator_Form_Model $custom_form Forminator_Form_Model. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * @param boolean $exclude_empty Exclude empty form entry. * @param array $form_fields Form fields. * @param string $repeater_suffix Repeater suffix. * @param boolean $show_label Show label. * @param string $list_tag List tag. * @param boolean $is_pdf Is PDF. * * @return string */ function forminator_prepare_formatted_form_entry( Forminator_Form_Model $custom_form, Forminator_Form_Entry_Model $entry, $exclude_empty, $form_fields = null, $repeater_suffix = '', $show_label = true, $list_tag = 'ol', $is_pdf = false ) { $ignored_field_types = Forminator_Form_Entry_Model::ignored_fields(); if ( is_null( $form_fields ) ) { $rendering_group = false; /** * Filter form fields before displaying * * @since 1.11 * * @param array $form_fields * @param Forminator_Form_Model $custom_form * * @return array */ $form_fields = apply_filters( 'forminator_custom_form_before_form_fields', $custom_form->get_fields(), $custom_form, Forminator_CForm_Front_Action::$prepared_data ); if ( is_null( $form_fields ) ) { $form_fields = array(); } } else { $rendering_group = true; } $html = '<br/><' . $list_tag . '>'; foreach ( $form_fields as $form_field ) { $field_array = $form_field->to_formatted_array(); $field_type = $field_array['type']; $field_id = Forminator_Field::get_property( 'element_id', $field_array ) . $repeater_suffix; if ( in_array( $field_id, Forminator_CForm_Front_Action::$hidden_fields, true ) || ( $form_field->parent_group && ! $rendering_group ) ) { continue; } if ( 'section' === $field_type ) { $value = $form_field->__get( 'section_title' ); $html .= '</' . $list_tag . '>'; $html .= '<h4><b>' . (string) $value . '</b></h4>'; $html .= '<' . $list_tag . '>'; } elseif ( 'html' === $field_type ) { $label = $form_field->__get( 'field_label' ); $value = $form_field->__get( 'variations' ); if ( $repeater_suffix ) { $group_fields = $custom_form->get_grouped_fields( $form_field->parent_group ); $original_keys = wp_list_pluck( $group_fields, 'slug' ); foreach ( $original_keys as $original_key ) { $value = str_replace( '{' . $original_key . '}', '{' . $original_key . $repeater_suffix . '}', $value ); } } $content = forminator_replace_form_data( $value, $custom_form, $entry, true, false, false, $is_pdf ); $content = forminator_replace_variables( $content, $custom_form->id ); $content = forminator_replace_custom_form_data( $content, $custom_form, $entry ); $html .= '</' . $list_tag . '>'; if ( ! empty( $label ) && $show_label ) { $html .= '<h4><b>' . $label . '</b></h4>'; } $html .= $content; $html .= '<' . $list_tag . '>'; } elseif ( in_array( $field_type, $ignored_field_types, true ) ) { continue; } elseif ( 'group' === $field_type ) { $label = $form_field->get_label_for_entry(); if ( ! empty( $label ) && $show_label ) { $html .= '<b>' . $label . '</b><br/>'; } $group_fields = $custom_form->get_grouped_fields( $field_id ); $html .= '<hr>'; $html .= forminator_prepare_formatted_form_entry( $custom_form, $entry, $exclude_empty, $group_fields ); $html .= '<hr>'; $original_keys = wp_list_pluck( $group_fields, 'slug' ); $repeater_keys = forminator_get_cloned_field_keys( $entry, $original_keys ); foreach ( $repeater_keys as $repeater_slug ) { $html .= forminator_prepare_formatted_form_entry( $custom_form, $entry, $exclude_empty, $group_fields, $repeater_slug ); $html .= '<hr>'; } } else { $slug = $form_field->slug . $repeater_suffix; if ( strpos( $slug, 'radio' ) !== false || strpos( $slug, 'select' ) !== false || strpos( $slug, 'checkbox' ) !== false ) { $value = forminator_replace_form_data( '{' . $slug . '}', $custom_form, $entry, true, false, false, $is_pdf ); } else { $separator = ! $show_label ? ' ' : '<br>'; $value = render_entry( $entry, $slug, $field_array, '', $exclude_empty, false, $separator, $show_label ); } /** * Filter value of a field that is not saved in DB */ $value = apply_filters( 'forminator_custom_form_after_render_value', $value, $custom_form, $slug, Forminator_CForm_Front_Action::$prepared_data ); if ( ! $exclude_empty || ! empty( $value ) ) { $html .= '<li>'; $label = $form_field->get_label_for_entry(); $display_label = $show_label; // Hide label for multiple name field. if ( 'name' === $field_type && ! empty( $field_array['multiple_name'] ) && 'true' === $field_array['multiple_name'] ) { $display_label = false; } if ( ! empty( $label ) && $display_label ) { $html .= '<b>' . $label . '</b><br/>'; } if ( isset( $value ) && '' !== $value ) { $html .= $value . '<br/>'; } $html .= '</li>'; } } } $html .= '</' . $list_tag . '><br/>'; return $html; } /** * Get Html Formatted of form entry * * @since 1.0.3 * * @param Forminator_Form_Model $custom_form Forminator_Form_Model. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * * @return string */ function forminator_get_formatted_form_non_empty_entry( Forminator_Form_Model $custom_form, Forminator_Form_Entry_Model $entry ) { return forminator_get_formatted_form_entry( $custom_form, $entry, true ); } /** * Get field from registered entries * * @since 1.0.5 * @since 1.24 Added $user_meta * * @param string $element_id Element Id. * @param Forminator_Form_Model $custom_form Forminator_Form_Model. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * @param bool $user_meta Check if usage is for user meta. * * @return string */ function forminator_get_field_from_form_entry( $element_id, Forminator_Form_Model $custom_form, Forminator_Form_Entry_Model $entry, $user_meta = false ) { $form_fields = $custom_form->get_fields(); if ( is_null( $form_fields ) ) { $form_fields = array(); } foreach ( $form_fields as $form_field ) { /** * Forminator_Form_Field_Model * * @var Forminator_Form_Field_Model $form_field */ if ( $form_field->slug !== $element_id ) { continue; } $field_type = $form_field->__get( 'type' ); if ( 'section' === $field_type ) { $value = $form_field->__get( 'section_title' ); } elseif ( 'html' === $field_type ) { $variations = $form_field->__get( 'variations' ); $value = forminator_replace_variables( $variations, $custom_form->id ); } elseif ( 'upload' === $field_type && $user_meta ) { $value = render_entry( $entry, $form_field->slug, null, '', false, true ); } else { $value = render_entry( $entry, $form_field->slug ); } return $value; } } /** * Get Html Formatted of form name * * @since 1.0.3 * * @param Forminator_Form_Model $custom_form Forminator_Form_Model. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * * @return string */ function forminator_get_formatted_form_name( Forminator_Form_Model $custom_form, Forminator_Form_Entry_Model $entry ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed return esc_html( forminator_get_form_name( $custom_form->id ) ); } /** * Get Submission ID * * @since 1.1 * * @param Forminator_Form_Model $custom_form Forminator_Form_Model. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * * @return string */ function forminator_get_submission_id( Forminator_Form_Model $custom_form, $entry = null ) { return is_object( $entry ) && isset( $entry->entry_id ) ? esc_html( $entry->entry_id ) : 0; } /** * Get referer url * * @since ? * * @param string $embed_url Embed URL. * @return string */ function forminator_get_referer_url( $embed_url = '' ) { $referer_url = ''; if ( isset( $_REQUEST['extra']['referer_url'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended $referer_url = sanitize_text_field( wp_unslash( $_REQUEST['extra']['referer_url'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended } elseif ( isset( $_REQUEST['referer_url'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended $referer_url = sanitize_text_field( wp_unslash( $_REQUEST['referer_url'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended } elseif ( isset( $_SERVER['HTTP_REFERER'] ) ) { $referer_url = sanitize_text_field( wp_unslash( $_SERVER['HTTP_REFERER'] ) ); } if ( '' === $referer_url ) { $referer_url = $embed_url; } return $referer_url; } /** * Get Submission URL * * @since 1.11 * * @param Forminator_Form_Model $custom_form Forminator_Form_Model. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * * @return string */ function forminator_get_submission_url( Forminator_Form_Model $custom_form, Forminator_Form_Entry_Model $entry ) { return '<a href="' . esc_url( admin_url( 'admin.php?page=forminator-entries&form_type=forminator_forms&form_id=' . $entry->form_id . '&entry_id=' . $entry->entry_id ) ) . '">' . esc_html__( 'here', 'forminator' ) . '</a>'; } /** * Get account approval link * * @since 1.11 * * @param Forminator_Form_Model $custom_form Forminator_Form_Model. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * * @return string */ function forminator_get_account_approval_link( Forminator_Form_Model $custom_form, Forminator_Form_Entry_Model $entry ) { $key = $entry->get_meta( 'activation_key', '' ); if ( ! empty( $key ) ) { $key = esc_url( add_query_arg( array( 'page' => 'account_activation', 'key' => $key, ), home_url( '/' ) ) ); $key = '<a href="' . $key . '" target="_blank">' . $key . '</a>'; } return '<p>' . $key . '</p>'; } /** * Get username from registration form * * @since 1.11 * * @param Forminator_Form_Model $custom_form Forminator_Form_Model. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * * @return string */ function forminator_get_formatted_username( Forminator_Form_Model $custom_form, Forminator_Form_Entry_Model $entry ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed $username = ''; if ( isset( $custom_form->settings['registration-username-field'] ) && ! empty( $custom_form->settings['registration-username-field'] ) ) { $username = $custom_form->settings['registration-username-field']; if ( ! empty( Forminator_CForm_Front_Action::$prepared_data[ $username ] ) ) { $username = '<b>' . Forminator_CForm_Front_Action::$prepared_data[ $username ] . '</b>'; } } return $username; } /** * Get line break * * @since 1.11 * * @return string */ function forminator_get_formatted_line_break() { return ' <br/>'; } /** * Get loggin URL * * @param string $embed_url Current URL. * @return string */ function forminator_get_login_url( $embed_url ) { if ( class_exists( 'Mask_Login' ) && method_exists( 'Mask_Login', 'is_active' ) && method_exists( 'Mask_Login', 'get_new_login_url' ) ) { $mask_login = new Mask_Login(); if ( $mask_login->is_active() ) { $login_url = $mask_login->get_new_login_url(); } } if ( empty( $login_url ) ) { global $wp_rewrite; $login_url = is_null( $wp_rewrite ) ? $embed_url . 'wp-login.php' : wp_login_url(); } return apply_filters( 'forminator_login_url', $login_url, $embed_url ); } /** * Return filtered editor content with replaced variables * * @since 1.0 * @since 1.0.6 add `{form_id}` handle * * @param string $content Content to replace the variables. * @param int $id Id. * @param mixed $entry Entry. * * @return string */ function forminator_replace_variables( $content, $id = false, $entry = null ) { $content_before_replacement = $content; // If we have no variables, skip. if ( strpos( $content, '{' ) !== false ) { $embed_url = ! empty( Forminator_CForm_Front_Action::$prepared_data['current_url'] ) ? Forminator_CForm_Front_Action::$prepared_data['current_url'] : forminator_get_current_url(); $post_id = null; if ( ! empty( Forminator_CForm_Front_Action::$prepared_data['page_id'] ) ) { $post_id = Forminator_CForm_Front_Action::$prepared_data['page_id']; } elseif ( $embed_url ) { $post_id = url_to_postid( $embed_url ); } $refer_url = forminator_get_referer_url( $embed_url ); $login_url = forminator_get_login_url( $embed_url ); // Use the date from the entry if date_created_sql exists. if ( ! empty( $entry->date_created_sql ) ) { $date_created = strtotime( $entry->date_created_sql ); } else { $date_created = forminator_local_timestamp(); } $variables = array( // Handle User IP Address variable. '{user_ip}' => forminator_user_ip(), // Handle Date (F d, Y) variable. '{date}' => date_i18n( 'F d, Y', forminator_local_timestamp(), true ), // Handle Date (mm/dd/yyyy) variable. '{date_mdy}' => date_i18n( 'm/d/Y', forminator_local_timestamp(), true ), // Handle Date (dd/mm/yyyy) variable. '{date_dmy}' => date_i18n( 'd/m/Y', forminator_local_timestamp(), true ), // Submission ID. '{submission_id}' => forminator_get_submission_id( new Forminator_Form_Model(), $entry ), // Submission time. '{submission_time}' => date_i18n( 'g:i:s a, T', $date_created, true ), // Submission Date (F d, Y) variable. '{submission_date}' => date_i18n( 'F d, Y', $date_created, true ), // Submission Date (mm/dd/yyyy) variable. '{submission_date_mdy}' => date_i18n( 'm/d/Y', $date_created, true ), // Submission Date (dd/mm/yyyy) variable. '{submission_date_dmy}' => date_i18n( 'd/m/Y', $date_created, true ), // Handle Embed Post/Page ID variable. '{embed_id}' => forminator_get_post_data( 'ID', $post_id ), // Handle Embed Post/Page Title variable. '{embed_title}' => forminator_get_post_data( 'post_title', $post_id ), // Handle Embed URL variable. '{embed_url}' => $embed_url, // Handle HTTP User Agent variable. // some browser not sending HTTP_USER_AGENT or some servers probably stripped this value. '{user_agent}' => isset( $_SERVER['HTTP_USER_AGENT'] ) ? esc_html( sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ) ) : '', // Handle site url variable. '{site_url}' => site_url(), // Handle login url variable. '{login_url}' => $login_url, // Handle HTTP Refer URL variable. '{refer_url}' => $refer_url, '{http_refer}' => $refer_url, // Handle User ID variable. '{user_id}' => forminator_get_user_data( 'ID' ), // Handle User Display Name variable. '{user_name}' => forminator_get_user_data( 'display_name' ), // Handle User Email variable. '{user_email}' => forminator_get_user_data( 'user_email' ), // Handle User Login variable. '{user_login}' => forminator_get_user_data( 'user_login' ), // Handle site title variable. '{site_title}' => get_bloginfo( 'name' ), ); if ( $id ) { // Handle form_name data. if ( strpos( $content, '{form_name}' ) !== false ) { $variables['{form_name}'] = esc_html( forminator_get_form_name( $id ) ); } // handle form_id. $variables['{form_id}'] = $id; // Handle Submissions number. $variables['{submissions_number}'] = Forminator_Form_Entry_Model::count_entries( $id ); } else { $variables['{form_name}'] = ''; $variables['{form_id}'] = ''; $variables['{submissions_number}'] = ''; } $content = str_replace( array_keys( $variables ), array_values( $variables ), $content ); } return apply_filters( 'forminator_replace_variables', $content, $content_before_replacement ); } /** * Render entry * Used in email notifications * TODO: refactor this * * @since 1.0 * @since 1.24 Added $att_id_only param. * * @param object $item - the entry. * @param string $column_name - the column name. * * @param null $field @since 1.0.5, optional Forminator_Form_Field_Model. * @param string $type Type. * @param bool $remove_empty Remove empty. * @param bool $att_id_only If output needs attachment ID only. E.g. when upload field is used with ACF file type. * @param string $separator Separator for some entries. Line break by default. (Added for PDF addon). * @param bool $show_label @since 1.25, added for PDF generation. * @return string */ function render_entry( $item, $column_name, $field = null, $type = '', $remove_empty = false, $att_id_only = false, $separator = '<br>', $show_label = true ) { $data = $item->get_meta( $column_name, '' ); $is_calculation = false; if ( stripos( $column_name, 'calculation' ) !== false ) { $is_calculation = true; } if ( $is_calculation && $data ) { return Forminator_Form_Entry_Model::meta_value_to_string( 'calculation', $data, true ); } if ( $data || '0' === $data ) { $currency_symbol = forminator_get_currency_symbol(); if ( is_array( $data ) ) { if ( 'non_empty' === $type ) { $data = array_filter( $data ); } if ( stripos( $column_name, 'time' ) !== false && 1 === count( $data ) && isset( $data['ampm'] ) ) { $data = array(); } $output = ''; $product_cost = 0; $is_product = false; $countries = forminator_get_countries_list(); if ( ! empty( $data ) ) { foreach ( $data as $key => $value ) { if ( is_array( $value ) ) { if ( 'file' === $key && isset( $value['file_url'] ) ) { if ( is_array( $value['file_url'] ) ) { $file_urls = $value['file_url']; } else { // If only attachment ID is needed like for ACF file type. if ( $att_id_only ) { return attachment_url_to_postid( $value['file_url'] ); } $file_urls = array( $value['file_url'] ); } $files_count = count( $file_urls ); foreach ( $file_urls as $index => $file_url ) { $file_name = basename( $file_url ); $file_name = "<a href='" . esc_url( $file_url ) . "' target='_blank' rel='noreferrer' title='" . esc_html__( 'View File', 'forminator' ) . "'>$file_name</a>"; $output .= $file_name; $output .= $index < $files_count - 1 ? $separator : ''; } } } elseif ( ! is_int( $key ) ) { if ( 'postdata' === $key ) { // possible empty when postdata not required. if ( ! empty( $value ) ) { $post_id = $data['postdata']; $url = get_edit_post_link( $post_id, 'link' ); // Title. $title = get_the_title( $post_id ); $title = ! empty( $title ) ? $title : esc_html__( '(no title)', 'forminator' ); $output .= '<ul>'; $output .= '<li>'; $output .= '<b>' . esc_html__( 'Title', 'forminator' ) . ':</b> '; $output .= '<a href="' . $url . '" target="_blank" rel="noopener noreferrer" title="' . esc_attr__( 'Edit Post', 'forminator' ) . '">' . $title . '</a>'; $output .= '</li>'; // Content. if ( ! empty( $data['value']['post-content'] ) ) { $post_content = $data['value']['post-content']; $output .= '<li>'; $output .= '<b>' . esc_html__( 'Content', 'forminator' ) . ':</b>' . $separator; $output .= wp_kses( $post_content, 'post' ); $output .= '</li>'; } // Excerpt. if ( ! empty( $data['value']['post-excerpt'] ) ) { $post_excerpt = $data['value']['post-excerpt']; $output .= '<li>'; $output .= '<b>' . esc_html__( 'Excerpt', 'forminator' ) . ':</b>' . $separator; $output .= wp_strip_all_tags( $post_excerpt ); $output .= '</li>'; } // Category. if ( ! empty( $data['value']['category'] ) ) { $categories = $data['value']['category']; $post_category = array(); if ( is_array( $categories ) ) { foreach ( $categories as $category_id ) { $post_category[] = get_the_category_by_ID( $category_id ); } } else { $post_category[] = get_the_category_by_ID( $categories ); } // In case of deleted categories. if ( ! empty( $post_category ) ) { $category_count = count( $post_category ); $label = ( 1 === $category_count ) ? esc_html__( 'Category', 'forminator' ) : esc_html__( 'Categories', 'forminator' ); $output .= '<li>'; $output .= '<b>' . $label . ':</b> '; $output .= implode( ',', $post_category ); $output .= '</li>'; } } // Tags. if ( ! empty( $data['value']['post_tag'] ) ) { $post_tag_id = $data['value']['post_tag']; $term_args = array( 'taxonomy' => 'post_tag', 'term_taxonomy_id' => $post_tag_id, 'hide_empty' => false, 'fields' => 'names', ); $term_query = new WP_Term_Query( $term_args ); // In case of deleted tags. if ( ! empty( $term_query->terms ) ) { $term_count = count( $term_query->terms ); $label = ( 1 === $term_count ) ? esc_html__( 'Tag', 'forminator' ) : esc_html__( 'Tags', 'forminator' ); $output .= '<li>'; $output .= '<b>' . $label . ':</b> '; $output .= implode( ',', $term_query->terms ); $output .= '</li>'; } } // Featured Image. if ( ! empty( $data['value']['post-image'] ) && ! empty( $data['value']['post-image']['attachment_id'] ) ) { $post_image_id = $data['value']['post-image']['attachment_id']; $output .= '<li>'; $output .= '<b>' . esc_html__( 'Featured image', 'forminator' ) . ':</b>' . $separator; $output .= wp_get_attachment_image( $post_image_id, array( 100, 100 ) ); $output .= '</li>'; } // Custom fields. if ( ! empty( $data['value']['post-custom'] ) ) { $post_custom = $data['value']['post-custom']; $output .= '<li>'; $output .= '<b>' . esc_html__( 'Custom fields', 'forminator' ) . ':</b>' . $separator; $output .= '<ul class="' . esc_attr( 'bulleted' ) . '">'; foreach ( $post_custom as $field ) { if ( ! empty( $field['value'] ) ) { $output .= '<li>'; $output .= esc_html( $field['key'] ) . ': '; $output .= esc_html( $field['value'] ); $output .= '</li>'; } } $output .= '</ul>'; $output .= '</li>'; } $tax_keys = forminator_list_custom_taxonomies( $data['value'] ); if ( ! empty( $tax_keys ) ) { foreach ( $tax_keys as $tax_key => $tax_name ) { if ( ! empty( $data['value'][ $tax_name ] ) ) { $the_taxonomies = ''; $single_label = ''; $plural_label = ''; $taxonomies = array(); $post_taxonomy = $data['value'][ $tax_name ]; if ( is_array( $post_taxonomy ) ) { foreach ( $post_taxonomy as $taxonomy ) { if ( ! is_wp_error( get_the_category_by_ID( $taxonomy ) ) ) { $taxonomies[] = get_the_category_by_ID( $taxonomy ); } } if ( ! empty( $taxonomies ) ) { $the_taxonomies = implode( ', ', $taxonomies ); } } else { $the_taxonomies = get_the_category_by_ID( $post_taxonomy ); if ( is_wp_error( $the_taxonomies ) ) { $the_taxonomies = ''; } } $tax_obj = get_taxonomy( $tax_name ); if ( ! empty( $tax_obj ) ) { $single_label = ! empty( $tax_obj->labels->singular_name ) ? $tax_obj->labels->singular_name : $tax_obj->labels->name; $plural_label = $tax_obj->labels->name; } if ( ! empty( $the_taxonomies ) ) { $output .= '<li>'; if ( is_array( $post_taxonomy ) ) { $output .= '<b>' . esc_html__( $plural_label, 'forminator' ) . ':</b> '; // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText } else { $output .= '<b>' . esc_html__( $single_label, 'forminator' ) . ':</b> '; // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText } $output .= $the_taxonomies; $output .= '</li>'; } } } } $output .= '</ul>'; } else { $output = ' '; } } elseif ( is_string( $key ) ) { if ( 'product-id' === $key || 'product-quantity' === $key ) { if ( 0 === $product_cost ) { $product_cost = $value; } else { $product_cost = $product_cost * $value; } $is_product = true; } else { $key_slug = $key; if ( in_array( $key, Forminator_Form_Entry_Model::field_suffix(), true ) ) { $key = Forminator_Form_Entry_Model::translate_suffix( $key ); } else { $key = strtolower( $key ); $key = ucfirst( str_replace( array( '-', '_' ), ' ', $key ) ); } // Name labels. if ( 'prefix' === $key_slug && ! empty( $field['prefix_label'] ) ) { $key = $field['prefix_label']; } if ( 'first-name' === $key_slug && ! empty( $field['fname_label'] ) ) { $key = $field['fname_label']; } if ( 'middle-name' === $key_slug && ! empty( $field['mname_label'] ) ) { $key = $field['mname_label']; } if ( 'last-name' === $key_slug && ! empty( $field['lname_label'] ) ) { $key = $field['lname_label']; } // Address labels. if ( 'street_address' === $key_slug && ! empty( $field['street_address_label'] ) ) { $key = $field['street_address_label']; } if ( 'address_line' === $key_slug && ! empty( $field['address_line_label'] ) ) { $key = $field['address_line_label']; } if ( 'city' === $key_slug && ! empty( $field['address_city_label'] ) ) { $key = $field['address_city_label']; } if ( 'state' === $key_slug && ! empty( $field['address_state_label'] ) ) { $key = $field['address_state_label']; } if ( 'zip' === $key_slug && ! empty( $field['address_zip_label'] ) ) { $key = $field['address_zip_label']; } if ( 'country' === $key_slug ) { if ( ! empty( $field['address_country_label'] ) ) { $key = $field['address_country_label']; } if ( isset( $countries[ $value ] ) ) { $value = $countries[ $value ]; } } if ( $remove_empty && empty( $value ) ) { $output .= ''; } elseif ( $show_label ) { $output .= sprintf( '<strong>%1$s : </strong> %2$s', esc_html( $key ), esc_html( $value ) ) . $separator; } else { $output .= esc_html( $value ) . $separator; } } } } } } if ( $is_product ) { /* Translators: 1. Opening <strong> tag, 2. closing <strong> tag 3. currency symbol with cost */ $output = sprintf( esc_html__( '%1$sTotal%2$s %3$s', 'forminator' ), '<strong>', '</strong>', $currency_symbol . '' . $product_cost ); } elseif ( ! empty( $output ) ) { if ( isset( $column_name ) && ( false !== strpos( $column_name, 'name' ) || false !== strpos( $column_name, 'address' ) || false !== strpos( $column_name, 'upload' ) || false !== strpos( $column_name, 'postdata' ) || false !== strpos( $column_name, 'slider' ) || false !== strpos( $column_name, 'signature' ) ) ) { $output = trim( $output ); } elseif ( false !== strpos( $column_name, 'date' ) && 'select' === $field['field_type'] ) { $meta_value = array( 'day' => $data['day'], 'month' => $data['month'], 'year' => $data['year'], 'format' => $data['format'], ); $output = Forminator_Form_Entry_Model::meta_value_to_string( 'date', $meta_value, true ) . $separator; /* translators: 1. Colon symbol, 2. Date format, 3. Separator. */ $output .= sprintf( esc_html__( 'Format%1$s %2$s %3$s', 'forminator' ), ':', $data['format'], $separator ); } elseif ( false !== strpos( $column_name, 'time' ) ) { $output = Forminator_Form_Entry_Model::meta_value_to_string( 'time', $data, true ) . $separator; } else { $output = substr( trim( $output ), 0, - 1 ); } } elseif ( is_array( $data ) ) { $output = implode( ', ', $data ); } return $output; } else { if ( stripos( $column_name, 'currency' ) !== false || stripos( $column_name, 'number' ) !== false ) { $data = Forminator_Field::forminator_number_formatting( $field, $data ); } return $data; } } return ''; } /** * Check, maybe field doesn't exist anymore * * @param string $element_id Field slug. * @param array $fields Fields. * @param int $form_id Form id. * @return boolean */ function forminator_old_field( $element_id, $fields, $form_id ) { $main_id = forminator_remove_prefixes( $element_id ); $prefix = $main_id !== $element_id ? str_replace( $main_id . '-', '', $element_id ) : ''; $element_ids = wp_list_pluck( $fields, 'element_id' ); $old_field = ! in_array( $main_id, $element_ids, true ); if ( $prefix && ! $old_field ) { $custom_form = Forminator_Base_Form_Model::get_model( $form_id ); $field = $custom_form->get_field( $main_id, false ); if ( ! $field->is_subfield_enabled( $prefix ) ) { $old_field = true; } } return $old_field; } /** * Remove prefixes from field slug * * @param string $field_id Field slug. * @return string */ function forminator_remove_prefixes( $field_id ) { $field_suffixes = Forminator_Form_Entry_Model::field_suffix(); $field_suffixes = array_map( function ( $str ) { return '-' . $str; }, $field_suffixes ); $field_id = str_replace( $field_suffixes, '', $field_id ); return $field_id; } /** * Return countries list * * @since 1.0 * @return array */ function forminator_get_countries_list() { $countries = array( 'AF' => esc_html__( 'Afghanistan', 'forminator' ), 'AL' => esc_html__( 'Albania', 'forminator' ), 'DZ' => esc_html__( 'Algeria', 'forminator' ), 'AS' => esc_html__( 'American Samoa', 'forminator' ), 'AD' => esc_html__( 'Andorra', 'forminator' ), 'AO' => esc_html__( 'Angola', 'forminator' ), 'AI' => esc_html__( 'Anguilla', 'forminator' ), 'AQ' => esc_html__( 'Antarctica', 'forminator' ), 'AG' => esc_html__( 'Antigua and Barbuda', 'forminator' ), 'AR' => esc_html__( 'Argentina', 'forminator' ), 'AM' => esc_html__( 'Armenia', 'forminator' ), 'AU' => esc_html__( 'Australia', 'forminator' ), 'AW' => esc_html__( 'Aruba', 'forminator' ), 'AT' => esc_html__( 'Austria', 'forminator' ), 'AZ' => esc_html__( 'Azerbaijan', 'forminator' ), 'BS' => esc_html__( 'Bahamas', 'forminator' ), 'BH' => esc_html__( 'Bahrain', 'forminator' ), 'BD' => esc_html__( 'Bangladesh', 'forminator' ), 'BB' => esc_html__( 'Barbados', 'forminator' ), 'BY' => esc_html__( 'Belarus', 'forminator' ), 'BE' => esc_html__( 'Belgium', 'forminator' ), 'BZ' => esc_html__( 'Belize', 'forminator' ), 'BJ' => esc_html__( 'Benin', 'forminator' ), 'BM' => esc_html__( 'Bermuda', 'forminator' ), 'BT' => esc_html__( 'Bhutan', 'forminator' ), 'BO' => esc_html__( 'Bolivia', 'forminator' ), 'BA' => esc_html__( 'Bosnia and Herzegovina', 'forminator' ), 'BW' => esc_html__( 'Botswana', 'forminator' ), 'BV' => esc_html__( 'Bouvet Island', 'forminator' ), 'BR' => esc_html__( 'Brazil', 'forminator' ), 'IO' => esc_html__( 'British Indian Ocean Territory', 'forminator' ), 'BN' => esc_html__( 'Brunei', 'forminator' ), 'BG' => esc_html__( 'Bulgaria', 'forminator' ), 'BF' => esc_html__( 'Burkina Faso', 'forminator' ), 'BI' => esc_html__( 'Burundi', 'forminator' ), 'KH' => esc_html__( 'Cambodia', 'forminator' ), 'CM' => esc_html__( 'Cameroon', 'forminator' ), 'CA' => esc_html__( 'Canada', 'forminator' ), 'CV' => esc_html__( 'Cabo Verde', 'forminator' ), 'KY' => esc_html__( 'Cayman Islands', 'forminator' ), 'CF' => esc_html__( 'Central African Republic', 'forminator' ), 'TD' => esc_html__( 'Chad', 'forminator' ), 'CL' => esc_html__( 'Chile', 'forminator' ), 'CN' => html_entity_decode( esc_html__( 'China, People\'s Republic of', 'forminator' ), ENT_QUOTES ), 'CX' => esc_html__( 'Christmas Island', 'forminator' ), 'CC' => esc_html__( 'Cocos Islands', 'forminator' ), 'CO' => esc_html__( 'Colombia', 'forminator' ), 'KM' => esc_html__( 'Comoros', 'forminator' ), 'CD' => esc_html__( 'Congo, Democratic Republic of the', 'forminator' ), 'CG' => esc_html__( 'Congo, Republic of the', 'forminator' ), 'CK' => esc_html__( 'Cook Islands', 'forminator' ), 'CR' => esc_html__( 'Costa Rica', 'forminator' ), 'CI' => html_entity_decode( esc_html__( 'Côte d\'Ivoire', 'forminator' ), ENT_QUOTES ), 'HR' => esc_html__( 'Croatia', 'forminator' ), 'CU' => esc_html__( 'Cuba', 'forminator' ), 'CW' => esc_html__( 'Curaçao', 'forminator' ), 'CY' => esc_html__( 'Cyprus', 'forminator' ), 'CZ' => esc_html__( 'Czech Republic', 'forminator' ), 'DK' => esc_html__( 'Denmark', 'forminator' ), 'DJ' => esc_html__( 'Djibouti', 'forminator' ), 'DM' => esc_html__( 'Dominica', 'forminator' ), 'DO' => esc_html__( 'Dominican Republic', 'forminator' ), 'TL' => esc_html__( 'East Timor', 'forminator' ), 'EC' => esc_html__( 'Ecuador', 'forminator' ), 'EG' => esc_html__( 'Egypt', 'forminator' ), 'SV' => esc_html__( 'El Salvador', 'forminator' ), 'GQ' => esc_html__( 'Equatorial Guinea', 'forminator' ), 'ER' => esc_html__( 'Eritrea', 'forminator' ), 'EE' => esc_html__( 'Estonia', 'forminator' ), 'ET' => esc_html__( 'Ethiopia', 'forminator' ), 'FK' => esc_html__( 'Falkland Islands', 'forminator' ), 'FO' => esc_html__( 'Faroe Islands', 'forminator' ), 'FJ' => esc_html__( 'Fiji', 'forminator' ), 'FI' => esc_html__( 'Finland', 'forminator' ), 'FR' => esc_html__( 'France', 'forminator' ), 'FX' => esc_html__( 'France, Metropolitan', 'forminator' ), 'GF' => esc_html__( 'French Guiana', 'forminator' ), 'PF' => esc_html__( 'French Polynesia', 'forminator' ), 'TF' => esc_html__( 'French South Territories', 'forminator' ), 'GA' => esc_html__( 'Gabon', 'forminator' ), 'GM' => esc_html__( 'Gambia', 'forminator' ), 'GE' => esc_html__( 'Georgia', 'forminator' ), 'DE' => esc_html__( 'Germany', 'forminator' ), 'GG' => esc_html__( 'Guernsey', 'forminator' ), 'GH' => esc_html__( 'Ghana', 'forminator' ), 'GI' => esc_html__( 'Gibraltar', 'forminator' ), 'GR' => esc_html__( 'Greece', 'forminator' ), 'GL' => esc_html__( 'Greenland', 'forminator' ), 'GD' => esc_html__( 'Grenada', 'forminator' ), 'GP' => esc_html__( 'Guadeloupe', 'forminator' ), 'GU' => esc_html__( 'Guam', 'forminator' ), 'GT' => esc_html__( 'Guatemala', 'forminator' ), 'GN' => esc_html__( 'Guinea', 'forminator' ), 'GW' => esc_html__( 'Guinea-Bissau', 'forminator' ), 'GY' => esc_html__( 'Guyana', 'forminator' ), 'HT' => esc_html__( 'Haiti', 'forminator' ), 'HM' => esc_html__( 'Heard Island And Mcdonald Island', 'forminator' ), 'HN' => esc_html__( 'Honduras', 'forminator' ), 'HK' => esc_html__( 'Hong Kong', 'forminator' ), 'HU' => esc_html__( 'Hungary', 'forminator' ), 'IS' => esc_html__( 'Iceland', 'forminator' ), 'IN' => esc_html__( 'India', 'forminator' ), 'ID' => esc_html__( 'Indonesia', 'forminator' ), 'IR' => esc_html__( 'Iran', 'forminator' ), 'IQ' => esc_html__( 'Iraq', 'forminator' ), 'IE' => esc_html__( 'Ireland', 'forminator' ), 'IL' => esc_html__( 'Israel', 'forminator' ), 'IT' => esc_html__( 'Italy', 'forminator' ), 'JM' => esc_html__( 'Jamaica', 'forminator' ), 'JP' => esc_html__( 'Japan', 'forminator' ), 'JE' => esc_html__( 'Jersey', 'forminator' ), 'JT' => esc_html__( 'Johnston Island', 'forminator' ), 'JO' => esc_html__( 'Jordan', 'forminator' ), 'KZ' => esc_html__( 'Kazakhstan', 'forminator' ), 'KE' => esc_html__( 'Kenya', 'forminator' ), 'KI' => esc_html__( 'Kiribati', 'forminator' ), 'KP' => html_entity_decode( esc_html__( 'Korea, Democratic People\'s Republic of', 'forminator' ), ENT_QUOTES ), 'KR' => esc_html__( 'Korea, Republic of', 'forminator' ), 'XK' => esc_html__( 'Kosovo', 'forminator' ), 'KW' => esc_html__( 'Kuwait', 'forminator' ), 'KG' => esc_html__( 'Kyrgyzstan', 'forminator' ), 'LA' => html_entity_decode( esc_html__( 'Lao People\'s Democratic Republic', 'forminator' ), ENT_QUOTES ), 'LV' => esc_html__( 'Latvia', 'forminator' ), 'LB' => esc_html__( 'Lebanon', 'forminator' ), 'LS' => esc_html__( 'Lesotho', 'forminator' ), 'LR' => esc_html__( 'Liberia', 'forminator' ), 'LY' => esc_html__( 'Libya', 'forminator' ), 'LI' => esc_html__( 'Liechtenstein', 'forminator' ), 'LT' => esc_html__( 'Lithuania', 'forminator' ), 'LU' => esc_html__( 'Luxembourg', 'forminator' ), 'MO' => esc_html__( 'Macau', 'forminator' ), 'MK' => esc_html__( 'North Macedonia', 'forminator' ), 'MG' => esc_html__( 'Madagascar', 'forminator' ), 'MW' => esc_html__( 'Malawi', 'forminator' ), 'MY' => esc_html__( 'Malaysia', 'forminator' ), 'MV' => esc_html__( 'Maldives', 'forminator' ), 'ML' => esc_html__( 'Mali', 'forminator' ), 'MT' => esc_html__( 'Malta', 'forminator' ), 'MH' => esc_html__( 'Marshall Islands', 'forminator' ), 'MQ' => esc_html__( 'Martinique', 'forminator' ), 'MR' => esc_html__( 'Mauritania', 'forminator' ), 'MU' => esc_html__( 'Mauritius', 'forminator' ), 'YT' => esc_html__( 'Mayotte', 'forminator' ), 'MX' => esc_html__( 'Mexico', 'forminator' ), 'FM' => esc_html__( 'Micronesia', 'forminator' ), 'MD' => esc_html__( 'Moldova', 'forminator' ), 'MC' => esc_html__( 'Monaco', 'forminator' ), 'MN' => esc_html__( 'Mongolia', 'forminator' ), 'MS' => esc_html__( 'Montserrat', 'forminator' ), 'ME' => esc_html__( 'Montenegro', 'forminator' ), 'MA' => esc_html__( 'Morocco', 'forminator' ), 'MZ' => esc_html__( 'Mozambique', 'forminator' ), 'MM' => esc_html__( 'Myanmar', 'forminator' ), 'NA' => esc_html__( 'Namibia', 'forminator' ), 'NR' => esc_html__( 'Nauru', 'forminator' ), 'NP' => esc_html__( 'Nepal', 'forminator' ), 'NL' => esc_html__( 'Netherlands', 'forminator' ), 'AN' => esc_html__( 'Netherlands Antilles', 'forminator' ), 'NC' => esc_html__( 'New Caledonia', 'forminator' ), 'NZ' => esc_html__( 'New Zealand', 'forminator' ), 'NI' => esc_html__( 'Nicaragua', 'forminator' ), 'NE' => esc_html__( 'Niger', 'forminator' ), 'NG' => esc_html__( 'Nigeria', 'forminator' ), 'NU' => esc_html__( 'Niue', 'forminator' ), 'NF' => esc_html__( 'Norfolk Island', 'forminator' ), 'MP' => esc_html__( 'Northern Mariana Islands', 'forminator' ), 'NO' => esc_html__( 'Norway', 'forminator' ), 'OM' => esc_html__( 'Oman', 'forminator' ), 'PK' => esc_html__( 'Pakistan', 'forminator' ), 'PW' => esc_html__( 'Palau', 'forminator' ), 'PS' => esc_html__( 'Palestine, State of', 'forminator' ), 'PA' => esc_html__( 'Panama', 'forminator' ), 'PG' => esc_html__( 'Papua New Guinea', 'forminator' ), 'PY' => esc_html__( 'Paraguay', 'forminator' ), 'PE' => esc_html__( 'Peru', 'forminator' ), 'PH' => esc_html__( 'Philippines', 'forminator' ), 'PN' => esc_html__( 'Pitcairn Islands', 'forminator' ), 'PL' => esc_html__( 'Poland', 'forminator' ), 'PT' => esc_html__( 'Portugal', 'forminator' ), 'PR' => esc_html__( 'Puerto Rico', 'forminator' ), 'QA' => esc_html__( 'Qatar', 'forminator' ), 'RE' => esc_html__( 'Reunion Island', 'forminator' ), 'RO' => esc_html__( 'Romania', 'forminator' ), 'RU' => esc_html__( 'Russia', 'forminator' ), 'RW' => esc_html__( 'Rwanda', 'forminator' ), 'KN' => esc_html__( 'Saint Kitts and Nevis', 'forminator' ), 'LC' => esc_html__( 'Saint Lucia', 'forminator' ), 'VC' => esc_html__( 'Saint Vincent and the Grenadines', 'forminator' ), 'WS' => esc_html__( 'Samoa', 'forminator' ), 'SH' => esc_html__( 'Saint Helena', 'forminator' ), 'PM' => html_entity_decode( esc_html__( 'Saint Pierre & Miquelon', 'forminator' ), ENT_QUOTES ), 'SM' => esc_html__( 'San Marino', 'forminator' ), 'ST' => esc_html__( 'Sao Tome and Principe', 'forminator' ), 'SA' => esc_html__( 'Saudi Arabia', 'forminator' ), 'SN' => esc_html__( 'Senegal', 'forminator' ), 'RS' => esc_html__( 'Serbia', 'forminator' ), 'SC' => esc_html__( 'Seychelles', 'forminator' ), 'SL' => esc_html__( 'Sierra Leone', 'forminator' ), 'SG' => esc_html__( 'Singapore', 'forminator' ), 'MF' => esc_html__( 'Sint Maarten', 'forminator' ), 'SK' => esc_html__( 'Slovakia', 'forminator' ), 'SI' => esc_html__( 'Slovenia', 'forminator' ), 'SB' => esc_html__( 'Solomon Islands', 'forminator' ), 'SO' => esc_html__( 'Somalia', 'forminator' ), 'ZA' => esc_html__( 'South Africa', 'forminator' ), 'GS' => esc_html__( 'South Georgia and South Sandwich', 'forminator' ), 'ES' => esc_html__( 'Spain', 'forminator' ), 'LK' => esc_html__( 'Sri Lanka', 'forminator' ), 'XX' => esc_html__( 'Stateless Persons', 'forminator' ), 'SD' => esc_html__( 'Sudan', 'forminator' ), 'SS' => esc_html__( 'Sudan, South', 'forminator' ), 'SR' => esc_html__( 'Suriname', 'forminator' ), 'SJ' => esc_html__( 'Svalbard and Jan Mayen', 'forminator' ), 'SZ' => esc_html__( 'Swaziland', 'forminator' ), 'SE' => esc_html__( 'Sweden', 'forminator' ), 'CH' => esc_html__( 'Switzerland', 'forminator' ), 'SY' => esc_html__( 'Syria', 'forminator' ), 'TW' => esc_html__( 'Taiwan, Republic of China', 'forminator' ), 'TJ' => esc_html__( 'Tajikistan', 'forminator' ), 'TZ' => esc_html__( 'Tanzania', 'forminator' ), 'TH' => esc_html__( 'Thailand', 'forminator' ), 'TG' => esc_html__( 'Togo', 'forminator' ), 'TK' => esc_html__( 'Tokelau', 'forminator' ), 'TO' => esc_html__( 'Tonga', 'forminator' ), 'TT' => esc_html__( 'Trinidad and Tobago', 'forminator' ), 'TN' => esc_html__( 'Tunisia', 'forminator' ), 'TR' => esc_html__( 'Turkey', 'forminator' ), 'TM' => esc_html__( 'Turkmenistan', 'forminator' ), 'TC' => esc_html__( 'Turks And Caicos Islands', 'forminator' ), 'TV' => esc_html__( 'Tuvalu', 'forminator' ), 'UG' => esc_html__( 'Uganda', 'forminator' ), 'UA' => esc_html__( 'Ukraine', 'forminator' ), 'AE' => esc_html__( 'United Arab Emirates', 'forminator' ), 'GB' => esc_html__( 'United Kingdom', 'forminator' ), 'UM' => esc_html__( 'US Minor Outlying Islands', 'forminator' ), 'US' => esc_html__( 'United States of America (USA)', 'forminator' ), 'UY' => esc_html__( 'Uruguay', 'forminator' ), 'UZ' => esc_html__( 'Uzbekistan', 'forminator' ), 'VU' => esc_html__( 'Vanuatu', 'forminator' ), 'VA' => esc_html__( 'Vatican City', 'forminator' ), 'VE' => esc_html__( 'Venezuela', 'forminator' ), 'VN' => esc_html__( 'Vietnam', 'forminator' ), 'VG' => esc_html__( 'Virgin Islands, British', 'forminator' ), 'VI' => esc_html__( 'Virgin Islands, U.S.', 'forminator' ), 'WF' => esc_html__( 'Wallis And Futuna Islands', 'forminator' ), 'EH' => esc_html__( 'Western Sahara', 'forminator' ), 'YE' => esc_html__( 'Yemen', 'forminator' ), 'ZM' => esc_html__( 'Zambia', 'forminator' ), 'ZW' => esc_html__( 'Zimbabwe', 'forminator' ), ); asort( $countries ); return apply_filters( 'forminator_countries_list', $countries ); } /** * Return sorted available fields * * @since 1.6 * * @param string $sort_attr Attribute. * @param int $sort_flag Sort flag. * * @return array */ function forminator_get_fields_sorted( $sort_attr, $sort_flag = SORT_ASC ) { $fields = array(); $fields_array = forminator_get_fields(); if ( ! empty( $fields_array ) ) { foreach ( $fields_array as $key => $field ) { $field_key = ''; if ( isset( $field->$sort_attr ) ) { $field_key = $field->$sort_attr; } if ( ! empty( $field_key ) ) { if ( isset( $fields[ $field_key ] ) ) { if ( is_int( $field_key ) ) { $field_key = (int) max( array_keys( $fields ) ); ++$field_key;// increase where there is dupe. } } $fields[ $field_key ] = $field; } else { $fields[] = $field; } } } if ( SORT_ASC === $sort_flag ) { ksort( $fields ); } else { krsort( $fields ); } $fields = array_values( $fields ); return apply_filters( 'forminator_fields_sorted', $fields, $fields_array, $sort_attr, $sort_flag ); } /** * Retrieves the list of common file extensions and their types. * * Extending @see get_allowed_mime_types without filter * * @since 1.6 */ function forminator_get_ext_types() { /** * - image * - audio * - video * - text * - Doc * - Archive * - Interactive */ $forminator_types = array( 'image' => array( // Image formats. 'jpg|jpeg|jpe' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png', 'bmp' => 'image/bmp', 'tiff|tif' => 'image/tiff', 'ico' => 'image/x-icon', 'psd' => 'application/octet-stream', 'xcf' => 'application/octet-stream', 'heic' => 'image/heic', 'webp' => 'image/webp', ), 'audio' => array( // Audio formats. 'mp3|m4a|m4b' => 'audio/mpeg', 'ra|ram' => 'audio/x-realaudio', 'wav|x-wav' => 'audio/wav', 'ogg|oga' => 'audio/ogg', 'mid|midi' => 'audio/midi', 'wma' => 'audio/x-ms-wma', 'wax' => 'audio/x-ms-wax', 'mka' => 'audio/x-matroska', 'aac' => 'audio/aac', 'flac' => 'audio/flac', ), 'video' => array( 'asf|asx' => 'video/x-ms-asf', 'wmv' => 'video/x-ms-wmv', 'wmx' => 'video/x-ms-wmx', 'wm' => 'video/x-ms-wm', 'avi' => 'video/avi', 'divx' => 'video/divx', 'flv' => 'video/x-flv', 'mov|qt' => 'video/quicktime', 'mpeg|mpg|mpe' => 'video/mpeg', 'mp4|m4v' => 'video/mp4', 'ogv' => 'video/ogg', 'webm' => 'video/webm', 'mkv' => 'video/x-matroska', '3gp|3gpp' => 'video/3gpp', // Can also be audio. '3g2|3gp2' => 'video/3gpp2', // Can also be audio. ), 'document' => array( // MS Office formats. 'doc' => 'application/msword', 'pot|pps|ppt' => 'application/vnd.ms-powerpoint', 'wri' => 'application/vnd.ms-write', 'mdb' => 'application/vnd.ms-access', 'mpp' => 'application/vnd.ms-project', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'docm' => 'application/vnd.ms-word.document.macroEnabled.12', 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', 'onetoc|onetoc2|onetmp|onepkg' => 'application/onenote', // OpenOffice formats. 'odt' => 'application/vnd.oasis.opendocument.text', 'odp' => 'application/vnd.oasis.opendocument.presentation', 'odg' => 'application/vnd.oasis.opendocument.graphics', 'odc' => 'application/vnd.oasis.opendocument.chart', 'odb' => 'application/vnd.oasis.opendocument.database', 'odf' => 'application/vnd.oasis.opendocument.formula', 'pages' => 'application/vnd.apple.pages', 'wp|wpd' => 'application/wordperfect', 'pdf' => 'application/pdf', 'oxps' => 'application/oxps', 'xps' => 'application/vnd.ms-xpsdocument', ), 'archive' => array( 'tar' => 'application/x-tar', 'zip' => 'application/zip', 'gz|gzip' => 'application/x-gzip', '7z' => 'application/x-7z-compressed', ), 'text' => array( // Text formats. 'txt|asc|c|cc|h|srt' => 'text/plain', 'csv' => 'text/csv', 'tsv' => 'text/tab-separated-values', 'ics' => 'text/calendar', 'rtx' => 'text/richtext', 'rtf' => 'application/rtf', 'vtt' => 'text/vtt', ), 'spreadsheet' => array( 'xla|xls|xlt|xlw' => 'application/vnd.ms-excel', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 'numbers' => 'application/vnd.apple.numbers', ), 'interactive' => array( 'class' => 'application/java', 'key' => 'application/vnd.apple.keynote', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', 'potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12', 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', 'sldm' => 'application/vnd.ms-powerpoint.slide.macroEnabled.12', ), ); foreach ( $forminator_types as $type => $forminator_type ) { $forminator_types[ $type ] = array_keys( $forminator_type ); } /** * Filter extensions types of files * * @since 1.6 * * @param array $forminator_types */ $forminator_types = apply_filters( 'forminator_get_ext_types', $forminator_types ); return $forminator_types; } /** * Format poll data variables to html formatted * * @since 1.6.1 * * @param string $content Content. * @param Forminator_Poll_Model $poll Forminator_Poll_Model. * @param array $data - submitted `_POST` data. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * * @return mixed */ function forminator_replace_poll_form_data( $content, Forminator_Poll_Model $poll, $data, Forminator_Form_Entry_Model $entry ) { if ( stripos( $content, '{poll_name}' ) !== false ) { $poll_name = forminator_get_name_from_model( $poll ); $content = str_ireplace( '{poll_name}', $poll_name, $content ); } if ( stripos( $content, '{poll_answer}' ) !== false ) { $answer_data = isset( $data[ $poll->id ] ) ? $data[ $poll->id ] : ''; $extra_field = isset( $data[ $poll->id . '-extra' ] ) ? $data[ $poll->id . '-extra' ] : ''; $fields_labels = $poll->pluck_fields_array( 'title', 'element_id', '1' ); $answer_label = isset( $fields_labels[ $answer_data ] ) ? $fields_labels[ $answer_data ] : ''; if ( ! empty( $extra_field ) ) { $answer_label .= ' ' . $extra_field; } $content = str_ireplace( '{poll_answer}', $answer_label, $content ); } if ( stripos( $content, '{poll_result}' ) !== false ) { $poll_results = array(); $fields_array = $poll->get_fields_as_array(); $map_entries = Forminator_Form_Entry_Model::map_polls_entries( $poll->id, $fields_array ); $fields = $poll->get_fields(); if ( ! is_null( $fields ) ) { foreach ( $fields as $field ) { $label = addslashes( $field->title ); $slug = isset( $field->slug ) ? $field->slug : sanitize_title( $label ); $entries = 0; if ( in_array( $slug, array_keys( $map_entries ), true ) ) { $entries = $map_entries[ $slug ]; } $poll_results[] = array( 'label' => $label, 'value' => $entries, ); } } $poll_results_html = '<ul>'; foreach ( $poll_results as $poll_result ) { $poll_results_html .= '<li>'; $poll_results_html .= '<strong>' . $poll_result['label'] . '</strong> : ' . $poll_result['value']; $poll_results_html .= '</li>'; } $poll_results_html .= '</ul>'; $content = str_ireplace( '{poll_result}', $poll_results_html, $content ); } return apply_filters( 'forminator_replace_poll_form_data', $content, $poll, $data, $entry ); } /** * Return vars for poll * * @since 1.6.1 * @return mixed */ function forminator_get_poll_vars() { $vars_list = array( 'poll_name' => esc_html__( 'Poll Name', 'forminator' ), 'poll_answer' => esc_html__( 'Poll Answer', 'forminator' ), 'poll_result' => esc_html__( 'Poll Result', 'forminator' ), ); /** * Filter forminator Poll var list * * @see forminator_replace_poll_form_data() * * @since 1.6.1 * * @param array $vars_list */ return apply_filters( 'forminator_poll_vars_list', $vars_list ); } /** * Format quiz data variables to html formatted * * @since 1.6.2 * * @param string $content Content. * @param Forminator_Quiz_Model $quiz Forminator_Quiz_Model. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * * @return mixed */ function forminator_replace_quiz_form_data( $content, Forminator_Quiz_Model $quiz, Forminator_Form_Entry_Model $entry ) { $result_behav = isset( $quiz->settings['results_behav'] ) ? $quiz->settings['results_behav'] : ''; if ( stripos( $content, '{quiz_name}' ) !== false ) { $quiz_name = forminator_get_name_from_model( $quiz ); $content = str_ireplace( '{quiz_name}', $quiz_name, $content ); } if ( stripos( $content, '{quiz_type}' ) !== false ) { $quiz_type = ''; if ( 'knowledge' === $quiz->quiz_type ) { $quiz_type = 'Knowledge'; } elseif ( 'nowrong' === $quiz->quiz_type ) { $quiz_type = 'Personality'; } $content = str_ireplace( '{quiz_type}', $quiz_type, $content ); } $answers = isset( Forminator_CForm_Front_Action::$prepared_data['answers'] ) ? Forminator_CForm_Front_Action::$prepared_data['answers'] : array(); // For single answer quiz. if ( stripos( $content, '{quiz_answer}' ) !== false && ( empty( $result_behav ) || 'after' === $result_behav ) ) { $answer_content = PHP_EOL . '<ul>' . PHP_EOL; if ( is_array( $answers ) ) { foreach ( $answers as $question_id => $answer_id ) { $question = $quiz->getQuestion( $question_id ); $answer = $quiz->getAnswer( $question_id, $answer_id ); $question_text = isset( $question['title'] ) ? $question['title'] : ''; $answer_text = isset( $answer['title'] ) ? $answer['title'] : ''; $answer_content .= '<li>' . PHP_EOL; $answer_content .= '<ul>' . PHP_EOL; $answer_content .= '<li><b>' . esc_html__( 'Question : ', 'forminator' ) . '</b>' . esc_html( $question_text ) . '</li>' . PHP_EOL; $answer_content .= '<li><b>' . esc_html__( 'Answer : ', 'forminator' ) . '</b>' . esc_html( $answer_text ) . '</li>' . PHP_EOL; $answer_content .= '</ul>' . PHP_EOL; $answer_content .= '</li>' . PHP_EOL; } } $answer_content .= '</ul>'; $content = str_ireplace( '{quiz_answer}', $answer_content, $content ); } // For multi-answer quiz. if ( stripos( $content, '{quiz_answer}' ) !== false && 'end' === $result_behav ) { $answer_content = PHP_EOL . '<ul>' . PHP_EOL; $question_ids = array(); if ( is_array( $answers ) ) { foreach ( $answers as $question_id => $answer_id ) { // In multi-answer, $question_id looks like this "question-2051-7608-3". $question_id = preg_replace( '/(-\d+$)/', '', $question_id ); if ( ! in_array( $question_id, $question_ids ) ) { // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict $answer = $quiz->getAnswer( $question_id, $answer_id ); $answer_text = isset( $answer['title'] ) ? $answer['title'] : ''; $question_ids[ $question_id ][] = $answer_text; } } foreach ( $question_ids as $question_id => $answer_titles ) { $question = $quiz->getQuestion( $question_id ); $question_text = isset( $question['title'] ) ? $question['title'] : ''; $answer_head = count( $answer_titles ) > 1 ? esc_html__( 'Answers : ', 'forminator' ) : esc_html__( 'Answer : ', 'forminator' ); $answer_content .= '<li>' . PHP_EOL; $answer_content .= '<ul>' . PHP_EOL; $answer_content .= '<li><b>' . esc_html__( 'Question : ', 'forminator' ) . '</b>' . esc_html( $question_text ) . '</li>' . PHP_EOL; $answer_content .= '<li><b>' . $answer_head . '</b>' . esc_html( implode( ', ', $answer_titles ) ) . '</li>' . PHP_EOL; $answer_content .= '</ul>' . PHP_EOL; $answer_content .= '</li>' . PHP_EOL; } } $answer_content .= '</ul>'; $content = str_ireplace( '{quiz_answer}', $answer_content, $content ); } if ( stripos( $content, '{quiz_result}' ) !== false ) { $result_content = ''; // we saved on $entry->meta_data['entry']['value'] => make sure its fulfilled before going further. if ( ! empty( $entry->meta_data ) && isset( $entry->meta_data['entry'] ) && isset( $entry->meta_data['entry']['value'] ) ) { if ( 'knowledge' === $quiz->quiz_type ) { $answers = $entry->meta_data['entry']['value']; $correct_answer_count = 0; $total_answer = 0; foreach ( $answers as $answer ) { $is_correct = isset( $answer['isCorrect'] ) ? $answer['isCorrect'] : false; $is_correct = filter_var( $is_correct, FILTER_VALIDATE_BOOLEAN ); if ( $is_correct ) { ++$correct_answer_count; } ++$total_answer; } $result_content = PHP_EOL . '<ul>' . PHP_EOL; $result_content .= '<li>' . sprintf( /* Translators: 1. Opening <b> tag, 2. closing <b> tag 3. Correct answer count */ esc_html__( '%1$sCorrect Answers%2$s : %3$d', 'forminator' ), '<b>', '</b>', $correct_answer_count ) . '</li>' . PHP_EOL; $result_content .= '<li>' . sprintf( /* Translators: 1. Opening <b> tag, 2. closing <b> tag 3. Total answer */ esc_html__( '%1$sTotal Question Answered%2$s : %3$d', 'forminator' ), '<b>', '</b>', $total_answer ) . '</li>' . PHP_EOL; $result_content .= '</ul>'; } elseif ( 'nowrong' === $quiz->quiz_type ) { $meta = $entry->meta_data['entry']['value']; // i know its complicated as eff, but this is how it saved since day 1. // and migrating this might pita and affect performance. if ( isset( $meta[0] ) && isset( $meta[0]['value'] ) && isset( $meta[0]['value']['result'] ) ) { $result = $meta[0]['value']['result']; $result_content = isset( $result['title'] ) ? esc_html( (string) $result['title'] ) : ''; } } } $content = str_ireplace( '{quiz_result}', $result_content, $content ); $content = do_shortcode( $content ); } return apply_filters( 'forminator_replace_quiz_form_data', $content, $quiz, Forminator_CForm_Front_Action::$prepared_data, $entry ); } /** * Return uniq key value * * @since 1.13 * * @return string */ function forminator_unique_key() { return wp_rand( 1000, 9999 ) . '-' . wp_rand( 1000, 9999 ); } /** * Return vars for quiz * * @since 1.6.2 * @return array */ function forminator_get_quiz_vars() { $vars_list = array( 'quiz_name' => esc_html__( 'Quiz Name', 'forminator' ), 'quiz_answer' => esc_html__( 'Quiz Answer', 'forminator' ), 'quiz_result' => esc_html__( 'Quiz Result', 'forminator' ), ); /** * Filter forminator Quiz var list * * @see forminator_replace_quiz_form_data() * * @since 1.6.2 * * @param array $vars_list */ return apply_filters( 'forminator_quiz_vars_list', $vars_list ); } /** * Replace Stripe data * * @param string $content Content. * @param Forminator_Form_Model $custom_form Forminator_Form_Model. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * * @return mixed */ function forminator_replace_form_payment_data( $content, ?Forminator_Form_Model $custom_form = null, ?Forminator_Form_Entry_Model $entry = null ) { if ( empty( $custom_form ) ) { return $content; } $payment_meta = forminator_payment_data( $content, $custom_form, $entry ); if ( ! empty( $payment_meta ) ) { $replaces = array( '{payment_mode}' => $payment_meta['mode'], '{payment_status}' => $payment_meta['status'], '{payment_amount}' => $payment_meta['amount'], '{payment_currency}' => $payment_meta['currency'], '{transaction_id}' => $payment_meta['transaction_id'], '{subscription_id}' => ! empty( $payment_meta['subscription_id'] ) ? $payment_meta['subscription_id'] : '', ); $content = str_replace( array_keys( $replaces ), array_values( $replaces ), $content ); } return apply_filters( 'forminator_replace_form_payment_data', $content, $custom_form, $entry ); } /** * Payment data * * @param string $content Content. * @param Forminator_Form_Model $custom_form Forminator_Form_Model. * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * * @return array|mixed */ function forminator_payment_data( $content, $custom_form, $entry ) { if ( empty( $custom_form ) ) { return $content; } $payment_meta = array(); $form_fields = $custom_form->get_fields(); if ( ! empty( $form_fields ) && ! empty( $entry ) ) { foreach ( $form_fields as $field ) { $field_type = $field->__get( 'type' ); if ( in_array( $field_type, array( 'stripe', 'stripe-ocs', 'paypal' ), true ) && ! empty( $entry->meta_data[ $field->slug ] ) ) { $payment_meta = $entry->meta_data[ $field->slug ]['value']; $payment_meta['payment_method'] = $field_type; } } } return $payment_meta; } /** * Get Default date format * * @param string $format Date format. * * @return string */ function datepicker_default_format( $format ) { switch ( $format ) { case 'mm/dd/yy': $format = 'm/d/Y'; break; case 'mm.dd.yy': $format = 'm.d.Y'; break; case 'mm-dd-yy': $format = 'm-d-Y'; break; case 'yy-mm-dd': $format = 'Y-m-d'; break; case 'yy.mm.dd': $format = 'Y.m.d'; break; case 'yy/mm/dd': $format = 'Y/m/d'; break; case 'dd/mm/yy': $format = 'd/m/Y'; break; case 'dd.mm.yy': $format = 'd.m.Y'; break; case 'dd-mm-yy': $format = 'd-m-Y'; break; default: $format = get_option( 'date_format' ); break; } return $format; } /** * Reformat date * * @since 1.18.0 * * @param string $date_value - The date. * @param string $date_format - The current date format. * @param string $new_format - The new date format. * * @return string */ function forminator_reformat_date( $date_value, $date_format, $new_format ) { $date = new Forminator_Date(); $date_format = $date->normalize_date_format( $date_format ); $date = date_create_from_format( $date_format, $date_value ); return date_format( $date, $new_format ); } /** * Get entry field value helper * * @since 1.14 * * @param Forminator_Form_Entry_Model $entry Forminator_Form_Entry_Model. * @param array $mapper Mapper. * @param string $sub_meta_key Meta key. * @param bool $allow_html Allow HTML. * @param int $truncate Truncate. * * @return string */ function forminator_get_entry_field_value( $entry, $mapper, $sub_meta_key = '', $allow_html = false, $truncate = PHP_INT_MAX ) { /** * Forminator_Form_Entry_Model * * @var Forminator_Form_Entry_Model $entry */ if ( isset( $mapper['property'] ) ) { if ( property_exists( $entry, $mapper['property'] ) ) { $property = $mapper['property']; // casting property to string. $value = (string) $entry->$property; } else { $value = ''; } } elseif ( 'group' === $mapper['type'] ) { $meta_value = $entry->get_meta( $sub_meta_key, '' ); $field_type = Forminator_Core::get_field_type( $sub_meta_key ); $value = Forminator_Form_Entry_Model::meta_value_to_string( $field_type, $meta_value, $allow_html, $truncate ); } else { $meta_value = $entry->get_meta( $mapper['meta_key'], '' ); $field_keys = array_keys( $entry->meta_data ); // Fix for Stripe OCS and Stripe old field to show only one. if ( 'stripe-ocs' === $mapper['type'] ) { if ( in_array( 'stripe-1', $field_keys, true ) && empty( $meta_value['mode'] ) ) { $meta_value = $entry->get_meta( 'stripe-1', '' ); } } // meta_key based. if ( ! isset( $mapper['sub_metas'] ) ) { $value = Forminator_Form_Entry_Model::meta_value_to_string( $mapper['type'], $meta_value, $allow_html, $truncate ); } elseif ( empty( $sub_meta_key ) ) { $value = ''; } elseif ( isset( $meta_value[ $sub_meta_key ] ) && ! empty( $meta_value[ $sub_meta_key ] ) ) { $value = $meta_value[ $sub_meta_key ]; $field_type = $mapper['type'] . '.' . $sub_meta_key; $value = Forminator_Form_Entry_Model::meta_value_to_string( $field_type, $value, $allow_html, $truncate ); } else { $value = ''; } } /** * Filter Get entry field value * * @param string $value Current value. * @param object $entry Forminator_Form_Entry_Model object. * @param array $mapper Mapper property. * @param string $sub_meta_key Sub meta key. * @param bool $allow_html Allow HTML. * @param int $truncate Truncate. */ return apply_filters( 'forminator_get_entry_field_value', $value, $entry, $mapper, $sub_meta_key, $allow_html, $truncate ); } /** * Forminator upload path * * @return string|null|WP_Error */ function forminator_upload_root_temp() { $upload_root_path = forminator_upload_root(); if ( is_wp_error( $upload_root_path ) ) { return $upload_root_path; } return $upload_root_path . 'temp'; } /** * Forminator Upload root * * @param string $base Base type. * * @return string|null|WP_Error */ function forminator_upload_root( $base = 'path' ) { $dir = wp_upload_dir(); if ( $dir['error'] ) { return new WP_Error( 'upload_dir_error', $dir['error'] ); } $upload_root = forminator_custom_upload_root( $dir, $base ); if ( ! empty( $upload_root ) ) { return esc_html( $upload_root ); } $upload_base = 'url' === $base ? $dir['baseurl'] : $dir['basedir']; return esc_html( $upload_base ) . '/forminator/'; } /** * Forminator custom root * * @param array $dir Directory. * @param string $base Base. * * @return string */ function forminator_custom_upload_root( $dir, $base ) { $custom_path = ''; $custom_upload = get_option( 'forminator_custom_upload' ); if ( isset( $custom_upload ) && $custom_upload ) { $upload_root = get_option( 'forminator_custom_upload_root' ); $upload_root = basename( $upload_root ); if ( ! str_contains( $upload_root, $dir['basedir'] ) ) { $upload_root = $dir['basedir'] . '/' . $upload_root; } if ( ! empty( $upload_root ) ) { if ( 'url' === $base ) { $dir_path = str_replace( $dir['basedir'], '', $upload_root ); $upload_root = $dir['baseurl'] . $dir_path; } $custom_path = esc_html( $upload_root ) . '/'; } } return $custom_path; } /** * Forminator get upload path * * @param int $form_id Form Id. * @param string $dir Directory. * @param string $base Base. * * @return string */ function forminator_get_upload_path( $form_id, $dir = '', $base = 'path' ) { $form_id = absint( $form_id ); $sub_folder = $form_id . '_' . wp_hash( $form_id ) . '/' . $dir; /** * Filter Custom upload subfolder * * @param string $sub_folder Upload subfolder. * @param int $form_id Module ID. * @param string $dir Sub directory. */ $sub_folder = apply_filters( 'forminator_custom_upload_subfolder', $sub_folder, $form_id, $dir ); $upload_root = forminator_upload_root( $base ); if ( is_wp_error( $upload_root ) ) { $upload_root = null; } return wp_normalize_path( $upload_root . $sub_folder ); } /** * Forminator get upload url * * @param int $form_id Form Id. * @param string $dir Directory. * * @return string */ function forminator_get_upload_url( $form_id, $dir = '' ) { $upload_path = forminator_get_upload_path( $form_id, $dir, 'url' ); $upload_url = str_replace( wp_normalize_path( untrailingslashit( ABSPATH ) ), site_url(), wp_normalize_path( $upload_path ) ); return $upload_url; } /** * Replace lead form data * * @param string $content Content. * @param array $quiz_settings Quiz settings. * @param Forminator_Form_Entry_Model|null $entry Forminator_Form_Entry_Model. * * @return string */ function forminator_replace_lead_form_data( $content, $quiz_settings, ?Forminator_Form_Entry_Model $entry = null ) { if ( isset( $quiz_settings['hasLeads'] ) && $quiz_settings['hasLeads'] ) { $lead_id = isset( $quiz_settings['leadsId'] ) ? $quiz_settings['leadsId'] : 0; $lead_model = Forminator_Base_Form_Model::get_model( $lead_id ); $form_entry_fields = forminator_lead_entry_data( $entry ); $submitted_data = forminator_lead_submitted_data( $form_entry_fields ); $entry->meta_data = $form_entry_fields; $content = forminator_replace_form_data( $content, $lead_model, $entry ); } return $content; } /** * Lead form data * * @param Forminator_Form_Entry_Model $entry Entry Model. * * @return array */ function forminator_lead_entry_data( $entry ) { $entry_data = array(); if ( isset( $entry->meta_data['lead_entry'] ) && ! empty( $entry->meta_data['lead_entry']['value'] ) ) { $entry_data = $entry->meta_data['lead_entry']['value']; } return $entry_data; } /** * Lead form submitted data * * @param mixed $lead_entry Lead entry. * * @return array */ function forminator_lead_submitted_data( $lead_entry ) { $meta_data = array(); if ( ! empty( $lead_entry ) ) { foreach ( $lead_entry as $lead_value ) { if ( ! empty( $lead_value['value'] ) && is_array( $lead_value['value'] ) ) { foreach ( $lead_value['value'] as $multi => $multi_value ) { if ( ! empty( $multi_value ) && is_array( $multi_value ) ) { foreach ( $multi_value as $sub => $sub_value ) { $meta_sub_name = $lead_value['name'] . '-' . $sub; $meta_data[ $meta_sub_name ] = $sub_value; } } else { $meta_name = $lead_value['name'] . '-' . $multi; $meta_data[ $meta_name ] = $multi_value; } } } else { $meta_data[ $lead_value['name'] ] = $lead_value['value']; } } } return $meta_data; } /** * Check how many instances of a field type exists in a given post ID * * @param string $field_type Field type. * * @return int */ function forminator_count_field_type_in_page( $field_type ) { global $post; if ( empty( $post->ID ) ) { return 0; } $page = get_post( $post->ID ); $content = $page->post_content; $field_count = 0; $form = Forminator_Form_Model::model(); // Check for forminator shortcodes. preg_match_all( '/' . get_shortcode_regex( array( 'forminator_form' ) ) . '/', $content, $matches, PREG_SET_ORDER ); // Increase count for every $field_type found. foreach ( $matches as $shortcode ) { preg_match_all( '!\d+!', $shortcode[0], $form_ids ); $form = $form->load( $form_ids[0][0] ); $form_fields = $form->get_fields(); foreach ( $form_fields as $field ) { if ( false !== strpos( $field->slug, $field_type ) ) { ++$field_count; } } } return $field_count; } /** * Trim field values * * @since 1.15.15 * * @param array $value Value array. * * @return array */ function forminator_trim_array( $value ) { foreach ( $value as $key => $val ) { if ( is_array( $val ) ) { $value[ $key ] = forminator_trim_array( $val ); } else { $value[ $key ] = strtolower( wp_unslash( trim( $val ) ) ); } } return $value; } /** * Convert special HTML entities back to characters * * @since 1.40 * @param array $value Value array. * @return array */ function forminator_htmlspecialchars_decode_array( $value ) { foreach ( $value as $key => $val ) { if ( is_array( $val ) ) { $value[ $key ] = forminator_htmlspecialchars_decode_array( $val ); } else { $value[ $key ] = htmlspecialchars_decode( $val ); } } return $value; } /** * Get cloned fields keys * * @param object $entry Entry object. * @param string $original_keys All field slugs of the current group field. * @return array */ function forminator_get_cloned_field_keys( $entry, $original_keys ) { if ( empty( $entry->meta_data ) ) { return array(); } $field_ids = implode( '|', $original_keys ); $all_suffixes = preg_filter( '/^(' . $field_ids . ')(-[^-]+)$/', '$2', array_keys( $entry->meta_data ) ); // Exclude reserved suffixes for complex fields. $repeater_suffixes = array_diff( $all_suffixes, array_map( function ( $s ) { return '-' . $s; }, $entry::field_suffix() ) ); return array_unique( $repeater_suffixes ); } /** * Truncate text * * @since 1.17.0 * * @param string $text Text for truncate. * @param int $truncate PHP_INT_MAX. */ function forminator_truncate_text( $text, $truncate = PHP_INT_MAX ) { if ( strlen( $text ) > $truncate ) { $text = substr( $text, 0, $truncate ) . '...'; } return $text; } /** * Query users. * * @since 1.20.0 * * @param string $search_string Search query. * @param array $exclude Array of user IDs to exclude from search. * * @return array */ function forminator_get_users_by_query( $search_string, $exclude ) { $params = array( 'orderby' => 'ID', 'order' => 'DESC', 'number' => 10, 'paged' => 1, 'exclude' => $exclude, 'search' => strtolower( $search_string ), 'search_columns' => array( 'user_login', 'user_email', 'user_nicename', 'display_name', ), ); $user_query = new WP_User_Query( $params ); $users = array(); foreach ( $user_query->get_results() as $user ) { $users[] = array( 'id' => $user->ID, 'name' => $user->get( 'display_name' ), 'email' => $user->get( 'user_email' ), 'role' => empty( $user->roles ) ? null : ucfirst( $user->roles[0] ), 'avatar' => get_avatar_url( $user->get( 'user_email' ) ), ); } return $users; } /** * Forminator Get allow mime type * * @param array $mimes Mimes. * @param bool $allow Allow. * * @return array */ function forminator_allowed_mime_types( $mimes = array(), $allow = true ) { if ( empty( $mimes ) ) { $mimes = get_allowed_mime_types(); } if ( ! $allow ) { $filters = array( 'htm|html', 'js', 'jse', 'jar', 'php', 'php3', 'php4', 'php5', 'phtml', 'svg', 'swf', 'exe', 'html', 'htm', 'shtml', 'xhtml', 'xml', 'css', 'asp', 'aspx', 'jsp', 'sql', 'hta', 'dll', 'bat', 'com', 'sh', 'bash', 'py', 'pl', 'dfxp', 'rar' ); foreach ( array_keys( $mimes ) as $mime_key ) { $key = strtolower( $mime_key ); if ( in_array( $key, $filters, true ) ) { unset( $mimes[ $mime_key ] ); } } } return $mimes; } /** * List custom taxonomies * * @since 1.23.0 * @param array $meta_value Meta value. * @return array */ function forminator_list_custom_taxonomies( $meta_value ) { $default_keys = array( 'post-title', 'post-content', 'post-excerpt', 'category', 'post_tag', 'post-custom', 'post-image', ); $tax_keys = array_diff( array_keys( $meta_value ), $default_keys ); return $tax_keys; } /** * Emulate prepared_data * * @param Forminator_Base_Form_Model $custom_form_model Base form model. * @param object $entry Entry data. * @return array */ function recreate_prepared_data( Forminator_Base_Form_Model $custom_form_model, $entry ) { $prepared_data = wp_list_pluck( $entry->meta_data, 'value' ); $fields = $custom_form_model->get_real_fields(); foreach ( $prepared_data as $key => $value ) { if ( isset( $value['result'] ) ) { $prepared_data[ $key ] = $value['result']; } elseif ( is_array( $value ) ) { foreach ( $value as $subkey => $subvalue ) { $prepared_data[ $key . '-' . $subkey ] = $subvalue; } } elseif ( 0 === strpos( $key, 'select-' ) || 0 === strpos( $key, 'radio-' ) || 0 === strpos( $key, 'checkbox-' ) ) { foreach ( $fields as $field ) { if ( empty( $field->raw['element_id'] ) || $key !== $field->raw['element_id'] ) { continue; } if ( empty( $field->raw['options'] ) || ! is_array( $field->raw['options'] ) ) { break; } $field_labels = wp_list_pluck( $field->raw['options'], 'label' ); $field_values = wp_list_pluck( $field->raw['options'], 'value' ); $multiple_values = explode( ', ', $value ); $prepared_data[ $key ] = $multiple_values; foreach ( $multiple_values as $multiple_key => $multiple_value ) { $field_value_key = array_search( $multiple_value, $field_labels, true ); if ( false !== $field_value_key ) { // Replace saved field Labels to the relevant field values. $prepared_data[ $key ][ $multiple_key ] = $field_values[ $field_value_key ]; } } break; } } } $prepared_data['form_id'] = $entry->form_id; return $prepared_data; } /** * Return state code * * @since 1.32.0 * @param string $state Search state. * @return string */ function forminator_get_state_code( $state ) { $state_code = apply_filters( 'forminator_statecode_list', array( 'USA' => array( 'AL' => esc_html__( 'Alabama', 'forminator' ), 'AK' => esc_html__( 'Alaska', 'forminator' ), 'AZ' => esc_html__( 'Arizona', 'forminator' ), 'AR' => esc_html__( 'Arkansas', 'forminator' ), 'CA' => esc_html__( 'California', 'forminator' ), 'CO' => esc_html__( 'Colorado', 'forminator' ), 'CT' => esc_html__( 'Connecticut', 'forminator' ), 'DE' => esc_html__( 'Delaware', 'forminator' ), 'DC' => esc_html__( 'District of Columbia', 'forminator' ), 'FL' => esc_html__( 'Florida', 'forminator' ), 'GA' => esc_html__( 'Georgia', 'forminator' ), 'HI' => esc_html__( 'Hawaii', 'forminator' ), 'ID' => esc_html__( 'Idaho', 'forminator' ), 'IL' => esc_html__( 'Illinois', 'forminator' ), 'IN' => esc_html__( 'Indiana', 'forminator' ), 'IA' => esc_html__( 'Iowa', 'forminator' ), 'KS' => esc_html__( 'Kansas', 'forminator' ), 'KY' => esc_html__( 'Kentucky', 'forminator' ), 'LA' => esc_html__( 'Louisiana', 'forminator' ), 'ME' => esc_html__( 'Maine', 'forminator' ), 'MD' => esc_html__( 'Maryland', 'forminator' ), 'MA' => esc_html__( 'Massachusetts', 'forminator' ), 'MI' => esc_html__( 'Michigan', 'forminator' ), 'MN' => esc_html__( 'Minnesota', 'forminator' ), 'MS' => esc_html__( 'Mississippi', 'forminator' ), 'MO' => esc_html__( 'Missouri', 'forminator' ), 'MT' => esc_html__( 'Montana', 'forminator' ), 'NE' => esc_html__( 'Nebraska', 'forminator' ), 'NV' => esc_html__( 'Nevada', 'forminator' ), 'NH' => esc_html__( 'New Hampshire', 'forminator' ), 'NJ' => esc_html__( 'New Jersey', 'forminator' ), 'NM' => esc_html__( 'New Mexico', 'forminator' ), 'NY' => esc_html__( 'New York', 'forminator' ), 'NC' => esc_html__( 'North Carolina', 'forminator' ), 'ND' => esc_html__( 'North Dakota', 'forminator' ), 'OH' => esc_html__( 'Ohio', 'forminator' ), 'OK' => esc_html__( 'Oklahoma', 'forminator' ), 'OR' => esc_html__( 'Oregon', 'forminator' ), 'PA' => esc_html__( 'Pennsylvania', 'forminator' ), 'PR' => esc_html__( 'Puerto Rico', 'forminator' ), 'RI' => esc_html__( 'Rhode Island', 'forminator' ), 'SC' => esc_html__( 'South Carolina', 'forminator' ), 'SD' => esc_html__( 'South Dakota', 'forminator' ), 'TN' => esc_html__( 'Tennessee', 'forminator' ), 'TX' => esc_html__( 'Texas', 'forminator' ), 'UT' => esc_html__( 'Utah', 'forminator' ), 'VT' => esc_html__( 'Vermont', 'forminator' ), 'VA' => esc_html__( 'Virginia', 'forminator' ), 'WA' => esc_html__( 'Washington', 'forminator' ), 'WV' => esc_html__( 'West Virginia', 'forminator' ), 'WI' => esc_html__( 'Wisconsin', 'forminator' ), 'WY' => esc_html__( 'Wyoming', 'forminator' ), ), 'Armed forces APO' => array( 'AA' => esc_html__( 'Armed Forces Americas', 'forminator' ), 'AE' => esc_html__( 'Armed Forces Europe', 'forminator' ), 'AP' => esc_html__( 'Armed Forces Pacific', 'forminator' ), ), 'Outlying areas' => array( 'AS' => esc_html__( 'American Samoa', 'forminator' ), 'FM' => esc_html__( 'Federated States of Micronesia', 'forminator' ), 'GU' => esc_html__( 'Guam', 'forminator' ), 'MH' => esc_html__( 'Marshall Islands', 'forminator' ), 'MP' => esc_html__( 'Northern Mariana Islands', 'forminator' ), 'PW' => esc_html__( 'Palau', 'forminator' ), 'VI' => esc_html__( 'Virgin Islands', 'forminator' ), ), 'Canada' => array( 'AB' => esc_html__( 'Alberta', 'forminator' ), 'BC' => esc_html__( 'British Columbia', 'forminator' ), 'MB' => esc_html__( 'Manitoba', 'forminator' ), 'NB' => esc_html__( 'New Brunswick', 'forminator' ), 'NL' => esc_html__( 'Newfoundland and Labrador', 'forminator' ), 'NT' => esc_html__( 'Northwest Territories', 'forminator' ), 'NS' => esc_html__( 'Nova Scotia', 'forminator' ), 'NU' => esc_html__( 'Nunavut', 'forminator' ), 'ON' => esc_html__( 'Ontario', 'forminator' ), 'PE' => esc_html__( 'Prince Edward Island', 'forminator' ), 'QC' => esc_html__( 'Quebec', 'forminator' ), 'SK' => esc_html__( 'Saskatchewan', 'forminator' ), 'YT' => esc_html__( 'Yukon', 'forminator' ), ), 'India' => array( 'APO' => esc_html__( 'Army Post Office', 'forminator' ), 'Delhi (NCT)' => esc_html__( 'Delhi', 'forminator' ), ), 'Mexico' => array( 'AGS' => esc_html__( 'Aguascalientes', 'forminator' ), 'BC' => esc_html__( 'Baja California', 'forminator' ), 'BCS' => esc_html__( 'Baja California Sur', 'forminator' ), 'CAMP' => esc_html__( 'Campeche', 'forminator' ), 'CHIS' => esc_html__( 'Chiapas', 'forminator' ), 'CHIH' => esc_html__( 'Chihuahua', 'forminator' ), 'CDMX' => esc_html__( 'Ciudad de México', 'forminator' ), 'COAH' => esc_html__( 'Coahuila', 'forminator' ), 'COL' => esc_html__( 'Colima', 'forminator' ), 'DF' => esc_html__( 'Distrito Federal', 'forminator' ), 'DGO' => esc_html__( 'Durango', 'forminator' ), 'MEX' => esc_html__( 'Estado de México', 'forminator' ), 'GTO' => esc_html__( 'Guanajuato', 'forminator' ), 'GRO' => esc_html__( 'Guerrero', 'forminator' ), 'HGO' => esc_html__( 'Hidalgo', 'forminator' ), 'JAL' => esc_html__( 'Jalisco', 'forminator' ), 'MICH' => esc_html__( 'Michoacán', 'forminator' ), 'MOR' => esc_html__( 'Morelos', 'forminator' ), 'NAY' => esc_html__( 'Nayarit', 'forminator' ), 'NL' => esc_html__( 'Nuevo León', 'forminator' ), 'OAX' => esc_html__( 'Oaxaca', 'forminator' ), 'PUE' => esc_html__( 'Puebla', 'forminator' ), 'QRO' => esc_html__( 'Querétaro', 'forminator' ), 'Q ROO' => esc_html__( 'Quintana Roo', 'forminator' ), 'SLP' => esc_html__( 'San Luis Potosí', 'forminator' ), 'SIN' => esc_html__( 'Sinaloa', 'forminator' ), 'SON' => esc_html__( 'Sonora', 'forminator' ), 'TAB' => esc_html__( 'Tabasco', 'forminator' ), 'TAMPS' => esc_html__( 'Tamaulipas', 'forminator' ), 'TLAX' => esc_html__( 'Tlaxcala', 'forminator' ), 'VER' => esc_html__( 'Veracruz', 'forminator' ), 'YUC' => esc_html__( 'Yucatán', 'forminator' ), 'ZAC' => esc_html__( 'Zacatecas', 'forminator' ), ), 'Japan' => array( 'AICHI-KEN' => esc_html__( 'Aichi', 'forminator' ), 'AKITA-KEN' => esc_html__( 'Akita', 'forminator' ), 'AOMORI-KEN' => esc_html__( 'Aomori', 'forminator' ), 'CHIBA-KEN' => esc_html__( 'Chiba', 'forminator' ), 'EHIME-KEN' => esc_html__( 'Ehime', 'forminator' ), 'FUKUI-KEN' => esc_html__( 'Fukui', 'forminator' ), 'FUKUOKA-KEN' => esc_html__( 'Fukuoka', 'forminator' ), 'FUKUSHIMA-KEN' => esc_html__( 'Fukushima', 'forminator' ), 'GIFU-KEN' => esc_html__( 'Gifu', 'forminator' ), 'GUNMA-KEN' => esc_html__( 'Gunma', 'forminator' ), 'HIROSHIMA-KEN' => esc_html__( 'Hiroshima', 'forminator' ), 'HOKKAIDO' => esc_html__( 'Hokkaido', 'forminator' ), 'HYOGO-KEN' => esc_html__( 'Hyogo', 'forminator' ), 'IBARAKI-KEN' => esc_html__( 'Ibaraki', 'forminator' ), 'ISHIKAWA-KEN' => esc_html__( 'Ishikawa', 'forminator' ), 'IWATE-KEN' => esc_html__( 'Iwate', 'forminator' ), 'KAGAWA-KEN' => esc_html__( 'Kagawa', 'forminator' ), 'KAGOSHIMA-KEN' => esc_html__( 'Kagoshima', 'forminator' ), 'KANAGAWA-KEN' => esc_html__( 'Kanagawa', 'forminator' ), 'KOCHI-KEN' => esc_html__( 'Kochi', 'forminator' ), 'KUMAMOTO-KEN' => esc_html__( 'Kumamoto', 'forminator' ), 'KYOTO-FU' => esc_html__( 'Kyoto', 'forminator' ), 'MIE-KEN' => esc_html__( 'Mie', 'forminator' ), 'MIYAGI-KEN' => esc_html__( 'Miyagi', 'forminator' ), 'MIYAZAKI-KEN' => esc_html__( 'Miyazaki', 'forminator' ), 'NAGANO-KEN' => esc_html__( 'Nagano', 'forminator' ), 'NAGASAKI-KEN' => esc_html__( 'Nagasaki', 'forminator' ), 'NARA-KEN' => esc_html__( 'Nara', 'forminator' ), 'NIIGATA-KEN' => esc_html__( 'Niigata', 'forminator' ), 'OITA-KEN' => esc_html__( 'Oita', 'forminator' ), 'OKAYAMA-KEN' => esc_html__( 'Okayama', 'forminator' ), 'OKINAWA-KEN' => esc_html__( 'Okinawa', 'forminator' ), 'OSAKA-FU' => esc_html__( 'Osaka', 'forminator' ), 'SAGA-KEN' => esc_html__( 'Saga', 'forminator' ), 'SAITAMA-KEN' => esc_html__( 'Saitama', 'forminator' ), 'SHIGA-KEN' => esc_html__( 'Shiga', 'forminator' ), 'SHIMANE-KEN' => esc_html__( 'Shimane', 'forminator' ), 'SHIZUOKA-KEN' => esc_html__( 'Shizuoka', 'forminator' ), 'TOCHIGI-KEN' => esc_html__( 'Tochigi', 'forminator' ), 'TOKUSHIMA-KEN' => esc_html__( 'Tokushima', 'forminator' ), 'TOKYO-TO' => esc_html__( 'Tokyo', 'forminator' ), 'TOTTORI-KEN' => esc_html__( 'Tottori', 'forminator' ), 'TOYAMA-KEN' => esc_html__( 'Toyama', 'forminator' ), 'WAKAYAMA-KEN' => esc_html__( 'Wakayama', 'forminator' ), 'YAMAGATA-KEN' => esc_html__( 'Yamagata', 'forminator' ), 'YAMAGUCHI-KEN' => esc_html__( 'Yamaguchi', 'forminator' ), 'YAMANASHI-KEN' => esc_html__( 'Yamanashi', 'forminator' ), ), 'Italy' => array( 'AG' => esc_html__( 'Agrigento', 'forminator' ), 'AL' => esc_html__( 'Alessandria', 'forminator' ), 'AN' => esc_html__( 'Ancona', 'forminator' ), 'AO' => esc_html__( 'Aosta', 'forminator' ), 'AR' => esc_html__( 'Arezzo', 'forminator' ), 'AP' => esc_html__( 'Ascoli Piceno', 'forminator' ), 'AT' => esc_html__( 'Asti', 'forminator' ), 'AV' => esc_html__( 'Avellino', 'forminator' ), 'BA' => esc_html__( 'Bari', 'forminator' ), 'BT' => esc_html__( 'Barletta-Andria-Trani', 'forminator' ), 'BL' => esc_html__( 'Belluno', 'forminator' ), 'BN' => esc_html__( 'Benevento', 'forminator' ), 'BG' => esc_html__( 'Bergamo', 'forminator' ), 'BI' => esc_html__( 'Biella', 'forminator' ), 'BO' => esc_html__( 'Bologna', 'forminator' ), 'BZ' => esc_html__( 'Bolzano', 'forminator' ), 'BS' => esc_html__( 'Brescia', 'forminator' ), 'BR' => esc_html__( 'Brindisi', 'forminator' ), 'CA' => esc_html__( 'Cagliari', 'forminator' ), 'CL' => esc_html__( 'Caltanissetta', 'forminator' ), 'CB' => esc_html__( 'Campobasso', 'forminator' ), 'CI' => esc_html__( 'Carbonia-Iglesias', 'forminator' ), 'CE' => esc_html__( 'Caserta', 'forminator' ), 'CT' => esc_html__( 'Catania', 'forminator' ), 'CZ' => esc_html__( 'Catanzaro', 'forminator' ), 'CH' => esc_html__( 'Chieti', 'forminator' ), 'CO' => esc_html__( 'Como', 'forminator' ), 'CS' => esc_html__( 'Cosenza', 'forminator' ), 'CR' => esc_html__( 'Cremona', 'forminator' ), 'KR' => esc_html__( 'Crotone', 'forminator' ), 'CN' => esc_html__( 'Cuneo', 'forminator' ), 'EN' => esc_html__( 'Enna', 'forminator' ), 'FM' => esc_html__( 'Fermo', 'forminator' ), 'FE' => esc_html__( 'Ferrara', 'forminator' ), 'FI' => esc_html__( 'Firenze', 'forminator' ), 'FG' => esc_html__( 'Foggia', 'forminator' ), 'FC' => esc_html__( 'Forlì-Cesena', 'forminator' ), 'FR' => esc_html__( 'Frosinone', 'forminator' ), 'GE' => esc_html__( 'Genova', 'forminator' ), 'GO' => esc_html__( 'Gorizia', 'forminator' ), 'GR' => esc_html__( 'Grosseto', 'forminator' ), 'IM' => esc_html__( 'Imperia', 'forminator' ), 'IS' => esc_html__( 'Isernia', 'forminator' ), 'AQ' => html_entity_decode( esc_html__( 'L\'Aquila', 'forminator' ), ENT_QUOTES ), 'SP' => esc_html__( 'La Spezia', 'forminator' ), 'LT' => esc_html__( 'Latina', 'forminator' ), 'LE' => esc_html__( 'Lecce', 'forminator' ), 'LC' => esc_html__( 'Lecco', 'forminator' ), 'LI' => esc_html__( 'Livorno', 'forminator' ), 'LO' => esc_html__( 'Lodi', 'forminator' ), 'LU' => esc_html__( 'Lucca', 'forminator' ), 'MC' => esc_html__( 'Macerata', 'forminator' ), 'MN' => esc_html__( 'Mantova', 'forminator' ), 'MS' => esc_html__( 'Massa-Carrara', 'forminator' ), 'MT' => esc_html__( 'Matera', 'forminator' ), 'VS' => esc_html__( 'Medio Campidano', 'forminator' ), 'ME' => esc_html__( 'Messina', 'forminator' ), 'MI' => esc_html__( 'Milano', 'forminator' ), 'MO' => esc_html__( 'Modena', 'forminator' ), 'MB' => esc_html__( 'Monza e della Brianza', 'forminator' ), 'NA' => esc_html__( 'Napoli', 'forminator' ), 'NO' => esc_html__( 'Novara', 'forminator' ), 'NU' => esc_html__( 'Nuoro', 'forminator' ), 'OG' => esc_html__( 'Ogliastra', 'forminator' ), 'OT' => esc_html__( 'Olbia-Tempio', 'forminator' ), 'OR' => esc_html__( 'Oristano', 'forminator' ), 'PD' => esc_html__( 'Padova', 'forminator' ), 'PA' => esc_html__( 'Palermo', 'forminator' ), 'PR' => esc_html__( 'Parma', 'forminator' ), 'PV' => esc_html__( 'Pavia', 'forminator' ), 'PG' => esc_html__( 'Perugia', 'forminator' ), 'PU' => esc_html__( 'Pesaro e Urbino', 'forminator' ), 'PE' => esc_html__( 'Pescara', 'forminator' ), 'PC' => esc_html__( 'Piacenza', 'forminator' ), 'PI' => esc_html__( 'Pisa', 'forminator' ), 'PT' => esc_html__( 'Pistoia', 'forminator' ), 'PN' => esc_html__( 'Pordenone', 'forminator' ), 'PZ' => esc_html__( 'Potenza', 'forminator' ), 'PO' => esc_html__( 'Prato', 'forminator' ), 'RG' => esc_html__( 'Ragusa', 'forminator' ), 'RA' => esc_html__( 'Ravenna', 'forminator' ), 'RC' => esc_html__( 'Reggio Calabria', 'forminator' ), 'RE' => esc_html__( 'Reggio Emilia', 'forminator' ), 'RI' => esc_html__( 'Rieti', 'forminator' ), 'RN' => esc_html__( 'Rimini', 'forminator' ), 'RM' => esc_html__( 'Roma', 'forminator' ), 'RO' => esc_html__( 'Rovigo', 'forminator' ), 'SA' => esc_html__( 'Salerno', 'forminator' ), 'SS' => esc_html__( 'Sassari', 'forminator' ), 'SV' => esc_html__( 'Savona', 'forminator' ), 'SI' => esc_html__( 'Siena', 'forminator' ), 'SR' => esc_html__( 'Siracusa', 'forminator' ), 'SO' => esc_html__( 'Sondrio', 'forminator' ), 'TA' => esc_html__( 'Taranto', 'forminator' ), 'TE' => esc_html__( 'Teramo', 'forminator' ), 'TR' => esc_html__( 'Terni', 'forminator' ), 'TO' => esc_html__( 'Torino', 'forminator' ), 'TP' => esc_html__( 'Trapani', 'forminator' ), 'TN' => esc_html__( 'Trento', 'forminator' ), 'TV' => esc_html__( 'Treviso', 'forminator' ), 'TS' => esc_html__( 'Trieste', 'forminator' ), 'UD' => esc_html__( 'Udine', 'forminator' ), 'VA' => esc_html__( 'Varese', 'forminator' ), 'VE' => esc_html__( 'Venezia', 'forminator' ), 'VB' => esc_html__( 'Verbano-Cusio-Ossola', 'forminator' ), 'VC' => esc_html__( 'Vercelli', 'forminator' ), 'VR' => esc_html__( 'Verona', 'forminator' ), 'VV' => esc_html__( 'Vibo Valentia', 'forminator' ), 'VI' => esc_html__( 'Vicenza', 'forminator' ), 'VT' => esc_html__( 'Viterbo', 'forminator' ), ), 'Indonesia' => array( 'ID-BA' => esc_html__( 'Bali', 'forminator' ), 'ID-BB' => esc_html__( 'Bangka Belitung', 'forminator' ), 'ID-BT' => esc_html__( 'Banten', 'forminator' ), 'ID-BE' => esc_html__( 'Bengkulu', 'forminator' ), 'ID-YO' => esc_html__( 'DI Yogyakarta', 'forminator' ), 'ID-JK' => esc_html__( 'DKI Jakarta', 'forminator' ), 'ID-GO' => esc_html__( 'Gorontalo', 'forminator' ), 'ID-JA' => esc_html__( 'Jambi', 'forminator' ), 'ID-JB' => esc_html__( 'Jawa Barat', 'forminator' ), 'ID-JT' => esc_html__( 'Jawa Tengah', 'forminator' ), 'ID-JI' => esc_html__( 'Jawa Timur', 'forminator' ), 'ID-KB' => esc_html__( 'Kalimantan Barat', 'forminator' ), 'ID-KS' => esc_html__( 'Kalimantan Selatan', 'forminator' ), 'ID-KT' => esc_html__( 'Kalimantan Tengah', 'forminator' ), 'ID-KI' => esc_html__( 'Kalimantan Timur', 'forminator' ), 'ID-KU' => esc_html__( 'Kalimantan Utara', 'forminator' ), 'ID-KR' => esc_html__( 'Kepulauan Riau', 'forminator' ), 'ID-LA' => esc_html__( 'Lampung', 'forminator' ), 'ID-MA' => esc_html__( 'Maluku', 'forminator' ), 'ID-MU' => esc_html__( 'Maluku Utara', 'forminator' ), 'ID-AC' => esc_html__( 'Nanggroe Aceh Darussalam', 'forminator' ), 'ID-NB' => esc_html__( 'Nusa Tenggara Barat', 'forminator' ), 'ID-NT' => esc_html__( 'Nusa Tenggara Timur', 'forminator' ), 'ID-PA' => esc_html__( 'Papua', 'forminator' ), 'ID-PB' => esc_html__( 'Papua Barat', 'forminator' ), 'ID-RI' => esc_html__( 'Riau', 'forminator' ), 'ID-SR' => esc_html__( 'Sulawesi Barat', 'forminator' ), 'ID-SN' => esc_html__( 'Sulawesi Selatan', 'forminator' ), 'ID-ST' => esc_html__( 'Sulawesi Tengah', 'forminator' ), 'ID-SG' => esc_html__( 'Sulawesi Tenggara', 'forminator' ), 'ID-SA' => esc_html__( 'Sulawesi Utara', 'forminator' ), 'ID-SB' => esc_html__( 'Sumatera Barat', 'forminator' ), 'ID-SS' => esc_html__( 'Sumatera Selatan', 'forminator' ), 'ID-SU' => esc_html__( 'Sumatera Utara', 'forminator' ), ), 'Brazil' => array( 'AC' => esc_html__( 'Acre', 'forminator' ), 'AL' => esc_html__( 'Alagoas', 'forminator' ), 'AP' => esc_html__( 'Amapá', 'forminator' ), 'AM' => esc_html__( 'Amazonas', 'forminator' ), 'BA' => esc_html__( 'Bahia', 'forminator' ), 'CE' => esc_html__( 'Ceará', 'forminator' ), 'DF' => esc_html__( 'Distrito Federal', 'forminator' ), 'ES' => esc_html__( 'Espírito Santo', 'forminator' ), 'GO' => esc_html__( 'Goiás', 'forminator' ), 'MA' => esc_html__( 'Maranhão', 'forminator' ), 'MT' => esc_html__( 'Mato Grosso', 'forminator' ), 'MS' => esc_html__( 'Mato Grosso do Sul', 'forminator' ), 'MG' => esc_html__( 'Minas Gerais', 'forminator' ), 'PR' => esc_html__( 'Paraná', 'forminator' ), 'PB' => esc_html__( 'Paraíba', 'forminator' ), 'PA' => esc_html__( 'Pará', 'forminator' ), 'PE' => esc_html__( 'Pernambuco', 'forminator' ), 'PI' => esc_html__( 'Piauí', 'forminator' ), 'RN' => esc_html__( 'Rio Grande do Norte', 'forminator' ), 'RS' => esc_html__( 'Rio Grande do Sul', 'forminator' ), 'RJ' => esc_html__( 'Rio de Janeiro', 'forminator' ), 'RO' => esc_html__( 'Rondônia', 'forminator' ), 'RR' => esc_html__( 'Roraima', 'forminator' ), 'SC' => esc_html__( 'Santa Catarina', 'forminator' ), 'SE' => esc_html__( 'Sergipe', 'forminator' ), 'SP' => esc_html__( 'São Paulo', 'forminator' ), 'TO' => esc_html__( 'Tocantins', 'forminator' ), ), 'Argentina' => array( 'CIUDAD AUTÓNOMA DE BUENOS AIRES' => esc_html__( 'Buenos Aires (Ciudad)', 'forminator' ), 'BUENOS AIRES' => esc_html__( 'Buenos Aires (Provincia)', 'forminator' ), 'CATAMARCA' => esc_html__( 'Catamarca', 'forminator' ), 'CHACO' => esc_html__( 'Chaco', 'forminator' ), 'CHUBUT' => esc_html__( 'Chubut', 'forminator' ), 'CORRIENTES' => esc_html__( 'Corrientes', 'forminator' ), 'CÓRDOBA' => esc_html__( 'Córdoba', 'forminator' ), 'ENTRE RÍOS' => esc_html__( 'Entre Ríos', 'forminator' ), 'FORMOSA' => esc_html__( 'Formosa', 'forminator' ), 'JUJUY' => esc_html__( 'Jujuy', 'forminator' ), 'LA PAMPA' => esc_html__( 'La Pampa', 'forminator' ), 'LA RIOJA' => esc_html__( 'La Rioja', 'forminator' ), 'MENDOZA' => esc_html__( 'Mendoza', 'forminator' ), 'MISIONES' => esc_html__( 'Misiones', 'forminator' ), 'NEUQUÉN' => esc_html__( 'Neuquén', 'forminator' ), 'RÍO NEGRO' => esc_html__( 'Río Negro', 'forminator' ), 'SALTA' => esc_html__( 'Salta', 'forminator' ), 'SAN JUAN' => esc_html__( 'San Juan', 'forminator' ), 'SAN LUIS' => esc_html__( 'San Luis', 'forminator' ), 'SANTA CRUZ' => esc_html__( 'Santa Cruz', 'forminator' ), 'SANTA FE' => esc_html__( 'Santa Fe', 'forminator' ), 'SANTIAGO DEL ESTERO' => esc_html__( 'Santiago del Estero', 'forminator' ), 'TIERRA DEL FUEGO' => esc_html__( 'Tierra del Fuego', 'forminator' ), 'TUCUMÁN' => esc_html__( 'Tucumán', 'forminator' ), ), ) ); if ( ! empty( $state ) && ! empty( $state_code ) ) { foreach ( $state_code as $key => $value ) { if ( ! empty( $value ) && is_array( $value ) ) { $code = array_search( $state, $value, true ); if ( ! empty( $code ) ) { $state = $code; } } } } return $state; } /** * Render Rating field * * @param mixed $rating_value Rating value. * @param array $rating_items Rating items. * * @return string */ function forminator_render_rating_field( $rating_value, $rating_items ) { $rating_value = ! empty( $rating_value ) ? $rating_value : 0; $max_rating = ! empty( $rating_items['max_rating'] ) ? $rating_items['max_rating'] : 0; $output = '<div class="forminator-rating-field forminator-rating-size--' . esc_attr( $rating_items['size'] ) . '">'; $output .= '<div class="forminator-rating-items">'; for ( $rating = 1; $rating <= $max_rating; $rating++ ) { $class_name = 'forminator-icon-' . $rating_items['icon'] . ( $rating <= $rating_value ? ' forminator-rating-active' : '' ); $output .= '<span class="' . esc_attr( $class_name ) . '" aria-hidden="true"></span>'; } $output .= '</div>'; if ( $rating_items['suffix'] ) { $output .= '<span class="forminator-rating-suffix">' . esc_html( '(' . $rating_value . '/' . $max_rating . ')' ) . '</span>'; } $output .= '</div>'; return $output; } helper-forms.php 0000644 00000070034 15162502320 0007660 0 ustar 00 <?php /** * Form helper functions. * * @package Forminator */ if ( ! defined( 'ABSPATH' ) ) { die(); } /** * Return local timestamp * * @since 1.0 * * @param string $timestamp Timestamp. * * @return mixed */ function forminator_local_timestamp( $timestamp = null ) { // If no timestamp, get it current. if ( is_null( $timestamp ) ) { $timestamp = time(); } return $timestamp + ( get_option( 'gmt_offset' ) * 3600 ); } /** * Return user IP * * @since 1.0 * @return string */ function forminator_user_ip() { return Forminator_Geo::get_user_ip(); } /** * Return user property * * @param mixed $property Property. * * @since 1.0 * @return string */ function forminator_get_user_data( $property ) { global $current_user; return $current_user->get( $property ); } /** * Return user property * * @since 1.0 * * @param string $property Property. * @param int $post_id Post Id. * @param string $default_value Default value. * * @return string */ function forminator_get_post_data( $property, $post_id = null, $default_value = '' ) { global $post; if ( $post_id ) { $post_object = get_post( $post_id ); // make sure its wp_post. if ( $post_object instanceof WP_Post ) { // set global $post as $post_object retrieved from `get_post` for next usage. $post = $post_object; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited } } if ( ! $post ) { // fallback on wp_ajax, `global $post` not available. $wp_referer = wp_get_referer(); if ( $wp_referer ) { $post_id = url_to_postid( $wp_referer ); if ( $post_id ) { $post_object = get_post( $post_id ); // make sure its wp_post. if ( $post_object instanceof WP_Post ) { // set global $post as $post_object retrieved from `get_post` for next usage. $post = $post_object; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited } } } } $post_data = forminator_object_to_array( $post ); if ( isset( $post_data[ $property ] ) ) { return $post_data[ $property ]; } else { return $default_value; } } /** * Return total custom form records * * @param string $status Status. * @since 1.0 * * @return int */ function forminator_cforms_total( $status = '' ) { return Forminator_Form_Model::model()->count_all( $status ); } /** * Return custom forms * * @since 1.0 * @return Forminator_Base_Form_Model[] */ function forminator_custom_forms() { return Forminator_Form_Model::model()->get_all_paged(); } /** * Return conversion rate from module * * @param array $module Module. * * @since 1.0 * @return mixed */ function forminator_get_rate( $module ) { if ( 0 === $module['views'] ) { $rate = 0; } else { $rate = round( ( $module['entries'] * 100 ) / $module['views'], 1 ); } return $rate; } /** * Return total polls form records * * @param string $status Status. * @since 1.0 * * @return int */ function forminator_polls_total( $status = '' ) { return Forminator_Poll_Model::model()->count_all( $status ); } /** * Return polls * * @since 1.0 * @return Forminator_Base_Form_Model[] */ function forminator_polls_forms() { return Forminator_Poll_Model::model()->get_all_paged(); } /** * Return total quizzes records * * @param string $status Status. * @since 1.0 * * @return int */ function forminator_quizzes_total( $status = '' ) { return Forminator_Quiz_Model::model()->count_all( $status ); } /** * Return quizzes * * @since 1.0 * @return Forminator_Base_Form_Model[] */ function forminator_quizzes_forms() { return Forminator_Quiz_Model::model()->get_all_paged(); } /** * Check if quiz has leads * * @param mixed $model Model. * * @since 1.14 * * @return bool */ function forminator_quiz_has_leads( $model ) { if ( isset( $model->settings['hasLeads'] ) && in_array( $model->settings['hasLeads'], array( true, 'true' ), true ) ) { return true; } return false; } /** * Return quiz edit url * * @since 1.0 * * @param array $module Module. * @param int $id Module id. * * @return mixed */ function forminator_quiz_get_edit_url( $module, $id ) { if ( isset( $module['type'] ) && 'nowrong' === $module['type'] ) { return admin_url( 'admin.php?page=forminator-nowrong-wizard&id=' . $id ); } else { return admin_url( 'admin.php?page=forminator-knowledge-wizard&id=' . $id ); } } /** * Return total forms * * @param string $status Status. * * @since 1.0 * * @return int */ function forminator_total_forms( $status = '' ) { $modules = array( forminator_cforms_total( $status ), forminator_polls_total( $status ), forminator_quizzes_total( $status ), ); return array_sum( $modules ); } /** * Return form nice name by id * * @since 1.0 * * @param int $id Id. * * @return mixed */ function forminator_get_form_name( $id ) { $model = Forminator_Base_Form_Model::get_model( $id ); // Fallback just in case. if ( ! empty( $model->settings['formName'] ) ) { return $model->settings['formName']; } else { return $model->raw->post_title; } } /** * Central per page for form view * * @param string $type View type. * * @since 1.0 * @return int */ function forminator_form_view_per_page( $type = 'listings' ) { if ( 'entries' === $type ) { $per_page = get_option( 'forminator_pagination_entries', 10 ); } else { $per_page = get_option( 'forminator_pagination_listings', 10 ); } // force at least 1 data per page. if ( $per_page < 1 ) { $per_page = 1; } return apply_filters( 'forminator_form_per_page', $per_page, $type ); } /** * Return admin page url by slug * * @param string $slug Slug. * * @since 1.0 * @return mixed */ function forminator_get_admin_link( $slug ) { return menu_page_url( $slug, false ); } /** * Return JS model to form model * * @since 1.0 * * @param array $data Data. * * @return array */ function forminator_data_to_model_form( $data ) { $model = array(); if ( empty( $data ) ) { return $model; } // Set wrappers. $model['wrappers'] = $data['wrappers']; // Remove wrappers to get all form settings. unset( $data['wrappers'] ); // Set settings. $model['settings'] = $data['settings']; return $model; } /** * Return JS model to form model * * @since 1.0 * * @param array $data Data. * * @return array */ function forminator_data_to_model_poll( $data ) { $model = array(); if ( empty( $data ) ) { return $model; } if ( isset( $data['answers'] ) ) { // Set wrappers. $model['answers'] = $data['answers']; // Remove wrappers to get all form settings. unset( $data['answers'] ); } // Set settings. $model['settings'] = $data['settings']; return $model; } /** * Return JS model to form model * * @since 1.0 * * @param array $data Data. * * @return array */ function forminator_data_to_model_quiz( $data ) { $model = array(); if ( empty( $data ) ) { return $model; } if ( isset( $data['type'] ) ) { $model['type'] = $data['type']; unset( $data['type'] ); } // Set results. if ( isset( $data['results'] ) ) { $model['results'] = $data['results']; unset( $data['results'] ); } // Set results. if ( isset( $data['questions'] ) ) { $model['questions'] = $data['questions']; unset( $data['questions'] ); } // Set settings. $model['settings'] = $data; if ( isset( $data['settings'] ) ) { $model['settings'] = $data['settings']; } return $model; } /** * Prepares the custom css string * * @since 1.0 * * @param string $css_string CSS string. * @param string $prefix prefix. * @param bool|false $as_array Prepare css as array. * @param bool|true $separate_prefix Separate prefix. * @param string $wildcard string. * * @return array|string */ function forminator_prepare_css( $css_string, $prefix, $as_array = false, $separate_prefix = true, $wildcard = '' ) { $css_array = array(); // master array to hold all values. $elements = explode( '}', $css_string ); // Output is the final processed CSS string. $output = ''; $prepared = ''; $have_media = false; $media_names = array(); $media_names_key = 0; $index = 0; foreach ( $elements as $element ) { // We need to null prepared else styles are multiplied. $prepared = ''; $check_element = trim( $element ); if ( empty( $check_element ) ) { // Still increment $index even if empty. ++$index; continue; } // get the name of the CSS element. $a_name = explode( '{', $element ); $name = $a_name[0]; // check if @media is present. $media_name = ''; if ( strpos( $name, '@media' ) !== false && isset( $a_name[1] ) ) { $have_media = true; $media_name = $name; $media_names[ $media_names_key ] = array( 'name' => $media_name, ); $name = $a_name[1]; ++$media_names_key; } if ( $have_media ) { $prepared = ''; } // get all the key:value pair styles. $a_styles = explode( ';', $element ); // remove element name from first property element. $remove_element_name = ( ! empty( $media_name ) ) ? $media_name . '{' . $name : $name; $a_styles[0] = str_replace( $remove_element_name . '{', '', $a_styles[0] ); $names = explode( ',', $name ); foreach ( $names as $name ) { $name = trim( $name ); if ( 0 === strpos( $name, ':' ) ) { $space_needed = false; } elseif ( $separate_prefix && empty( $wildcard ) ) { $space_needed = true; } elseif ( $separate_prefix && ! empty( $wildcard ) ) { // wildcard is the sibling class of target selector e.g. "wph-modal". if ( strpos( $name, $wildcard ) && ! strpos( $name, $wildcard . '-' ) ) { $space_needed = false; } else { $space_needed = true; } } else { $space_needed = false; } $maybe_put_space = ( $space_needed ) ? ' ' : ''; $prepared .= ( trim( $prefix ) . $maybe_put_space . trim( $name ) . ',' ); } $prepared = trim( $prepared, ',' ); $prepared .= '{'; // loop through each style and split apart the key from the value. $count = count( $a_styles ); for ( $a = 0; $a < $count; $a++ ) { if ( '' !== trim( $a_styles[ $a ] ) ) { $a_key_value = array_map( 'trim', explode( ':', $a_styles[ $a ] ) ); // build the master css array. if ( count( $a_key_value ) >= 2 ) { $a_key_value_to_join = array_slice( $a_key_value, 1 ); $a_key_value[1] = implode( ':', $a_key_value_to_join ); $css_array[ $name ][ $a_key_value[0] ] = $a_key_value[1]; $prepared .= ( $a_key_value[0] . ': ' . $a_key_value[1] ); if ( strpos( $a_key_value[1], '!important' ) === false ) { $prepared .= ' !important'; } $prepared .= ';'; } } } $prepared .= '}'; // if have @media earlier, append these styles. $prev_media_names_key = $media_names_key - 1; if ( isset( $media_names[ $prev_media_names_key ] ) ) { if ( isset( $media_names[ $prev_media_names_key ]['styles'] ) ) { // See if there were two closing '}' or just one. // (each element is exploded/split on '}' symbol, so having two empty strings afterward in the elements array means two '}'s. $next_element = isset( $elements[ $index + 2 ] ) ? trim( $elements[ $index + 2 ] ) : false; // If inside @media block. if ( ! empty( $next_element ) ) { $media_names[ $prev_media_names_key ]['styles'] .= $prepared; } else { // If outside of @media block, add to output. $output .= $prepared; } } else { $media_names[ $prev_media_names_key ]['styles'] = $prepared; } } else { // If no @media, add styles to $output outside @media. $output .= $prepared; } // Increase index. ++$index; } // if have @media, populate styles using $media_names. if ( $have_media ) { // reset first $prepared styles. $prepared = ''; foreach ( $media_names as $media ) { $prepared .= $media['name'] . '{ ' . $media['styles'] . ' }'; } // Add @media styles to output. $output .= $prepared; } return $as_array ? $css_array : $output; } /** * Handle all pagination * * @since 1.0 * * @param int $total - the total records. * @param string $type - The type of page (listings or entries). */ function forminator_list_pagination( $total, $type = 'listings' ) { $pagenum = (int) Forminator_Core::sanitize_text_field( 'paged' ); $page_number = max( 1, $pagenum ); $per_page = forminator_form_view_per_page( $type ); if ( 'entries' === $type ) { $per_page = forminator_form_view_per_page( 'entries' ); } if ( $total > $per_page ) { $removable_query_args = wp_removable_query_args(); $http_hosts = isset( $_SERVER['HTTP_HOST'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ) ) : ''; $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : ''; $current_url = set_url_scheme( 'http://' . $http_hosts . $request_uri ); $current_url = remove_query_arg( $removable_query_args, $current_url ); $current = $page_number + 1; $total_pages = ceil( $total / $per_page ); $total_pages = absint( $total_pages ); $disable_first = false; $disable_last = false; $disable_prev = false; $disable_next = false; $mid_size = 2; $end_size = 1; $show_skip = false; if ( $total_pages > 10 ) { $show_skip = true; } if ( $total_pages >= 4 ) { $disable_prev = true; $disable_next = true; } if ( 1 === $page_number ) { $disable_first = true; } if ( $page_number === $total_pages ) { $disable_last = true; } ?> <ul class="sui-pagination"> <?php if ( ! $disable_first ) : ?> <?php $prev_url = esc_url( add_query_arg( 'paged', min( $total_pages, $page_number - 1 ), $current_url ) ); $first_url = esc_url( add_query_arg( 'paged', min( 1, $total_pages ), $current_url ) ); ?> <?php if ( $show_skip ) : ?> <li class="wpmudev-pagination--prev"> <a href="<?php echo esc_url( $first_url ); ?>"><i class="sui-icon-arrow-skip-start" aria-hidden="true"></i></a> </li> <?php endif; ?> <?php if ( $disable_prev ) : ?> <li class="wpmudev-pagination--prev"> <a href="<?php echo esc_url( $prev_url ); ?>"><i class="sui-icon-chevron-left" aria-hidden="true"></i></a> </li> <?php endif; ?> <?php endif; ?> <?php $dots = false; for ( $i = 1; $i <= $total_pages; $i++ ) : $class = ( $page_number === $i ) ? 'sui-active' : ''; $url = esc_url( add_query_arg( 'paged', ( $i ), $current_url ) ); if ( ( $i <= $end_size || ( $current && $i >= $current - $mid_size && $i <= $current + $mid_size ) || $i > $total_pages - $end_size ) ) { ?> <li class="<?php echo esc_attr( $class ); ?>"><a href="<?php echo esc_url( $url ); ?>" class="<?php echo esc_attr( $class ); ?>"><?php echo esc_html( $i ); ?></a></li> <?php $dots = true; } elseif ( $dots ) { ?> <li class="sui-pagination-dots"><span><?php esc_html_e( '…', 'forminator' ); ?></span></li> <?php $dots = false; } ?> <?php endfor; ?> <?php if ( ! $disable_last ) : ?> <?php $next_url = esc_url( add_query_arg( 'paged', min( $total_pages, $page_number + 1 ), $current_url ) ); $last_url = esc_url( add_query_arg( 'paged', max( $total_pages, $page_number - 1 ), $current_url ) ); ?> <?php if ( $disable_next ) : ?> <li class="wpmudev-pagination--next"> <a href="<?php echo esc_url( $next_url ); ?>"><i class="sui-icon-chevron-right" aria-hidden="true"></i></a> </li> <?php endif; ?> <?php if ( $show_skip ) : ?> <li class="wpmudev-pagination--next"> <a href="<?php echo esc_url( $last_url ); ?>"><i class="sui-icon-arrow-skip-end" aria-hidden="true"></i></a> </li> <?php endif; ?> <?php endif; ?> </ul> <?php } } /** * Get Form Model from id * * @since 1.0.5 * * @param int $id Form Id. * * @return bool|Forminator_Base_Form_Model|null */ function forminator_get_model_from_id( $id ) { $post = get_post( $id ); if ( ! $post instanceof WP_Post ) { return null; } $custom_form_model = Forminator_Form_Model::model(); $quiz_form_model = Forminator_Quiz_Model::model(); $poll_form_model = Forminator_Poll_Model::model(); switch ( $post->post_type ) { case $custom_form_model->get_post_type(): $form_model = $custom_form_model->load( $id ); break; case $quiz_form_model->get_post_type(): $form_model = $quiz_form_model->load( $id ); break; case $poll_form_model->get_post_type(): $form_model = $poll_form_model->load( $id ); break; default: $form_model = null; break; } return $form_model; } /** * Get Latest entry based on $entry_type * [custom-forms, quizzes, poll] * will return null if there is no entry * * @param string $entry_type Entry Type. * * @return Forminator_Form_Entry_Model|null */ function forminator_get_latest_entry( $entry_type ) { $latest_entry = Forminator_Form_Entry_Model::get_latest_entry( $entry_type ); return $latest_entry; } /** * Get Time of latest entry created based on $entry_type * [custom-forms, quizzes, poll] * * @param string $entry_type Entry Type. * * @return string */ function forminator_get_latest_entry_time( $entry_type ) { $latest_entry = forminator_get_latest_entry( $entry_type ); if ( $latest_entry instanceof Forminator_Form_Entry_Model ) { $last_entry_time = mysql2date( 'U', $latest_entry->date_created_sql ); $time_diff = human_time_diff( current_time( 'timestamp' ), $last_entry_time ); // phpcs:ignore WordPress.DateTime.CurrentTimeTimestamp.Requested -- We are using the current timestamp based on the site's timezone. $last_entry_time = sprintf( /* translators: %s: Time difference */ esc_html__( '%s ago', 'forminator' ), $time_diff ); return $last_entry_time; } else { return esc_html__( 'Never', 'forminator' ); } } /** * Get Latest entry based on $form_id * will return null if there is no entry * * @param int $form_id Form id. * @param string $order Order by. * * @return Forminator_Form_Entry_Model|null */ function forminator_get_latest_entry_by_form_id( $form_id, $order = 'DESC' ) { $latest_entry = Forminator_Form_Entry_Model::get_latest_entry_by_form_id( $form_id, $order ); return $latest_entry; } /** * Get Time of latest entry created based on $form_id * * @param int $form_id Form Id. * @param string $order Order by. * * @return string */ function forminator_get_latest_entry_time_by_form_id( $form_id, $order = 'DESC' ) { $latest_entry = forminator_get_latest_entry_by_form_id( $form_id, $order ); if ( $latest_entry instanceof Forminator_Form_Entry_Model ) { return $latest_entry->time_created; } else { return esc_html__( 'Never', 'forminator' ); } } /** * Get Time of view created based on $form_id * * @param int $form_id Form Id. * @param string $order Order by. * * @return string */ function forminator_get_latest_view_time_by_form_id( $form_id, $order = 'DESC' ) { $latest_entry = forminator_get_view_entry_by_form_id( $form_id, $order ); if ( $latest_entry instanceof Forminator_Form_Entry_Model ) { return $latest_entry->time_created; } else { return esc_html__( 'Never', 'forminator' ); } } /** * Update Form Submission retention * * @since 1.0.6 * * @param int $form_id Form Id. * @param int $retention_number Retention number. * @param int $retention_unit Retention unit. * @param bool $draft Draft. */ function forminator_update_form_submissions_retention( $form_id, $retention_number, $retention_unit, $draft = false ) { $opt = get_option( 'forminator_form_privacy_settings', array() ); if ( is_null( $retention_number ) && is_null( $retention_unit ) ) { // deletion mode. unset( $opt[ $form_id ] ); } elseif ( $draft ) { $opt[ $form_id . '-draft' ] = array( 'draft_retention_number' => (int) $retention_number, 'draft_retention_unit' => $retention_unit, ); } else { $opt[ $form_id ] = array( 'submissions_retention_number' => (int) $retention_number, 'submissions_retention_unit' => $retention_unit, ); } update_option( 'forminator_form_privacy_settings', $opt ); } /** * Clone form submission retention * * @since 1.0.6 * * @param int $old_id Old Id. * @param int $new_id New Id. */ function forminator_clone_form_submissions_retention( $old_id, $new_id ) { $opt = get_option( 'forminator_form_privacy_settings', array() ); if ( isset( $opt[ $old_id ] ) ) { $opt[ $new_id ] = $opt[ $old_id ]; } update_option( 'forminator_form_privacy_settings', $opt ); } /** * Update poll submission retention * * @since 1.0.6 * * @param int $poll_id Poll Id. * @param int $retention_number Retention number. * @param int $retention_unit Retention unit. */ function forminator_update_poll_submissions_retention( $poll_id, $retention_number, $retention_unit ) { $opt = get_option( 'forminator_poll_privacy_settings', array() ); if ( is_null( $retention_number ) && is_null( $retention_unit ) ) { // deletion mode. unset( $opt[ $poll_id ] ); } else { $opt[ $poll_id ] = array( 'ip_address_retention_number' => (int) $retention_number, 'ip_address_retention_unit' => $retention_unit, ); } update_option( 'forminator_poll_privacy_settings', $opt ); } /** * Clone poll ip retention * * @since 1.0.6 * * @param int $old_id Old Id. * @param int $new_id New id. */ function forminator_clone_poll_submissions_retention( $old_id, $new_id ) { $opt = get_option( 'forminator_poll_privacy_settings', array() ); if ( isset( $opt[ $old_id ] ) ) { $opt[ $new_id ] = $opt[ $old_id ]; } update_option( 'forminator_poll_privacy_settings', $opt ); } /** * Return form nice name by model * * @since 1.6.1 * * @param Forminator_Base_Form_Model $model Base form model. * * @return string */ function forminator_get_name_from_model( $model ) { // Fallback just in case. if ( ! empty( $model->settings['formName'] ) ) { return $model->settings['formName']; } else { return $model->raw->post_title; } } /** * Return social share message * * @since 1.10 * * @param mixed $model Model. * @param string $title Title. * @param string $result Result. * @return mixed|string */ function forminator_get_social_message( $model, $title, $result ) { $settings = $model->settings; $message = esc_html__( 'I got {quiz_result} on {quiz_name} quiz!', 'forminator' ); if ( isset( $settings['social-share-message'] ) && ! empty( $settings['social-share-message'] ) ) { $message = $settings['social-share-message']; } $model_id = ! empty( $model->id ) ? $model->id : false; $message = forminator_replace_variables( $message, $model_id ); $message = str_ireplace( '{quiz_name}', $title, $message ); $message = str_ireplace( '{quiz_result}', $result, $message ); return $message; } /** * Get Chart data of Poll * * @param Forminator_Poll_Model $poll Poll model. * * @return array */ function forminator_get_chart_data( Forminator_Poll_Model $poll ) { $accessibility_enabled = get_option( 'forminator_enable_accessibility', false ); $chart_colors = forminator_get_poll_chart_colors( $poll->id, $accessibility_enabled ); $default_chart_colors = $chart_colors; $chart_datas = array(); $form_settings = $poll->settings; $number_votes_enabled = false; // TO-DO: Remove later. This will be handled through ChartJS function. $fields_array = $poll->get_fields_as_array(); $map_entries = Forminator_Form_Entry_Model::map_polls_entries( $poll->id, $fields_array ); $fields = $poll->get_fields(); if ( ! is_null( $fields ) ) { foreach ( $fields as $field ) { // Label. $label = sanitize_text_field( $field->title ); // Votes. $slug = isset( $field->slug ) ? $field->slug : sanitize_title( $label ); $entries = 0; if ( in_array( $slug, array_keys( $map_entries ), true ) ) { $entries = $map_entries[ $slug ]; } $color = $field->color; if ( empty( $color ) || empty( $form_settings['poll-colors'] ) ) { // Colors. if ( empty( $chart_colors ) ) { $chart_colors = $default_chart_colors; } $color = array_shift( $chart_colors ); } $chart_datas[] = array( (string) $label, (int) $entries, (string) $color, ); } } /** * Filters chart datas. Can be helpful in reordering data in charts. * * @param array $chart_datas Array with labels, number of votes and colors. * @since 1.13 */ return apply_filters( 'forminator_polls_chart_datas', $chart_datas ); } /** * Get a specific property of an array. * * @since 1.11 * * @param array $array_values Array from which the property's value should be retrieved. * @param string $prop Name of the property to be retrieved. * @param string $default_value Optional. Value that should be returned if the property is not set or empty. Defaults to null. * * @return null|string|mixed The value */ function forminator_get_property( $array_values, $prop, $default_value = null ) { if ( ! is_array( $array_values ) && ! ( is_object( $array_values ) && $array_values instanceof ArrayAccess ) ) { return $default_value; } $value = isset( $array_values[ $prop ] ) ? $array_values[ $prop ] : ''; return empty( $value ) && null !== $default_value ? $default_value : $value; } /** * Flag whether this is the main site or not * * @since 1.11 * @return bool */ function forminator_is_main_site() { return ( is_multisite() && is_main_site() ); } /** * Flag whether this is subdomain network or not * * @since 1.11 * @return bool */ function forminator_is_subdomain_network() { return ( is_multisite() && is_subdomain_install() ); } /** * Return quiz name by id * * @since 1.14 * * @param int $id Id. * * @return string */ function forminator_get_quiz_name( $id ) { $model = Forminator_Base_Form_Model::get_model( $id ); return ! empty( $model->settings['quiz_name'] ) ? $model->settings['quiz_name'] : ''; } /** * Defender compatibility * * @return array */ function forminator_defender_compatibility() { $defender_data = array( 'is_activated' => false, 'is_free' => false, 'img_dir_url' => '', 'two_fa_settings' => '', 'lost_phone_url' => '', 'structure' => '', ); // Todo: Def version >= 2.4. if ( defined( 'DEFENDER_VERSION' ) && function_exists( 'defender_backward_compatibility' ) ) { /** * Defender_backward_compatibility() return array of values: * bool 'is_free' * string 'plugin_url' * object 'two_fa_settings' * string 'two_fa_component' * string 'lost_url' */ $defender_compatibility = defender_backward_compatibility(); $defender_data = array( 'is_activated' => true, 'is_free' => $defender_compatibility['is_free'], 'img_dir_url' => $defender_compatibility['plugin_url'] . '/assets/img/', 'two_fa_settings' => $defender_compatibility['two_fa_settings'], 'two_fa_component' => $defender_compatibility['two_fa_component'], 'structure' => 'new', 'lost_url' => $defender_compatibility['lost_url'], ); } elseif ( function_exists( 'wp_defender' ) ) { $defender_data['is_activated'] = true; $defender_data['is_free'] = wp_defender()->isFree; $defender_data['img_dir_url'] = wp_defender()->getPluginUrl() . 'app/module/advanced-tools/img/'; $defender_data['structure'] = 'old'; // Todo: Def version < 2.2.9. if ( class_exists( '\WP_Defender\Module\Advanced_Tools\Model\Auth_Settings' ) ) { $defender_data['two_fa_settings'] = \WP_Defender\Module\Advanced_Tools\Model\Auth_Settings::instance(); $defender_data['two_fa_component'] = '\WP_Defender\Module\Advanced_Tools\Component\Auth_API'; } elseif ( class_exists( '\WP_Defender\Module\Two_Factor\Model\Auth_Settings' ) ) { // Todo: Def version >= 2.2.9 and < 2.4. $defender_data['two_fa_settings'] = \WP_Defender\Module\Two_Factor\Model\Auth_Settings::instance(); $defender_data['two_fa_component'] = '\WP_Defender\Module\Two_Factor\Component\Auth_API'; } } return $defender_data; } /** * Get schedule time * * @param array $schedule Schedule. * * @return string */ function forminator_get_schedule_time( $schedule ) { $frequency = ! empty( $schedule['frequency'] ) ? $schedule['frequency'] : 'daily'; switch ( $frequency ) { case 'daily': $time = 'Daily, ' . $schedule['time']; break; case 'weekly': $time = 'Weekly on ' . ucfirst( $schedule['weekDay'] ) . ', ' . $schedule['weekTime']; break; case 'monthly': $time = 'Monthly/' . $schedule['monthDay'] . ', ' . $schedule['monthTime']; break; default: $time = ''; break; } return $time; } helper-mail.php 0000644 00000004324 15162502320 0007453 0 ustar 00 <?php /** * Mailer helper functions. * * @package Forminator */ if ( ! defined( 'ABSPATH' ) ) { die(); } /** * Mail Helper function **/ /** * Set the message variables * * @since 1.0 * @param string $embed_id Embed Id. * @param string $embed_title Embed title. * @param string $embed_url Embed URL. * @param string $user_name User name. * @param string $user_email User email. * @param string $user_login User login. * @param string $site_url Site URL. * * @return array */ function forminator_set_message_vars( $embed_id, $embed_title, $embed_url, $user_name, $user_email, $user_login, $site_url ) { $message_vars = array(); $message_vars['user_ip'] = Forminator_Geo::get_user_ip(); $message_vars['date_mdy'] = gmdate( 'm/d/Y' ); $message_vars['date_dmy'] = gmdate( 'd/m/Y' ); $message_vars['submission_time'] = date_i18n( 'g:i:s a, T', forminator_local_timestamp(), true ); $message_vars['embed_id'] = $embed_id; $message_vars['embed_title'] = $embed_title; $message_vars['embed_url'] = $embed_url; $message_vars['user_agent'] = isset( $_SERVER['HTTP_USER_AGENT'] ) ? esc_html( sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ) ) : 'none'; $message_vars['refer_url'] = forminator_get_referer_url( $embed_url ); $message_vars['http_refer'] = $message_vars['refer_url']; $message_vars['user_name'] = $user_name; $message_vars['user_email'] = $user_email; $message_vars['user_login'] = $user_login; $message_vars['site_url'] = $site_url; return $message_vars; } /** * Get global sender email from Global Settings * * @since 1.1 * @return string */ function get_global_sender_email_address() { $global_sender_email = get_option( 'forminator_sender_email_address', 'noreply@' . wp_parse_url( get_site_url(), PHP_URL_HOST ) ); return apply_filters( 'forminator_sender_email_address', $global_sender_email ); } /** * Get global sender name from Global Settings * * @since 1.1 * @return string */ function get_global_sender_name() { $global_sender_email = get_option( 'forminator_sender_name', get_option( 'blogname' ) ); return apply_filters( 'forminator_sender_name', $global_sender_email ); } encryption.php 0000644 00000011520 15162502320 0007442 0 ustar 00 <?php /** * Encryption helper class * * @package Forminator */ if ( ! defined( 'ABSPATH' ) ) { die(); } /** * Class Forminator_Encryption */ class Forminator_Encryption { /** * Encrypt secret keys * * @param array $keys Keys. * @param array $settings Settings. * @param array $symbols_to_save Symbols to save from the beginning and end of the key. * @return array */ public static function encrypt_secret_keys( array $keys, array $settings, array $symbols_to_save = array( 0, 4 ) ): array { foreach ( $keys as $key ) { if ( ! empty( $settings[ $key ] ) ) { $original_key = $settings[ $key ]; // save relevant symbols from the beginning and end of the key. $partial_secret = substr( $original_key, 0, $symbols_to_save[0] ) . str_repeat( '*', 10 ) . substr( $original_key, -$symbols_to_save[1] ); $settings[ $key ] = $partial_secret; $settings['is_salty'] = self::use_wp_salt(); $settings[ $key . '_encrypted' ] = self::encrypt( $original_key ); } } return $settings; } /** * Encrypt data by sodium * * @param string $value Value to encrypt. * * @return string */ public static function encrypt( string $value ): string { try { $encryption_key = self::get_encryption_key(); // Random nonce, unique for each encryption. $nonce = random_bytes( SODIUM_CRYPTO_SECRETBOX_NONCEBYTES ); // Encrypt input with secret encryption_key and nonce. $ciphertext = sodium_crypto_secretbox( $value, $nonce, $encryption_key ); // We then convert the encrypted message with the nonce to base64 for safe transport or storage. // Again we use a timing-safe variant of base64_encode() to do this. $result = sodium_bin2base64( $nonce . $ciphertext, SODIUM_BASE64_VARIANT_ORIGINAL ); // Overwrite $input, $nonce and $encryption_key with null bytes in order to prevent sensitive data leak. sodium_memzero( $nonce ); sodium_memzero( $encryption_key ); sodium_memzero( $value ); } catch ( \Exception $e ) { $result = $value; unset( $value ); } // Apply filter to allow custom encryption methods. $encrypted_value = apply_filters( 'forminator_custom_encryption', $result ); try { // Overwrite $result with null bytes in order to prevent sensitive data leak. sodium_memzero( $result ); } catch ( \Exception $e ) { unset( $result ); } return $encrypted_value; } /** * Decrypt data by sodium * * @param string $value Value to decrypt. * @param bool $was_salty Was encrypted with WP salt. * @return string */ public static function decrypt( string $value, bool $was_salty = false ): string { // Apply filter to allow custom decryption methods. $value = apply_filters( 'forminator_custom_decryption', $value ); try { $encryption_key = self::get_encryption_key( $was_salty ); // Convert the base64 encoded message to binary using sodium_base642bin(). $ciphertext = sodium_base642bin( $value, SODIUM_BASE64_VARIANT_ORIGINAL ); // Extract nonce from the ciphertext by taking the first 24 (SODIUM_CRYPTO_SECRETBOX_NONCEBYTES) chars. $nonce = mb_substr( $ciphertext, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit' ); // Remaining part is the encrypted message. $ciphertext = mb_substr( $ciphertext, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit' ); // Decrypt the message with the secret key and nonce. $plaintext = (string) sodium_crypto_secretbox_open( $ciphertext, $nonce, $encryption_key ); // Overwrite $ciphertext, $nonce and $key with null bytes in order to prevent sensitive data leak. sodium_memzero( $nonce ); sodium_memzero( $encryption_key ); sodium_memzero( $ciphertext ); } catch ( \Exception $e ) { return $value; } return $plaintext; } /** * Get encryption key * * @param bool $with_salt Based on WP salt. * @return string */ private static function get_encryption_key( $with_salt = false ): string { $encryption_key = $with_salt ? wp_salt() : self::get_encryption_key_base(); // Make the string suit for Sodium crypto secret key. return sodium_crypto_generichash( $encryption_key, '', SODIUM_CRYPTO_SECRETBOX_KEYBYTES ); } /** * Get encryption key base * * @return string */ private static function get_encryption_key_base(): string { if ( defined( 'FORMINATOR_ENCRYPTION_KEY' ) && ! empty( FORMINATOR_ENCRYPTION_KEY ) ) { $encryption_key = FORMINATOR_ENCRYPTION_KEY; } else { // get WP salt. $encryption_key = wp_salt(); } return apply_filters( 'forminator_encryption_key', $encryption_key ); } /** * Check if WP salt is used * * @return bool */ public static function use_wp_salt(): bool { return self::get_encryption_key_base() === wp_salt(); } /** * Generate encryption key * * @return string */ public static function generate_encryption_key(): string { return str_replace( "'", '', wp_generate_password( 64, true, true ) ); } } helper-google-fonts.php 0000644 00000160134 15162502321 0011137 0 ustar 00 <?php /** * Google font helper functions. * * @package Forminator */ if ( ! defined( 'ABSPATH' ) ) { die(); } /** * Return all fonts * * @since 1.0 * @return mixed */ function forminator_get_all_fonts() { $cached_fonts = forminator_cached_fonts(); $cached_fonts = ! empty( $cached_fonts ) ? json_decode( $cached_fonts, true ) : forminator_load_from_google(); /** * Retrieve all available fonts. * * Example format: * array( * 'family' => 'ABeeZee', * 'category' => 'sans-serif', * 'variants' => array('regular', 'italic') * ) * * @since 1.37 * * @param array $cached_fonts Array of supported fonts. * * @return array Filtered list of fonts. */ return apply_filters( 'forminator_on_get_all_fonts', $cached_fonts ); } /** * Load & return fonts from Google * * @since 1.0 * @return mixed */ function forminator_load_from_google() { return array(); } /** * Return font families * * @param bool $is_object Is object. * * @since 1.0 * @return mixed */ function forminator_get_font_families( $is_object ) { $families = forminator_get_all_fonts(); if ( $is_object ) { return $families; } // backwards compatibility. $families = wp_list_pluck( $families, 'family' ); return $families; } /** * Return cache google fonts * * @since 1.0 * @return string */ function forminator_cached_fonts() { return '[{"family":"ABeeZee","category":"sans-serif","variants":["regular","italic"]},{"family":"Abel","category":"sans-serif","variants":["regular"]},{"family":"Abril Fatface","category":"display","variants":["regular"]},{"family":"Aclonica","category":"sans-serif","variants":["regular"]},{"family":"Acme","category":"sans-serif","variants":["regular"]},{"family":"Actor","category":"sans-serif","variants":["regular"]},{"family":"Adamina","category":"serif","variants":["regular"]},{"family":"Advent Pro","category":"sans-serif","variants":["100","200","300","regular","500","600","700"]},{"family":"Aguafina Script","category":"handwriting","variants":["regular"]},{"family":"Akronim","category":"display","variants":["regular"]},{"family":"Aladin","category":"handwriting","variants":["regular"]},{"family":"Aldrich","category":"sans-serif","variants":["regular"]},{"family":"Alef","category":"sans-serif","variants":["regular","700"]},{"family":"Alegreya","category":"serif","variants":["regular","italic","700","700italic","900","900italic"]},{"family":"Alegreya SC","category":"serif","variants":["regular","italic","700","700italic","900","900italic"]},{"family":"Alegreya Sans","category":"sans-serif","variants":["100","100italic","300","300italic","regular","italic","500","500italic","700","700italic","800","800italic","900","900italic"]},{"family":"Alegreya Sans SC","category":"sans-serif","variants":["100","100italic","300","300italic","regular","italic","500","500italic","700","700italic","800","800italic","900","900italic"]},{"family":"Alex Brush","category":"handwriting","variants":["regular"]},{"family":"Alfa Slab One","category":"display","variants":["regular"]},{"family":"Alice","category":"serif","variants":["regular"]},{"family":"Alike","category":"serif","variants":["regular"]},{"family":"Alike Angular","category":"serif","variants":["regular"]},{"family":"Allan","category":"display","variants":["regular","700"]},{"family":"Allerta","category":"sans-serif","variants":["regular"]},{"family":"Allerta Stencil","category":"sans-serif","variants":["regular"]},{"family":"Allura","category":"handwriting","variants":["regular"]},{"family":"Almendra","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Almendra Display","category":"display","variants":["regular"]},{"family":"Almendra SC","category":"serif","variants":["regular"]},{"family":"Amarante","category":"display","variants":["regular"]},{"family":"Amaranth","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Amatic SC","category":"handwriting","variants":["regular","700"]},{"family":"Amethysta","category":"serif","variants":["regular"]},{"family":"Amiri","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Amita","category":"handwriting","variants":["regular","700"]},{"family":"Anaheim","category":"sans-serif","variants":["regular"]},{"family":"Andada","category":"serif","variants":["regular"]},{"family":"Andika","category":"sans-serif","variants":["regular"]},{"family":"Angkor","category":"display","variants":["regular"]},{"family":"Annie Use Your Telescope","category":"handwriting","variants":["regular"]},{"family":"Anonymous Pro","category":"monospace","variants":["regular","italic","700","700italic"]},{"family":"Antic","category":"sans-serif","variants":["regular"]},{"family":"Antic Didone","category":"serif","variants":["regular"]},{"family":"Antic Slab","category":"serif","variants":["regular"]},{"family":"Anton","category":"sans-serif","variants":["regular"]},{"family":"Arapey","category":"serif","variants":["regular","italic"]},{"family":"Arbutus","category":"display","variants":["regular"]},{"family":"Arbutus Slab","category":"serif","variants":["regular"]},{"family":"Architects Daughter","category":"handwriting","variants":["regular"]},{"family":"Archivo Black","category":"sans-serif","variants":["regular"]},{"family":"Archivo Narrow","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Arimo","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Arizonia","category":"handwriting","variants":["regular"]},{"family":"Armata","category":"sans-serif","variants":["regular"]},{"family":"Artifika","category":"serif","variants":["regular"]},{"family":"Arvo","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Arya","category":"sans-serif","variants":["regular","700"]},{"family":"Asap","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Asar","category":"serif","variants":["regular"]},{"family":"Asset","category":"display","variants":["regular"]},{"family":"Astloch","category":"display","variants":["regular","700"]},{"family":"Asul","category":"sans-serif","variants":["regular","700"]},{"family":"Atomic Age","category":"display","variants":["regular"]},{"family":"Aubrey","category":"display","variants":["regular"]},{"family":"Audiowide","category":"display","variants":["regular"]},{"family":"Autour One","category":"display","variants":["regular"]},{"family":"Average","category":"serif","variants":["regular"]},{"family":"Average Sans","category":"sans-serif","variants":["regular"]},{"family":"Averia Gruesa Libre","category":"display","variants":["regular"]},{"family":"Averia Libre","category":"display","variants":["300","300italic","regular","italic","700","700italic"]},{"family":"Averia Sans Libre","category":"display","variants":["300","300italic","regular","italic","700","700italic"]},{"family":"Averia Serif Libre","category":"display","variants":["300","300italic","regular","italic","700","700italic"]},{"family":"Bad Script","category":"handwriting","variants":["regular"]},{"family":"Balthazar","category":"serif","variants":["regular"]},{"family":"Bangers","category":"display","variants":["regular"]},{"family":"Basic","category":"sans-serif","variants":["regular"]},{"family":"Battambang","category":"display","variants":["regular","700"]},{"family":"Baumans","category":"display","variants":["regular"]},{"family":"Bayon","category":"display","variants":["regular"]},{"family":"Belgrano","category":"serif","variants":["regular"]},{"family":"Belleza","category":"sans-serif","variants":["regular"]},{"family":"BenchNine","category":"sans-serif","variants":["300","regular","700"]},{"family":"Bentham","category":"serif","variants":["regular"]},{"family":"Berkshire Swash","category":"handwriting","variants":["regular"]},{"family":"Bevan","category":"display","variants":["regular"]},{"family":"Bigelow Rules","category":"display","variants":["regular"]},{"family":"Bigshot One","category":"display","variants":["regular"]},{"family":"Bilbo","category":"handwriting","variants":["regular"]},{"family":"Bilbo Swash Caps","category":"handwriting","variants":["regular"]},{"family":"Biryani","category":"sans-serif","variants":["200","300","regular","600","700","800","900"]},{"family":"Bitter","category":"serif","variants":["regular","italic","700"]},{"family":"Black Ops One","category":"display","variants":["regular"]},{"family":"Bokor","category":"display","variants":["regular"]},{"family":"Bonbon","category":"handwriting","variants":["regular"]},{"family":"Boogaloo","category":"display","variants":["regular"]},{"family":"Bowlby One","category":"display","variants":["regular"]},{"family":"Bowlby One SC","category":"display","variants":["regular"]},{"family":"Brawler","category":"serif","variants":["regular"]},{"family":"Bree Serif","category":"serif","variants":["regular"]},{"family":"Bubblegum Sans","category":"display","variants":["regular"]},{"family":"Bubbler One","category":"sans-serif","variants":["regular"]},{"family":"Buda","category":"display","variants":["300"]},{"family":"Buenard","category":"serif","variants":["regular","700"]},{"family":"Butcherman","category":"display","variants":["regular"]},{"family":"Butterfly Kids","category":"handwriting","variants":["regular"]},{"family":"Cabin","category":"sans-serif","variants":["regular","italic","500","500italic","600","600italic","700","700italic"]},{"family":"Cabin Condensed","category":"sans-serif","variants":["regular","500","600","700"]},{"family":"Cabin Sketch","category":"display","variants":["regular","700"]},{"family":"Caesar Dressing","category":"display","variants":["regular"]},{"family":"Cagliostro","category":"sans-serif","variants":["regular"]},{"family":"Calligraffitti","category":"handwriting","variants":["regular"]},{"family":"Cambay","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Cambo","category":"serif","variants":["regular"]},{"family":"Candal","category":"sans-serif","variants":["regular"]},{"family":"Cantarell","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Cantata One","category":"serif","variants":["regular"]},{"family":"Cantora One","category":"sans-serif","variants":["regular"]},{"family":"Capriola","category":"sans-serif","variants":["regular"]},{"family":"Cardo","category":"serif","variants":["regular","italic","700"]},{"family":"Carme","category":"sans-serif","variants":["regular"]},{"family":"Carrois Gothic","category":"sans-serif","variants":["regular"]},{"family":"Carrois Gothic SC","category":"sans-serif","variants":["regular"]},{"family":"Carter One","category":"display","variants":["regular"]},{"family":"Catamaran","category":"sans-serif","variants":["100","200","300","regular","500","600","700","800","900"]},{"family":"Caudex","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Caveat","category":"handwriting","variants":["regular","700"]},{"family":"Caveat Brush","category":"handwriting","variants":["regular"]},{"family":"Cedarville Cursive","category":"handwriting","variants":["regular"]},{"family":"Ceviche One","category":"display","variants":["regular"]},{"family":"Changa One","category":"display","variants":["regular","italic"]},{"family":"Chango","category":"display","variants":["regular"]},{"family":"Chau Philomene One","category":"sans-serif","variants":["regular","italic"]},{"family":"Chela One","category":"display","variants":["regular"]},{"family":"Chelsea Market","category":"display","variants":["regular"]},{"family":"Chenla","category":"display","variants":["regular"]},{"family":"Cherry Cream Soda","category":"display","variants":["regular"]},{"family":"Cherry Swash","category":"display","variants":["regular","700"]},{"family":"Chewy","category":"display","variants":["regular"]},{"family":"Chicle","category":"display","variants":["regular"]},{"family":"Chivo","category":"sans-serif","variants":["regular","italic","900","900italic"]},{"family":"Chonburi","category":"display","variants":["regular"]},{"family":"Cinzel","category":"serif","variants":["regular","700","900"]},{"family":"Cinzel Decorative","category":"display","variants":["regular","700","900"]},{"family":"Clicker Script","category":"handwriting","variants":["regular"]},{"family":"Coda","category":"display","variants":["regular","800"]},{"family":"Coda Caption","category":"sans-serif","variants":["800"]},{"family":"Codystar","category":"display","variants":["300","regular"]},{"family":"Combo","category":"display","variants":["regular"]},{"family":"Comfortaa","category":"display","variants":["300","regular","700"]},{"family":"Coming Soon","category":"handwriting","variants":["regular"]},{"family":"Concert One","category":"display","variants":["regular"]},{"family":"Condiment","category":"handwriting","variants":["regular"]},{"family":"Content","category":"display","variants":["regular","700"]},{"family":"Contrail One","category":"display","variants":["regular"]},{"family":"Convergence","category":"sans-serif","variants":["regular"]},{"family":"Cookie","category":"handwriting","variants":["regular"]},{"family":"Copse","category":"serif","variants":["regular"]},{"family":"Corben","category":"display","variants":["regular","700"]},{"family":"Courgette","category":"handwriting","variants":["regular"]},{"family":"Cousine","category":"monospace","variants":["regular","italic","700","700italic"]},{"family":"Coustard","category":"serif","variants":["regular","900"]},{"family":"Covered By Your Grace","category":"handwriting","variants":["regular"]},{"family":"Crafty Girls","category":"handwriting","variants":["regular"]},{"family":"Creepster","category":"display","variants":["regular"]},{"family":"Crete Round","category":"serif","variants":["regular","italic"]},{"family":"Crimson Text","category":"serif","variants":["regular","italic","600","600italic","700","700italic"]},{"family":"Croissant One","category":"display","variants":["regular"]},{"family":"Crushed","category":"display","variants":["regular"]},{"family":"Cuprum","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Cutive","category":"serif","variants":["regular"]},{"family":"Cutive Mono","category":"monospace","variants":["regular"]},{"family":"Damion","category":"handwriting","variants":["regular"]},{"family":"Dancing Script","category":"handwriting","variants":["regular","700"]},{"family":"Dangrek","category":"display","variants":["regular"]},{"family":"Dawning of a New Day","category":"handwriting","variants":["regular"]},{"family":"Days One","category":"sans-serif","variants":["regular"]},{"family":"Dekko","category":"handwriting","variants":["regular"]},{"family":"Delius","category":"handwriting","variants":["regular"]},{"family":"Delius Swash Caps","category":"handwriting","variants":["regular"]},{"family":"Delius Unicase","category":"handwriting","variants":["regular","700"]},{"family":"Della Respira","category":"serif","variants":["regular"]},{"family":"Denk One","category":"sans-serif","variants":["regular"]},{"family":"Devonshire","category":"handwriting","variants":["regular"]},{"family":"Dhurjati","category":"sans-serif","variants":["regular"]},{"family":"Didact Gothic","category":"sans-serif","variants":["regular"]},{"family":"Diplomata","category":"display","variants":["regular"]},{"family":"Diplomata SC","category":"display","variants":["regular"]},{"family":"Domine","category":"serif","variants":["regular","700"]},{"family":"Donegal One","category":"serif","variants":["regular"]},{"family":"Doppio One","category":"sans-serif","variants":["regular"]},{"family":"Dorsa","category":"sans-serif","variants":["regular"]},{"family":"Dosis","category":"sans-serif","variants":["200","300","regular","500","600","700","800"]},{"family":"Dr Sugiyama","category":"handwriting","variants":["regular"]},{"family":"Droid Sans","category":"sans-serif","variants":["regular","700"]},{"family":"Droid Sans Mono","category":"monospace","variants":["regular"]},{"family":"Droid Serif","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Duru Sans","category":"sans-serif","variants":["regular"]},{"family":"Dynalight","category":"display","variants":["regular"]},{"family":"EB Garamond","category":"serif","variants":["regular"]},{"family":"Eagle Lake","category":"handwriting","variants":["regular"]},{"family":"Eater","category":"display","variants":["regular"]},{"family":"Economica","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Eczar","category":"serif","variants":["regular","500","600","700","800"]},{"family":"Ek Mukta","category":"sans-serif","variants":["200","300","regular","500","600","700","800"]},{"family":"Electrolize","category":"sans-serif","variants":["regular"]},{"family":"Elsie","category":"display","variants":["regular","900"]},{"family":"Elsie Swash Caps","category":"display","variants":["regular","900"]},{"family":"Emblema One","category":"display","variants":["regular"]},{"family":"Emilys Candy","category":"display","variants":["regular"]},{"family":"Engagement","category":"handwriting","variants":["regular"]},{"family":"Englebert","category":"sans-serif","variants":["regular"]},{"family":"Enriqueta","category":"serif","variants":["regular","700"]},{"family":"Erica One","category":"display","variants":["regular"]},{"family":"Esteban","category":"serif","variants":["regular"]},{"family":"Euphoria Script","category":"handwriting","variants":["regular"]},{"family":"Ewert","category":"display","variants":["regular"]},{"family":"Exo","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Exo 2","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Expletus Sans","category":"display","variants":["regular","italic","500","500italic","600","600italic","700","700italic"]},{"family":"Fanwood Text","category":"serif","variants":["regular","italic"]},{"family":"Fascinate","category":"display","variants":["regular"]},{"family":"Fascinate Inline","category":"display","variants":["regular"]},{"family":"Faster One","category":"display","variants":["regular"]},{"family":"Fasthand","category":"serif","variants":["regular"]},{"family":"Fauna One","category":"serif","variants":["regular"]},{"family":"Federant","category":"display","variants":["regular"]},{"family":"Federo","category":"sans-serif","variants":["regular"]},{"family":"Felipa","category":"handwriting","variants":["regular"]},{"family":"Fenix","category":"serif","variants":["regular"]},{"family":"Finger Paint","category":"display","variants":["regular"]},{"family":"Fira Mono","category":"monospace","variants":["regular","700"]},{"family":"Fira Sans","category":"sans-serif","variants":["300","300italic","regular","italic","500","500italic","700","700italic"]},{"family":"Fjalla One","category":"sans-serif","variants":["regular"]},{"family":"Fjord One","category":"serif","variants":["regular"]},{"family":"Flamenco","category":"display","variants":["300","regular"]},{"family":"Flavors","category":"display","variants":["regular"]},{"family":"Fondamento","category":"handwriting","variants":["regular","italic"]},{"family":"Fontdiner Swanky","category":"display","variants":["regular"]},{"family":"Forum","category":"display","variants":["regular"]},{"family":"Francois One","category":"sans-serif","variants":["regular"]},{"family":"Freckle Face","category":"display","variants":["regular"]},{"family":"Fredericka the Great","category":"display","variants":["regular"]},{"family":"Fredoka One","category":"display","variants":["regular"]},{"family":"Freehand","category":"display","variants":["regular"]},{"family":"Fresca","category":"sans-serif","variants":["regular"]},{"family":"Frijole","category":"display","variants":["regular"]},{"family":"Fruktur","category":"display","variants":["regular"]},{"family":"Fugaz One","category":"display","variants":["regular"]},{"family":"GFS Didot","category":"serif","variants":["regular"]},{"family":"GFS Neohellenic","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Gabriela","category":"serif","variants":["regular"]},{"family":"Gafata","category":"sans-serif","variants":["regular"]},{"family":"Galdeano","category":"sans-serif","variants":["regular"]},{"family":"Galindo","category":"display","variants":["regular"]},{"family":"Gentium Basic","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Gentium Book Basic","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Geo","category":"sans-serif","variants":["regular","italic"]},{"family":"Geostar","category":"display","variants":["regular"]},{"family":"Geostar Fill","category":"display","variants":["regular"]},{"family":"Germania One","category":"display","variants":["regular"]},{"family":"Gidugu","category":"sans-serif","variants":["regular"]},{"family":"Gilda Display","category":"serif","variants":["regular"]},{"family":"Give You Glory","category":"handwriting","variants":["regular"]},{"family":"Glass Antiqua","category":"display","variants":["regular"]},{"family":"Glegoo","category":"serif","variants":["regular","700"]},{"family":"Gloria Hallelujah","category":"handwriting","variants":["regular"]},{"family":"Goblin One","category":"display","variants":["regular"]},{"family":"Gochi Hand","category":"handwriting","variants":["regular"]},{"family":"Gorditas","category":"display","variants":["regular","700"]},{"family":"Goudy Bookletter 1911","category":"serif","variants":["regular"]},{"family":"Graduate","category":"display","variants":["regular"]},{"family":"Grand Hotel","category":"handwriting","variants":["regular"]},{"family":"Gravitas One","category":"display","variants":["regular"]},{"family":"Great Vibes","category":"handwriting","variants":["regular"]},{"family":"Griffy","category":"display","variants":["regular"]},{"family":"Gruppo","category":"display","variants":["regular"]},{"family":"Gudea","category":"sans-serif","variants":["regular","italic","700"]},{"family":"Gurajada","category":"serif","variants":["regular"]},{"family":"Habibi","category":"serif","variants":["regular"]},{"family":"Halant","category":"serif","variants":["300","regular","500","600","700"]},{"family":"Hammersmith One","category":"sans-serif","variants":["regular"]},{"family":"Hanalei","category":"display","variants":["regular"]},{"family":"Hanalei Fill","category":"display","variants":["regular"]},{"family":"Handlee","category":"handwriting","variants":["regular"]},{"family":"Hanuman","category":"serif","variants":["regular","700"]},{"family":"Happy Monkey","category":"display","variants":["regular"]},{"family":"Headland One","category":"serif","variants":["regular"]},{"family":"Henny Penny","category":"display","variants":["regular"]},{"family":"Herr Von Muellerhoff","category":"handwriting","variants":["regular"]},{"family":"Hind","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Hind Siliguri","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Hind Vadodara","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Holtwood One SC","category":"serif","variants":["regular"]},{"family":"Homemade Apple","category":"handwriting","variants":["regular"]},{"family":"Homenaje","category":"sans-serif","variants":["regular"]},{"family":"IM Fell DW Pica","category":"serif","variants":["regular","italic"]},{"family":"IM Fell DW Pica SC","category":"serif","variants":["regular"]},{"family":"IM Fell Double Pica","category":"serif","variants":["regular","italic"]},{"family":"IM Fell Double Pica SC","category":"serif","variants":["regular"]},{"family":"IM Fell English","category":"serif","variants":["regular","italic"]},{"family":"IM Fell English SC","category":"serif","variants":["regular"]},{"family":"IM Fell French Canon","category":"serif","variants":["regular","italic"]},{"family":"IM Fell French Canon SC","category":"serif","variants":["regular"]},{"family":"IM Fell Great Primer","category":"serif","variants":["regular","italic"]},{"family":"IM Fell Great Primer SC","category":"serif","variants":["regular"]},{"family":"Iceberg","category":"display","variants":["regular"]},{"family":"Iceland","category":"display","variants":["regular"]},{"family":"Imprima","category":"sans-serif","variants":["regular"]},{"family":"Inconsolata","category":"monospace","variants":["regular","700"]},{"family":"Inder","category":"sans-serif","variants":["regular"]},{"family":"Indie Flower","category":"handwriting","variants":["regular"]},{"family":"Inika","category":"serif","variants":["regular","700"]},{"family":"Inknut Antiqua","category":"serif","variants":["300","regular","500","600","700","800","900"]},{"family":"Irish Grover","category":"display","variants":["regular"]},{"family":"Istok Web","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Italiana","category":"serif","variants":["regular"]},{"family":"Italianno","category":"handwriting","variants":["regular"]},{"family":"Itim","category":"handwriting","variants":["regular"]},{"family":"Jacques Francois","category":"serif","variants":["regular"]},{"family":"Jacques Francois Shadow","category":"display","variants":["regular"]},{"family":"Jaldi","category":"sans-serif","variants":["regular","700"]},{"family":"Jim Nightshade","category":"handwriting","variants":["regular"]},{"family":"Jockey One","category":"sans-serif","variants":["regular"]},{"family":"Jolly Lodger","category":"display","variants":["regular"]},{"family":"Josefin Sans","category":"sans-serif","variants":["100","100italic","300","300italic","regular","italic","600","600italic","700","700italic"]},{"family":"Josefin Slab","category":"serif","variants":["100","100italic","300","300italic","regular","italic","600","600italic","700","700italic"]},{"family":"Joti One","category":"display","variants":["regular"]},{"family":"Judson","category":"serif","variants":["regular","italic","700"]},{"family":"Julee","category":"handwriting","variants":["regular"]},{"family":"Julius Sans One","category":"sans-serif","variants":["regular"]},{"family":"Junge","category":"serif","variants":["regular"]},{"family":"Jura","category":"sans-serif","variants":["300","regular","500","600"]},{"family":"Just Another Hand","category":"handwriting","variants":["regular"]},{"family":"Just Me Again Down Here","category":"handwriting","variants":["regular"]},{"family":"Kadwa","category":"serif","variants":["regular","700"]},{"family":"Kalam","category":"handwriting","variants":["300","regular","700"]},{"family":"Kameron","category":"serif","variants":["regular","700"]},{"family":"Kanit","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Kantumruy","category":"sans-serif","variants":["300","regular","700"]},{"family":"Karla","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Karma","category":"serif","variants":["300","regular","500","600","700"]},{"family":"Kaushan Script","category":"handwriting","variants":["regular"]},{"family":"Kavoon","category":"display","variants":["regular"]},{"family":"Kdam Thmor","category":"display","variants":["regular"]},{"family":"Keania One","category":"display","variants":["regular"]},{"family":"Kelly Slab","category":"display","variants":["regular"]},{"family":"Kenia","category":"display","variants":["regular"]},{"family":"Khand","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Khmer","category":"display","variants":["regular"]},{"family":"Khula","category":"sans-serif","variants":["300","regular","600","700","800"]},{"family":"Kite One","category":"sans-serif","variants":["regular"]},{"family":"Knewave","category":"display","variants":["regular"]},{"family":"Kotta One","category":"serif","variants":["regular"]},{"family":"Koulen","category":"display","variants":["regular"]},{"family":"Kranky","category":"display","variants":["regular"]},{"family":"Kreon","category":"serif","variants":["300","regular","700"]},{"family":"Kristi","category":"handwriting","variants":["regular"]},{"family":"Krona One","category":"sans-serif","variants":["regular"]},{"family":"Kurale","category":"serif","variants":["regular"]},{"family":"La Belle Aurore","category":"handwriting","variants":["regular"]},{"family":"Laila","category":"serif","variants":["300","regular","500","600","700"]},{"family":"Lakki Reddy","category":"handwriting","variants":["regular"]},{"family":"Lancelot","category":"display","variants":["regular"]},{"family":"Lateef","category":"handwriting","variants":["regular"]},{"family":"Lato","category":"sans-serif","variants":["100","100italic","300","300italic","regular","italic","700","700italic","900","900italic"]},{"family":"League Script","category":"handwriting","variants":["regular"]},{"family":"Leckerli One","category":"handwriting","variants":["regular"]},{"family":"Ledger","category":"serif","variants":["regular"]},{"family":"Lekton","category":"sans-serif","variants":["regular","italic","700"]},{"family":"Lemon","category":"display","variants":["regular"]},{"family":"Libre Baskerville","category":"serif","variants":["regular","italic","700"]},{"family":"Life Savers","category":"display","variants":["regular","700"]},{"family":"Lilita One","category":"display","variants":["regular"]},{"family":"Lily Script One","category":"display","variants":["regular"]},{"family":"Limelight","category":"display","variants":["regular"]},{"family":"Linden Hill","category":"serif","variants":["regular","italic"]},{"family":"Lobster","category":"display","variants":["regular"]},{"family":"Lobster Two","category":"display","variants":["regular","italic","700","700italic"]},{"family":"Londrina Outline","category":"display","variants":["regular"]},{"family":"Londrina Shadow","category":"display","variants":["regular"]},{"family":"Londrina Sketch","category":"display","variants":["regular"]},{"family":"Londrina Solid","category":"display","variants":["regular"]},{"family":"Lora","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Love Ya Like A Sister","category":"display","variants":["regular"]},{"family":"Loved by the King","category":"handwriting","variants":["regular"]},{"family":"Lovers Quarrel","category":"handwriting","variants":["regular"]},{"family":"Luckiest Guy","category":"display","variants":["regular"]},{"family":"Lusitana","category":"serif","variants":["regular","700"]},{"family":"Lustria","category":"serif","variants":["regular"]},{"family":"Macondo","category":"display","variants":["regular"]},{"family":"Macondo Swash Caps","category":"display","variants":["regular"]},{"family":"Magra","category":"sans-serif","variants":["regular","700"]},{"family":"Maiden Orange","category":"display","variants":["regular"]},{"family":"Mako","category":"sans-serif","variants":["regular"]},{"family":"Mallanna","category":"sans-serif","variants":["regular"]},{"family":"Mandali","category":"sans-serif","variants":["regular"]},{"family":"Marcellus","category":"serif","variants":["regular"]},{"family":"Marcellus SC","category":"serif","variants":["regular"]},{"family":"Marck Script","category":"handwriting","variants":["regular"]},{"family":"Margarine","category":"display","variants":["regular"]},{"family":"Marko One","category":"serif","variants":["regular"]},{"family":"Marmelad","category":"sans-serif","variants":["regular"]},{"family":"Martel","category":"serif","variants":["200","300","regular","600","700","800","900"]},{"family":"Martel Sans","category":"sans-serif","variants":["200","300","regular","600","700","800","900"]},{"family":"Marvel","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Mate","category":"serif","variants":["regular","italic"]},{"family":"Mate SC","category":"serif","variants":["regular"]},{"family":"Maven Pro","category":"sans-serif","variants":["regular","500","700","900"]},{"family":"McLaren","category":"display","variants":["regular"]},{"family":"Meddon","category":"handwriting","variants":["regular"]},{"family":"MedievalSharp","category":"display","variants":["regular"]},{"family":"Medula One","category":"display","variants":["regular"]},{"family":"Megrim","category":"display","variants":["regular"]},{"family":"Meie Script","category":"handwriting","variants":["regular"]},{"family":"Merienda","category":"handwriting","variants":["regular","700"]},{"family":"Merienda One","category":"handwriting","variants":["regular"]},{"family":"Merriweather","category":"serif","variants":["300","300italic","regular","italic","700","700italic","900","900italic"]},{"family":"Merriweather Sans","category":"sans-serif","variants":["300","300italic","regular","italic","700","700italic","800","800italic"]},{"family":"Metal","category":"display","variants":["regular"]},{"family":"Metal Mania","category":"display","variants":["regular"]},{"family":"Metamorphous","category":"display","variants":["regular"]},{"family":"Metrophobic","category":"sans-serif","variants":["regular"]},{"family":"Michroma","category":"sans-serif","variants":["regular"]},{"family":"Milonga","category":"display","variants":["regular"]},{"family":"Miltonian","category":"display","variants":["regular"]},{"family":"Miltonian Tattoo","category":"display","variants":["regular"]},{"family":"Miniver","category":"display","variants":["regular"]},{"family":"Miss Fajardose","category":"handwriting","variants":["regular"]},{"family":"Modak","category":"display","variants":["regular"]},{"family":"Modern Antiqua","category":"display","variants":["regular"]},{"family":"Molengo","category":"sans-serif","variants":["regular"]},{"family":"Molle","category":"handwriting","variants":["italic"]},{"family":"Monda","category":"sans-serif","variants":["regular","700"]},{"family":"Monofett","category":"display","variants":["regular"]},{"family":"Monoton","category":"display","variants":["regular"]},{"family":"Monsieur La Doulaise","category":"handwriting","variants":["regular"]},{"family":"Montaga","category":"serif","variants":["regular"]},{"family":"Montez","category":"handwriting","variants":["regular"]},{"family":"Montserrat","category":"sans-serif","variants":["regular","700"]},{"family":"Montserrat Alternates","category":"sans-serif","variants":["regular","700"]},{"family":"Montserrat Subrayada","category":"sans-serif","variants":["regular","700"]},{"family":"Moul","category":"display","variants":["regular"]},{"family":"Moulpali","category":"display","variants":["regular"]},{"family":"Mountains of Christmas","category":"display","variants":["regular","700"]},{"family":"Mouse Memoirs","category":"sans-serif","variants":["regular"]},{"family":"Mr Bedfort","category":"handwriting","variants":["regular"]},{"family":"Mr Dafoe","category":"handwriting","variants":["regular"]},{"family":"Mr De Haviland","category":"handwriting","variants":["regular"]},{"family":"Mrs Saint Delafield","category":"handwriting","variants":["regular"]},{"family":"Mrs Sheppards","category":"handwriting","variants":["regular"]},{"family":"Muli","category":"sans-serif","variants":["300","300italic","regular","italic"]},{"family":"Mystery Quest","category":"display","variants":["regular"]},{"family":"NTR","category":"sans-serif","variants":["regular"]},{"family":"Neucha","category":"handwriting","variants":["regular"]},{"family":"Neuton","category":"serif","variants":["200","300","regular","italic","700","800"]},{"family":"New Rocker","category":"display","variants":["regular"]},{"family":"News Cycle","category":"sans-serif","variants":["regular","700"]},{"family":"Niconne","category":"handwriting","variants":["regular"]},{"family":"Nixie One","category":"display","variants":["regular"]},{"family":"Nobile","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Nokora","category":"serif","variants":["regular","700"]},{"family":"Norican","category":"handwriting","variants":["regular"]},{"family":"Nosifer","category":"display","variants":["regular"]},{"family":"Nothing You Could Do","category":"handwriting","variants":["regular"]},{"family":"Noticia Text","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Noto Sans","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Noto Serif","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Nova Cut","category":"display","variants":["regular"]},{"family":"Nova Flat","category":"display","variants":["regular"]},{"family":"Nova Mono","category":"monospace","variants":["regular"]},{"family":"Nova Oval","category":"display","variants":["regular"]},{"family":"Nova Round","category":"display","variants":["regular"]},{"family":"Nova Script","category":"display","variants":["regular"]},{"family":"Nova Slim","category":"display","variants":["regular"]},{"family":"Nova Square","category":"display","variants":["regular"]},{"family":"Numans","category":"sans-serif","variants":["regular"]},{"family":"Nunito","category":"sans-serif","variants":["300","regular","700"]},{"family":"Odor Mean Chey","category":"display","variants":["regular"]},{"family":"Offside","category":"display","variants":["regular"]},{"family":"Old Standard TT","category":"serif","variants":["regular","italic","700"]},{"family":"Oldenburg","category":"display","variants":["regular"]},{"family":"Oleo Script","category":"display","variants":["regular","700"]},{"family":"Oleo Script Swash Caps","category":"display","variants":["regular","700"]},{"family":"Open Sans","category":"sans-serif","variants":["300","300italic","regular","italic","600","600italic","700","700italic","800","800italic"]},{"family":"Open Sans Condensed","category":"sans-serif","variants":["300","300italic","700"]},{"family":"Oranienbaum","category":"serif","variants":["regular"]},{"family":"Orbitron","category":"sans-serif","variants":["regular","500","700","900"]},{"family":"Oregano","category":"display","variants":["regular","italic"]},{"family":"Orienta","category":"sans-serif","variants":["regular"]},{"family":"Original Surfer","category":"display","variants":["regular"]},{"family":"Oswald","category":"sans-serif","variants":["300","regular","700"]},{"family":"Over the Rainbow","category":"handwriting","variants":["regular"]},{"family":"Overlock","category":"display","variants":["regular","italic","700","700italic","900","900italic"]},{"family":"Overlock SC","category":"display","variants":["regular"]},{"family":"Ovo","category":"serif","variants":["regular"]},{"family":"Oxygen","category":"sans-serif","variants":["300","regular","700"]},{"family":"Oxygen Mono","category":"monospace","variants":["regular"]},{"family":"PT Mono","category":"monospace","variants":["regular"]},{"family":"PT Sans","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"PT Sans Caption","category":"sans-serif","variants":["regular","700"]},{"family":"PT Sans Narrow","category":"sans-serif","variants":["regular","700"]},{"family":"PT Serif","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"PT Serif Caption","category":"serif","variants":["regular","italic"]},{"family":"Pacifico","category":"handwriting","variants":["regular"]},{"family":"Palanquin","category":"sans-serif","variants":["100","200","300","regular","500","600","700"]},{"family":"Palanquin Dark","category":"sans-serif","variants":["regular","500","600","700"]},{"family":"Paprika","category":"display","variants":["regular"]},{"family":"Parisienne","category":"handwriting","variants":["regular"]},{"family":"Passero One","category":"display","variants":["regular"]},{"family":"Passion One","category":"display","variants":["regular","700","900"]},{"family":"Pathway Gothic One","category":"sans-serif","variants":["regular"]},{"family":"Patrick Hand","category":"handwriting","variants":["regular"]},{"family":"Patrick Hand SC","category":"handwriting","variants":["regular"]},{"family":"Patua One","category":"display","variants":["regular"]},{"family":"Paytone One","category":"sans-serif","variants":["regular"]},{"family":"Peddana","category":"serif","variants":["regular"]},{"family":"Peralta","category":"display","variants":["regular"]},{"family":"Permanent Marker","category":"handwriting","variants":["regular"]},{"family":"Petit Formal Script","category":"handwriting","variants":["regular"]},{"family":"Petrona","category":"serif","variants":["regular"]},{"family":"Philosopher","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Piedra","category":"display","variants":["regular"]},{"family":"Pinyon Script","category":"handwriting","variants":["regular"]},{"family":"Pirata One","category":"display","variants":["regular"]},{"family":"Plaster","category":"display","variants":["regular"]},{"family":"Play","category":"sans-serif","variants":["regular","700"]},{"family":"Playball","category":"display","variants":["regular"]},{"family":"Playfair Display","category":"serif","variants":["regular","italic","700","700italic","900","900italic"]},{"family":"Playfair Display SC","category":"serif","variants":["regular","italic","700","700italic","900","900italic"]},{"family":"Podkova","category":"serif","variants":["regular","700"]},{"family":"Poiret One","category":"display","variants":["regular"]},{"family":"Poller One","category":"display","variants":["regular"]},{"family":"Poly","category":"serif","variants":["regular","italic"]},{"family":"Pompiere","category":"display","variants":["regular"]},{"family":"Pontano Sans","category":"sans-serif","variants":["regular"]},{"family":"Poppins","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Port Lligat Sans","category":"sans-serif","variants":["regular"]},{"family":"Port Lligat Slab","category":"serif","variants":["regular"]},{"family":"Pragati Narrow","category":"sans-serif","variants":["regular","700"]},{"family":"Prata","category":"serif","variants":["regular"]},{"family":"Preahvihear","category":"display","variants":["regular"]},{"family":"Press Start 2P","category":"display","variants":["regular"]},{"family":"Princess Sofia","category":"handwriting","variants":["regular"]},{"family":"Prociono","category":"serif","variants":["regular"]},{"family":"Prosto One","category":"display","variants":["regular"]},{"family":"Puritan","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Purple Purse","category":"display","variants":["regular"]},{"family":"Quando","category":"serif","variants":["regular"]},{"family":"Quantico","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Quattrocento","category":"serif","variants":["regular","700"]},{"family":"Quattrocento Sans","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Questrial","category":"sans-serif","variants":["regular"]},{"family":"Quicksand","category":"sans-serif","variants":["300","regular","700"]},{"family":"Quintessential","category":"handwriting","variants":["regular"]},{"family":"Qwigley","category":"handwriting","variants":["regular"]},{"family":"Racing Sans One","category":"display","variants":["regular"]},{"family":"Radley","category":"serif","variants":["regular","italic"]},{"family":"Rajdhani","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Raleway","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"]},{"family":"Raleway Dots","category":"display","variants":["regular"]},{"family":"Ramabhadra","category":"sans-serif","variants":["regular"]},{"family":"Ramaraja","category":"serif","variants":["regular"]},{"family":"Rambla","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Rammetto One","category":"display","variants":["regular"]},{"family":"Ranchers","category":"display","variants":["regular"]},{"family":"Rancho","category":"handwriting","variants":["regular"]},{"family":"Ranga","category":"display","variants":["regular","700"]},{"family":"Rationale","category":"sans-serif","variants":["regular"]},{"family":"Ravi Prakash","category":"display","variants":["regular"]},{"family":"Redressed","category":"handwriting","variants":["regular"]},{"family":"Reenie Beanie","category":"handwriting","variants":["regular"]},{"family":"Revalia","category":"display","variants":["regular"]},{"family":"Rhodium Libre","category":"serif","variants":["regular"]},{"family":"Ribeye","category":"display","variants":["regular"]},{"family":"Ribeye Marrow","category":"display","variants":["regular"]},{"family":"Righteous","category":"display","variants":["regular"]},{"family":"Risque","category":"display","variants":["regular"]},{"family":"Roboto","category":"sans-serif","variants":["100","100italic","300","300italic","regular","italic","500","500italic","700","700italic","900","900italic"]},{"family":"Roboto Condensed","category":"sans-serif","variants":["300","300italic","regular","italic","700","700italic"]},{"family":"Roboto Mono","category":"monospace","variants":["100","100italic","300","300italic","regular","italic","500","500italic","700","700italic"]},{"family":"Roboto Slab","category":"serif","variants":["100","300","regular","700"]},{"family":"Rochester","category":"handwriting","variants":["regular"]},{"family":"Rock Salt","category":"handwriting","variants":["regular"]},{"family":"Rokkitt","category":"serif","variants":["regular","700"]},{"family":"Romanesco","category":"handwriting","variants":["regular"]},{"family":"Ropa Sans","category":"sans-serif","variants":["regular","italic"]},{"family":"Rosario","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Rosarivo","category":"serif","variants":["regular","italic"]},{"family":"Rouge Script","category":"handwriting","variants":["regular"]},{"family":"Rozha One","category":"serif","variants":["regular"]},{"family":"Rubik","category":"sans-serif","variants":["300","300italic","regular","italic","500","500italic","700","700italic","900","900italic"]},{"family":"Rubik Mono One","category":"sans-serif","variants":["regular"]},{"family":"Rubik One","category":"sans-serif","variants":["regular"]},{"family":"Ruda","category":"sans-serif","variants":["regular","700","900"]},{"family":"Rufina","category":"serif","variants":["regular","700"]},{"family":"Ruge Boogie","category":"handwriting","variants":["regular"]},{"family":"Ruluko","category":"sans-serif","variants":["regular"]},{"family":"Rum Raisin","category":"sans-serif","variants":["regular"]},{"family":"Ruslan Display","category":"display","variants":["regular"]},{"family":"Russo One","category":"sans-serif","variants":["regular"]},{"family":"Ruthie","category":"handwriting","variants":["regular"]},{"family":"Rye","category":"display","variants":["regular"]},{"family":"Sacramento","category":"handwriting","variants":["regular"]},{"family":"Sahitya","category":"serif","variants":["regular","700"]},{"family":"Sail","category":"display","variants":["regular"]},{"family":"Salsa","category":"display","variants":["regular"]},{"family":"Sanchez","category":"serif","variants":["regular","italic"]},{"family":"Sancreek","category":"display","variants":["regular"]},{"family":"Sansita One","category":"display","variants":["regular"]},{"family":"Sarala","category":"sans-serif","variants":["regular","700"]},{"family":"Sarina","category":"display","variants":["regular"]},{"family":"Sarpanch","category":"sans-serif","variants":["regular","500","600","700","800","900"]},{"family":"Satisfy","category":"handwriting","variants":["regular"]},{"family":"Scada","category":"sans-serif","variants":["regular","italic","700","700italic"]},{"family":"Scheherazade","category":"serif","variants":["regular","700"]},{"family":"Schoolbell","category":"handwriting","variants":["regular"]},{"family":"Seaweed Script","category":"display","variants":["regular"]},{"family":"Sevillana","category":"display","variants":["regular"]},{"family":"Seymour One","category":"sans-serif","variants":["regular"]},{"family":"Shadows Into Light","category":"handwriting","variants":["regular"]},{"family":"Shadows Into Light Two","category":"handwriting","variants":["regular"]},{"family":"Shanti","category":"sans-serif","variants":["regular"]},{"family":"Share","category":"display","variants":["regular","italic","700","700italic"]},{"family":"Share Tech","category":"sans-serif","variants":["regular"]},{"family":"Share Tech Mono","category":"monospace","variants":["regular"]},{"family":"Shojumaru","category":"display","variants":["regular"]},{"family":"Short Stack","category":"handwriting","variants":["regular"]},{"family":"Siemreap","category":"display","variants":["regular"]},{"family":"Sigmar One","category":"display","variants":["regular"]},{"family":"Signika","category":"sans-serif","variants":["300","regular","600","700"]},{"family":"Signika Negative","category":"sans-serif","variants":["300","regular","600","700"]},{"family":"Simonetta","category":"display","variants":["regular","italic","900","900italic"]},{"family":"Sintony","category":"sans-serif","variants":["regular","700"]},{"family":"Sirin Stencil","category":"display","variants":["regular"]},{"family":"Six Caps","category":"sans-serif","variants":["regular"]},{"family":"Skranji","category":"display","variants":["regular","700"]},{"family":"Slabo 13px","category":"serif","variants":["regular"]},{"family":"Slabo 27px","category":"serif","variants":["regular"]},{"family":"Slackey","category":"display","variants":["regular"]},{"family":"Smokum","category":"display","variants":["regular"]},{"family":"Smythe","category":"display","variants":["regular"]},{"family":"Sniglet","category":"display","variants":["regular","800"]},{"family":"Snippet","category":"sans-serif","variants":["regular"]},{"family":"Snowburst One","category":"display","variants":["regular"]},{"family":"Sofadi One","category":"display","variants":["regular"]},{"family":"Sofia","category":"handwriting","variants":["regular"]},{"family":"Sonsie One","category":"display","variants":["regular"]},{"family":"Sorts Mill Goudy","category":"serif","variants":["regular","italic"]},{"family":"Source Code Pro","category":"monospace","variants":["200","300","regular","500","600","700","900"]},{"family":"Source Sans Pro","category":"sans-serif","variants":["200","200italic","300","300italic","regular","italic","600","600italic","700","700italic","900","900italic"]},{"family":"Source Serif Pro","category":"serif","variants":["regular","600","700"]},{"family":"Special Elite","category":"display","variants":["regular"]},{"family":"Spicy Rice","category":"display","variants":["regular"]},{"family":"Spinnaker","category":"sans-serif","variants":["regular"]},{"family":"Spirax","category":"display","variants":["regular"]},{"family":"Squada One","category":"display","variants":["regular"]},{"family":"Sree Krushnadevaraya","category":"serif","variants":["regular"]},{"family":"Stalemate","category":"handwriting","variants":["regular"]},{"family":"Stalinist One","category":"display","variants":["regular"]},{"family":"Stardos Stencil","category":"display","variants":["regular","700"]},{"family":"Stint Ultra Condensed","category":"display","variants":["regular"]},{"family":"Stint Ultra Expanded","category":"display","variants":["regular"]},{"family":"Stoke","category":"serif","variants":["300","regular"]},{"family":"Strait","category":"sans-serif","variants":["regular"]},{"family":"Sue Ellen Francisco","category":"handwriting","variants":["regular"]},{"family":"Sumana","category":"serif","variants":["regular","700"]},{"family":"Sunshiney","category":"handwriting","variants":["regular"]},{"family":"Supermercado One","category":"display","variants":["regular"]},{"family":"Sura","category":"serif","variants":["regular","700"]},{"family":"Suranna","category":"serif","variants":["regular"]},{"family":"Suravaram","category":"serif","variants":["regular"]},{"family":"Suwannaphum","category":"display","variants":["regular"]},{"family":"Swanky and Moo Moo","category":"handwriting","variants":["regular"]},{"family":"Syncopate","category":"sans-serif","variants":["regular","700"]},{"family":"Tangerine","category":"handwriting","variants":["regular","700"]},{"family":"Taprom","category":"display","variants":["regular"]},{"family":"Tauri","category":"sans-serif","variants":["regular"]},{"family":"Teko","category":"sans-serif","variants":["300","regular","500","600","700"]},{"family":"Telex","category":"sans-serif","variants":["regular"]},{"family":"Tenali Ramakrishna","category":"sans-serif","variants":["regular"]},{"family":"Tenor Sans","category":"sans-serif","variants":["regular"]},{"family":"Text Me One","category":"sans-serif","variants":["regular"]},{"family":"The Girl Next Door","category":"handwriting","variants":["regular"]},{"family":"Tienne","category":"serif","variants":["regular","700","900"]},{"family":"Tillana","category":"handwriting","variants":["regular","500","600","700","800"]},{"family":"Timmana","category":"sans-serif","variants":["regular"]},{"family":"Tinos","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Titan One","category":"display","variants":["regular"]},{"family":"Titillium Web","category":"sans-serif","variants":["200","200italic","300","300italic","regular","italic","600","600italic","700","700italic","900"]},{"family":"Trade Winds","category":"display","variants":["regular"]},{"family":"Trocchi","category":"serif","variants":["regular"]},{"family":"Trochut","category":"display","variants":["regular","italic","700"]},{"family":"Trykker","category":"serif","variants":["regular"]},{"family":"Tulpen One","category":"display","variants":["regular"]},{"family":"Ubuntu","category":"sans-serif","variants":["300","300italic","regular","italic","500","500italic","700","700italic"]},{"family":"Ubuntu Condensed","category":"sans-serif","variants":["regular"]},{"family":"Ubuntu Mono","category":"monospace","variants":["regular","italic","700","700italic"]},{"family":"Ultra","category":"serif","variants":["regular"]},{"family":"Uncial Antiqua","category":"display","variants":["regular"]},{"family":"Underdog","category":"display","variants":["regular"]},{"family":"Unica One","category":"display","variants":["regular"]},{"family":"UnifrakturCook","category":"display","variants":["700"]},{"family":"UnifrakturMaguntia","category":"display","variants":["regular"]},{"family":"Unkempt","category":"display","variants":["regular","700"]},{"family":"Unlock","category":"display","variants":["regular"]},{"family":"Unna","category":"serif","variants":["regular"]},{"family":"VT323","category":"monospace","variants":["regular"]},{"family":"Vampiro One","category":"display","variants":["regular"]},{"family":"Varela","category":"sans-serif","variants":["regular"]},{"family":"Varela Round","category":"sans-serif","variants":["regular"]},{"family":"Vast Shadow","category":"display","variants":["regular"]},{"family":"Vesper Libre","category":"serif","variants":["regular","500","700","900"]},{"family":"Vibur","category":"handwriting","variants":["regular"]},{"family":"Vidaloka","category":"serif","variants":["regular"]},{"family":"Viga","category":"sans-serif","variants":["regular"]},{"family":"Voces","category":"display","variants":["regular"]},{"family":"Volkhov","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Vollkorn","category":"serif","variants":["regular","italic","700","700italic"]},{"family":"Voltaire","category":"sans-serif","variants":["regular"]},{"family":"Waiting for the Sunrise","category":"handwriting","variants":["regular"]},{"family":"Wallpoet","category":"display","variants":["regular"]},{"family":"Walter Turncoat","category":"handwriting","variants":["regular"]},{"family":"Warnes","category":"display","variants":["regular"]},{"family":"Wellfleet","category":"display","variants":["regular"]},{"family":"Wendy One","category":"sans-serif","variants":["regular"]},{"family":"Wire One","category":"sans-serif","variants":["regular"]},{"family":"Work Sans","category":"sans-serif","variants":["100","200","300","regular","500","600","700","800","900"]},{"family":"Yanone Kaffeesatz","category":"sans-serif","variants":["200","300","regular","700"]},{"family":"Yantramanav","category":"sans-serif","variants":["100","300","regular","500","700","900"]},{"family":"Yellowtail","category":"handwriting","variants":["regular"]},{"family":"Yeseva One","category":"display","variants":["regular"]},{"family":"Yesteryear","category":"handwriting","variants":["regular"]},{"family":"Zeyada","category":"handwriting","variants":["regular"]}]'; } helper-currency.php 0000644 00000024277 15162502321 0010375 0 ustar 00 <?php /** * Currency helper functions. * * @package Forminator */ if ( ! defined( 'ABSPATH' ) ) { die(); } /** * Currency list * * @return mixed */ function forminator_pp_currency_list() { return apply_filters( 'forminator_pp_currency_list', array( 'AUD' => array( 'Australia, Dollars', '24' ), 'BRL' => array( 'Brazil, Reais', '52, 24' ), 'CAD' => array( 'Canada, Dollars', '24' ), 'CZK' => array( 'Czech Republic, Koruny', '4b, 10d' ), 'DKK' => array( 'Denmark, Kroner', '6b, 72' ), 'EUR' => array( 'Euro', '20ac' ), 'HKD' => array( 'Hong Kong, Dollars', '24' ), 'HUF' => array( 'Hungary, Forint', '46, 74' ), 'CNY' => array( 'China, Yuan Renminbi', '5143' ), 'ILS' => array( 'Israel, New Shekels', '20aa' ), 'JPY' => array( 'Japan, Yen', 'a5' ), 'MYR' => array( 'Malaysia, Ringgits', '52, 4d' ), 'MXN' => array( 'Mexico, Pesos', '24' ), 'TWD' => array( 'Taiwan, New Dollars', '4e, 54, 24' ), 'NZD' => array( 'New Zealand, Dollars', '24' ), 'NOK' => array( 'Norway, Krone', '6b, 72' ), 'PHP' => array( 'Philippines, Pesos', '50, 68, 70' ), 'PLN' => array( 'Poland, Zlotych', '7a, 142' ), 'GBP' => array( 'United Kingdom, Pounds', 'a3' ), 'RUB' => array( 'Russia, Rubles', '440, 443, 431' ), 'SGD' => array( 'Singapore, Dollars', '24' ), 'SEK' => array( 'Sweden, Kronor', '6b, 72' ), 'CHF' => array( 'Switzerland, Francs', '43, 48, 46' ), 'THB' => array( 'Thailand, Baht', 'e3f' ), 'USD' => array( 'United States of America, Dollars', '24' ), ) ); } /** * Return list of currencies for Stripe * updated: Oct 21, 2020 * Removed currencies but might be supported back later (18): * BHD, BYR, CUP, SVC, EEK, GHC, GGP, IRR, IMP, JEP, KWD, LVL, LTL, KPW, OMR, SYP, TVD, VEF * Added currencies (31): * AMD, AOA, BDT, BIF, CDF, CVE, DJF, DZD, ETB, GMD, GNF, HTG, KMF, LSL, MDL, MGA, MMK, MOP, * MRO, MVR, MWK, PGK, RWF, SLL, STD, SZL, TJS, TOP, TZS, UGX, VUV, WST, XPF * * @since 1.0 * @since 1.15 Added new supported currencies and removed unsupported * @since 1.20 Added JOD * * @url Stripe Currencies: https://stripe.com/docs/currencies * @url Unicode hex table: https://gist.github.com/mroyce/a7e37ced540f45104de4cc03224937c7 * * @return array */ function forminator_currency_list() { return apply_filters( 'forminator_currency_list', array( 'AFN' => array( 'Afghanistan, Afghanis', '60b' ), 'ALL' => array( 'Albania, Leke', '4c, 65, 6b' ), 'DZD' => array( 'Algeria, Dinars', '44, 41' ), 'AOA' => array( 'Angola, Kwanzas', '4b, 7a' ), 'ARS' => array( 'Argentina, Pesos', '24' ), 'AMD' => array( 'Armenia, Drams', '58f' ), 'AWG' => array( 'Aruba, Guilders (also called Florins)', '192' ), 'AUD' => array( 'Australia, Dollars', '24' ), 'AZN' => array( 'Azerbaijan, New Manats', '43c, 430, 43d' ), 'BSD' => array( 'Bahamas, Dollars', '24' ), 'BDT' => array( 'Bangladesh, Takas', '9f3' ), 'BBD' => array( 'Barbados, Dollars', '24' ), 'BZD' => array( 'Belize, Dollars', '42, 5a, 24' ), 'BMD' => array( 'Bermuda, Dollars', '24' ), 'BOB' => array( 'Bolivia, Bolivianos', '24, 62' ), 'BAM' => array( 'Bosnia and Herzegovina, Convertible Marka', '4b, 4d' ), 'BWP' => array( 'Botswana, Pulas', '50' ), 'BGN' => array( 'Bulgaria, Leva', '43b, 432' ), 'BIF' => array( 'Burundi, Francs', '46, 42, 75' ), 'MMK' => array( 'Burma, Kyats', '4b' ), 'BRL' => array( 'Brazil, Reais', '52, 24' ), 'BND' => array( 'Brunei Darussalam, Dollars', '24' ), 'KHR' => array( 'Cambodia, Riels', '17db' ), 'CAD' => array( 'Canada, Dollars', '24' ), 'CVE' => array( 'Cabo Verde, Escudos', '45, 73, 63' ), 'KYD' => array( 'Cayman Islands, Dollars', '24' ), 'CLP' => array( 'Chile, Pesos', '24' ), 'CNY' => array( 'China, Yuan Renminbi', '5143' ), 'COP' => array( 'Colombia, Pesos', '24' ), 'KMF' => array( 'Comoros, Francs', '43, 46' ), 'CRC' => array( 'Costa Rica, Colones', '20a1' ), 'HRK' => array( 'Croatia, Kuna', '6b, 6e' ), 'CZK' => array( 'Czech Republic, Koruny', '4b, 10d' ), 'CDF' => array( 'Democratic Republic of Congo, Francs', '46, 43' ), 'DKK' => array( 'Denmark, Kroner', '6b, 72' ), 'DJF' => array( 'Djibouti, Francs', '46, 64, 6a' ), 'DOP' => array( 'Dominican Republic, Pesos', '52, 44, 24' ), 'XCD' => array( 'East Caribbean, Dollars', '24' ), 'EGP' => array( 'Egypt, Pounds', '45, 47, 50' ), 'ETB' => array( 'Ethiopia, Birrs', '42, 72' ), 'EUR' => array( 'Euro', '20ac' ), 'FKP' => array( 'Falkland Islands, Pounds', 'a3' ), 'FJD' => array( 'Fiji, Dollars', '24' ), 'GMD' => array( 'Gambia, Dalasis', '44' ), 'GEL' => array( 'Georgia, Lari', '6c, 61, 72, 69' ), 'GIP' => array( 'Gibraltar, Pounds', 'a3' ), 'GTQ' => array( 'Guatemala, Quetzales', '51' ), 'GNF' => array( 'Guinea, Francs', '46, 47' ), 'GYD' => array( 'Guyana, Dollars', '24' ), 'HTG' => array( 'Haiti, Gourdes', '47' ), 'HNL' => array( 'Honduras, Lempiras', '4c' ), 'HKD' => array( 'Hong Kong, Dollars', '24' ), 'HUF' => array( 'Hungary, Forints', '46, 74' ), 'ISK' => array( 'Iceland, Kronur', '6b, 72' ), 'INR' => array( 'India, Rupees', '20a8' ), 'IDR' => array( 'Indonesia, Rupiahs', '52, 70' ), 'ILS' => array( 'Israel, New Shekels', '20aa' ), 'JMD' => array( 'Jamaica, Dollars', '4a, 24' ), 'JOD' => array( 'Jordan, Dinars', '4a, 44' ), 'JPY' => array( 'Japan, Yen', 'a5' ), 'KZT' => array( 'Kazakhstan, Tenge', '43b, 432' ), 'KES' => array( 'Kenyan Shillings', '4B, 73, 68, 73' ), 'KGS' => array( 'Kyrgyzstan, Soms', '43b, 432' ), 'LAK' => array( 'Laos, Kips', '20ad' ), 'LBP' => array( 'Lebanon, Pounds', 'a3' ), 'LSL' => array( 'Lesotho, Maloti', '4d' ), 'LRD' => array( 'Liberia, Dollars', '24' ), 'MKD' => array( 'North Macedonia, Denars', '434, 435, 43d' ), 'MOP' => array( 'Macau, Patacas', '4d, 4f, 50, 24' ), 'MGA' => array( 'Madagascar, Ariary', '41, 72' ), 'MWK' => array( 'Malawi, Kwachas', '4b' ), 'MYR' => array( 'Malaysia, Ringgits', '52, 4d' ), 'MVR' => array( 'Maldives, Rufiyaa', '52, 66' ), 'MRO' => array( 'Mauritania, Ouguiya', '55, 4d' ), 'MUR' => array( 'Mauritius, Rupees', '20a8' ), 'MXN' => array( 'Mexico, Pesos', '24' ), 'MDL' => array( 'Moldova, Lei', '4c' ), 'MNT' => array( 'Mongolia, Tugriks', '20ae' ), 'MAD' => array( 'Morocco, Dirhams', '64, 68' ), 'MZN' => array( 'Mozambique, Meticais', '4d, 54' ), 'NAD' => array( 'Namibia, Dollars', '24' ), 'NPR' => array( 'Nepal, Rupees', '20a8' ), 'ANG' => array( 'Netherlands Antilles, Guilders (also called Florins)', '192' ), 'NZD' => array( 'New Zealand, Dollars', '24' ), 'NIO' => array( 'Nicaragua, Cordobas', '43, 24' ), 'NGN' => array( 'Nigeria, Nairas', '20a6' ), 'NOK' => array( 'Norway, Kroner', '6b, 72' ), 'PKR' => array( 'Pakistan, Rupees', '20a8' ), 'PAB' => array( 'Panama, Balboas', '42, 2f, 2e' ), 'PGK' => array( 'Papua New Guinea, Kina', '4b' ), 'PYG' => array( 'Paraguay, Guaranies', '47, 73' ), 'PEN' => array( 'Peru, Nuevos Soles', '53, 2f, 2e' ), 'PHP' => array( 'Philippines, Pesos', '20b1' ), 'PLN' => array( 'Poland, Zlotych', '7a, 142' ), 'QAR' => array( 'Qatar, Rials', 'fdfc' ), 'RON' => array( 'Romania, New Lei', '6c, 65, 69' ), 'RUB' => array( 'Russia, Rubles', '440, 443, 431' ), 'RWF' => array( 'Rwanda, Francs', '52, 46' ), 'SHP' => array( 'Saint Helena, Pounds', 'a3' ), 'WST' => array( 'Samoa, Tālā', '54' ), 'STD' => array( 'São Tomé and Príncipe, Dobras', '44, 62' ), // STN since 2018 but not yet updated in payment gateways. 'SAR' => array( 'Saudi Arabia, Riyals', 'fdfc' ), 'RSD' => array( 'Serbia, Dinars', '414, 438, 43d, 2e' ), 'SCR' => array( 'Seychelles, Rupees', '20a8' ), 'SLL' => array( 'Sierra Leone, Leone', '4c, 65' ), 'SGD' => array( 'Singapore, Dollars', '24' ), 'SBD' => array( 'Solomon Islands, Dollars', '24' ), 'SOS' => array( 'Somalia, Shillings', '53' ), 'ZAR' => array( 'South Africa, Rand', '52' ), 'KRW' => array( 'South Korea, Won', '20a9' ), 'LKR' => array( 'Sri Lanka, Rupees', '20a8' ), 'SZL' => array( 'Swaziland, Emalangeni', '45' ), 'SEK' => array( 'Sweden, Kronor', '6b, 72' ), 'CHF' => array( 'Switzerland, Francs', '43, 48, 46' ), 'SRD' => array( 'Suriname, Dollars', '24' ), 'TWD' => array( 'Taiwan, New Dollars', '4e, 54, 24' ), 'TJS' => array( 'Tajikistan, Somoni', '53, 4d' ), 'TZS' => array( 'Tanzania, Shillings', '54, 53, 68' ), 'THB' => array( 'Thailand, Baht', 'e3f' ), 'TOP' => array( 'Tonga, Paʻanga', '54, 24' ), 'TTD' => array( 'Trinidad and Tobago, Dollars', '54, 54, 24' ), 'TRY' => array( 'Turkey, Liras', '20BA' ), 'UGX' => array( 'Uganda, Shillings', '55, 53, 68' ), 'UAH' => array( 'Ukraine, Hryvnia', '20b4' ), 'AED' => array( 'United Arab Emirates, Dirhams', '64, 68' ), 'GBP' => array( 'United Kingdom, Pounds', 'a3' ), 'USD' => array( 'United States of America, Dollars', '24' ), 'UYU' => array( 'Uruguay, Pesos', '24, 55' ), 'UZS' => array( 'Uzbekistan, Sums', '43b, 432' ), 'VUV' => array( 'Vanuatu, Vatu', '56, 54' ), 'VND' => array( 'Vietnam, Dong', '20ab' ), 'XAF' => array( 'BEAC, CFA Francs', '46, 43, 46, 41' ), 'XOF' => array( 'BCEAO, CFA Francs', '46, 43, 46, 41' ), 'XPF' => array( 'Wallis and Futuna, CFP Francs', '46' ), 'YER' => array( 'Yemen, Rials', 'fdfc' ), 'ZMW' => array( 'Zimbabwe, Zambian Kwacha', '5a, 24' ), ) ); } /** * Get currency * * @since 1.0 * @param string $currency_code - the currency code. * * @return string */ function forminator_get_currency( $currency_code ) { $currencies = forminator_currency_list(); if ( ! empty( $currencies ) && isset( $currencies[ $currency_code ] ) ) { return $currencies[ $currency_code ]; } return ''; } /** * Get currency symbol * * @since 1.0 * @return string */ function forminator_get_currency_symbol() { $currency = get_option( 'forminator_currency', 'USD' ); $current_currency = forminator_get_currency( $currency ); if ( is_array( $current_currency ) ) { $symbols = array_map( 'trim', explode( ', ', $current_currency[1] ) ); if ( is_array( $symbols ) ) { $symbol = ''; foreach ( $symbols as $temp ) { $symbol .= '&#x' . $temp . ';'; } } else { $symbol = '&#x' . $symbol . ';'; } return $symbol; } return $currency; }