__('Dynamic Render', 'acfe'),
'name' => 'acfe_flexible_layouts_templates',
'key' => 'acfe_flexible_layouts_templates',
'instructions' => __('Render the layout using custom template, style & javascript files', 'acfe') . '. ' . '' . __('See documentation', 'acfe') . '',
'type' => 'true_false',
'message' => '',
'default_value' => false,
'ui' => true,
'ui_on_text' => '',
'ui_off_text' => '',
'conditional_logic' => array(
array(
array(
'field' => 'acfe_flexible_advanced',
'operator' => '==',
'value' => '1',
),
)
)
));
// Preview
acf_render_field_setting($field, array(
'label' => __('Dynamic Preview', 'acfe'),
'name' => 'acfe_flexible_layouts_previews',
'key' => 'acfe_flexible_layouts_previews',
'instructions' => __('Use layouts render settings to display a dynamic preview in the administration', 'acfe') . '. ' . '' . __('See documentation', 'acfe') . '',
'type' => 'true_false',
'message' => '',
'default_value' => false,
'ui' => true,
'ui_on_text' => '',
'ui_off_text' => '',
'conditional_logic' => array(
array(
array(
'field' => 'acfe_flexible_advanced',
'operator' => '==',
'value' => '1',
),
array(
'field' => 'acfe_flexible_layouts_templates',
'operator' => '==',
'value' => '1',
),
)
)
));
// Placholder
acf_render_field_setting($field, array(
'label' => __('Layouts Placeholder', 'acfe'),
'name' => 'acfe_flexible_layouts_placeholder',
'key' => 'acfe_flexible_layouts_placeholder',
'instructions' => __('Display a placeholder with an icon', 'acfe') . '. ' . '' . __('See documentation', 'acfe') . '',
'type' => 'true_false',
'message' => '',
'default_value' => false,
'ui' => true,
'ui_on_text' => '',
'ui_off_text' => '',
'conditional_logic' => array(
array(
array(
'field' => 'acfe_flexible_advanced',
'operator' => '==',
'value' => '1',
),
array(
'field' => 'acfe_flexible_layouts_previews',
'operator' => '!=',
'value' => '1',
),
)
)
));
}
/**
* render_layout_settings
*
* @param $flexible
* @param $layout
* @param $prefix
*/
function render_layout_settings($flexible, $layout, $prefix){
if(!acfe_get($flexible, 'acfe_flexible_layouts_templates')){
return;
}
// vars
$name = $flexible['name'];
$key = $flexible['key'];
$l_name = $layout['name'];
$prepend = acfe_get_setting('theme_folder') ? trailingslashit(acfe_get_setting('theme_folder')) : '';
// Title
echo '';
acf_render_field_wrap(array(
'label' => __('Render', 'acfe'),
'type' => 'hidden',
'name' => 'acfe_flexible_render_label',
'wrapper' => array(
'class' => 'acfe-flexible-field-setting acfe-flexible-field-setting-row',
)
), 'ul');
echo '
';
// Template
$prepend = apply_filters("acfe/flexible/prepend/template", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/template/name={$name}", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/template/key={$key}", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/template/layout={$l_name}", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/template/name={$name}&layout={$l_name}", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/template/key={$key}&layout={$l_name}", $prepend, $flexible, $layout);
acf_render_field_wrap(array(
'prepend' => $prepend,
'name' => 'acfe_flexible_render_template',
'type' => 'text',
'class' => 'acf-fc-meta-name',
'prefix' => $prefix,
'value' => $layout['acfe_flexible_render_template'],
'placeholder' => 'template.php',
), 'ul');
// Style
$prepend = apply_filters("acfe/flexible/prepend/style", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/style/name={$name}", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/style/key={$key}", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/style/layout={$l_name}", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/style/name={$name}&layout={$l_name}", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/style/key={$key}&layout={$l_name}", $prepend, $flexible, $layout);
acf_render_field_wrap(array(
'prepend' => $prepend,
'name' => 'acfe_flexible_render_style',
'type' => 'text',
'class' => 'acf-fc-meta-name',
'prefix' => $prefix,
'value' => $layout['acfe_flexible_render_style'],
'placeholder' => 'style.css',
), 'ul');
// Script
$prepend = apply_filters("acfe/flexible/prepend/script", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/script/name={$name}", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/script/key={$key}", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/script/layout={$l_name}", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/script/name={$name}&layout={$l_name}", $prepend, $flexible, $layout);
$prepend = apply_filters("acfe/flexible/prepend/script/key={$key}&layout={$l_name}", $prepend, $flexible, $layout);
acf_render_field_wrap(array(
'prepend' => $prepend,
'name' => 'acfe_flexible_render_script',
'type' => 'text',
'class' => 'acf-fc-meta-name',
'prefix' => $prefix,
'value' => $layout['acfe_flexible_render_script'],
'placeholder' => 'script.js',
), 'ul');
}
/**
* render_field
*
* @param $field
*/
function render_field($field){
// check setting
if(!acfe_get($field, 'acfe_flexible_layouts_templates') || !acfe_get($field, 'acfe_flexible_layouts_previews')){
return;
}
// vars
global $is_preview;
$is_preview = true;
// render: global enqueue
acfe_flexible_render_enqueue($field);
// loop layouts
foreach($field['layouts'] as $layout){
// render: layout enqueue
acfe_flexible_render_layout_enqueue($layout, $field);
}
}
/**
* wrapper_attributes
*
* @param $wrapper
* @param $field
*
* @return mixed
*/
function wrapper_attributes($wrapper, $field){
if(acfe_get($field, 'acfe_flexible_layouts_placeholder')){
$wrapper['data-acfe-flexible-placeholder'] = 1;
}
if(acfe_get($field, 'acfe_flexible_layouts_templates') && acfe_get($field, 'acfe_flexible_layouts_previews')){
$wrapper['data-acfe-flexible-placeholder'] = 1;
$wrapper['data-acfe-flexible-preview'] = 1;
}
return $wrapper;
}
/**
* prepare_layout
*
* @param $layout
* @param $field
* @param $i
* @param $value
* @param $prefix
*
* @return mixed
*/
function prepare_layout($layout, $field, $i, $value, $prefix){
if(!acfe_get($field, 'acfe_flexible_layouts_placeholder') && !acfe_get($field, 'acfe_flexible_layouts_previews')){
return $layout;
}
// Vars
$name = $field['_name'];
$key = $field['key'];
$l_name = $layout['name'];
$placeholder = array(
'class' => 'acfe-fc-placeholder',
'title' => __('Edit layout', 'acfe'),
);
$placeholder = apply_filters("acfe/flexible/layouts/placeholder", $placeholder, $layout, $field, $i, $value, $prefix);
$placeholder = apply_filters("acfe/flexible/layouts/placeholder/name={$name}", $placeholder, $layout, $field, $i, $value, $prefix);
$placeholder = apply_filters("acfe/flexible/layouts/placeholder/key={$key}", $placeholder, $layout, $field, $i, $value, $prefix);
$placeholder = apply_filters("acfe/flexible/layouts/placeholder/layout={$l_name}", $placeholder, $layout, $field, $i, $value, $prefix);
$placeholder = apply_filters("acfe/flexible/layouts/placeholder/name={$name}&layout={$l_name}", $placeholder, $layout, $field, $i, $value, $prefix);
$placeholder = apply_filters("acfe/flexible/layouts/placeholder/key={$key}&layout={$l_name}", $placeholder, $layout, $field, $i, $value, $prefix);
$html = false;
if(!empty($value) && acfe_get($field, 'acfe_flexible_layouts_previews')){
ob_start();
$this->layout_preview(array(
'post_id' => acf_get_valid_post_id(),
'i' => $i,
'field_key' => $key,
'nonce' => wp_create_nonce("acf_field_flexible_content_{$key}"),
'layout' => $l_name,
'value' => $value,
));
$html = ob_get_clean();
if(strlen($html) > 0){
$placeholder['class'] .= ' acfe-fc-preview';
}
}
?>
0,
'i' => 0,
'field_key' => '',
'nonce' => '',
'layout' => '',
'value' => array()
));
}
// verify nonce
if(!acfe_verify_ajax($options['nonce'], $options['field_key'], true, 'flexible_content')){
die();
}
// Load field
$field = acf_get_field($options['field_key']);
if(!$field){
return $this->return_or_die();
}
// Layout
$instance = acf_get_field_type('flexible_content');
$layout = $instance->get_layout($options['layout'], $field);
if(!$layout){
return $this->return_or_die();
}
// Global
global $is_preview;
// Vars
$i = (int) $options['i'];
$field_key = $options['field_key'];
$value = wp_unslash($options['value']);
$is_preview = true;
$name = $field['_name'];
$key = $field['key'];
$l_name = $layout['name'];
$post_id = acf_uniqid('acfe/flexible_content/preview');
// prepare meta
$meta = array(
$field_key => array()
);
// if preview index is higher than 0
// add empty layouts to mimic get_row_index()
if($i > 0){
for($j=0; $j < $i; $j++){
$meta[ $field_key ][] = array(
'acf_fc_layout' => $layout['name']
);
}
}
// append current layout
$meta[ $field_key ][] = $value;
// setup meta
acfe_setup_meta($meta, $post_id, true);
if(have_rows($field_key)):
while(have_rows($field_key)): the_row();
// continue to loop until the correct preview index
if(acf_get_loop('active', 'i') !== $i){
// remove previously created empty layouts
// so acf_get_loop('active', 'value') only return one row (current)
$loop = acf_get_loop('active');
unset($loop['value'][ $loop['i'] ]);
acf_update_loop('active', 'value', $loop['value']);
continue;
}
// global post
global $post;
if($this->no_post){
$post = null;
}
// context:ajax/taxonomy/user page
if(!isset($post)){
$post_id = acfe_get_post_id('array');
// context:ajax
if($post_id['type'] === 'post'){
$post = get_post($post_id['id']);
// context:taxonomy/user page
// assign for next call
// this fix the issue where doing new WP_Query() in a taxonomy page
// will setup the last $post as global and break next get_field() calls
}else{
$this->no_post = true;
}
}
if($this->no_post){
add_action('loop_end', array($this, 'loop_end'));
}
add_filter('acf/pre_load_post_id', array($this, 'pre_load_post_id'), 2, 2);
add_action('loop_start', array($this, 'loop_start'));
// deprecated
do_action_deprecated("acfe/flexible/preview/name={$name}", array($field, $layout), '0.8.6.7');
do_action_deprecated("acfe/flexible/preview/key={$key}", array($field, $layout), '0.8.6.7');
do_action_deprecated("acfe/flexible/layout/preview/layout={$l_name}", array($field, $layout), '0.8.6.7');
do_action_deprecated("acfe/flexible/layout/preview/name={$name}&layout={$l_name}", array($field, $layout), '0.8.6.7');
do_action_deprecated("acfe/flexible/layout/preview/key={$key}&layout={$l_name}", array($field, $layout), '0.8.6.7');
do_action_deprecated("acfe/flexible/preview", array($field, $layout), '0.8.6.7');
// include template
acfe_flexible_render_layout_template($layout, $field);
remove_filter('acf/pre_load_post_id', array($this, 'pre_load_post_id'), 2);
remove_action('loop_start', array($this, 'loop_start'));
if($this->no_post){
remove_action('loop_end', array($this, 'loop_end'));
}
endwhile;
endif;
acfe_reset_meta();
$is_preview = false;
return $this->return_or_die();
}
/**
* loop_start
*
* Allow to use new WP_Query() in the layout preview/admin
* https://core.trac.wordpress.org/ticket/18408
*
* @return void
*/
function loop_start(){
if(is_admin()){
global $wp_query, $post;
$wp_query->post = $post;
}
}
/**
* loop_end
*
* Quick hack for taxonomy/user/options page
* This reset the global $post after the end of while($q->have_posts()): $q->the_post()
* Not ideal, but it works
*
* @return void
*/
function loop_end(){
if(is_admin()){
global $post;
$post = null;
}
}
/**
* pre_load_post_id
*
* This only affect get_field() in the layout preview/admin
*
* @param $null
* @param $post_id
*
* @return false|mixed
*/
function pre_load_post_id($null, $post_id){
// post id provided
if($post_id){
return $null;
}
// retrieve global post
global $post;
if($post){
return null; // let acf find the post from the $post
}
// retrieve the correct post id dynamically
// context:taxonomy/user/options page
return acfe_get_post_id();
}
/**
* return_or_die
*
* @return bool|void
*/
function return_or_die(){
// check ajax & make sure the action is correct
if(wp_doing_ajax() && acf_maybe_get_POST('action') === 'acfe/flexible/layout_preview'){
die;
}
return true;
}
}
acf_new_instance('acfe_field_flexible_content_preview');
endif;