web/wp-content/plugins/acf-extended/includes/fields/field-flexible-content-actions.php (268 lines of code) (raw):

<?php if(!defined('ABSPATH')){ exit; } if(!class_exists('acfe_field_flexible_content_actions')): class acfe_field_flexible_content_actions{ /** * construct */ function __construct(){ // Hooks add_filter('acfe/flexible/defaults_field', array($this, 'defaults_field'), 6); add_filter('acfe/flexible/render_field_settings', array($this, 'render_field_settings'), 6); add_filter('acfe/flexible/validate_field', array($this, 'validate_actions')); add_filter('acfe/flexible/wrapper_attributes', array($this, 'wrapper_attributes'), 10, 2); add_filter('acfe/flexible/load_fields', array($this, 'load_fields'), 10, 2); add_filter('acfe/flexible/layouts/div', array($this, 'layout_div'), 10, 6); add_filter('acfe/flexible/prepare_layout', array($this, 'prepare_layout'), 10, 5); add_filter('acfe/flexible/layouts/icons', array($this, 'layout_icons'), 11, 3); add_filter('acfe/flexible/secondary_actions', array($this, 'secondary_actions'), 10, 2); add_filter('acf/fields/flexible_content/layout_attrs', array($this, 'layout_attrs'), 5, 4); add_filter('acf/load_value/type=flexible_content', array($this, 'load_value'), 10, 3); } /** * defaults_field * * acfe/flexible/defaults_field * * @param $field * * @return mixed */ function defaults_field($field){ $field['acfe_flexible_add_actions'] = array(); return $field; } /** * render_field_settings * * acfe/flexible/render_field_settings * * @param $field */ function render_field_settings($field){ /** * old settings: * * acfe_flexible_title_edition * acfe_flexible_toggle * acfe_flexible_copy_paste * acfe_flexible_lock * acfe_flexible_close_button * * acfe_flexible_clone */ $choices = array( 'title' => __('Inline Title Edit', 'acfe'), 'toggle' => __('Toggle Layout', 'acfe'), 'copy' => __('Copy/paste Layout', 'acfe'), 'lock' => __('Lock Layouts', 'acfe'), 'close' => __('Close Button', 'acfe'), ); if(acf_version_compare(acf_get_setting('version'), '<', '5.9')){ $choices['clone'] = __('Clone', 'acfe'); } acf_render_field_setting($field, array( 'label' => __('Additional Actions', 'acfe'), 'name' => 'acfe_flexible_add_actions', 'key' => 'acfe_flexible_add_actions', 'instructions' => '<a href="https://www.acf-extended.com/features/fields/flexible-content/advanced-settings" target="_blank">' . __('See documentation', 'acfe') . '</a>', 'type' => 'checkbox', 'default_value' => '', 'layout' => 'horizontal', 'choices' => $choices, 'conditional_logic' => array( array( array( 'field' => 'acfe_flexible_advanced', 'operator' => '==', 'value' => '1', ), ) ) )); } /** * validate_actions * * acfe/flexible/validate_field * * @param $field * * @return mixed */ function validate_actions($field){ $actions = acf_get_array($field['acfe_flexible_add_actions']); // acfe_flexible_title_edition if(acf_maybe_get($field, 'acfe_flexible_title_edition')){ if(!in_array('title', $actions)) $actions[] = 'title'; acfe_unset($field, 'acfe_flexible_title_edition'); } // acfe_flexible_toggle if(acf_maybe_get($field, 'acfe_flexible_toggle')){ if(!in_array('toggle', $actions)) $actions[] = 'toggle'; acfe_unset($field, 'acfe_flexible_toggle'); } // acfe_flexible_copy_paste if(acf_maybe_get($field, 'acfe_flexible_copy_paste')){ if(!in_array('copy', $actions)) $actions[] = 'copy'; acfe_unset($field, 'acfe_flexible_copy_paste'); } // acfe_flexible_lock if(acf_maybe_get($field, 'acfe_flexible_lock')){ if(!in_array('lock', $actions)) $actions[] = 'lock'; acfe_unset($field, 'acfe_flexible_lock'); } // acfe_flexible_close_button if(acf_maybe_get($field, 'acfe_flexible_close_button')){ if(!in_array('close', $actions)) $actions[] = 'close'; acfe_unset($field, 'acfe_flexible_close_button'); } // acfe_flexible_clone if(acf_maybe_get($field, 'acfe_flexible_clone')){ if(!in_array('clone', $actions)) $actions[] = 'clone'; acfe_unset($field, 'acfe_flexible_clone'); } $field['acfe_flexible_add_actions'] = $actions; return $field; } /** * wrapper_attributes * * acfe/flexible/wrapper_attributes * * @param $wrapper * @param $field * * @return mixed */ function wrapper_attributes($wrapper, $field){ $actions = $field['acfe_flexible_add_actions']; // Title if(in_array('title', $actions)){ $wrapper['data-acfe-flexible-title-edition'] = 1; } // Toggle if(in_array('toggle', $actions)){ $wrapper['data-acfe-flexible-toggle'] = 1; } // Copy if(in_array('copy', $actions)){ $wrapper['data-acfe-flexible-copy-paste'] = 1; } // Lock $lock = in_array('lock', $actions); $lock = apply_filters("acfe/flexible/lock", $lock, $field); $lock = apply_filters("acfe/flexible/lock/name={$field['_name']}", $lock, $field); $lock = apply_filters("acfe/flexible/lock/key={$field['key']}", $lock, $field); if($lock){ $wrapper['data-acfe-flexible-lock'] = 1; } // Clone if(in_array('close', $actions)){ $wrapper['data-acfe-flexible-close-button'] = 1; } return $wrapper; } /** * load_fields * * acfe/flexible/load_fields * * @param $fields * @param $field * * @return mixed */ function load_fields($fields, $field){ // check setting if(!isset($field['acfe_flexible_add_actions'])){ return $fields; } // actions $actions = $field['acfe_flexible_add_actions']; // loop layouts foreach($field['layouts'] as $i => $layout){ // Title if(in_array('title', $actions)){ // Vars $key = "field_{$layout['key']}_title"; $name = 'acfe_flexible_layout_title'; $label = $layout['label']; // Add local acf_add_local_field(array( 'label' => false, 'key' => $key, 'name' => $name, 'type' => 'text', 'required' => false, 'maxlength' => false, 'default_value' => $label, 'placeholder' => $label, 'parent_layout' => $layout['key'], 'parent' => $field['key'] )); // Add sub field array_unshift($fields, acf_get_field($key)); } // Toggle if(in_array('toggle', $actions)){ // Vars $key = "field_{$layout['key']}_toggle"; $name = 'acfe_flexible_toggle'; // Add local acf_add_local_field(array( 'label' => false, 'key' => $key, 'name' => $name, 'type' => 'acfe_hidden', 'required' => false, 'default_value' => false, 'parent_layout' => $layout['key'], 'parent' => $field['key'] )); // Add sub field array_unshift($fields, acf_get_field($key)); } } return $fields; } /** * layout_div * * @param $div * @param $layout * @param $field * * @return mixed */ function layout_div($div, $layout, $field, $i, $value, $prefix){ if(in_array('toggle', $field['acfe_flexible_add_actions'])){ if(isset($value["field_{$layout['key']}_toggle"]) && !empty($value["field_{$layout['key']}_toggle"])){ $div['class'] .= ' acfe-flexible-layout-hidden'; } } return $div; } /** * prepare_layout * * acfe/flexible/prepare_layout * * @param $layout * @param $field * @param $i * @param $value * @param $prefix * * @return mixed */ function prepare_layout($layout, $field, $i, $value, $prefix){ if(empty($layout['sub_fields'])){ return $layout; } // Actions $actions = $field['acfe_flexible_add_actions']; // Title if(in_array('title', $actions)){ $sub_field = acfe_extract_sub_field($layout, 'acfe_flexible_layout_title', $value); if($sub_field){ // update prefix to allow for nested values $sub_field['prefix'] = $prefix; $sub_field['class'] = 'acfe-flexible-control-title'; $sub_field['data-acfe-flexible-control-title-input'] = 1; $sub_field = acf_validate_field($sub_field); $sub_field = acf_prepare_field($sub_field); $input_attrs = array(); foreach(array('type', 'id', 'class', 'name', 'value', 'placeholder', 'maxlength', 'pattern', 'readonly', 'disabled', 'required', 'data-acfe-flexible-control-title-input') as $k){ if(isset($sub_field[$k])){ $input_attrs[$k] = $sub_field[$k]; } } // render input echo acf_get_text_input(acf_filter_attrs($input_attrs)); } } // Toggle if(in_array('toggle', $actions)){ $sub_field = acfe_extract_sub_field($layout, 'acfe_flexible_toggle', $value); if($sub_field){ // update prefix to allow for nested values $sub_field['prefix'] = $prefix; $sub_field['class'] = 'acfe-flexible-layout-toggle'; $sub_field = acf_validate_field($sub_field); $sub_field = acf_prepare_field($sub_field); $input_attrs = array(); foreach(array('type', 'id', 'class', 'name', 'value') as $k){ if(isset($sub_field[$k])){ $input_attrs[$k] = $sub_field[$k]; } } // render input echo acf_get_hidden_input(acf_filter_attrs($input_attrs)); } } return $layout; } /** * layout_icons * * acfe/flexible/layouts/icons * * @param $icons * @param $layout * @param $field * * @return mixed */ function layout_icons($icons, $layout, $field){ $actions = $field['acfe_flexible_add_actions']; // Toggle if(in_array('toggle', $actions)){ $icons = array_merge(array( 'toggle' => '<a class="acf-icon small light acf-js-tooltip acfe-flexible-icon dashicons dashicons-hidden" href="#" title="'. __('Toggle layout', 'acfe') . '" data-acfe-flexible-control-toggle="' . $layout['name'] . '"></a>' ), $icons); } // Copy if(in_array('copy', $actions)){ $icons = array_merge(array( 'copy' => '<a class="acf-icon small light acf-js-tooltip acfe-flexible-icon dashicons dashicons-category" href="#" title="'. __('Copy layout', 'acfe') .'" data-acfe-flexible-control-copy="' . $layout['name'] . '"></a>' ), $icons); } // Clone if(in_array('clone', $actions) && acf_version_compare(acf_get_setting('version'), '<', '5.9')){ $icons = array_merge($icons, array( 'clone' => '<a class="acf-icon small light acf-js-tooltip acfe-flexible-icon dashicons dashicons-admin-page" href="#" title="'. __('Clone layout', 'acfe'). '" data-acfe-flexible-control-clone="' . $layout['name'] . '"></a>' )); } return $icons; } /** * secondary_actions * * acfe/flexible/secondary_actions * * @param $actions * @param $field * * @return mixed */ function secondary_actions($actions, $field){ if(!in_array('copy', $field['acfe_flexible_add_actions'])){ return $actions; } $actions['copy'] = '<a href="#" data-acfe-flexible-control-action="copy">' . __('Copy layouts', 'acfe') . '</a>'; $actions['paste'] = '<a href="#" data-acfe-flexible-control-action="paste">' . __('Paste layouts', 'acfe') . '</a>'; return $actions; } /** * layout_attrs * * acf/fields/flexible_content/layout_attrs * * @param $attrs * @param $field * @param $layout * @param $i * * @return mixed */ function layout_attrs($attrs, $field, $layout, $i){ if(!in_array('title', $field['acfe_flexible_add_actions'])){ return $attrs; } $attrs['class'] .= ' acf-js-tooltip'; $attrs['title'] = __('Layout', 'acfe') . ': ' . esc_attr(strip_tags($layout['label'])); return $attrs; } /** * load_value * * acf/load_value/type=flexible_content * * @param $value * @param $post_id * @param $field * * @return array|mixed */ function load_value($value, $post_id, $field){ // Bail early if admin if(is_admin() && !wp_doing_ajax()){ return $value; } // Bail early if preview if(acf_maybe_get_POST('action') === 'acfe/flexible/layout_preview'){ return $value; } if(empty($field['layouts'])){ return $value; } if(!in_array('toggle', $field['acfe_flexible_add_actions'])){ return $value; } $models = array(); foreach($field['layouts'] as $layout_key => $layout){ $models[$layout['name']] = array( 'key' => $layout['key'], 'name' => $layout['name'], 'toggle' => "field_{$layout['key']}_toggle" ); } $value = acf_get_array($value); foreach($value as $k => $layout){ if(!isset($models[$layout['acf_fc_layout']])){ continue; } if(!acf_maybe_get($layout, $models[$layout['acf_fc_layout']]['toggle'])){ continue; } unset($value[$k]); } // reassign keys $value = array_values($value); return $value; } } acf_new_instance('acfe_field_flexible_content_actions'); endif;