File "FrmProFormActionsController.php"
Full path: /home/bud/public_html/swamp/wp-admin/wp-content/plugins/formidable-pro/classes/controllers/FrmProFormActionsController.php
File size: 17.56 KB
MIME-type: text/x-php
Charset: utf-8
<?php
if ( ! defined( 'ABSPATH' ) ) {
die( 'You are not allowed to call this page directly.' );
}
class FrmProFormActionsController {
public static function register_actions( $actions ) {
$actions['wppost'] = 'FrmProPostAction';
include_once(FrmProAppHelper::plugin_path() . '/classes/views/frmpro-form-actions/post_action.php');
return $actions;
}
public static function email_action_control( $settings ) {
$settings['event'] = array_unique(
array_merge(
$settings['event'],
array( 'draft', 'create', 'update', 'delete', 'import' )
)
);
$settings['priority'] = 41;
return $settings;
}
public static function form_action_settings( $form_action, $atts ) {
global $wpdb;
extract( $atts );
$show_logic = self::has_valid_conditions( $form_action->post_content['conditions'] );
// Text for different actions
if ( $form_action->post_excerpt === 'email' ) {
/**
* Adds fields to add email attachment.
*/
self::add_file_attachment_field( $form_action, $atts );
$send = __( 'Send', 'formidable-pro' );
$stop = __( 'Stop', 'formidable-pro' );
$this_action_if = __( 'this notification if', 'formidable-pro' );
} if ( $form_action->post_excerpt === 'wppost' ) {
$send = __( 'Create', 'formidable-pro' );
$stop = __( 'Don\'t create', 'formidable-pro' );
$this_action_if = __( 'this post if', 'formidable-pro' );
} elseif ( $form_action->post_excerpt === 'register' ) {
$send = __( 'Register', 'formidable-pro' );
$stop = __( 'Don\'t register', 'formidable-pro' );
$this_action_if = __( 'user if', 'formidable-pro' );
} else {
$send = __( 'Do', 'formidable-pro' );
$stop = __( 'Don\'t do', 'formidable-pro' );
$this_action_if = __( 'this action if', 'formidable-pro' );
}
$form_fields = $atts['values']['fields'];
unset( $atts['values']['fields'] );
include FrmProAppHelper::plugin_path() . '/classes/views/frmpro-form-actions/_form_action.php';
}
/**
* Adds necessary fields to attach a file as attachment to email.
*
* @param object $form_action Describes the current Form Action.
* @param object $pass_args
*
* @since 4.06.02
*/
private static function add_file_attachment_field( $form_action, $pass_args ) {
$has_attachment = ! empty( $form_action->post_content['email_attachment_id'] );
$can_generate_csv_file = is_callable( 'FrmXMLController::get_fields_for_csv_export' );
include FrmProAppHelper::plugin_path() . '/classes/views/frmpro-form-actions/_email_attachment_row.php';
}
/**
* @since 4.06.02
*/
public static function action_conditions_met( $action, $entry ) {
$notification = $action->post_content;
$stop = false;
$met = array();
if ( ! isset( $notification['conditions'] ) || empty( $notification['conditions'] ) ) {
return $stop;
}
foreach ( $notification['conditions'] as $k => $condition ) {
if ( ! is_numeric( $k ) ) {
continue;
}
if ( $stop && 'any' === $notification['conditions']['any_all'] && 'stop' === $notification['conditions']['send_stop'] ) {
continue;
}
self::prepare_logic_value( $condition['hide_opt'], $action, $entry );
$observed_value = self::get_value_from_entry( $entry, $condition['hide_field'] );
$stop = FrmFieldsHelper::value_meets_condition( $observed_value, $condition['hide_field_cond'], $condition['hide_opt'] );
if ( $notification['conditions']['send_stop'] === 'send' ) {
$stop = $stop ? false : true;
}
$met[ $stop ] = $stop;
}
if ( $notification['conditions']['any_all'] === 'all' && ! empty( $met ) && isset( $met[0] ) && isset( $met[1] ) ) {
$stop = ( $notification['conditions']['send_stop'] === 'send' );
} elseif ( $notification['conditions']['any_all'] === 'any' && $notification['conditions']['send_stop'] === 'send' && isset( $met[0] ) ) {
$stop = false;
}
return $stop;
}
/**
* Prepare the logic value for comparison against the entered value
*
* @since 4.06.02
*
* @param array|string $logic_value
*/
private static function prepare_logic_value( &$logic_value, $action, $entry ) {
if ( is_array( $logic_value ) ) {
$logic_value = reset( $logic_value );
}
if ( $logic_value === 'current_user' ) {
$logic_value = get_current_user_id();
}
$logic_value = apply_filters( 'frm_content', $logic_value, $action->menu_order, $entry );
/**
* @since 4.04.05
*/
$logic_value = apply_filters( 'frm_action_logic_value', $logic_value );
}
/**
* Get the value from a specific field and entry
*
* @since 4.06.02
*
* @param object $entry
* @param int $field_id
*
* @return array|bool|mixed|string
*/
private static function get_value_from_entry( $entry, $field_id ) {
$observed_value = '';
if ( isset( $entry->metas[ $field_id ] ) ) {
$observed_value = $entry->metas[ $field_id ];
} elseif ( FrmAppHelper::pro_is_installed() ) {
$field = FrmField::getOne( $field_id );
if ( $entry->post_id ) {
$observed_value = FrmProEntryMetaHelper::get_post_or_meta_value(
$entry,
$field,
array(
'links' => false,
'truncate' => false,
)
);
} else {
$observed_value = self::maybe_get_repeater_values_from_entry( $field, $entry );
}
}
/**
* @since 4.06.02
*/
$observed_value = apply_filters( 'frm_action_logic_value', $observed_value, compact( 'entry', 'field_id' ) );
return $observed_value;
}
/**
* @param stdClass $field
* @param stdClass $entry
* @return array|string
*/
private static function maybe_get_repeater_values_from_entry( $field, $entry ) {
if ( ! $field || empty( $field->field_options['in_section'] ) || ! isset( $entry->metas[ $field->field_options['in_section'] ] ) || (int) $entry->form_id === (int) $field->form_id ) {
return '';
}
global $wpdb;
return FrmDb::get_col(
$wpdb->prefix . 'frm_item_metas m INNER JOIN ' . $wpdb->prefix . 'frm_items i ON i.id = m.item_id',
array(
'm.field_id' => $field->id,
'i.parent_item_id' => $entry->id,
),
'm.meta_value'
);
}
public static function _logic_row() {
FrmAppHelper::permission_check('frm_edit_forms');
check_ajax_referer( 'frm_ajax', 'nonce' );
$meta_name = FrmAppHelper::get_param( 'meta_name', '', 'get', 'sanitize_title' );
$form_id = FrmAppHelper::get_param( 'form_id', '', 'get', 'absint' );
$key = FrmAppHelper::get_param( 'email_id', '', 'get', 'sanitize_title' );
$type = FrmAppHelper::get_param( 'type', '', 'get', 'sanitize_title' );
$form = FrmForm::getOne($form_id);
FrmProFormsController::include_logic_row(
array(
'form_id' => $form->id,
'form' => $form,
'meta_name' => $meta_name,
'condition' => array( 'hide_field_cond' => '==', 'hide_field' => '' ),
'key' => $key,
'name' => 'frm_' . $type . '_action[' . $key . '][post_content][conditions][' . $meta_name . ']',
'hidelast' => '#frm_logic_rows_' . $key,
'showlast' => '#logic_link_' . $key,
)
);
wp_die();
}
/**
* Before the form action is saved, check for logic that
* needs to be removed.
*
* @since 3.0
*/
public static function remove_incomplete_logic( $settings ) {
if ( isset( $settings['post_content']['conditions'] ) ) {
self::remove_logic_without_field( $settings['post_content']['conditions'] );
}
return $settings;
}
/**
* If a condition doesn't include a selected field, remove it
*
* @since 3.0
*/
private static function remove_logic_without_field( &$conditions ) {
if ( empty( $conditions ) ) {
return;
}
foreach ( $conditions as $k => $condition ) {
if ( ! is_numeric( $k ) ) {
continue;
}
if ( empty( $condition['hide_field'] ) ) {
unset( $conditions[ $k ] );
}
}
}
/**
* If logic includes rows with a field selected, it is value
*
* @since 3.0
*
* @return bool
*/
private static function has_valid_conditions( $conditions ) {
self::remove_logic_without_field( $conditions );
return count( $conditions ) > 2;
}
public static function fill_action_options( $action, $type ) {
if ( 'wppost' == $type ) {
$default_values = array(
'post_type' => 'post',
'post_category' => array(),
'post_content' => '',
'post_excerpt' => '',
'post_title' => '',
'post_name' => '',
'post_date' => '',
'post_status' => '',
'post_custom_fields' => array(),
'post_password' => '',
'post_parent' => '',
'menu_order' => '',
);
$action->post_content = array_merge($default_values, (array) $action->post_content);
}
return $action;
}
/**
* @since 2.0.23
*/
public static function maybe_trigger_draft_actions( $event, $args ) {
if ( isset( $args['entry_id'] ) && FrmProEntry::is_draft( $args['entry_id'] ) ) {
$event = 'draft';
}
return $event;
}
public static function trigger_draft_actions( $entry_id, $form_id ) {
FrmFormActionsController::trigger_actions( 'draft', $form_id, $entry_id );
}
public static function trigger_update_actions( $entry_id, $form_id ) {
$event = apply_filters( 'frm_trigger_update_action', 'update', array( 'entry_id' => $entry_id ) );
FrmFormActionsController::trigger_actions( $event, $form_id, $entry_id );
}
public static function trigger_delete_actions( $entry_id, $entry = false ) {
if ( empty( $entry ) ) {
$entry = FrmEntry::getOne( $entry_id );
}
FrmFormActionsController::trigger_actions('delete', $entry->form_id, $entry);
}
public static function _postmeta_row() {
FrmAppHelper::permission_check('frm_edit_forms');
check_ajax_referer( 'frm_ajax', 'nonce' );
$custom_data = array( 'meta_name' => $_POST['meta_name'], 'field_id' => '');
$action_key = absint( $_POST['action_key'] );
$action_control = FrmFormActionsController::get_form_actions( 'wppost' );
$action_control->_set($action_key);
$values = array();
if ( isset($_POST['form_id']) ) {
$values['fields'] = FrmField::getAll( array( 'fi.form_id' => absint( $_POST['form_id'] ), 'fi.type not' => FrmField::no_save_fields() ), 'field_order');
}
$echo = false;
$cf_keys = self::get_post_meta_keys();
include(FrmProAppHelper::plugin_path() . '/classes/views/frmpro-form-actions/_custom_field_row.php');
wp_die();
}
private static function get_post_meta_keys() {
global $wpdb;
$post_type = FrmAppHelper::get_param( 'post_type', 'post', 'post', 'sanitize_text_field' );
$limit = (int) apply_filters( 'postmeta_form_limit', 50 );
$sql = "SELECT DISTINCT meta_key
FROM $wpdb->postmeta pm
LEFT JOIN $wpdb->posts p
ON (p.ID = pm.post_ID)
WHERE p.post_type = %s
ORDER BY meta_key
LIMIT %d";
$cf_keys = $wpdb->get_col( $wpdb->prepare( $sql, $post_type, $limit ) );
if ( ! is_array( $cf_keys ) ) {
$cf_keys = array();
}
if ( 'post' == $post_type && ! in_array( '_thumbnail_id', $cf_keys ) ) {
$cf_keys[] = '_thumbnail_id';
}
if ( ! empty( $cf_keys ) ) {
natcasesort( $cf_keys );
}
return $cf_keys;
}
public static function _posttax_row() {
FrmAppHelper::permission_check('frm_edit_forms');
check_ajax_referer( 'frm_ajax', 'nonce' );
if ( isset($_POST['field_id']) ) {
$field_vars = array(
'meta_name' => $_POST['meta_name'],
'field_id' => $_POST['field_id'],
'show_exclude' => (int) $_POST['show_exclude'],
'exclude_cat' => ( (int) $_POST['show_exclude'] ) ? '-1' : 0
);
} else {
$field_vars = array( 'meta_name' => '', 'field_id' => '', 'show_exclude' => 0, 'exclude_cat' => 0);
}
$tax_meta = (int) $_POST['tax_key'];
$post_type = sanitize_text_field( $_POST['post_type'] );
$action_key = (int) $_POST['action_key'];
$action_control = FrmFormActionsController::get_form_actions( 'wppost' );
$action_control->_set($action_key);
if ( $post_type ) {
$taxonomies = get_object_taxonomies($post_type);
}
$values = array();
if ( isset($_POST['form_id']) ) {
$values['fields'] = FrmField::getAll( array( 'fi.form_id' => (int) $_POST['form_id'], 'fi.type' => array( 'checkbox', 'radio', 'select', 'tag', 'data' ) ), 'field_order' );
$values['id'] = (int) $_POST['form_id'];
}
$echo = false;
include(FrmProAppHelper::plugin_path() . '/classes/views/frmpro-form-actions/_post_taxonomy_row.php');
wp_die();
}
public static function _replace_posttax_options() {
FrmAppHelper::permission_check('frm_edit_forms');
check_ajax_referer( 'frm_ajax', 'nonce' );
// Get the post type, and all taxonomies for that post type
$post_type = sanitize_text_field( $_POST['post_type'] );
$taxonomies = get_object_taxonomies($post_type);
// Get the HTML for the options
include(FrmProAppHelper::plugin_path() . '/classes/views/frmpro-form-actions/_post_taxonomy_select.php');
wp_die();
}
/**
* Display the taxonomy checkboxes for a specific taxonomy in a Create Post action
*
* @since 2.01.0
* @param array $args (MUST include taxonomy, form_id, field_name, and value)
*/
public static function display_taxonomy_checkboxes_for_post_action( $args ) {
if ( ! $args['taxonomy'] ) {
return;
}
$args['level'] = 1;
$args['post_type'] = FrmProFormsHelper::post_type( $args['form_id'] );
$children = get_categories(
array(
'hide_empty' => false,
'parent' => 0,
'type' => $args['post_type'],
'taxonomy' => $args['taxonomy'],
)
);
foreach ( $children as $key => $cat ) {
$args['cat'] = $cat; ?>
<div class="frm_catlevel_1"><?php
self::display_taxonomy_checkbox_group( $args );
?>
</div><?php
}
}
/**
* Display a single taxonomy checkbox and its children
*
* @since 2.01.0
* @param array $args (MUST include cat, value, field_name, post_type, taxonomy, and level)
*/
private static function display_taxonomy_checkbox_group( $args ) {
if ( ! is_object($args['cat']) ) {
return;
}
if ( is_array($args['value']) ) {
$checked = ( in_array($args['cat']->cat_ID, $args['value'] ) ) ? ' checked="checked" ' : '';
} else {
$checked = checked( $args['value'], $args['cat']->cat_ID, false );
}
?>
<div class="frm_checkbox">
<label><input type="checkbox" name="<?php echo esc_attr( $args['field_name'] ); ?>" value="<?php
echo esc_attr( $args['cat']->cat_ID );
?>"<?php
echo $checked;
?> /><?php echo esc_html( $args['cat']->cat_name ); ?></label><?php
$children = get_categories(
array(
'type' => $args['post_type'],
'hide_empty' => false,
'parent' => $args['cat']->cat_ID,
'taxonomy' => $args['taxonomy'],
)
);
if ( $children ) {
$args['level']++;
foreach ( $children as $key => $cat ) {
$args['cat'] = $cat;
?>
<div class="frm_catlevel_<?php echo esc_attr( $args['level'] ); ?>"><?php self::display_taxonomy_checkbox_group( $args ); ?></div>
<?php
}
}
echo '</div>';
}
/**
* AJAX get post parent option.
*
* @since 4.10.01
*/
public static function ajax_get_post_parent_option() {
FrmAppHelper::permission_check( 'frm_edit_forms' );
check_ajax_referer( 'frm_ajax' );
$post_type = FrmAppHelper::get_post_param( 'post_type', '', 'sanitize_text_field' );
if ( ! $post_type ) {
wp_send_json_error( __( 'Post type is empty', 'formidable-pro' ) );
}
if ( ! is_post_type_hierarchical( $post_type ) ) {
wp_die( '0' );
}
FrmProPostAction::post_parent_dropdown(
array(
'post_type' => $post_type,
'field_name' => 'REPLACETHISNAME', // This string is replaced in file js/formidable_admin.js in the lite version.
)
);
wp_die();
}
/**
* AJAX get post parent option.
*
* @since 4.11.03
*/
public static function ajax_should_use_post_menu_order_option() {
FrmAppHelper::permission_check( 'frm_edit_forms' );
check_ajax_referer( 'frm_ajax' );
$post_type = FrmAppHelper::get_post_param( 'post_type', '', 'sanitize_text_field' );
if ( ! $post_type ) {
wp_send_json_error( __( 'Post type is empty', 'formidable-pro' ) );
}
$should_use_post_menu_order_option = post_type_supports( $post_type, 'page-attributes' ) ? '1' : '0';
wp_die( $should_use_post_menu_order_option );
}
/**
* Shows disabled PDF attachment option.
*
* @since 5.4.3
*/
public static function show_disabled_pdf_attachment_option() {
if ( function_exists( 'frm_pdfs_autoloader' ) || ! FrmAppHelper::show_new_feature( 'pdfs' ) ) {
return;
}
$data = array(
'url' => 'formidable-pdfs/formidable-pdfs.php',
'class' => 'frm-activate-addon',
'status' => 'installed',
);
?>
<div
id="frm_attach_pdf_setting"
style="margin-top: 15px;"
data-upgrade="<?php esc_attr_e( 'Email PDFs', 'formidable-pro' ); ?>"
data-oneclick="<?php echo esc_attr( wp_json_encode( $data ) ); ?>"
>
<?php
FrmProHtmlHelper::toggle(
'frm_attach_pdf',
'frm_attach_pdf',
array(
'div_class' => 'with_frm_style frm_toggle',
'checked' => false,
'echo' => true,
)
);
?>
<label id="frm_attach_pdf_label" for="frm_attach_pdf">
<?php esc_html_e( 'Attach PDF of entry to email', 'formidable-pro' ); ?>
</label>
</div>
<style>
#frm_attach_pdf_setting label {
color: var(--grey);
}
</style>
<?php
}
}