web/wp-content/plugins/acf-extended/includes/modules/form/module-form-action.php (178 lines of code) (raw):

<?php if(!defined('ABSPATH')){ exit; } if(!class_exists('acfe_module_form_action')): class acfe_module_form_action{ // vars public $name = '', $title = '', $item = array(), $validate = array(), $fields = array(), $prefix = ''; /** * __construct */ function __construct(){ $this->initialize(); $this->prefix = "{$this->name}_action"; $this->add_filter("acfe/form/load_{$this->name}", array($this, 'load_action'), 9, 2); $this->add_action("acfe/form/validate_{$this->name}", array($this, 'validate_action'), 9, 2); $this->add_filter("acfe/form/prepare_{$this->name}", array($this, 'prepare_action'), 9, 2); $this->add_action("acfe/form/make_{$this->name}", array($this, 'make_action'), 9, 2); $this->add_filter("acfe/form/register_layout_{$this->name}", array($this, 'register_layout'), 9); } /** * initialize */ function initialize(){ // ... } /** * get_layout * * @return mixed */ function get_layout(){ $layout = array( 'key' => "layout_{$this->name}", 'name' => $this->name, 'label' => $this->title, 'display' => 'row', 'sub_fields' => apply_filters("acfe/form/register_layout_{$this->name}", array()), 'min' => '', 'max' => '', ); $layout = $this->prefix_fields_keys($layout, $this->prefix); return $layout; } /** * prepare_action * * acfe/form/prepare_{name}:9 * * @param $action * @param $form * * @return mixed */ function prepare_action($action, $form){ // return return $action; } /** * prepare_load_action * * @param $action * * @return mixed */ function prepare_load_action($action){ return $action; } /** * prepare_save_action * * @param $action * * @return mixed */ function prepare_save_action($action){ $item = $this->item; // save loop foreach(array_keys($item) as $k){ // post_type => save_post_type if(acf_maybe_get($action, $k)){ $item[ $k ] = $action[ $k ]; } } return $item; } /** * prepare_action_for_export * * @param $action * * @return mixed */ function prepare_action_for_export($action){ return $action; } /** * validate_item * * @param $action */ function validate_item($action){ // default item $defaults = wp_parse_args($this->item, array( 'action' => '', 'name' => '', )); // parse defaults $action = acfe_parse_args_r($action, $defaults); return $action; } /** * set_action_output * * @param $data * @param $action */ function set_action_output($data, $action){ // get actions $actions = acf_get_form_data('acfe/form/actions'); $actions = acf_get_array($actions); // add action type (post) $actions[ $action['action'] ] = $data; // add action name (my-post) if(!empty($action['name'])){ $actions[ $action['name'] ] = $data; } // set query var acf_set_form_data('acfe/form/actions', $actions); } /** * load_acf_values * * @param $form * @param $post_id * @param $acf_fields * @param $acf_fields_exclude * * @return array */ function load_acf_values($form, $post_id, $acf_fields, $acf_fields_exclude){ // get meta values for $post_id $acf = acfe_get_fields($post_id); // load acf fields foreach($acf_fields as $field_key){ // field key already loaded if(in_array($field_key, $acf_fields_exclude)){ continue; } // check field is not hidden and has no value set in 'acfe/form/load_form' if(acf_maybe_get($form['map'], $field_key) === false || isset($form['map'][ $field_key ]['value'])){ continue; } // get field & value $field = acf_get_field($field_key); $value = acfe_get_value_from_acf_values_by_key($acf, $field_key); // value is null (doesn't exist in database for $post_id) // might be a "taxonomy field" with "load values" enabled if($field && $value === null){ // remove stored field value // values are stored via acfe_get_fields($post_id) above // this workaround allow to use a different field key, but with same name to be loaded // for example when a field group is duplicated, so one field group is used for front-end and the other for back-end $store = acf_get_store('values'); if($store->has("{$post_id}:{$field['name']}")){ $store->remove("{$post_id}:{$field['name']}"); } // we need to retrieve the taxonomy value via acf_get_value() // so the load_value() method kicks in and "load values" can inject data $value = acf_get_value($post_id, $field); } // map value $form['map'][ $field_key ]['value'] = $value; if($field && $field['type'] === 'clone' && $field['display'] === 'seamless'){ foreach(acf_get_array($value) as $sub_field_key => $sub_field_value){ $form['map'][ $sub_field_key ]['value'] = $sub_field_value; } } } return $form; } /** * save_acf_fields * * @param $post_id * @param $action */ function save_acf_fields($post_id, $action){ // acf fields $acf_fields = acf_extract_var($action['save'], 'acf_fields'); $acf_fields = acf_get_array($acf_fields); // see: /includes/modules/form/module-form-front.php:152 // $acf = acf_maybe_get_POST('acf'); // backup original acf $acf = $_POST['acf']; $acf = acf_get_array($acf); // check if fields to save are in the $_POST['acf'] dataset $values = acfe_filter_acf_values_by_keys($acf, $acf_fields); // acf fields if($values){ // save meta fields acf_save_post($post_id, $values); // restore original acf $_POST['acf'] = $acf; } } /** * add_action * * @param $tag * @param $function_to_add * @param $priority * @param $accepted_args */ function add_action($tag = '', $function_to_add = '', $priority = 10, $accepted_args = 1){ if(is_callable($function_to_add)){ add_action($tag, $function_to_add, $priority, $accepted_args); } } /** * add_filter * * @param $tag * @param $function_to_add * @param $priority * @param $accepted_args */ function add_filter($tag = '', $function_to_add = '', $priority = 10, $accepted_args = 1){ if(is_callable($function_to_add)){ add_filter($tag, $function_to_add, $priority, $accepted_args); } } /** * prefix_fields_keys * * @param $layout * @param $prefix * * @return mixed */ function prefix_fields_keys($layout, $prefix){ // vars $prefix_ = $prefix ? "{$prefix}_" : ''; if(acf_maybe_get($layout, 'sub_fields')){ // loop foreach($layout['sub_fields'] as &$field){ // key doesn't exists if(!isset($field['key'])){ $field['key'] = "field_{$prefix_}{$field['name']}"; // key exists }else{ $field['key'] = $this->do_prefix($field['key'], $prefix_); } // check conditional logic if(acf_maybe_get($field, 'conditional_logic')){ foreach($field['conditional_logic'] as &$group){ foreach($group as &$rule){ $rule['field'] = $this->do_prefix($rule['field'], $prefix_); } } } // check related fields if(isset($field['wrapper']['data-related-field'])){ $field['wrapper']['data-related-field'] = $this->do_prefix($field['wrapper']['data-related-field'], $prefix_); } // check sub fields if(acf_maybe_get($field, 'sub_fields')){ $field = $this->prefix_fields_keys($field, $prefix); } } } // return return $layout; } /** * do_prefix * * @param $string * @param $prefix * * @return array|mixed|string|string[] */ function do_prefix($string, $prefix){ if(acf_is_field_key($string)){ // check it doesn't already starts with field_prefix if(!acfe_starts_with($string, "field_{$prefix}")){ $string = substr_replace($string, "field_{$prefix}", 0, 6); } }else{ // check it doesn't already starts with prefix if(!empty($prefix) && !acfe_starts_with($string, $prefix)){ $string = "field_{$prefix}{$string}"; } } return $string; } } endif; // register store acf_register_store('acfe-module-form-actions'); /** * acfe_register_form_action_type * * @param $class * * @return bool */ function acfe_register_form_action_type($class){ // instantiate $action = new $class(); // add to store acf_get_store('acfe-module-form-actions')->set($action->name, $action); // return return true; } /** * acfe_get_form_action_types * @return array|mixed|null */ function acfe_get_form_action_types(){ return acf_get_store('acfe-module-form-actions')->get(); } /** * acfe_get_form_action * * @param $name * * @return array|mixed|null */ function acfe_get_form_action_type($name){ return acf_get_store('acfe-module-form-actions')->get($name); } /** * acfe_query_form_action_type * * @param $query * * @return false|mixed */ function acfe_query_form_action_type($query = array()){ $module = acf_get_store('acfe-module-form-actions')->query($query); if(empty($module)){ return false; } return current($module); }