he form name and form key. $form_key = FrmAppHelper::get_unique_key( sanitize_title( $name ), 'frm_forms', 'form_key' ); FrmForm::update( $form_id, compact( 'name', 'form_key' ) ); wp_send_json_success( compact( 'form_key' ) ); } public static function json_error( $errors ) { $errors['json'] = __( 'Abnormal HTML characters prevented your form from saving correctly', 'formidable' ); return $errors; } /** * Education for premium features. * * @since 4.05 * @return void */ public static function add_form_style_tab_options() { include FrmAppHelper::plugin_path() . '/classes/views/frm-forms/add_form_style_options.php'; } /** * Add education about views. * * @since 4.07 * * @return void */ public static function no_views( $values = array() ) { FrmAppHelper::include_svg(); $id = FrmAppHelper::get_param( 'form', '', 'get', 'absint' ); $form = $id ? FrmForm::getOne( $id ) : false; include FrmAppHelper::plugin_path() . '/classes/views/shared/views-info.php'; } /** * Add education about reports. * * @since 4.07 * * @return void */ public static function no_reports( $values = array() ) { $id = FrmAppHelper::get_param( 'form', '', 'get', 'absint' ); $form = $id ? FrmForm::getOne( $id ) : false; include FrmAppHelper::plugin_path() . '/classes/views/shared/reports-info.php'; } /** * FRONT-END FORMS. */ public static function admin_bar_css() { if ( is_admin() || ! current_user_can( 'frm_edit_forms' ) ) { return; } self::move_menu_to_footer(); add_action( 'wp_before_admin_bar_render', 'FrmFormsController::admin_bar_configure' ); FrmAppHelper::load_font_style(); } /** * @since 4.05.02 */ private static function move_menu_to_footer() { $settings = FrmAppHelper::get_settings(); if ( empty( $settings->admin_bar ) ) { remove_action( 'wp_body_open', 'wp_admin_bar_render', 0 ); } } public static function admin_bar_configure() { global $frm_vars; if ( empty( $frm_vars['forms_loaded'] ) ) { return; } $actions = array(); foreach ( $frm_vars['forms_loaded'] as $form ) { if ( is_object( $form ) ) { $actions[ $form->id ] = $form->name; } unset( $form ); } if ( empty( $actions ) ) { return; } self::add_menu_to_admin_bar(); self::add_forms_to_admin_bar( $actions ); } /** * @since 2.05.07 */ public static function add_menu_to_admin_bar() { global $wp_admin_bar; $wp_admin_bar->add_node( array( 'id' => 'frm-forms', 'title' => '' . FrmAppHelper::get_menu_name() . '', 'href' => admin_url( 'admin.php?page=formidable' ), 'meta' => array( 'title' => FrmAppHelper::get_menu_name(), ), ) ); } /** * @since 2.05.07 */ private static function add_forms_to_admin_bar( $actions ) { global $wp_admin_bar; asort( $actions ); foreach ( $actions as $form_id => $name ) { $wp_admin_bar->add_node( array( 'parent' => 'frm-forms', 'id' => 'edit_form_' . $form_id, 'title' => empty( $name ) ? __( '(no title)', 'formidable' ) : $name, 'href' => FrmForm::get_edit_link( $form_id ), ) ); } } /** * The formidable shortcode * * @param array $atts The params from the shortcode. * @return string */ public static function get_form_shortcode( $atts ) { global $frm_vars; if ( ! empty( $frm_vars['skip_shortcode'] ) ) { $sc = '[formidable'; $sc .= FrmAppHelper::array_to_html_params( $atts ); return $sc . ']'; } $shortcode_atts = shortcode_atts( array( 'id' => '', 'key' => '', 'title' => 'auto', 'description' => 'auto', 'readonly' => false, 'entry_id' => false, 'fields' => array(), 'exclude_fields' => array(), 'minimize' => false, ), $atts ); do_action( 'formidable_shortcode_atts', $shortcode_atts, $atts ); return self::show_form( $shortcode_atts['id'], $shortcode_atts['key'], $shortcode_atts['title'], $shortcode_atts['description'], $atts ); } /** * @since 5.2.01 * * @param false|int|string $id * @param false|string $key * @return false|stdClass */ private static function maybe_get_form_by_id_or_key( $id, $key ) { if ( ! $id ) { $id = $key; } return self::maybe_get_form_to_show( $id ); } /** * @param false|int|string $id * @param false|string $key * @param bool|int|string $title may be 'auto', true, false, 'true', 'false', 'yes', '1', 1, '0', 0. * @param bool|int|string $description may be 'auto', true, false, 'true', 'false', 'yes', '1', 1, '0', 0. * @param array $atts * @return string */ public static function show_form( $id = '', $key = '', $title = false, $description = false, $atts = array() ) { $form = self::maybe_get_form_by_id_or_key( $id, $key ); if ( ! $form ) { return __( 'Please select a valid form', 'formidable' ); } if ( 'auto' === $title ) { $title = ! empty( $form->options['show_title'] ); } if ( 'auto' === $description ) { $description = ! empty( $form->options['show_description'] ); } FrmAppController::maybe_update_styles(); add_action( 'frm_load_form_hooks', 'FrmHooksController::trigger_load_form_hooks' ); FrmAppHelper::trigger_hook_load( 'form', $form ); $form = apply_filters( 'frm_pre_display_form', $form ); $frm_settings = FrmAppHelper::get_settings( array( 'current_form' => $form->id ) ); if ( self::is_viewable_draft_form( $form ) ) { // don't show a draft form on a page $form = __( 'Please select a valid form', 'formidable' ); } elseif ( ! FrmForm::is_visible_to_user( $form ) ) { $form = do_shortcode( $frm_settings->login_msg ); } else { do_action( 'frm_pre_get_form', $form ); $form = self::get_form( $form, $title, $description, $atts ); /** * Use this shortcode to check for external shortcodes that may span * across multiple fields in the customizable HTML * * @since 2.0.8 */ $form = apply_filters( 'frm_filter_final_form', $form ); } return $form; } /** * @param false|int|string $id * @return false|stdClass */ private static function maybe_get_form_to_show( $id ) { $form = false; if ( ! empty( $id ) ) { // Form id or key is set. $form = FrmForm::getOne( $id ); if ( ! $form || $form->parent_form_id || $form->status === 'trash' ) { $form = false; } } return $form; } private static function is_viewable_draft_form( $form ) { return $form->status === 'draft' && current_user_can( 'frm_edit_forms' ) && ! FrmAppHelper::is_preview_page(); } public static function get_form( $form, $title, $description, $atts = array() ) { ob_start(); do_action( 'frm_before_get_form', $atts ); self::get_form_contents( $form, $title, $description, $atts ); self::enqueue_scripts( FrmForm::get_params( $form ) ); $contents = ob_get_contents(); ob_end_clean(); self::maybe_minimize_form( $atts, $contents ); return $contents; } public static function enqueue_scripts( $params ) { do_action( 'frm_enqueue_form_scripts', $params ); } public static function get_form_contents( $form, $title, $description, $atts ) { $params = FrmForm::get_params( $form ); $errors = self::get_saved_errors( $form, $params ); $fields = FrmFieldsHelper::get_form_fields( $form->id, $errors ); $reset = false; $pass_args = compact( 'form', 'fields', 'errors', 'title', 'description', 'reset' ); $pass_args['action'] = $params['action']; $handle_process_here = $params['action'] === 'create' && $params['posted_form_id'] == $form->id && $_POST; // phpcs:ignore WordPress.Security.NonceVerification.Missing if ( ! $handle_process_here ) { FrmFormState::set_initial_value( 'title', $title ); FrmFormState::set_initial_value( 'description', $description ); do_action( 'frm_display_form_action', $params, $fields, $form, $title, $description ); if ( apply_filters( 'frm_continue_to_new', true, $form->id, $params['action'] ) ) { self::show_form_after_submit( $pass_args ); } } elseif ( ! empty( $errors ) ) { self::show_form_after_submit( $pass_args ); } else { do_action( 'frm_validate_form_creation', $params, $fields, $form, $title, $description ); if ( apply_filters( 'frm_continue_to_create', true, $form->id ) ) { $entry_id = self::just_created_entry( $form->id ); $pass_args['entry_id'] = $entry_id; $pass_args['reset'] = true; self::run_on_submit_actions( $pass_args ); do_action( 'frm_after_entry_processed', array( 'entry_id' => $entry_id, 'form' => $form, ) ); } }//end if } /** * If the form was processed earlier (init), get the generated errors * * @since 2.05 */ private static function get_saved_errors( $form, $params ) { global $frm_vars; if ( $params['posted_form_id'] == $form->id && $_POST && isset( $frm_vars['created_entries'][ $form->id ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing $errors = $frm_vars['created_entries'][ $form->id ]['errors']; } else { $errors = array(); } /** * Allows modifying the generated errors if the form was processed earlier. * * @since 5.2.03 * * @param array $errors Errors data. Is empty array if no errors found. * @param array $params Form params. See {@see FrmForm::get_params()}. */ return apply_filters( 'frm_saved_errors', $errors, $params ); } /** * @since 2.2.7 */ public static function just_created_entry( $form_id ) { global $frm_vars; return isset( $frm_vars['created_entries'] ) && isset( $frm_vars['created_entries'][ $form_id ] ) && isset( $frm_vars['created_entries'][ $form_id ]['entry_id'] ) ? $frm_vars['created_entries'][ $form_id ]['entry_id'] : 0; } /** * Gets confirmation method. * * @since 3.0 * @since 6.0 This method can return an array of met On Submit actions. * * @param array $atts { * Atts. * * @type object $form Form object. * @type int $entry_id Entry ID. * } * @return array|string */ private static function get_confirmation_method( $atts ) { $action = FrmOnSubmitHelper::current_event( $atts ); $opt = 'update' === $action ? 'edit_action' : 'success_action'; $method = ! empty( $atts['form']->options[ $opt ] ) ? $atts['form']->options[ $opt ] : 'message'; if ( ! empty( $atts['entry_id'] ) ) { $met_actions = self::get_met_on_submit_actions( $atts, $action ); if ( $met_actions ) { $method = $met_actions; } } $method = apply_filters( 'frm_success_filter', $method, $atts['form'], $action ); if ( $method !== 'message' && ( ! $atts['entry_id'] || ! is_numeric( $atts['entry_id'] ) ) ) { $method = 'message'; } return $method; } public static function maybe_trigger_redirect( $form, $params, $args ) { if ( ! isset( $params['id'] ) ) { global $frm_vars; $params['id'] = $frm_vars['created_entries'][ $form->id ]['entry_id']; } $conf_method = self::get_confirmation_method( array( 'form' => $form, 'entry_id' => $params['id'], 'action' => FrmOnSubmitHelper::current_event( $params ), ) ); self::maybe_trigger_redirect_with_action( $conf_method, $form, $params, $args ); } /** * Maybe trigger redirect with the new Confirmation action. * * @since 6.1.1 * * @param array|string $conf_method Array of confirmation actions or the action type string. * @param object $form Form object. * @param array $params See {@see FrmFormsController::maybe_trigger_redirect()}. * @param array $args See {@see FrmFormsController::maybe_trigger_redirect()}. */ public static function maybe_trigger_redirect_with_action( $conf_method, $form, $params, $args ) { if ( is_array( $conf_method ) && 1 === count( $conf_method ) ) { if ( 'redirect' === FrmOnSubmitHelper::get_action_type( $conf_method[0] ) ) { $event = FrmOnSubmitHelper::current_event( $params ); FrmOnSubmitHelper::populate_on_submit_data( $form->options, $conf_method[0], $event ); $conf_method = 'redirect'; } } if ( 'redirect' === $conf_method ) { self::trigger_redirect( $form, $params, $args ); } } public static function trigger_redirect( $form, $params, $args ) { $success_args = array( 'action' => $params['action'], 'conf_method' => 'redirect', 'form' => $form, 'entry_id' => $params['id'], ); if ( isset( $args['ajax'] ) ) { $success_args['ajax'] = $args['ajax']; } self::run_success_action( $success_args ); } /** * Used when the success action is not 'message' * * @since 2.05 * @since 6.0 `$args['force_delay_redirect']` is added. * * @param array $args { * The args. * * @type string $conf_method The method. * @type object $form Form object. * @type int $entry_id Entry ID. * @type string $action The action event. Accepts `create` or `update`. * @type array $fields The array of fields. * @type int $force_delay_redirect Force to show the message before redirecting in case redirect method runs. * } */ public static function run_success_action( $args ) { global $frm_vars; $extra_args = $args; unset( $extra_args['form'] ); do_action( 'frm_success_action', $args['conf_method'], $args['form'], $args['form']->options, $args['entry_id'], $extra_args ); $opt = ! isset( $args['action'] ) || $args['action'] === 'create' ? 'success' : 'edit'; $args['success_opt'] = $opt; $args['ajax'] = ! empty( $frm_vars['ajax'] ); if ( $args['conf_method'] === 'page' && is_numeric( $args['form']->options[ $opt . '_page_id' ] ) ) { self::load_page_after_submit( $args ); } elseif ( $args['conf_method'] === 'redirect' ) { self::redirect_after_submit( $args ); } else { self::show_message_after_save( $args ); } } /** * Gets met On Submit actions. * * @since 6.0 * * @param array $args See {@see FrmFormsController::run_success_action()}. * @param string $event Form event. Default is `create`. * @return array Array of actions that meet the conditional logics. */ public static function get_met_on_submit_actions( $args, $event = 'create' ) { if ( ! FrmOnSubmitHelper::form_has_migrated( $args['form'] ) ) { return array(); } // If a redirect action has already opened the URL in a new tab, we show the default message in the current tab. if ( ! empty( self::$redirected_in_new_tab[ $args['form']->id ] ) ) { return array( FrmOnSubmitHelper::get_fallback_action_after_open_in_new_tab( $event ) ); } $entry = FrmEntry::getOne( $args['entry_id'], true ); $actions = FrmOnSubmitHelper::get_actions( $args['form']->id ); $met_actions = array(); $has_redirect = false; foreach ( $actions as $action ) { if ( ! in_array( $event, $action->post_content['event'], true ) ) { continue; } if ( FrmFormAction::action_conditions_met( $action, $entry ) ) { continue; } $action_type = FrmOnSubmitHelper::get_action_type( $action ); if ( 'redirect' === $action_type ) { if ( $has_redirect ) { // Do not process because we run the first redirect action only. continue; } } if ( ! self::is_valid_on_submit_action( $action, $args, $event ) ) { continue; } if ( 'redirect' === $action_type ) { $has_redirect = true; } $met_actions[] = $action; unset( $action ); }//end foreach $args['event'] = $event; /** * Filters the On Submit actions that meet the conditional logics. * * @since 6.0 * * @param array $met_actions Actions that meet the conditional logics. * @param array $args See {@see FrmFormsController::run_success_action()}. `$args['event']` is also added. */ $met_actions = apply_filters( 'frm_get_met_on_submit_actions', $met_actions, $args ); if ( empty( $met_actions ) ) { $met_actions = array( FrmOnSubmitHelper::get_fallback_action( $event ) ); } return $met_actions; } /** * Checks if a Confirmation action has the valid data. * * @since 6.1.2 * * @param object $action Form action object. * @param array $args See {@see FrmFormsController::run_success_action()}. * @param string $event Form event. Default is `create`. * @return bool */ private static function is_valid_on_submit_action( $action, $args, $event = 'create' ) { $action_type = FrmOnSubmitHelper::get_action_type( $action ); if ( 'redirect' === $action_type ) { // Run through frm_redirect_url filter. This is used for the valid action check. $action->post_content['success_url'] = apply_filters( 'frm_redirect_url', $action->post_content['success_url'], $args['form'], $args + array( 'action' => $event ) ); return ! empty( $action->post_content['success_url'] ); } if ( 'page' === $action_type ) { if ( empty( $action->post_content['success_page_id'] ) ) { return false; } $page = get_post( $action->post_content['success_page_id'] ); if ( ! $page || 'trash' === $page->post_status ) { return false; } } return true; } /** * Runs On Submit actions. * * @since 6.0 * * @param array $args See inside {@see FrmFormsController::get_form_contents()} method. */ public static function run_on_submit_actions( $args ) { $args['conf_method'] = self::get_confirmation_method( array( 'form' => $args['form'], 'entry_id' => $args['entry_id'], 'action' => FrmOnSubmitHelper::current_event( $args ), ) ); if ( ! is_array( $args['conf_method'] ) ) { self::run_success_action( $args ); return; } // If conf_method is an array, run On Submit actions. if ( ! $args['conf_method'] ) { // Use default message. FrmOnSubmitHelper::populate_on_submit_data( $args['form']->options ); self::run_success_action( $args ); } elseif ( 1 === count( $args['conf_method'] ) ) { FrmOnSubmitHelper::populate_on_submit_data( $args['form']->options, reset( $args['conf_method'] ) ); $args['conf_method'] = $args['form']->options['success_action']; self::run_success_action( $args ); } else { self::run_multi_on_submit_actions( $args ); } } /** * Runs multiple success actions. * * @since 6.0 * * @param array $args See {@see FrmFormsController::run_success_action()}. */ public static function run_multi_on_submit_actions( $args ) { $redirect_action = null; foreach ( $args['conf_method'] as $action ) { if ( 'redirect' === FrmOnSubmitHelper::get_action_type( $action ) ) { // We catch the redirect action to run it last. $redirect_action = $action; continue; } self::run_single_on_submit_action( $args, $action ); unset( $action ); } if ( $redirect_action ) { // Show script to delay the redirection. $args['force_delay_redirect'] = true; self::run_single_on_submit_action( $args, $redirect_action ); } } /** * Runs single On Submit action. * * @since 6.0 * * @param array $args See {@see FrmFormsController::run_success_action()}. * @param object $action On Submit action object. */ public static function run_single_on_submit_action( $args, $action ) { $new_args = self::get_run_success_action_args( $args, $action ); self::run_success_action( $new_args ); } /** * Gets run_success_action() args from the On Submit action. * * @since 6.0 * * @param array $args See {@see FrmFormsController::run_success_action()}. * @param object $action On Submit action object. * @return array */ private static function get_run_success_action_args( $args, $action ) { $new_args = $args; FrmOnSubmitHelper::populate_on_submit_data( $new_args['form']->options, $action, $args['action'] ); $opt = 'update' === $args['action'] ? 'edit_' : 'success_'; $new_args['conf_method'] = $new_args['form']->options[ $opt . 'action' ]; /** * Filters the run success action args. * * @since 6.0 * * @param array $new_args The new args. * @param array $args The old args. See {@see FrmFormsController::run_success_action()}. * @param object $action On Submit action object. */ return apply_filters( 'frm_get_run_success_action_args', $new_args, $args, $action ); } /** * @since 3.0 */ private static function load_page_after_submit( $args ) { global $post; $opt = $args['success_opt']; if ( ! $post || $args['form']->options[ $opt . '_page_id' ] != $post->ID ) { $page = get_post( $args['form']->options[ $opt . '_page_id' ] ); $old_post = $post; $post = $page; $content = apply_filters( 'frm_content', $page->post_content, $args['form'], $args['entry_id'] ); // Fix the On Submit page content doesn't show when previewing In theme. $has_preview_filter = has_filter( 'the_content', 'FrmFormsController::preview_content' ); if ( $has_preview_filter ) { remove_filter( 'the_content', 'FrmFormsController::preview_content', 9999 ); } echo apply_filters( 'the_content', $content ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped if ( $has_preview_filter ) { add_filter( 'the_content', 'FrmFormsController::preview_content', 9999 ); } $post = $old_post; }//end if } /** * @since 3.0 * @param array $args See {@see FrmFormsController::run_success_action()}. */ private static function redirect_after_submit( $args ) { add_filter( 'frm_use_wpautop', '__return_false' ); $opt = $args['success_opt']; $success_url = trim( $args['form']->options[ $opt . '_url' ] ); $success_url = apply_filters( 'frm_content', $success_url, $args['form'], $args['entry_id'] ); $success_url = do_shortcode( $success_url ); $args['id'] = $args['entry_id']; FrmEntriesController::delete_entry_before_redirect( $success_url, $args['form'], $args ); add_filter( 'frm_redirect_url', 'FrmEntriesController::prepare_redirect_url' ); $success_url = apply_filters( 'frm_redirect_url', $success_url, $args['form'], $args ); $doing_ajax = FrmAppHelper::doing_ajax(); if ( ! empty( $args['ajax'] ) && $doing_ajax && empty( $args['force_delay_redirect'] ) ) { // Is AJAX submit and there is just one Redirect action runs. echo json_encode( self::get_ajax_redirect_response_data( $args + compact( 'success_url' ) ) ); wp_die(); } if ( ! headers_sent() && empty( $args['force_delay_redirect'] ) ) { // Not AJAX submit, no headers sent, and there is just one Redirect action runs. if ( ! empty( $args['form']->options['open_in_new_tab'] ) ) { self::print_open_in_new_tab_js_with_fallback_handler( $success_url, $args ); self::$redirected_in_new_tab[ $args['form']->id ] = 1; return; } wp_redirect( esc_url_raw( $success_url ) ); // Do not use wp_die or redirect fails. die(); } // Redirect with a delay. self::redirect_after_submit_using_js( $args + compact( 'success_url', 'doing_ajax' ) ); } /** * Prints open in new tab js with fallback handler. * * @since 6.3.1 * * @param string $success_url Success URL. * @param array $args See {@see FrmFormsController::redirect_after_submit()}. */ private static function print_open_in_new_tab_js_with_fallback_handler( $success_url, $args ) { echo ''; } /** * Gets response data for redirect action when AJAX submitting. * * @since 6.3.1 * * @param array $args See {@see FrmFormsController::run_success_action()}. * @return array */ private static function get_ajax_redirect_response_data( $args ) { $response_data = array( 'redirect' => $args['success_url'] ); if ( ! empty( $args['form']->options['open_in_new_tab'] ) ) { $response_data['openInNewTab'] = 1; $args['message'] = FrmOnSubmitHelper::get_default_new_tab_msg(); $args['form']->options['success_msg'] = $args['message']; $args['form']->options['edit_msg'] = $args['message']; if ( ! isset( $args['fields'] ) ) { $args['fields'] = FrmField::get_all_for_form( $args['form']->id ); } $args['message'] = self::prepare_submit_message( $args['form'], $args['entry_id'], $args ); ob_start(); self::show_lone_success_message( $args ); $response_data['content'] = ob_get_clean(); $response_data['fallbackMsg'] = self::get_redirect_fallback_message( $args['success_url'], $args ); } return $response_data; } /** * Redirects after submitting using JS. This is used when showing message before redirecting. * * @since 6.0 * * @param array $args See {@see FrmFormsController::run_success_action()}. */ private static function redirect_after_submit_using_js( $args ) { $success_msg = FrmOnSubmitHelper::get_default_redirect_msg(); $redirect_msg = self::get_redirect_message( $args['success_url'], $success_msg, $args ); $success_url = esc_url_raw( $args['success_url'] ); /** * Filters the delay time before redirecting when On Submit Redirect action is delayed. * * @since 6.0 * * @param int $delay_time Delay time in milliseconds. */ $delay_time = apply_filters( 'frm_redirect_delay_time', 8000 ); if ( ! empty( $args['form']->options['open_in_new_tab'] ) ) { $redirect_js = 'window.open("' . $success_url . '", "_blank")'; } else { $redirect_js = 'window.location="' . $success_url . '";'; } add_filter( 'frm_use_wpautop', '__return_true' ); echo FrmAppHelper::maybe_kses( $redirect_msg ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo ''; } /** * @since 3.0 * * @param string $success_url * @param string $success_msg * @param array $args */ private static function get_redirect_message( $success_url, $success_msg, $args ) { $redirect_msg = '
' . $success_msg . '
' . self::get_redirect_fallback_message( $success_url, $args ) . '
'; $redirect_args = array( 'entry_id' => $args['entry_id'], 'form_id' => $args['form']->id, 'form' => $args['form'], ); return apply_filters( 'frm_redirect_msg', $redirect_msg, $redirect_args ); } /** * Gets fallback message when redirecting failed. * * @since 6.3.1 * * @param string $success_url Redirect URL. * @param array $args Contains `form` object. * @return string */ private static function get_redirect_fallback_message( $success_url, $args ) { $target = ''; if ( ! empty( $args['form']->options['open_in_new_tab'] ) ) { $target = ' target="_blank"'; } return sprintf( /* translators: %1$s: Start link HTML, %2$s: End link HTML */ __( '%1$sClick here%2$s if you are not automatically redirected.', 'formidable' ), '', '' ); } /** * Prepare to show the success message and empty form after submit * * @since 2.05 */ public static function show_message_after_save( $atts ) { $atts['message'] = self::prepare_submit_message( $atts['form'], $atts['entry_id'], $atts ); if ( ! isset( $atts['form']->options['show_form'] ) || $atts['form']->options['show_form'] ) { if ( isset( $atts['action'] ) && 'update' === $atts['action'] && is_callable( array( 'FrmProEntriesController', 'show_front_end_form_with_entry' ) ) ) { $entry = FrmEntry::getOne( $atts['entry_id'] ); if ( $entry ) { // This is copied from the Pro plugin. $atts['conf_message'] = FrmProEntriesController::confirmation( 'message', $atts['form'], $atts['form']->options, $entry->id, $atts ); $atts['show_form'] = FrmProEntriesController::is_form_displayed_after_edit( $atts['form'] ); FrmProEntriesController::show_front_end_form_with_entry( $entry, $atts ); } } else { self::show_form_after_submit( $atts ); } } else { self::show_lone_success_message( $atts ); } } /** * Show an empty form * * @since 2.05 */ private static function show_form_after_submit( $args ) { self::fill_atts_for_form_display( $args ); $errors = $args['errors']; $message = $args['message']; $form = $args['form']; $title = $args['title']; $description = $args['description']; if ( empty( $args['fields'] ) ) { $values = array( 'custom_style' => FrmAppHelper::custom_style_value( array() ), ); } else { $values = FrmEntriesHelper::setup_new_vars( $args['fields'], $form, $args['reset'] ); } unset( $args ); $include_form_tag = apply_filters( 'frm_include_form_tag', true, $form ); $frm_settings = FrmAppHelper::get_settings(); $submit = isset( $form->options['submit_value'] ) ? $form->options['submit_value'] : $frm_settings->submit_value; global $frm_vars; self::maybe_load_css( $form, $values['custom_style'], $frm_vars['load_css'] ); $message_placement = self::message_placement( $form, $message ); include FrmAppHelper::plugin_path() . '/classes/views/frm-entries/new.php'; } /** * @since 4.05.02 * @return string - 'before', 'after', or 'submit' */ private static function message_placement( $form, $message ) { $place = 'before'; if ( $message && isset( $form->options['form_class'] ) ) { if ( strpos( $form->options['form_class'], 'frm_below_success' ) !== false ) { $place = 'after'; } elseif ( strpos( $form->options['form_class'], 'frm_inline_success' ) !== false ) { $place = 'submit'; } } /** * @since 4.05.02 * @return string - 'before' or 'after' */ return apply_filters( 'frm_message_placement', $place, compact( 'form', 'message' ) ); } /** * Get all the values needed on the new.php entry page * * @since 2.05 */ private static function fill_atts_for_form_display( &$args ) { if ( ! isset( $args['title'] ) && isset( $args['show_title'] ) ) { $args['title'] = $args['show_title']; } if ( ! isset( $args['description'] ) && isset( $args['show_description'] ) ) { $args['description'] = $args['show_description']; } $defaults = array( 'errors' => array(), 'message' => '', 'fields' => array(), 'form' => array(), 'title' => true, 'description' => false, 'reset' => false, ); $args = wp_parse_args( $args, $defaults ); } /** * Show the success message without the form * * @since 2.05 */ private static function show_lone_success_message( $atts ) { global $frm_vars; $values = FrmEntriesHelper::setup_new_vars( $atts['fields'], $atts['form'], true ); self::maybe_load_css( $atts['form'], $values['custom_style'], $frm_vars['load_css'] ); $include_extra_container = 'frm_forms' . FrmFormsHelper::get_form_style_class( $values ); $errors = array(); $form = $atts['form']; $message = $atts['message']; include FrmAppHelper::plugin_path() . '/classes/views/frm-entries/errors.php'; } /** * Prepare the success message before it's shown * * @since 2.05 * @since 6.0.x Added the third parameter. * * @param object $form Form object. * @param int $entry_id Entry ID. * @param array $args See {@see FrmFormsController::run_success_action()}. * @return string */ private static function prepare_submit_message( $form, $entry_id, $args = array() ) { $frm_settings = FrmAppHelper::get_settings( array( 'current_form' => $form->id ) ); $opt = isset( $args['success_opt'] ) ? $args['success_opt'] : 'success'; if ( $entry_id && is_numeric( $entry_id ) ) { $message = isset( $form->options[ $opt . '_msg' ] ) ? $form->options[ $opt . '_msg' ] : $frm_settings->success_msg; $class = 'frm_message'; } else { $message = $frm_settings->failed_msg; $class = FrmFormsHelper::form_error_class(); } $message = FrmFormsHelper::get_success_message( compact( 'message', 'form', 'entry_id', 'class' ) ); return apply_filters( 'frm_main_feedback', $message, $form, $entry_id ); } /** * @return void */ public static function front_head() { $version = FrmAppHelper::plugin_version(); $suffix = FrmAppHelper::js_suffix(); if ( ! empty( $suffix ) && self::has_combo_js_file() ) { wp_register_script( 'formidable', FrmAppHelper::plugin_url() . '/js/frm.min.js', array( 'jquery' ), $version, true ); } else { wp_register_script( 'formidable', FrmAppHelper::plugin_url() . "/js/formidable{$suffix}.js", array( 'jquery' ), $version, true ); } add_filter( 'script_loader_tag', 'FrmFormsController::defer_script_loading', 10, 2 ); if ( FrmAppHelper::is_admin() ) { // don't load this in back-end return; } FrmAppHelper::localize_script( 'front' ); FrmStylesController::enqueue_css( 'register' ); } /** * @since 3.0 */ public static function has_combo_js_file() { return is_readable( FrmAppHelper::plugin_path() . '/js/frm.min.js' ); } public static function maybe_load_css( $form, $this_load, $global_load ) { $load_css = FrmForm::is_form_loaded( $form, $this_load, $global_load ); if ( ! $load_css ) { return; } global $frm_vars; self::footer_js( 'header' ); $frm_vars['css_loaded'] = true; self::load_late_css(); } /** * If css is loaded only on applicable pages, include it before the form loads * to prevent a flash of unstyled form. * * @since 4.01 * * @return void */ private static function load_late_css() { $frm_settings = FrmAppHelper::get_settings(); $late_css = $frm_settings->load_style === 'dynamic'; if ( ! $late_css || ! self::should_load_late() ) { return; } global $wp_styles; if ( is_array( $wp_styles->queue ) && in_array( 'formidable', $wp_styles->queue, true ) ) { wp_print_styles( 'formidable' ); } } /** * Avoid late load if All in One SEO is active because it prevents CSS from loading entirely. * * @since 5.2.03 * * @return bool */ private static function should_load_late() { return ! function_exists( 'aioseo' ); } public static function defer_script_loading( $tag, $handle ) { if ( 'captcha-api' == $handle && ! strpos( $tag, 'defer' ) ) { $tag = str_replace( ' src', ' defer="defer" async="async" src', $tag ); } return $tag; } public static function footer_js( $location = 'footer' ) { global $frm_vars; FrmStylesController::enqueue_css(); if ( ! FrmAppHelper::is_admin() && $location !== 'header' && ! empty( $frm_vars['forms_loaded'] ) ) { // load formidable js wp_enqueue_script( 'formidable' ); } } /** * @since 2.0.8 */ private static function maybe_minimize_form( $atts, &$content ) { // check if minimizing is turned on if ( self::is_minification_on( $atts ) ) { $content = str_replace( array( "\r\n", "\r", "\n", "\t", ' ' ), '', $content ); } } /** * @since 2.0.8 * @return bool */ private static function is_minification_on( $atts ) { return ! empty( $atts['minimize'] ); } /** * @since 5.0.16 * * @return void */ public static function landing_page_preview_option() { $dir = apply_filters( 'frm_landing_page_preview_option', false ); if ( false === $dir || ! file_exists( $dir . 'landing-page-preview-option.php' ) ) { $dir = self::get_form_views_path(); } include $dir . 'landing-page-preview-option.php'; } /** * @since 5.0.16 * * @return string */ private static function get_form_views_path() { return FrmAppHelper::plugin_path() . '/classes/views/frm-forms/'; } /** * Create a page with an embedded formidable Gutenberg block. * * @since 5.2 * * @return void */ public static function create_page_with_shortcode() { if ( ! current_user_can( 'publish_posts' ) ) { die( 0 ); } check_ajax_referer( 'frm_ajax', 'nonce' ); $type = FrmAppHelper::get_post_param( 'type', '', 'sanitize_text_field' ); if ( ! $type || ! in_array( $type, array( 'form', 'view' ), true ) ) { die( 0 ); } $object_id = FrmAppHelper::get_post_param( 'object_id', '', 'absint' ); if ( ! $object_id ) { die( 0 ); } $postarr = array( 'post_type' => 'page' ); if ( 'form' === $type ) { $postarr['post_content'] = self::get_page_shortcode_content_for_form( $object_id ); } else { $postarr['post_content'] = apply_filters( 'frm_create_page_with_' . $type . '_shortcode_content', '', $object_id ); } $name = FrmAppHelper::get_post_param( 'name', '', 'sanitize_text_field' ); if ( $name ) { $postarr['post_title'] = $name; } $success = wp_insert_post( $postarr ); if ( ! is_numeric( $success ) || ! $success ) { die( 0 ); } wp_send_json( array( 'redirect' => get_edit_post_link( $success, 'redirect' ), ) ); } /** * @since 5.3 * * @param int $form_id * @return string */ private static function get_page_shortcode_content_for_form( $form_id ) { $shortcode = '[formidable id="' . $form_id . '"]'; $html_comment_start = ''; $html_comment_end = ''; return $html_comment_start . '
' . $shortcode . '
' . $html_comment_end; } /** * Get page dropdown for AJAX request for embedding form in an existing page. * * @return void */ public static function get_page_dropdown() { if ( ! current_user_can( 'publish_posts' ) ) { die( 0 ); } check_ajax_referer( 'frm_ajax', 'nonce' ); $html = FrmAppHelper::clip( function () { FrmAppHelper::maybe_autocomplete_pages_options( array( 'field_name' => 'frm_page_dropdown', 'page_id' => '', 'placeholder' => __( 'Select a Page', 'formidable' ), ) ); } ); $post_type_object = get_post_type_object( 'page' ); wp_send_json( array( 'html' => $html, 'edit_page_url' => admin_url( sprintf( $post_type_object->_edit_link . '&action=edit', 0 ) ), ) ); } /** * @deprecated 4.0 */ public static function create( $values = array() ) { _deprecated_function( __METHOD__, '4.0', 'FrmFormsController::update' ); self::update( $values ); } /** * @deprecated 6.7 * * @return bool */ public static function expired() { _deprecated_function( __METHOD__, '6.7' ); return FrmAddonsController::is_license_expired(); } }
Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'FrmFormsController' not found in /home/ecofinir/public_html/wp-includes/class-wp-hook.php on line 324
تفاوت رشد،پیشرفت و توسعه - اکوفاین | مدیریتی ، مالی ، اقتصادی

Blog Post

تفاوت رشد،پیشرفت و توسعه
تفاوت "رشد"، "پیشرفت" و "توسعه"
مدیریت

تفاوت رشد،پیشرفت و توسعه 

تفاوت “رشد”، “پیشرفت” و “توسعه”

سه واژه رشد (Growth)، پیشرفت (Progress) و توسعه (Development) در سه معنای مختلفی به کار برده می‌شوند

و حال اینکه ما در بسیاری اوقات آن‌ها را جابه‌جا به کار می‌بریم.

“رشد”

تکثیر وضع موجود است. به عنوان مثال ایران خودرو امسال 100 هزار خودرو تولید کرده است

و سال دیگر 200 هزار خودرو با همان وضعیت تولید می‌کند یا افزایش تعداد جاده‌ها، فرودگاه‌ها، سدها نشانه رشد است.

“پیشرفت”

اما در مرحله بالاتری از رشد و به معنای این است که وضع موجود را با کیفیت مادی یا فناوری بهتری تکثیر کنیم یا ارتقا دهیم.

به طور مثال ایران خودرو در سال آینده خودروهای مدل بالاتری را با کیفیت و فناوری بهتر تولید می‌کند. یا اینکه سدها با فرآیند متفاوت و کیفیت بهینه‌تری ساخته شود. یا اینکه فولاد مبارکه تولید فولاد را به جای روش کوره بلند با روش قوس الکتریکی تولید کند. این‌ها نمونه هایی از مصادیق پیشرفت هستند.

ما بعد از انقلاب شاهد رشد و پیشرفت زیادی بودیم، حتی در برخی حوزه‌ها بیش از حد رشد و گاهی پیشرفت داشته‌ایم.

اما واژه سوم یعنی

 “توسعه”

.  برخلاف دو مفهوم قبلی، به معنای تحول کیفی در پدیده موجود است.

توسعه به معنای تغییر در خلق‌وخوی فردی و الگوهای رفتاری، اجتماعی و حتی ماهیت پدیده‌هاست. به طور مثال اگر عضلات را قوی کنیم و افزایش دهیم با پدیده رشد روبه‌رو هستیم. اگر با این عضلات بتوانیم کارهای حرفه‌ای ورزشی مثل ژیمناستیک انجام بدهیم با پدیده پیشرفت همراه بوده‌ایم اما اگر از لحاظ رفتارها و خلق‌وخوها انسان متفاوت دیگری شدیم، توسعه یافته‌ایم.

در توسعه، جامعه جان‌دارترمی‌شود. در جامعه توسعه یافته، حساسیت‌ها و توجهات بیشتر است

و جامعه نسبت به هر رفتاری واکنش نشان می‌دهد. به همین دلیل است که در جوامع توسعه یافته، جامعه زنده و پویاست و به نوعی روح پیدا می‌کند. زمانی که توسعه روی می‌دهد ابعاد کمّی پیشرفت و رشد در روح متجلی می‌شود و کیفیت تحول، مدنظر قرار می‌گیرد.

در واقع، از منظر دیگری، توسعه دارای دو بعد است:
«بعد اقتصادی و مادی» و بعد «فرهنگی و رفتاری».
در بعد اقتصادی، توسعه تولید «رفاه» می‌کند و رفاه زمانی است که ما می‌توانیم خود را از فشارها و تصادف‌های طبیعی و غیرطبیعی مصون کنیم.

در این بعدِ توسعه، ما نیازمند سرمایه اقتصادی هستیم.

سرمایه اقتصادی هم نیروی انسانی می‌خواهد و نیروی انسانی هم در دانشگاه تربیت می‌شود.بنابراین احساس نیازبه نیروی فنی شکل می‌گیرد.

بعد اقتصادی به دنبال رفاه است و فرآیندی که طی می‌شود،رشدو پیشرفت است.

اماتوسعه، بعد فرهنگی و رفتاری هم دارد؛ زمانی شما تمامی ابزارها وامکانات اقتصادی و رفاهی را در اختیار دارید اما از وضعیت جامعه‌تان احساس ناراحتی و کلافگی می‌کنید، آرام و قرار ندارید و نسبت به رفتارهای پیرامونی خود احساس انزجار می‌کنید. با وجود اینکه رفاه دارید اما احساس رضایت نمی‌کنید. مثلا ما در خودرویی مدرن با «رفاه» کامل نشسته ایم اما به علت بی‌نظمی و بی‌قانونی، از رانندگی در این شهر «رضایت» نداریم. در واقع فرزندان ما به دلیل عدم احساس رضایت است که مهاجرت می‌کنند و با پدیده فرار مغزها مواجه می‌شویم.

ما به طور نسبی «رفاه» داریم اما «رضایت» همان چیزی است که ما نمی‌توانیم تولید کنیم و به واقع رضایت نتیجه همان بعد دوم توسعه یعنی بعد فرهنگی رفتاری است.

زمانی که بعد دوم توسعه رخ نمی‌دهد، روابط و رفتارهای ما تیز و برنده و پرهزینه می‌شود. در جوامع توسعه نیافته، شما اگر چه ابزارهای پیشرفت را در اختیار دارید اما رفتارهایتان تیز و همراه با خشونت است.

بنابراین در این مفهوم، توسعه به معنای صیقل دادن تیزی‌های اجتماعی است. جامعه‌ای که توانایی این را داشته باشد که تیزی‌ها را صیقل دهد، مناسباتش توسعه می‌یابد. بعد فرهنگی و رفتاری توسعه، تیزی های رفتار ما را صیقل می‌دهد و مناسبات اجتماعی ما را کم هزینه تر می‌کند و در نتیجه صیقل خوردن تیزی‌ها، رضایت شکل می‌گیرد.

نویسنده :دکتر رنانی

آیا این محتوا برای شما مفید بود ؟

روی ستارها کلیک کنید تا امتیاز شما ثبت شود!

میانگین امتیاز 0 / 5. تعداد آرا: 0

تا الان رای نیامده! اولین نفری باشید که به این پست امتیاز می دهید.

مطالب مرتبط

یک دیدگاه

  1. اکوفاین | بهترین سرمایه گذاری برای فرزندان

    […] پول های زیادی تان را برای پیشرفت خودشان صرف […]

دیدگاهتان را بنویسید

بخش های ضروری علامت گذاری شده اند *