web/wp-content/plugins/acf-extended/includes/modules/form/module-form-fields.php (1,587 lines of code) (raw):
<?php
if(!defined('ABSPATH')){
exit;
}
if(!class_exists('acfe_module_form_field_groups')):
class acfe_module_form_field_groups{
/*
* Construct
*/
function __construct(){
// register field groups
add_filter('acfe/module/register_field_groups/module=form', array($this, 'register_field_groups'), 10, 2);
// deprecated
add_filter('acf/prepare_field/key=field_success_return', array($this, 'prepare_success_return'));
// checkbox choices
// todo: use attribute instead?
add_filter('acf/prepare_field/key=field_option_action_save_acf_fields', array($this, 'checkbox_choices'));
add_filter('acf/prepare_field/key=field_option_action_load_acf_fields', array($this, 'checkbox_choices'));
add_filter('acf/prepare_field/key=field_post_action_save_acf_fields', array($this, 'checkbox_choices'));
add_filter('acf/prepare_field/key=field_post_action_load_acf_fields', array($this, 'checkbox_choices'));
add_filter('acf/prepare_field/key=field_term_action_save_acf_fields', array($this, 'checkbox_choices'));
add_filter('acf/prepare_field/key=field_term_action_load_acf_fields', array($this, 'checkbox_choices'));
add_filter('acf/prepare_field/key=field_user_action_save_acf_fields', array($this, 'checkbox_choices'));
add_filter('acf/prepare_field/key=field_user_action_load_acf_fields', array($this, 'checkbox_choices'));
add_action('wp_ajax_acfe/form/map_checkbox_ajax', array($this, 'ajax_checkbox_choices'));
add_action('wp_ajax_acfe/form/field_groups_metabox', array($this, 'ajax_field_groups_metabox'));
// select choices
add_filter('acf/prepare_field/type=select', array($this, 'select_choices'), 15);
add_filter('acf/prepare_field/type=acfe_post_types', array($this, 'select_choices'), 15);
add_filter('acf/prepare_field/type=acfe_post_statuses', array($this, 'select_choices'), 15);
add_filter('acf/prepare_field/type=acfe_taxonomy_terms', array($this, 'select_choices'), 15);
add_filter('acf/prepare_field/type=acfe_taxonomies', array($this, 'select_choices'), 15);
add_filter('acf/prepare_field/type=acfe_user_roles', array($this, 'select_choices'), 15);
add_action('wp_ajax_acfe/form/map_field_ajax', array($this, 'ajax_select_choices'));
// field groups choices
add_filter('acf/prepare_field/key=field_field_groups', array($this, 'field_groups_choices'), 15);
add_action('wp_ajax_acfe/form/map_field_groups_ajax', array($this, 'ajax_field_groups_choices'));
// post object
add_action('wp_ajax_acf/fields/post_object/query', array($this, 'ajax_post_object_choices'), 5);
add_action('wp_ajax_acf/fields/acfe_taxonomy_terms/query', array($this, 'ajax_taxonomy_terms_choices'), 5);
add_action('wp_ajax_acf/fields/user/query', array($this, 'ajax_post_author_choices'), 5);
}
/**
* ajax_post_object_choices
*/
function ajax_post_object_choices(){
// added in js
if(!acf_maybe_get_POST('is_form') || !acf_maybe_get_POST('field_key')){
return;
}
acf_add_local_field(array(
'key' => acf_maybe_get_POST('field_key'),
'label' => '',
'name' => '',
'type' => 'post_object',
'instructions' => '',
'required' => 0,
'conditional_logic' => array(),
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'return_format' => 'id',
'default_value' => '',
));
}
/**
* ajax_taxonomy_terms_choices
*/
function ajax_taxonomy_terms_choices(){
// added in js
if(!acf_maybe_get_POST('is_form') || !acf_maybe_get_POST('field_key')){
return;
}
acf_add_local_field(array(
'key' => acf_maybe_get_POST('field_key'),
'label' => '',
'name' => 'target_custom',
'type' => 'acfe_taxonomy_terms',
'instructions' => '',
'required' => 0,
'conditional_logic' => array(),
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'field_type' => 'select',
'return_format' => 'id',
'ui' => true,
'ajax' => true,
'default_value' => '',
));
}
/**
* ajax_post_author_choices
*/
function ajax_post_author_choices(){
// added in js
if(!acf_maybe_get_POST('is_form') || !acf_maybe_get_POST('field_key')){
return;
}
acf_add_local_field(array(
'key' => acf_maybe_get_POST('field_key'),
'label' => '',
'name' => '',
'type' => 'user',
'instructions' => '',
'required' => 0,
'conditional_logic' => array(),
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'return_format' => 'id',
'default_value' => '',
));
}
/**
* checkbox_choices
*
* @param $field
*
* @return mixed
*/
function checkbox_choices($field){
// global
global $item;
// prepare field groups
$field_groups = $item['field_groups'];
$field_groups = array_filter($field_groups, 'acf_get_field_group');
$field_groups = array_unique($field_groups);
// vars
$choices = array();
// loop
foreach($field_groups as $field_group){
// field group
$field_group_obj = acf_get_field_group($field_group);
// get fields
$fields = $this->get_fields($field_group, true);
// append
foreach($fields as $_field){
$choices[ $field_group_obj['title'] ][ $_field['key'] ] = $_field['label'];
}
}
$field['choices'] = $choices;
return $field;
}
/**
* ajax_field_groups_metabox
*/
function ajax_field_groups_metabox(){
// validate
if(!acf_verify_ajax()){
die();
}
// default options
$options = acf_parse_args($_POST, array(
'field_groups' => array(),
));
$field_groups = array();
// loop field groups
foreach($options['field_groups'] as $key){
// get local field group if any
$field_group = acf_get_field_group($key);
if($field_group){
// store
$field_groups[] = $field_group;
}
}
if($field_groups){
acf_disable_filter('clone');
acfe_render_field_groups_details($field_groups);
}
die;
}
/**
* ajax_checkbox_choices
*/
function ajax_checkbox_choices(){
// validate
if(!acf_verify_ajax()){
die();
}
// default options
$options = acf_parse_args($_POST, array(
'post_id' => 0,
'name' => '',
'_name' => '',
'key' => '',
'value' => array(),
'field_groups' => array(),
));
$field = array(
'key' => $options['key'],
'label' => 'Save ACF fields',
'name' => $options['name'],
'type' => 'checkbox',
'instructions' => __('Which ACF fields should be saved as metadata', 'acfe'),
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'choices' => array(),
'allow_custom' => 0,
'default_value' => array(),
'value' => $options['value'],
'class' => '',
'layout' => 'vertical',
'toggle' => 0,
'return_format' => 'value',
'save_custom' => 0,
'_name' => $options['_name'],
);
// prepare field groups
$field_groups = $options['field_groups'];
$field_groups = array_filter($field_groups, 'acf_get_field_group');
$field_groups = array_unique($field_groups);
$choices = array();
$labels = array();
foreach($field_groups as $field_group){
// field group
$field_group_obj = acf_get_field_group($field_group);
// get fields
$fields = $this->get_fields($field_group, true);
if(!empty($fields)){
// append
foreach($fields as $_field){
$choices[ $field_group_obj['title'] ][ $_field['key'] ] = $_field['label'];
}
$labels[] = $field_group_obj['title'];
}
}
$field['choices'] = $choices;
$attrs = array('data-labels' => $labels);
echo '<div ' . acf_esc_attrs($attrs) . '></div>';
acf_get_field_type('checkbox')->render_field($field);
die;
}
/**
* field_groups_choices
*
* acf/prepare_field/key=field_field_groups
*
* @param $field
*
* @return mixed
*/
function field_groups_choices($field){
// validate
if(acf_maybe_get($field, 'ajax_action') !== 'acfe/form/map_field_groups_ajax'){
return $field;
}
// fix nonce with acf 6.3.10
$field['nonce'] = wp_create_nonce($field['key']);
// append to choices
foreach(acf_get_field_groups() as $field_group){
$field['choices'][ $field_group['key'] ] = $field_group['key'];
}
// loop choices
foreach(array_keys($field['choices']) as $key){
// get value
$value = $field['choices'][ $key ];
// check field key
if(is_string($value) && acf_is_field_group_key($value)){
// get field group
$choice_field_group = acf_get_field_group($value);
// update title
if($choice_field_group){
$field['choices'][ $key ] = $choice_field_group['title'];
}
}
}
// encode custom choices
if(isset($field['custom_choices'])){
// remove custom choice if already in choices
foreach(array_keys($field['custom_choices']) as $key){
if(isset($field['choices'][ $key ])){
unset($field['custom_choices'][ $key ]);
}
}
$field['wrapper']['data-custom-choices'] = json_encode($field['custom_choices']);
}
return $field;
}
/**
* ajax_field_groups_choices
*
* wp_ajax_acfe/form/map_field_groups_ajax
*/
function ajax_field_groups_choices(){
$nonce = acf_request_arg('nonce', '');
$key = acf_request_arg('field_key', '');
// Back-compat for field settings.
if(!acf_is_field_key($key)){
$nonce = '';
$key = '';
}
// validate
if(!acf_verify_ajax($nonce, $key)){
die();
}
// default options
$options = acf_parse_args($_POST, array(
'post_id' => 0,
's' => '',
'value' => '',
'choices' => array(),
'custom_choices' => array(),
'field_key' => '',
'paged' => 1,
));
// vars
$results = array();
$values = array();
$search = null;
// search
if($options['s'] !== ''){
// strip slashes (search may be integer)
$search = strval($options['s']);
$search = wp_unslash($search);
}
// custom choices
if($options['custom_choices']){
$children = array();
foreach($options['custom_choices'] as $key => $value){
// ensure value is a string
$value = strval($value);
// append to collection
$values[] = $key;
// if searching, but doesn't exist
if(is_string($search) && stripos($value, $search) === false && stripos($key, $search) === false){
continue;
}
$children[] = array(
'id' => $key,
'text' => $value,
);
}
if($children){
$results[] = array(
'text' => __('Custom', 'acfe'),
'children' => $children
);
}
}
// field groups
$children = array();
foreach(acf_get_field_groups() as $field_group){
// vars
$key = $field_group['key'];
$value = $field_group['title'];
// ensure value is a string
$value = strval($value);
// append to collection
$values[] = $key;
// if searching, but doesn't exist
if(is_string($search) && stripos($value, $search) === false && stripos($key, $search) === false){
continue;
}
$children[] = array(
'id' => $key,
'text' => $value,
);
}
if($children){
$results[] = array(
'text' => 'Field Groups',
'children' => $children
);
}
// custom value
$children = array();
$value_array = acf_get_array($options['value']);
$value_array[] = '';
foreach($value_array as $value){
$key = $value;
$value = strval($value);
// if search
if(is_string($search)){
// search already exists in custom values
if($search === $value && !in_array($value, $values)){
$children[] = array(
'id' => $key,
'text' => $this->get_field_label($value)
);
// search not found in any value, generate choice
}elseif(!in_array($search, $values)){
$_key = $search;
$_value = $search;
// reset children to avoid duplicate append
$children = array();
$children[] = array(
'id' => $_key,
'text' => $this->get_field_label($_value)
);
}
// no search and value not found in choices, generate custom choice
}elseif($value && !in_array($value, $values)){
$children[] = array(
'id' => $key,
'text' => $this->get_field_label($value)
);
}
}
if($children){
array_unshift($results, array(
'text' => __('Custom', 'acfe'),
'children' => $children
));
}
// response
$response = array(
'results' => $results,
);
// return
acf_send_ajax_results($response);
}
/**
* select_choices
*
* acf/prepare_field/type=select
*
* @param $field
*
* @return mixed
*/
function select_choices($field){
// validate
if(acf_maybe_get($field, 'ajax_action') !== 'acfe/form/map_field_ajax'){
return $field;
}
// is load
$is_load = isset($field['wrapper']['data-related-field']) && !empty($field['wrapper']['data-related-field']);
// fix nonce with acf 6.3.10
$field['nonce'] = wp_create_nonce($field['key']);
// global
global $item;
// prepare field groups
$field_groups = $item['field_groups'];
$field_groups = array_filter($field_groups, 'acf_get_field_group');
$field_groups = array_unique($field_groups);
// loop field groups
foreach($field_groups as $field_group){
// get fields
$fields = $this->get_fields($field_group);
// append
foreach($fields as $_field){
$key = $is_load ? $_field['key'] : "{field:{$_field['key']}}";
$field['choices'][ $key ] = $_field['label'];
}
}
$ajax_choices = array();
// loop choices
foreach(array_keys($field['choices']) as $key){
// get value
$value = $field['choices'][ $key ];
// check field key
if(is_string($key) && $this->is_field_key_tag($key, $is_load)){
if(is_string($value) && acf_is_field_key($value)){
$field['choices'][ $key ] = $this->get_field_label($value);
}
continue;
}
$ajax_choices[ $key ] = $value;
}
// encode choices
if($ajax_choices){
// remove custom choices from choice
if(isset($field['custom_choices'])){
foreach(array_keys($ajax_choices) as $key){
if(isset($field['custom_choices'][ $key ])){
unset($ajax_choices[ $key ]);
}
}
}
$field['wrapper']['data-choices'] = json_encode($ajax_choices);
}
// encode custom choices
if(isset($field['custom_choices'])){
// remove custom choice if already in choices
foreach(array_keys($field['custom_choices']) as $key){
if(isset($field['choices'][ $key ])){
unset($field['custom_choices'][ $key ]);
}
}
$field['wrapper']['data-custom-choices'] = json_encode($field['custom_choices']);
}
// todo: remove exception here
if($field['_name'] === 'save_post_terms'){
foreach(array_keys($field['choices']) as $taxonomy){
$terms = $field['choices'][ $taxonomy ];
if(is_array($terms)){
unset($field['choices'][ $taxonomy ]);
foreach($terms as $key => $value){
$field['choices'][ $key ] = $value;
}
}
}
}
// return
return $field;
}
/**
* ajax_select_choices
*
* wp_ajax_acfe/form/map_field_ajax
*/
function ajax_select_choices(){
$nonce = acf_request_arg('nonce', '');
$key = acf_request_arg('field_key', '');
// Back-compat for field settings.
if(!acf_is_field_key($key)){
$nonce = '';
$key = '';
}
// validate
if(!acf_verify_ajax($nonce, $key)){
die();
}
// default options
$options = acf_parse_args($_POST, array(
'post_id' => 0,
's' => '',
'value' => '',
'choices' => array(),
'custom_choices' => array(),
'field_key' => '',
'field_label' => '',
'field_groups' => array(),
'is_load' => false,
'paged' => 1,
));
// vars
$is_load = (bool) $options['is_load'];
$results = array();
$values = array();
$search = null;
// search
if($options['s'] !== ''){
// strip slashes (search may be integer)
$search = strval($options['s']);
$search = wp_unslash($search);
}
// custom choices
if($options['custom_choices']){
$children = array();
foreach($options['custom_choices'] as $key => $value){
// ensure value is a string
$value = strval($value);
// append to collection
$values[] = $key;
// if searching, but doesn't exist
if(is_string($search) && stripos($value, $search) === false && stripos($key, $search) === false){
continue;
}
$children[] = array(
'id' => $key,
'text' => $value,
);
}
if($children){
$results[] = array(
'text' => __('Custom', 'acfe'),
'children' => $children
);
}
}
// generic choices
if($options['choices']){
$children = array();
$is_array = false;
foreach($options['choices'] as $key => $value){
// value is array (multi dimentional choices)
if(is_array($value)){
$is_array = true;
$sub_children = array();
foreach($value as $sub_key => $sub_value){
// ensure value is a string
$sub_value = strval($sub_value);
// append to collection
$values[] = $sub_key;
// if searching, but doesn't exist
if(is_string($search) && stripos($sub_value, $search) === false && stripos($sub_key, $search) === false){
continue;
}
$sub_children[] = array(
'id' => $sub_key,
'text' => $sub_value,
);
}
if($sub_children){
$results[] = array(
'text' => $key,
'children' => $sub_children
);
}
// normal value
}else{
// ensure value is a string
$value = strval($value);
// append to collection
$values[] = $key;
// if searching, but doesn't exist
if(is_string($search) && stripos($value, $search) === false && stripos($key, $search) === false){
continue;
}
$children[] = array(
'id' => $key,
'text' => $value,
);
}
}
if(!$is_array && $children){
$results[] = array(
'text' => $options['field_label'],
'children' => $children
);
}
}
// field groups fields
foreach($options['field_groups'] as $field_group_key){
// vars
$field_group = acf_get_field_group($field_group_key);
// get fields
$fields = $this->get_fields($field_group_key);
$children = array();
foreach($fields as $field){
$key = $is_load ? $field['key'] : "{field:{$field['key']}}";
$value = $field['field']['label'];
// ensure value is a string
$value = strval($value);
$value = empty($value) ? $field['key'] : "{$value} ({$field['key']})";
// append to collection
$values[] = $key;
// if searching, but doesn't exist
if(is_string($search) && stripos($value, $search) === false && stripos($key, $search) === false){
continue;
}
$children[] = array(
'id' => $key,
'text' => $field['label'],
);
}
if($children){
$results[] = array(
'text' => $field_group['title'],
'children' => $children
);
}
}
// custom value
$children = array();
$value_array = acf_get_array($options['value']);
$value_array[] = ''; // we must append empty string to let search being a custom value (in case a value was never selected before)
foreach($value_array as $value){
$key = $value;
$value = strval($value);
// if search
if(is_string($search)){
// search already exists in custom values
if($search === $value && !in_array($value, $values)){
$children[] = array(
'id' => $key,
'text' => $this->get_field_label($value)
);
// search not found in any value, generate choice
}elseif(!in_array($search, $values)){
$_key = $search;
$_value = $search;
// reset children to avoid duplicate append
$children = array();
$children[] = array(
'id' => $_key,
'text' => $this->get_field_label($_value)
);
}
// no search and value not found in choices, generate custom choice
}elseif($value && !in_array($value, $values)){
$children[] = array(
'id' => $key,
'text' => $this->get_field_label($value)
);
}
}
if($children){
array_unshift($results, array(
'text' => __('Custom', 'acfe'),
'children' => $children
));
}
// response
$response = array(
'results' => $results,
);
// return
acf_send_ajax_results($response);
}
/**
* get_field_label
*
* @param $value
*
* @return mixed|string
*/
function get_field_label($value){
if(is_string($value) && acf_is_field_key($value)){
$field = acf_get_field($value);
if($field){
$ancestors = isset($field['ancestors']) ? $field['ancestors'] : count(acf_get_field_ancestors($field));
$label = '';
$label = str_repeat('- ', $ancestors) . $label;
$label .= !empty($field['label']) ? $field['label'] : '(' . __('no label', 'acf') . ')';
$label .= $field['required'] ? ' *' : '';
$value = "{$label} ({$value})";
}
}
return $value;
}
/**
* get_fields_details
*
* @param $field
*
* @return mixed
*/
function get_fields_details($field){
// disallow tab, message, accordion
if(in_array($field['type'], array('tab', 'message', 'accordion'))){
return false;
}
// disallow subfields for repeater/flexible content
if(in_array($field['type'], array('repeater', 'flexible_content'))){
$field['sub_fields'] = array();
}
// get parent field
if(is_string($field['parent']) && acf_is_field_key($field['parent'])){
// get field
$parent = acf_get_field($field['parent']);
// parent = group
if($parent && $parent['type'] === 'group' && !empty($parent['label'])){
// prepend with group label
$field['label'] = "{$parent['label']}: {$field['label']}";
}
}
return $field;
}
/**
* get_fields
*
* @param $field_group
*
* @return array|string[]
*/
function get_fields($field_group, $show_top_level = false){
acf_disable_filter('clone');
$fields = acf_get_fields($field_group);
if(!empty($fields)){
// vars
$all_fields = acfe_get_fields_details_recursive($fields, array($this, 'get_fields_details'));
$fields = array();
// check the first field is a child of the field group
// this fix an issue where acf_get_fields($field_group) return orphan fields in ajax query
// if field group has no fields and is local field group
if(!empty($all_fields) && acf_is_local_field_group($field_group)){
if(isset($all_fields[0]['field']) && acf_maybe_get($all_fields[0]['field'], 'parent') !== $field_group){
return $fields;
}
}
// filtered fields
foreach($all_fields as $field){
// do not show group, clone
if(in_array($field['field']['type'], array('group'))){
continue;
}
// do not show top level (repeater, flexible content)
if(!$show_top_level){
if(in_array($field['field']['type'], array('clone', 'repeater', 'flexible_content'))){
continue;
}
}
// filtered
$fields[] = $field;
}
// loop fields
foreach(array_keys($fields) as $key){
$field = $fields[ $key ];
// add (field_abcdef123456) to field label
$fields[ $key ]['label'] = "{$field['label']} ({$field['key']})";
}
}
// return
return $fields;
}
/**
* is_field_key_tag
*
* @param $key
* @param $is_load
*
* @return bool
*/
function is_field_key_tag($key, $is_load = false){
if($is_load){
return is_string($key) && !empty($key) && acf_is_field_key($key);
}
return is_string($key) && !empty($key) && preg_match('/^{field:field_[a-zA-Z0-9_]+}$/', $key);
}
/**
* prepare_success_return
*
* @param $field
*
* @return false|mixed
*/
function prepare_success_return($field){
if(empty($field['value'])){
return false;
}
_deprecated_function('ACF Extended: "Redirection" Forms setting', '0.8.7.5', "the Redirect Action (See documentation: https://www.acf-extended.com/features/modules/dynamic-forms)");
return $field;
}
/*
* Register Field Groups
*/
function register_field_groups($field_groups, $module){
$layouts = array();
$actions = acfe_get_form_action_types();
foreach($actions as $action){
$layout = $action->get_layout();
$layouts[ $layout['key'] ] = $layout;
}
$field_groups[] = array(
'key' => 'group_acfe_form',
'title' => __('Form', 'acfe'),
'location' => array(
array(
array(
'param' => 'post_type',
'operator' => '==',
'value' => $module->post_type,
),
),
),
'menu_order' => 0,
'position' => 'normal',
'style' => 'default',
'label_placement' => 'left',
'instruction_placement' => 'label',
'hide_on_screen' => '',
'active' => 1,
'description' => '',
'fields' => array(
/**
* general
*/
array(
'key' => 'field_tab_general',
'label' => __('General', 'acfe'),
'name' => '',
'type' => 'tab',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
'data-no-preference' => true,
),
'placement' => 'top',
'endpoint' => 0,
),
array(
'key' => 'field_name',
'label' => __('Name', 'acfe'),
'name' => 'name',
'type' => 'acfe_slug',
'instructions' => '',
'required' => 1,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => '',
'append' => '',
'maxlength' => '',
),
array(
'key' => 'field_field_groups',
'label' => __('Field Groups', 'acfe'),
'name' => 'field_groups',
'type' => 'select',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'choices' => array(),
'default_value' => array(),
'allow_null' => 1,
'multiple' => 1,
'ui' => 1,
'ajax' => 1,
'return_format' => 'value',
'allow_custom' => 1,
'placeholder' => '',
'ajax_action' => 'acfe/form/map_field_groups_ajax'
),
array(
'key' => 'field_actions',
'label' => __('Actions', 'acfe'),
'name' => 'actions',
'type' => 'flexible_content',
'instructions' => __('Add actions on form submission', 'acfe'),
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'acfe_flexible_stylised_button' => 1,
'layouts' => $layouts,
'button_label' => __('Add action', 'acfe'),
'min' => '',
'max' => '',
),
/**
* settings
*/
array(
'key' => 'field_tab_settings',
'label' => __('Settings', 'acfe'),
'name' => '',
'type' => 'tab',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'placement' => 'top',
'endpoint' => 0,
),
array(
'key' => 'field_location',
'label' => __('Field groups locations rules', 'acfe'),
'name' => 'location',
'type' => 'true_false',
'instructions' => __('Apply field groups locations rules on front-end display', 'acfe'),
'required' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'message' => '',
'default_value' => 0,
'ui' => 1,
'ui_on_text' => '',
'ui_off_text' => '',
'group_with' => 'settings',
),
array(
'key' => 'field_honeypot',
'label' => __('Honeypot', 'acfe'),
'name' => 'honeypot',
'type' => 'true_false',
'instructions' => __('Whether to include a hidden input field to capture non human form submission. Defaults to true.', 'acfe'),
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'message' => '',
'default_value' => 1,
'ui' => 1,
'ui_on_text' => '',
'ui_off_text' => '',
'group_with' => 'settings',
),
array(
'key' => 'field_kses',
'label' => __('Kses', 'acfe'),
'name' => 'kses',
'type' => 'true_false',
'instructions' => __('Whether or not to sanitize all $_POST data with the wp_kses_post() function. Defaults to true.', 'acfe'),
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'message' => '',
'default_value' => 1,
'ui' => 1,
'ui_on_text' => '',
'ui_off_text' => '',
'group_with' => 'settings',
),
array(
'key' => 'field_uploader',
'label' => __('Uploader', 'acfe'),
'name' => 'uploader',
'type' => 'radio',
'instructions' => __('Whether to use the WP uploader or a basic input for image and file fields. Defaults to \'wp\'.', 'acfe'),
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'choices' => array(
'default' => __('Default', 'acfe'),
'wp' => __('WordPress', 'acfe'),
'basic' => __('Browser', 'acfe'),
),
'allow_null' => 0,
'other_choice' => 0,
'default_value' => 'default',
'layout' => 'vertical',
'return_format' => 'value',
'save_other_choice' => 0,
'group_with' => 'settings',
),
/**
* attributes
*/
array(
'key' => 'field_tab_attributes',
'label' => __('Attributes', 'acfe'),
'name' => '',
'type' => 'tab',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'placement' => 'top',
'endpoint' => 0,
),
array(
'key' => 'field_form',
'label' => __('Form attributes', 'acfe'),
'name' => 'form',
'type' => 'group',
'instructions' => __('Attributes settings related to the form.', 'acfe'),
'required' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'layout' => 'block',
'acfe_seamless_style' => true,
'acfe_group_modal' => 0,
'conditional_logic' => array(),
'group_with' => 'attributes',
'sub_fields' => array(
array(
'key' => 'field_form_element',
'label' => '',
'name' => 'element',
'type' => 'select',
'instructions' => '',
'required' => 0,
'conditional_logic' => array(),
'wrapper' => array(
'width' => '33.33',
'class' => '',
'id' => '',
),
'default_value' => 'form',
'placeholder' => '',
'prepend' => 'element',
'choices' => array(
'form' => '<form>',
'div' => '<div>',
)
),
array(
'key' => 'field_form_class',
'label' => '',
'name' => 'class',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => array(),
'wrapper' => array(
'width' => '33.33',
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => 'form class',
'append' => '',
'maxlength' => '',
),
array(
'key' => 'field_form_id',
'label' => '',
'name' => 'id',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => array(),
'wrapper' => array(
'width' => '33.33',
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => 'form id',
'append' => '',
'maxlength' => '',
),
),
),
array(
'key' => 'field_fields',
'label' => __('Fields attributes', 'acfe'),
'name' => 'fields',
'type' => 'group',
'instructions' => __('Attributes settings related to the fields.', 'acfe'),
'required' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'layout' => 'block',
'acfe_seamless_style' => true,
'acfe_group_modal' => 0,
'conditional_logic' => array(),
'group_with' => 'attributes',
'sub_fields' => array(
array(
'key' => 'field_fields_element',
'label' => '',
'name' => 'element',
'type' => 'select',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '33.33',
'class' => '',
'id' => '',
),
'prepend' => 'element',
'choices' => array(
'div' => '<div>',
'tr' => '<tr>',
'td' => '<td>',
'ul' => '<ul>',
'ol' => '<ol>',
'dl' => '<dl>',
),
'allow_null' => 0,
'other_choice' => 0,
'default_value' => 'div',
'return_format' => 'value',
'save_other_choice' => 0,
),
array(
'key' => 'field_fields_wrapper_class',
'label' => '',
'name' => 'wrapper_class',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => array(),
'wrapper' => array(
'width' => '33.33',
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => 'wrap class',
'append' => '',
'maxlength' => '',
),
array(
'key' => 'field_fields_class',
'label' => '',
'name' => 'class',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => array(),
'wrapper' => array(
'width' => '33.33',
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => 'field class',
'append' => '',
'maxlength' => '',
),
array(
'key' => 'field_fields_label',
'label' => '',
'name' => 'label',
'type' => 'select',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '33.33',
'class' => '',
'id' => '',
),
'choices' => array(
'top' => __('Top', 'acfe'),
'left' => __('Left', 'acfe'),
'hidden' => __('Hidden', 'acfe'),
),
'allow_null' => 0,
'other_choice' => 0,
'default_value' => 'top',
'return_format' => 'value',
'prepend' => 'label',
),
array(
'key' => 'field_fields_instruction',
'label' => '',
'name' => 'instruction',
'type' => 'select',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '33.33',
'class' => '',
'id' => '',
),
'choices' => array(
'label' => __('Label', 'acfe'),
'field' => __('Field', 'acfe'),
'above_field' => __('Above field', 'acfe'),
'tooltip' => __('Tooltip', 'acfe'),
),
'allow_null' => 0,
'other_choice' => 0,
'default_value' => 'label',
'return_format' => 'value',
'prepend' => 'instruction',
),
),
),
array(
'key' => 'field_submit',
'label' => __('Submit button', 'acfe'),
'name' => 'submit',
'type' => 'true_false',
'instructions' => __('Whether or not to create a form submit button. Defaults to true', 'acfe'),
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'message' => '',
'default_value' => 1,
'ui' => 1,
'ui_on_text' => '',
'ui_off_text' => '',
'group_with' => 'attributes',
),
array(
'key' => 'field_submit_value',
'label' => __('Submit value', 'acfe'),
'name' => 'submit_value',
'type' => 'text',
'instructions' => __('The text displayed on the submit button', 'acfe'),
'required' => 0,
'conditional_logic' => array(
array(
array(
'field' => 'field_submit',
'operator' => '==',
'value' => '1',
),
),
),
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'default_value' => 'Submit',
'placeholder' => '',
'prepend' => '',
'append' => '',
'maxlength' => '',
'group_with' => 'attributes',
),
array(
'key' => 'field_submit_button',
'label' => __('Submit button', 'acfe'),
'name' => 'submit_button',
'type' => 'acfe_code_editor',
'instructions' => __('HTML used to render the submit button.', 'acfe'),
'required' => 0,
'conditional_logic' => array(
array(
array(
'field' => 'field_submit',
'operator' => '==',
'value' => '1',
),
),
),
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'default_value' => '<input type="submit" class="acf-button button button-primary button-large" value="%s" />',
'placeholder' => '',
'maxlength' => '',
'rows' => 2,
'group_with' => 'attributes',
),
array(
'key' => 'field_submit_spinner',
'label' => __('Submit spinner', 'acfe'),
'name' => 'submit_spinner',
'type' => 'acfe_code_editor',
'instructions' => __('HTML used to render the submit button loading spinner.', 'acfe'),
'required' => 0,
'conditional_logic' => array(
array(
array(
'field' => 'field_submit',
'operator' => '==',
'value' => '1',
),
),
),
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'default_value' => '<span class="acf-spinner"></span>',
'placeholder' => '',
'maxlength' => '',
'rows' => 2,
'group_with' => 'attributes',
),
/**
* render
*/
array(
'key' => 'field_tab_render',
'label' => __('Render', 'acfe'),
'name' => '',
'type' => 'tab',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'placement' => 'top',
'endpoint' => 0,
),
array(
'key' => 'field_render',
'label' => __('Form render', 'acfe'),
'name' => 'render',
'type' => 'acfe_code_editor',
'instructions' => __('Render customized form HTML. Leave empty to render form normally.', 'acfe') . '<br /><br />' .
__('Render field group:', 'acfe') . '<br /><code>{render:group_abc123}</code><br/><br/>' .
__('Render field:', 'acfe') . '<br /><code>{render:field_abc123}</code><br/><code>{render:my_field}</code><br/><br/>' .
__('Render all fields:' ,'acfe') . '<br /><code>{render:fields}</code><br/><br/>' .
__('Render submit button:', 'acfe') . '<br /><code>{render:submit}</code>',
'required' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'maxlength' => '',
'rows' => 18,
'conditional_logic' => array(),
),
/**
* validation
*/
array(
'key' => 'field_tab_validation',
'label' => __('Validation', 'acfe'),
'name' => '',
'type' => 'tab',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'placement' => 'top',
'endpoint' => 0,
'group_with' => 'validation',
),
array(
'key' => 'field_hide_error',
'label' => __('Hide general error', 'acfe'),
'name' => 'hide_error',
'type' => 'true_false',
'instructions' => __('Hide the general error message: "Validation failed. 1 field requires attention"', 'acfe'),
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'message' => '',
'default_value' => 0,
'ui' => 1,
'ui_on_text' => '',
'ui_off_text' => '',
'group_with' => 'validation',
),
array(
'key' => 'field_hide_revalidation',
'label' => __('Hide successful re-validation', 'acfe'),
'name' => 'hide_revalidation',
'type' => 'true_false',
'instructions' => __('Hide "Validation successful" notice when an error has been previously thrown', 'acfe'),
'required' => 0,
'conditional_logic' => array(
array(
array(
'field' => 'field_hide_error',
'operator' => '!=',
'value' => '1',
),
)
),
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'message' => '',
'default_value' => 0,
'ui' => 1,
'ui_on_text' => '',
'ui_off_text' => '',
'group_with' => 'validation',
),
array(
'key' => 'field_hide_unload',
'label' => __('Hide confirmation on exit', 'acfe'),
'name' => 'hide_unload',
'type' => 'true_false',
'instructions' => __('Do not prompt user on page refresh', 'acfe'),
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'message' => '',
'default_value' => 0,
'ui' => 1,
'ui_on_text' => '',
'ui_off_text' => '',
'group_with' => 'validation',
),
array(
'key' => 'field_messages',
'label' => __('General error messages', 'acfe'),
'name' => 'messages',
'type' => 'group',
'instructions' => __('Customize general error messages.', 'acfe'),
'required' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'layout' => 'block',
'acfe_seamless_style' => true,
'acfe_group_modal' => 0,
'conditional_logic' => array(
array(
array(
'field' => 'field_hide_error',
'operator' => '!=',
'value' => '1',
),
)
),
'group_with' => 'validation',
'sub_fields' => array(
array(
'key' => 'field_messages_failure',
'label' => '',
'name' => 'failure',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => array(),
'wrapper' => array(
'width' => '50',
'class' => '',
'id' => '',
),
'default_value' => 'Validation failed',
'placeholder' => '',
'prepend' => 'failure',
'append' => '',
'maxlength' => '',
),
array(
'key' => 'field_messages_error',
'label' => '',
'name' => 'error',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => array(),
'wrapper' => array(
'width' => '50',
'class' => '',
'id' => '',
),
'default_value' => '1 field requires attention',
'placeholder' => '',
'prepend' => 'error',
'append' => '',
'maxlength' => '',
),
array(
'key' => 'field_messages_success',
'label' => '',
'name' => 'success',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => array(),
'wrapper' => array(
'width' => '50',
'class' => '',
'id' => '',
),
'default_value' => 'Validation successful',
'placeholder' => '',
'prepend' => 'success',
'append' => '',
'maxlength' => '',
),
array(
'key' => 'field_messages_errors',
'label' => '',
'name' => 'errors',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => array(),
'wrapper' => array(
'width' => '50',
'class' => '',
'id' => '',
),
'default_value' => '%d fields require attention',
'placeholder' => '',
'prepend' => 'errors',
'append' => '',
'maxlength' => '',
),
),
),
array(
'key' => 'field_errors_position',
'label' => __('Fields errors position', 'acfe'),
'name' => 'errors_position',
'type' => 'radio',
'instructions' => __('Choose where to display field errors', 'acfe'),
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'choices' => array(
'above' => __('Above fields', 'acfe'),
'below' => __('Below fields', 'acfe'),
'group' => __('Group errors', 'acfe'),
'hide' => __('Hide errors', 'acfe'),
),
'allow_null' => 0,
'other_choice' => 0,
'default_value' => 'above',
'layout' => 'vertical',
'return_format' => 'value',
'save_other_choice' => 0,
'group_with' => 'validation',
),
array(
'key' => 'field_errors_class',
'label' => __('Fields errors class', 'acfe'),
'name' => 'errors_class',
'type' => 'text',
'instructions' => __('Add class to the error message', 'acfe'),
'required' => 0,
'conditional_logic' => array(
array(
array(
'field' => 'field_errors_position',
'operator' => '!=',
'value' => 'hide',
),
)
),
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => '',
'append' => '',
'maxlength' => '',
'group_with' => 'validation',
),
/**
* success
*/
array(
'key' => 'field_tab_success',
'label' => __('Success', 'acfe'),
'name' => '',
'type' => 'tab',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'placement' => 'top',
'endpoint' => 0,
),
array(
'key' => 'field_success_return',
'label' => __('Redirection', 'acfe'),
'name' => 'success_return',
'type' => 'text',
'instructions' => __('The URL to be redirected to after the form is submitted.', 'acfe') . '<br/><br/><u>' . __('This setting is deprecated, use the new "Redirect Action" instead.', 'acfe') . '</u>',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
'data-enable-switch' => true
),
'default_value' => '',
'placeholder' => '',
'prepend' => '',
'append' => '',
'maxlength' => '',
'group_with' => 'success',
),
array(
'key' => 'field_success_hide_form',
'label' => __('Hide form', 'acfe'),
'name' => 'success_hide_form',
'type' => 'true_false',
'instructions' => __('Hide form on successful submission', 'acfe'),
'conditional_logic' => array(
array(
array(
'field' => 'field_success_return',
'operator' => '==',
'value' => '',
),
),
),
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'message' => '',
'default_value' => 0,
'ui' => 1,
'ui_on_text' => '',
'ui_off_text' => '',
'group_with' => 'success',
),
array(
'key' => 'field_success_scroll',
'label' => __('Scroll to message', 'acfe'),
'name' => 'success_scroll',
'type' => 'true_false',
'instructions' => __('Scroll to message on success', 'acfe'),
'conditional_logic' => array(
array(
array(
'field' => 'field_success_return',
'operator' => '==',
'value' => '',
),
),
),
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
),
'message' => '',
'default_value' => 0,
'ui' => 1,
'ui_on_text' => '',
'ui_off_text' => '',
'group_with' => 'success',
),
array(
'key' => 'field_success_message',
'label' => __('Success message', 'acfe'),
'name' => 'success_message',
'type' => 'wysiwyg',
'instructions' => __('The message displayed above the form after the submission.', 'acfe'),
'required' => 0,
'conditional_logic' => array(
array(
array(
'field' => 'field_success_return',
'operator' => '==',
'value' => '',
),
),
),
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
'data-instruction-placement' => 'field'
),
'default_value' => __('Form updated', 'acfe'),
'tabs' => 'all',
'toolbar' => 'full',
'media_upload' => 1,
'delay' => 0,
'group_with' => 'success',
),
array(
'key' => 'field_success_wrapper',
'label' => __('Success wrapper HTML', 'acfe'),
'name' => 'success_wrapper',
'type' => 'acfe_code_editor',
'instructions' => __('HTML used to render the updated message.', 'acfe') . '<br />' .
__('If used, you have to include the following code <code>%s</code> to print the actual "Success message" above.', 'acfe'),
'required' => 0,
'conditional_logic' => array(
array(
array(
'field' => 'field_success_return',
'operator' => '==',
'value' => '',
),
),
),
'wrapper' => array(
'width' => '',
'class' => '',
'id' => '',
'data-instruction-placement' => 'field'
),
'default_value' => '<div id="message" class="updated">%s</div>',
'placeholder' => '',
'maxlength' => '',
'rows' => 2,
'group_with' => 'success',
),
),
);
return $field_groups;
}
}
acf_new_instance('acfe_module_form_field_groups');
endif;