957 lines
31 KiB
PHP
957 lines
31 KiB
PHP
<?php
|
|
/**
|
|
* Fusion Form Builder.
|
|
*
|
|
* @package Fusion-Builder
|
|
* @since 3.0
|
|
*/
|
|
|
|
// Do not allow directly accessing this file.
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit( 'Direct script access denied.' );
|
|
}
|
|
|
|
/**
|
|
* Fusion Form Builder class.
|
|
*
|
|
* @since 3.0
|
|
*/
|
|
class Fusion_Form_Builder {
|
|
/**
|
|
* The one, true instance of this object.
|
|
*
|
|
* @static
|
|
* @access private
|
|
* @since 2.2
|
|
* @var object
|
|
*/
|
|
private static $instance;
|
|
|
|
/**
|
|
* Form post type handle.
|
|
*
|
|
* @access private
|
|
* @since 7.0
|
|
* @var string
|
|
*/
|
|
private $post_type = 'fusion_form';
|
|
|
|
/**
|
|
* Class constructor.
|
|
*
|
|
* @since 2.2
|
|
* @access private
|
|
*/
|
|
private function __construct() {
|
|
if ( ! self::is_enabled() ) {
|
|
return;
|
|
}
|
|
|
|
$this->register_post_types();
|
|
|
|
$this->setup_form_submit_functions();
|
|
|
|
add_action( 'fusion_builder_shortcodes_init', [ $this, 'init_shortcodes' ] );
|
|
|
|
add_action( 'admin_enqueue_scripts', [ $this, 'admin_scripts' ] );
|
|
|
|
add_action( 'wp_ajax_fusion_form_export', [ $this, 'ajax_export_entries' ] );
|
|
add_action( 'admin_init', [ $this, 'export_entries' ] );
|
|
|
|
// Reset form stats.
|
|
add_action( 'admin_init', [ $this, 'process_bulk_reset_forms' ] );
|
|
add_action( 'admin_action_awb_reset_form', [ $this, 'reset_form' ] );
|
|
|
|
// Enqueue styles on frontend.
|
|
add_action( 'wp', [ $this, 'frontend_styles' ] );
|
|
|
|
// Requirements for live editor.
|
|
add_action( 'fusion_builder_load_templates', [ $this, 'load_component_templates' ] );
|
|
add_action( 'fusion_builder_enqueue_separate_live_scripts', [ $this, 'load_component_views' ] );
|
|
|
|
// Process action to update form view in database.
|
|
add_action( 'wp_ajax_fusion_form_update_view', [ $this, 'fusion_form_update_view' ] );
|
|
add_action( 'wp_ajax_nopriv_fusion_form_update_view', [ $this, 'fusion_form_update_view' ] );
|
|
|
|
// Handles ajax request for removing form entry from database.
|
|
add_action( 'wp_ajax_fusion_remove_form_entry', [ $this, 'remove_form_entry' ] );
|
|
|
|
// Enqueue custom backbone templates for form creator.
|
|
add_action( 'fusion_builder_after', [ $this, 'add_form_templates' ] );
|
|
|
|
// New layout hook.
|
|
add_action( 'admin_action_fusion_form_new', [ $this, 'add_new_form' ] );
|
|
|
|
// Clone section.
|
|
add_action( 'admin_action_clone_form', [ $this, 'maybe_clone_form' ] );
|
|
|
|
// Overwrite page template for form preview.
|
|
add_filter( 'template_include', [ $this, 'form_builder_form_preview_template' ] );
|
|
|
|
// There should be a better way for this.
|
|
add_action( 'wp_head', [ $this, 'get_form_data' ] );
|
|
|
|
add_action( 'avada_dashboard_sticky_menu_items', [ $this, 'add_avada_dashboard_sticky_menu_items' ], 15 );
|
|
|
|
// Force button if this is enabled.
|
|
add_filter( 'fusion_is_fusion_button_enabled', '__return_true' );
|
|
|
|
// Add wrapper class.
|
|
add_filter( 'fusion_builder_live_editor_wrapper_class', [ $this, 'add_wrapper_class' ] );
|
|
|
|
// Add pre and post content wrappers.
|
|
add_filter( 'fusion_builder_front_end_content', [ $this, 'add_step_holders' ] );
|
|
|
|
add_action( 'wp', [ $this, 'wp' ] );
|
|
|
|
add_action( 'after_setup_theme', [ $this, 'create_db_tables' ], 11 );
|
|
|
|
// Predefined choices.
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/i18n/countries.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/i18n/days-of-the-week.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/i18n/months-of-the-year.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/i18n/us-states.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/i18n/years.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/i18n/days-of-the-month.php';
|
|
}
|
|
|
|
/**
|
|
* Creates or returns an instance of this class.
|
|
*
|
|
* @static
|
|
* @access public
|
|
* @since 2.2
|
|
*/
|
|
public static function get_instance() {
|
|
|
|
// If an instance hasn't been created and set to $instance create an instance and set it to $instance.
|
|
if ( null === self::$instance ) {
|
|
self::$instance = new Fusion_Form_Builder();
|
|
}
|
|
return self::$instance;
|
|
}
|
|
|
|
/**
|
|
* Checks if forms are enabled.
|
|
*
|
|
* @static
|
|
* @access public
|
|
* @since 3.1
|
|
* @return bool
|
|
*/
|
|
public static function is_enabled() {
|
|
$fusion_settings = awb_get_fusion_settings();
|
|
|
|
$status_fusion_forms = $fusion_settings->get( 'status_fusion_forms' );
|
|
$status_fusion_forms = '0' === $status_fusion_forms ? false : true;
|
|
return boolval( apply_filters( 'fusion_load_form_builder', $status_fusion_forms ) );
|
|
}
|
|
|
|
/**
|
|
* Instantiates the Fusion_Form_Submit object.
|
|
*
|
|
* @access public
|
|
* @since 3.1
|
|
* @return void
|
|
*/
|
|
public function setup_form_submit_functions() {
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-submit.php';
|
|
new Fusion_Form_Submit();
|
|
}
|
|
|
|
/**
|
|
* Adds wrapper class to live editor.
|
|
*
|
|
* @access public
|
|
* @param string $classes Existing classes.
|
|
* @since 3.1
|
|
* @return string
|
|
*/
|
|
public function add_wrapper_class( $classes ) {
|
|
if ( 'fusion_form' === get_post_type() && fusion_is_preview_frame() ) {
|
|
$classes .= ' fusion-form fusion-form-builder fusion-form-form-wrapper';
|
|
}
|
|
return $classes;
|
|
}
|
|
|
|
|
|
/**
|
|
* Adds slots for the navigation for live builder preview.
|
|
*
|
|
* @access public
|
|
* @param string $markup Markup of the live builder content holder.
|
|
* @since 3.10.2
|
|
* @return string
|
|
*/
|
|
public function add_step_holders( $markup ) {
|
|
if ( 'fusion_form' === get_post_type() && fusion_is_preview_frame() ) {
|
|
return '<div class="awb-above-form"></div>' . $markup . '<div class="awb-below-form"></div>';
|
|
}
|
|
return $markup;
|
|
}
|
|
|
|
/**
|
|
* Enqueue form styles on frontend.
|
|
*
|
|
* @since 2.3
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function frontend_styles() {
|
|
|
|
Fusion_Dynamic_CSS::enqueue_style(
|
|
FUSION_BUILDER_PLUGIN_DIR . 'assets/css/fusion-form.min.css',
|
|
FUSION_BUILDER_PLUGIN_URL . 'assets/css/fusion-form.min.css'
|
|
);
|
|
|
|
if ( is_rtl() ) {
|
|
Fusion_Dynamic_CSS::enqueue_style(
|
|
FUSION_BUILDER_PLUGIN_DIR . 'assets/css/fusion-form-rtl.min.css',
|
|
FUSION_BUILDER_PLUGIN_URL . 'assets/css/fusion-form-rtl.min.css'
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update form view in database.
|
|
*
|
|
* @since 2.3
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function fusion_form_update_view() {
|
|
|
|
// No need for nonce check, we're just updating form view and sending back nonce.
|
|
|
|
$form_id = '';
|
|
if ( isset( $_POST['form_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
|
|
$form_id = sanitize_text_field( wp_unslash( $_POST['form_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
|
|
}
|
|
|
|
if ( '' !== $form_id ) {
|
|
$this->increase_view_count( $form_id );
|
|
}
|
|
|
|
// Send back nonce field.
|
|
wp_nonce_field( 'fusion_form_nonce', 'fusion-form-nonce-' . absint( $form_id ), false, true );
|
|
die();
|
|
}
|
|
|
|
/**
|
|
* Return whether or not a visitor can increase the form views.
|
|
*
|
|
* @since 3.5
|
|
* @param string|int $form_id The form id.
|
|
* @return bool
|
|
*/
|
|
public function can_increase_views_count( $form_id ) {
|
|
$fusion_settings = awb_get_fusion_settings();
|
|
$increase_views_setting = $fusion_settings->get( 'form_views_counting' );
|
|
|
|
$can_increase_views = false;
|
|
|
|
if ( 'all' === $increase_views_setting ) {
|
|
$can_increase_views = true;
|
|
}
|
|
|
|
if ( 'logged_out' === $increase_views_setting && ! is_user_logged_in() ) {
|
|
$can_increase_views = true;
|
|
}
|
|
|
|
if ( 'non_admins' === $increase_views_setting && ! current_user_can( 'manage_options' ) ) {
|
|
$can_increase_views = true;
|
|
}
|
|
|
|
$can_increase_views = apply_filters( 'fusion_forms_can_increase_views', $can_increase_views, $form_id );
|
|
|
|
return $can_increase_views;
|
|
}
|
|
|
|
/**
|
|
* Increase form view count.
|
|
*
|
|
* @since 3.7
|
|
* @param string|int $form_id The form id.
|
|
* @return void
|
|
*/
|
|
public function increase_view_count( $form_id ) {
|
|
if ( $this->can_increase_views_count( $form_id ) ) {
|
|
$fusion_forms = new Fusion_Form_DB_Forms();
|
|
$fusion_forms->insert(
|
|
[
|
|
'form_id' => $form_id,
|
|
'views' => 0,
|
|
]
|
|
);
|
|
$fusion_forms->increment_views( $form_id );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add items to the Avada dashboard sticky menu.
|
|
*
|
|
* @access public
|
|
* @since 5.0
|
|
* @param string $screen The current screen.
|
|
* @return void
|
|
*/
|
|
public function add_avada_dashboard_sticky_menu_items( $screen ) {
|
|
if ( current_user_can( apply_filters( 'awb_role_manager_access_capability', 'edit_posts', 'fusion_form' ) ) || current_user_can( apply_filters( 'awb_role_manager_access_capability', 'moderate_comments', 'fusion_form', 'submissions_access' ) ) ) : ?>
|
|
<?php $link = ( 'forms' === $screen ) || ! current_user_can( apply_filters( 'awb_role_manager_access_capability', 'edit_posts', 'fusion_form' ) ) ? '#' : admin_url( 'admin.php?page=avada-forms' ); ?>
|
|
<li class="avada-db-menu-item avada-db-menu-item-forms"><a class="avada-db-menu-item-link<?php echo ( 'forms' === $screen ) ? ' avada-db-active' : ''; ?>" href="<?php echo esc_url( $link ); ?>" ><i class="fusiona-avada-form-element"></i><span class="avada-db-menu-item-text"><?php esc_html_e( 'Forms', 'fusion-builder' ); ?></span></a>
|
|
<ul class="avada-db-menu-sub avada-db-menu-sub-forms">
|
|
|
|
<?php if ( current_user_can( apply_filters( 'awb_role_manager_access_capability', 'edit_posts', 'fusion_form' ) ) ) : ?>
|
|
<li class="avada-db-menu-sub-item avada-db-menu-sub-item-forms">
|
|
<a class="avada-db-menu-sub-item-link<?php echo ( 'forms' === $screen ) ? ' avada-db-active' : ''; ?>" href="<?php echo esc_url( $link ); ?>">
|
|
<i class="fusiona-avada-form-element"></i>
|
|
<div class="avada-db-menu-sub-item-text">
|
|
<div class="avada-db-menu-sub-item-label"><?php esc_html_e( 'Form Builder', 'fusion-builder' ); ?></div>
|
|
<div class="avada-db-menu-sub-item-desc"><?php esc_html_e( 'Build / Edit your Avada Forms.', 'fusion-builder' ); ?></div>
|
|
</div>
|
|
</a>
|
|
</li>
|
|
<?php endif; ?>
|
|
<?php if ( current_user_can( apply_filters( 'awb_role_manager_access_capability', 'moderate_comments', 'fusion_form', 'submissions_access' ) ) ) : ?>
|
|
<li class="avada-db-menu-sub-item avada-db-menu-sub-item-form-entries">
|
|
<a class="avada-db-menu-sub-item-link<?php echo ( 'form-entries' === $screen ) ? ' avada-db-active' : ''; ?>" href="<?php echo esc_url( ( 'form-entries' === $screen ) ? '#' : admin_url( 'admin.php?page=avada-form-entries' ) ); ?>">
|
|
<i class="fusiona-content"></i>
|
|
<div class="avada-db-menu-sub-item-text">
|
|
<div class="avada-db-menu-sub-item-label"><?php esc_html_e( 'Form Entries', 'fusion-builder' ); ?></div>
|
|
<div class="avada-db-menu-sub-item-desc"><?php esc_html_e( 'Manage your form entries.', 'fusion-builder' ); ?></div>
|
|
</div>
|
|
</a>
|
|
</li>
|
|
<?php endif; ?>
|
|
</ul>
|
|
</li>
|
|
<?php
|
|
endif;
|
|
}
|
|
|
|
/**
|
|
* Register the post types and taxonomies.
|
|
*
|
|
* @since 2.2
|
|
* @access public
|
|
*/
|
|
public function register_post_types() {
|
|
$is_builder = fusion_is_preview_frame() || fusion_is_builder_frame();
|
|
$args = [
|
|
'labels' => [
|
|
'name' => _x( 'Avada Forms', 'Post Type General Name', 'fusion-builder' ),
|
|
'singular_name' => _x( 'Avada Form', 'Post Type Singular Name', 'fusion-builder' ),
|
|
'add_new_item' => _x( 'Add New Form', 'fusion-builder' ),
|
|
'edit_item' => _x( 'Edit Form', 'fusion-builder' ),
|
|
],
|
|
'public' => false,
|
|
'publicly_queryable' => $is_builder,
|
|
'show_ui' => true,
|
|
'show_in_menu' => false,
|
|
'exclude_from_search' => true,
|
|
'can_export' => true,
|
|
'query_var' => true,
|
|
'has_archive' => false,
|
|
'capability_type' => 'post',
|
|
'map_meta_cap' => true,
|
|
'hierarchical' => false,
|
|
'show_in_nav_menus' => false,
|
|
'supports' => [ 'title', 'editor' ],
|
|
'menu_icon' => 'dashicons-fusiona-logo',
|
|
];
|
|
|
|
register_post_type( 'fusion_form', apply_filters( 'fusion_form_cpt_args', $args ) );
|
|
}
|
|
|
|
/**
|
|
* Init shortcode files specific to templates.
|
|
*
|
|
* @since 2.2
|
|
* @access public
|
|
*/
|
|
public function init_shortcodes() {
|
|
|
|
// TODO: WHat is this ?.
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-db.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-list-table.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-widget.php';
|
|
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-db-privacy.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-db-items.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-db-submissions.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-db-entries.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-db-forms.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-db-fields.php';
|
|
|
|
new Fusion_Form_DB_Privacy();
|
|
|
|
// Real shortcodes...
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/notice.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/text.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/password.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/textarea.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/number.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/email.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/phone-number.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/select.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/radio.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/image-select.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/recaptcha.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/checkbox.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/consent.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/range.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/upload.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/date.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/time.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/rating.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/hidden.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/honeypot.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/fusion-form.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/fusion-form-step.php';
|
|
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/form/submit.php';
|
|
}
|
|
|
|
/**
|
|
* The main send function, handling the form submission.
|
|
*
|
|
* @since 2.3
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function remove_form_entry() {
|
|
// Verify the form submission nonce.
|
|
check_ajax_referer( 'fusion_entry_nonce', 'fusion_entry_nonce' );
|
|
|
|
if ( isset( $_POST['entry'] ) && current_user_can( apply_filters( 'awb_role_manager_access_capability', 'moderate_comments', 'fusion_form' ) ) && current_user_can( apply_filters( 'awb_role_manager_access_capability', 'moderate_comments', 'fusion_form', 'submissions_access' ) ) ) {
|
|
$entry_id = (int) sanitize_text_field( wp_unslash( $_POST['entry'] ) );
|
|
$submissions = new Fusion_Form_DB_Submissions();
|
|
|
|
$submissions->delete( $entry_id );
|
|
wp_send_json_success();
|
|
}
|
|
|
|
wp_send_json_error();
|
|
}
|
|
|
|
/**
|
|
* Enqueue required js on backend.
|
|
*
|
|
* @since 2.3
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function admin_scripts() {
|
|
global $pagenow, $typenow, $form_creator_fields;
|
|
if ( ( 'post.php' === $pagenow || 'post-new.php' === $pagenow ) && post_type_supports( $typenow, 'editor' ) ) {
|
|
if ( 'fusion_form' === $typenow ) {
|
|
wp_enqueue_script( 'fusion_builder_form_blank', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-blank-form.js', [], FUSION_BUILDER_VERSION, true );
|
|
}
|
|
}
|
|
|
|
// Add inline style to make "Form Entries" menu item visible in case only form entries should be displayed.
|
|
if ( ! current_user_can( apply_filters( 'awb_role_manager_access_capability', 'edit_posts', 'fusion_form' ) ) && current_user_can( apply_filters( 'awb_role_manager_access_capability', 'moderate_comments', 'fusion_form', 'submissions_access' ) ) ) {
|
|
wp_add_inline_style( 'avada-wp-admin-css', '#toplevel_page_avada > ul.wp-submenu a[href="admin.php?page=avada-form-entries"] { display: inline; }' );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add templates required for form creator.
|
|
*
|
|
* @since 2.3
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function add_form_templates() {
|
|
include FUSION_BUILDER_PLUGIN_DIR . 'inc/templates/blank-form.php';
|
|
}
|
|
|
|
|
|
/**
|
|
* Load the templates for live editor.
|
|
*
|
|
* @since 2.3
|
|
* @access public
|
|
*/
|
|
public function load_component_templates() {
|
|
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/front-end-blank-form.php';
|
|
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/form-components/text.php';
|
|
}
|
|
|
|
/**
|
|
* Load the views for the components.
|
|
*
|
|
* @since 2.3
|
|
* @access public
|
|
*/
|
|
public function load_component_views() {
|
|
wp_enqueue_script( 'fusion_builder_blank_form', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/view-blank-form.js', [], FUSION_BUILDER_VERSION, true );
|
|
wp_enqueue_script( 'fusion_builder_form_text', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/form/view-text.js', [], FUSION_BUILDER_VERSION, true );
|
|
}
|
|
|
|
/**
|
|
* Create a new form, fired from forms page.
|
|
*/
|
|
public function add_new_form() {
|
|
check_admin_referer( 'fusion_new_form' );
|
|
|
|
if ( ! current_user_can( apply_filters( 'awb_role_manager_access_capability', 'edit_posts', 'fusion_forms' ) ) ) {
|
|
return;
|
|
}
|
|
|
|
$custom_icon_set = [
|
|
'post_title' => isset( $_GET['name'] ) ? sanitize_text_field( wp_unslash( $_GET['name'] ) ) : '',
|
|
'post_status' => current_user_can( 'publish_posts' ) ? 'publish' : 'pending',
|
|
'post_type' => $this->post_type,
|
|
];
|
|
|
|
$set_id = wp_insert_post( $custom_icon_set, true );
|
|
if ( is_wp_error( $set_id ) ) {
|
|
$error_string = $set_id->get_error_message();
|
|
wp_die( esc_html( $error_string ) );
|
|
}
|
|
|
|
// Just redirect to back-end editor. In future tie it to default editor option.
|
|
wp_safe_redirect( awb_get_new_post_edit_link( $set_id ) );
|
|
die();
|
|
}
|
|
|
|
/**
|
|
* Saves a new form.
|
|
*
|
|
* @access public
|
|
* @since 3.0
|
|
*/
|
|
public function maybe_clone_form() {
|
|
if ( ! ( isset( $_GET['item'] ) || isset( $_POST['item'] ) || ( isset( $_REQUEST['action'] ) && 'clone_form' === $_REQUEST['action'] ) ) ) { // phpcs:ignore WordPress.Security
|
|
wp_die( esc_attr__( 'No form to clone.', 'fusion-builder' ) );
|
|
}
|
|
|
|
if ( isset( $_REQUEST['_fusion_form_clone_nonce'] ) && check_admin_referer( 'clone_form', '_fusion_form_clone_nonce' ) && current_user_can( 'edit_others_posts' ) ) {
|
|
|
|
// Get the post being copied.
|
|
$id = isset( $_GET['item'] ) ? wp_unslash( $_GET['item'] ) : wp_unslash( $_POST['item'] ); // phpcs:ignore WordPress.Security
|
|
$post = get_post( $id );
|
|
|
|
// Copy the section and insert it.
|
|
if ( isset( $post ) && $post ) {
|
|
$this->clone_form( $post );
|
|
|
|
// Redirect to the all sections screen.
|
|
wp_safe_redirect( admin_url( 'admin.php?page=avada-forms' ) );
|
|
|
|
exit;
|
|
|
|
} else {
|
|
|
|
/* translators: The ID not found. */
|
|
wp_die( sprintf( esc_attr__( 'Cloning failed. Form not found. ID: %s', 'fusion-builder' ), htmlspecialchars( $id ) ) ); // phpcs:ignore WordPress.Security
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Clones a section.
|
|
*
|
|
* @access public
|
|
* @since 3.0
|
|
* @param object $post The post object.
|
|
* @return int
|
|
*/
|
|
public function clone_form( $post ) {
|
|
|
|
// Ignore revisions.
|
|
if ( 'revision' === $post->post_type ) {
|
|
return;
|
|
}
|
|
|
|
$post_meta = fusion_data()->post_meta( $post->ID )->get_all_meta();
|
|
$new_post_parent = $post->post_parent;
|
|
|
|
$new_post = [
|
|
'menu_order' => $post->menu_order,
|
|
'comment_status' => $post->comment_status,
|
|
'ping_status' => $post->ping_status,
|
|
'post_author' => $post->post_author,
|
|
'post_content' => $post->post_content,
|
|
'post_excerpt' => $post->post_excerpt,
|
|
'post_mime_type' => $post->post_mime_type,
|
|
'post_parent' => $new_post_parent,
|
|
'post_password' => $post->post_password,
|
|
'post_status' => 'publish',
|
|
|
|
/* translators: The post title. */
|
|
'post_title' => sprintf( esc_attr__( '%s ( Cloned )', 'fusion-builder' ), $post->post_title ),
|
|
'post_type' => $post->post_type,
|
|
];
|
|
|
|
// Add new section post.
|
|
$new_post_id = wp_insert_post( $new_post );
|
|
|
|
// Set a proper slug.
|
|
$post_name = wp_unique_post_slug( $post->post_name, $new_post_id, 'publish', $post->post_type, $new_post_parent );
|
|
$new_post = [];
|
|
$new_post['ID'] = $new_post_id;
|
|
$new_post['post_name'] = $post_name;
|
|
|
|
wp_update_post( $new_post );
|
|
|
|
// Post terms.
|
|
// TODO: Maybe copy terms.
|
|
|
|
// Clone section meta.
|
|
if ( ! empty( $post_meta ) ) {
|
|
foreach ( $post_meta as $key => $val ) {
|
|
fusion_data()->post_meta( $new_post_id )->set( $key, $val );
|
|
}
|
|
}
|
|
|
|
return $new_post_id;
|
|
}
|
|
|
|
/**
|
|
* Resets stats of all given forms.
|
|
*
|
|
* @access public
|
|
* @since 3.11.8
|
|
* @return void
|
|
*/
|
|
public function process_bulk_reset_forms() {
|
|
if ( ( isset( $_REQUEST['action'] ) && 'awb_bulk_reset_forms' === $_REQUEST['action'] || isset( $_REQUEST['action2'] ) && 'awb_bulk_reset_forms' === $_REQUEST['action2'] ) ) {
|
|
|
|
if ( check_admin_referer( 'bulk-forms', '_wpnonce' ) && current_user_can( 'edit_others_posts' ) ) {
|
|
global $wpdb;
|
|
$ids = wp_unslash( $_REQUEST['post'] );
|
|
$db = new Fusion_Form_DB();
|
|
foreach ( $ids as $id ) {
|
|
$db->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}fusion_forms SET views = 0, submissions_count = 0 WHERE `form_id` = %d", $id ) );
|
|
}
|
|
|
|
$referer = fusion_get_referer();
|
|
if ( $referer ) {
|
|
wp_safe_redirect( $referer );
|
|
exit;
|
|
}
|
|
} else {
|
|
|
|
/* translators: Form IDs. */
|
|
wp_die( sprintf( esc_html__( 'Reset of forms %s faild.', 'fusion-builder' ), implode( ', ', wp_unslash( $_REQUEST['post'] ) ) ) ); // phpcs:ignore WordPress.Security
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Resets stats of a form.
|
|
*
|
|
* @access public
|
|
* @since 3.11.8
|
|
* @return void
|
|
*/
|
|
public function reset_form() {
|
|
if ( isset( $_GET['action'] ) && 'awb_reset_form' === $_GET['action'] ) {
|
|
if ( ! isset( $_GET['post'] ) ) {
|
|
wp_die( esc_attr__( 'Cannot reset form. No ID given.', 'fusion-builder' ) );
|
|
}
|
|
|
|
if ( isset( $_GET['_awb_reset_form'] ) && check_admin_referer( 'reset_form', '_awb_reset_form' ) && current_user_can( 'edit_others_posts' ) ) {
|
|
global $wpdb;
|
|
$id = wp_unslash( $_GET['post'] );
|
|
$db = new Fusion_Form_DB();
|
|
$db->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}fusion_forms SET views = 0, submissions_count = 0 WHERE `form_id` = %d", $id ) );
|
|
|
|
// Redirect to the all sections screen.
|
|
wp_safe_redirect( admin_url( 'admin.php?page=avada-forms' ) );
|
|
exit;
|
|
|
|
} else {
|
|
|
|
/* translators: Form ID. */
|
|
wp_die( sprintf( esc_html__( 'Reset of form %s faild.', 'fusion-builder' ), htmlspecialchars( $id ) ) ); // phpcs:ignore WordPress.Security
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Display form preview.
|
|
*
|
|
* @since 2.3
|
|
* @param string $single_template Template file name or uri.
|
|
* @return array
|
|
*/
|
|
public function form_builder_form_preview_template( $single_template ) {
|
|
global $post_type;
|
|
|
|
wp_verify_nonce( 'preview_nonce' );
|
|
|
|
$show_form_preview = isset( $_GET['preview'] ) && is_user_logged_in();
|
|
$has_form_id = ( isset( $_GET['preview_id'] ) && '' !== $_GET['preview_id'] ) || ( isset( $_GET['p'] ) && '' !== $_GET['p'] );
|
|
$is_form = 'fusion_form' === $post_type;
|
|
|
|
if ( is_singular( 'fusion_form' ) || ( $is_form && $show_form_preview && $has_form_id ) ) {
|
|
$single_template = FUSION_BUILDER_PLUGIN_DIR . 'templates/form-builder-preview.php';
|
|
}
|
|
|
|
return $single_template;
|
|
}
|
|
|
|
/**
|
|
* Sets the global $fusion_form var.
|
|
*
|
|
* @access public
|
|
* @since 3.1
|
|
* @return void
|
|
*/
|
|
public function get_form_data() {
|
|
if ( 'fusion_form' === get_post_type() ) {
|
|
global $fusion_form, $post;
|
|
|
|
$fusion_form = Fusion_Builder_Form_Helper::fusion_form_set_form_data( $post->ID );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Function attached to wp hook.
|
|
*
|
|
* @access public
|
|
* @since 1.0
|
|
* @return void
|
|
*/
|
|
public function wp() {
|
|
if ( is_singular( 'fusion_form' ) ) {
|
|
add_filter( 'the_content', [ $this, 'render_form' ] );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* We are viewing a form directly, replace it with the shortcode.
|
|
*
|
|
* @access public
|
|
* @since 1.0
|
|
* @param string $content The content.
|
|
* @return string The content, modified.
|
|
*/
|
|
public function render_form( $content ) {
|
|
|
|
// So we only target main content.
|
|
if ( ! fusion_doing_ajax() && is_main_query() && false !== strpos( $content, 'fusion_form_' ) && ! fusion_is_preview_frame() && ! fusion_is_builder_frame() ) {
|
|
$content = '[fusion_form form_post_id="' . fusion_library()->get_page_id() . '" class="" id="" /]';
|
|
}
|
|
return $content;
|
|
}
|
|
/**
|
|
* Creates Avada Forms database tables.
|
|
*/
|
|
public function create_db_tables() {
|
|
|
|
if ( true === FusionBuilder::is_upgrading() ) {
|
|
// Include Form Installer.
|
|
if ( ! class_exists( 'Fusion_Form_DB_Install' ) ) {
|
|
include_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-db-install.php';
|
|
}
|
|
|
|
$fusion_form_db_install = new Fusion_Form_DB_Install();
|
|
$fusion_form_db_install->create_tables();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Export form entries for a specific form.
|
|
*
|
|
* @access public
|
|
* @since 3.3
|
|
* @return void.
|
|
*/
|
|
public function ajax_export_entries() {
|
|
|
|
// Nonce check.
|
|
if ( ! isset( $_GET['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['nonce'] ) ), 'fusion-form-nonce' ) || ! current_user_can( 'export' ) ) {
|
|
echo wp_json_encode(
|
|
[
|
|
'status' => 'error_nonce',
|
|
]
|
|
);
|
|
die();
|
|
}
|
|
|
|
$per_page = apply_filters( 'fusion_form_export_per_step', 250 );
|
|
$form_id = isset( $_GET['formID'] ) ? absint( wp_unslash( $_GET['formID'] ) ) : 0;
|
|
$current_page = isset( $_GET['currentPage'] ) ? absint( wp_unslash( $_GET['currentPage'] ) ) : 0;
|
|
$total_pages = isset( $_GET['totalPages'] ) ? absint( wp_unslash( $_GET['totalPages'] ) ) : 0;
|
|
$status_message = 'export_processing';
|
|
$submissions = new Fusion_Form_DB_Submissions();
|
|
|
|
if ( 0 === $total_pages ) {
|
|
$submission_args = [
|
|
'what' => 'COUNT(id) AS count',
|
|
'where' => [ 'form_id' => (int) $form_id ],
|
|
];
|
|
$result = $submissions->get( $submission_args );
|
|
|
|
$total_count = $result[0]->count;
|
|
$total_pages = (int) ceil( $total_count / $per_page );
|
|
}
|
|
|
|
// Get form post content.
|
|
global $wpdb;
|
|
$query = "SELECT p.post_content FROM $wpdb->posts AS p INNER JOIN {$wpdb->prefix}fusion_forms AS ff ON p.ID = ff.form_id WHERE ff.id = %d";
|
|
$results = $wpdb->get_results( $wpdb->prepare( $query, (int) $form_id ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL
|
|
$form_post_content = $results && isset( $results[0] ) ? $results[0]->post_content : '';
|
|
$field_labels = [];
|
|
$field_names = [];
|
|
|
|
// Get labels and names for all fields / inputs.
|
|
if ( '' !== $form_post_content ) {
|
|
// Get form field names.
|
|
preg_match_all( '/\[fusion_form_[^\]]*\sname=\"([^\"]*)\"/', $form_post_content, $matches );
|
|
$field_names = isset( $matches[1] ) ? $matches[1] : [];
|
|
|
|
// Get form field labels.
|
|
preg_match_all( '/\[fusion_form_[^\]]*\slabel=\"([^\"]*)\"/', $form_post_content, $matches );
|
|
$field_labels = isset( $matches[1] ) ? $matches[1] : [];
|
|
|
|
// If (some) labels are missing or empty use name instead.
|
|
if ( count( $field_names ) !== count( array_filter( $field_labels ) ) || count( array_unique( $field_labels ) ) !== count( $field_labels ) ) {
|
|
$field_labels = map_deep( $field_names, 'Fusion_Builder_Form_Helper::fusion_name_to_label' );
|
|
}
|
|
}
|
|
|
|
$additional_labels = [ 'id', 'time' ];
|
|
|
|
// Add submission ID to label.
|
|
$field_labels = array_merge( [ 'id' => __( 'Submission ID', 'fusion-builder' ) ], $field_labels );
|
|
|
|
// Add date and time to labels.
|
|
$field_labels['time'] = __( 'Date Time', 'fusion-builder' );
|
|
|
|
// Apply filters.
|
|
$field_labels = apply_filters( 'awb_form_export_labels', $field_labels, $form_id );
|
|
|
|
$form_creator_list_table = new Fusion_Form_List_Table( $form_id );
|
|
$form_creator_list_table->prepare_items( $per_page, $current_page );
|
|
|
|
$upload_dir = wp_upload_dir();
|
|
$file = $upload_dir['basedir'] . '/form-' . $form_id . '-entries.csv';
|
|
|
|
if ( 1 === $current_page && file_exists( $file ) ) {
|
|
@unlink( $file ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
|
|
}
|
|
|
|
$f = fopen( $file, 'a' ); // phpcs:ignore WordPress.WP.AlternativeFunctions
|
|
$titles = 1 === $current_page ? false : true;
|
|
|
|
if ( is_array( $form_creator_list_table->items ) && ! empty( $form_creator_list_table->items ) ) {
|
|
foreach ( $form_creator_list_table->items as $key => $form_entry ) {
|
|
|
|
$form_submission = $this->find_submission( $key, $form_creator_list_table->form_submissions );
|
|
|
|
unset( $form_entry['Actions'] );
|
|
if ( ! $titles ) {
|
|
$titles = true;
|
|
|
|
// Add BOM.
|
|
fprintf( $f, chr( 0xEF ) . chr( 0xBB ) . chr( 0xBF ) );
|
|
|
|
// Add title row.
|
|
fputcsv( $f, $field_labels );
|
|
}
|
|
|
|
$csv_entry = [];
|
|
foreach ( $field_labels as $fkey => $label ) {
|
|
if ( in_array( $fkey, $additional_labels, true ) ) {
|
|
$csv_entry[ $label ] = $form_submission && isset( $form_submission->$fkey ) ? $form_submission->$fkey : '';
|
|
} else {
|
|
$csv_entry[ $label ] = isset( $form_entry[ $label ] ) ? $form_entry[ $label ] : '';
|
|
}
|
|
}
|
|
$csv_entry = apply_filters( 'awb_form_export_entry', $csv_entry, $form_id );
|
|
fputcsv( $f, array_values( $csv_entry ) );
|
|
}
|
|
}
|
|
fclose( $f ); // phpcs:ignore WordPress.WP.AlternativeFunctions
|
|
|
|
if ( $current_page === $total_pages ) {
|
|
$status_message = 'export_done';
|
|
}
|
|
|
|
echo wp_json_encode(
|
|
[
|
|
'status' => $status_message,
|
|
'total_pages' => $total_pages,
|
|
]
|
|
);
|
|
die();
|
|
}
|
|
/**
|
|
* Find the submission with the ID.
|
|
*
|
|
* @access public
|
|
* @since 3.11
|
|
* @param int $id The Id.
|
|
* @param array $submissions The submissions.
|
|
* @return mixed
|
|
*/
|
|
public function find_submission( $id = 0, $submissions = [] ) {
|
|
foreach ( $submissions as $key => $submission ) {
|
|
if ( (int) $id === (int) $submission->id ) {
|
|
return $submission;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Export form entries..
|
|
*
|
|
* @access public
|
|
* @since 3.3
|
|
* @return void.
|
|
*/
|
|
public function export_entries() {
|
|
|
|
if ( isset( $_GET['page'] ) && 'avada-form-entries' === $_GET['page'] && isset( $_GET['nonce'] ) ) {
|
|
|
|
// Nonce check.
|
|
if ( ! isset( $_GET['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['nonce'] ) ), 'fusion-form-nonce' ) ) {
|
|
die();
|
|
}
|
|
|
|
$form_id = isset( $_GET['form_id'] ) ? sanitize_text_field( $_GET['form_id'] ) : '';
|
|
|
|
$upload_dir = wp_upload_dir();
|
|
$file = $upload_dir['basedir'] . '/form-' . $form_id . '-entries.csv';
|
|
|
|
if ( file_exists( $file ) ) {
|
|
$file_parts = pathinfo( $file );
|
|
|
|
if ( 'csv' === $file_parts['extension'] ) {
|
|
// Trigger file download.
|
|
header( 'Content-type: application/csv' );
|
|
header( 'Content-Disposition: attachment; filename=form-' . $form_id . '-entries.csv' );
|
|
header( 'Content-Transfer-Encoding: UTF-8' );
|
|
|
|
readfile( $file ); // phpcs:ignore WordPress.WP.AlternativeFunctions
|
|
|
|
echo ob_get_clean(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
|
|
|
@unlink( $file ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
|
|
|
|
die();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Instantiates the Fusion_Form_Builder class.
|
|
* Make sure the class is properly set-up.
|
|
*
|
|
* @since object 2.2
|
|
* @return object Fusion_App
|
|
*/
|
|
function Fusion_Form_Builder() { // phpcs:ignore WordPress.NamingConventions
|
|
return Fusion_Form_Builder::get_instance();
|
|
}
|
|
Fusion_Form_Builder();
|