function render_layout($field, $layout, $i, $value) { // vars $order = 0; $el = 'div'; $div = array('class' => 'layout', 'data-id' => $i, 'data-layout' => $layout['name']); // collapsed $collapsed = acf_get_user_setting('collapsed_' . $field['key'], ''); // cookie fallback ( version < 5.3.2 ) if ($collapsed === '') { $collapsed = acf_extract_var($_COOKIE, "acf_collapsed_{$field['key']}", ''); $collapsed = str_replace('|', ',', $collapsed); acf_update_user_setting('collapsed_' . $field['key'], $collapsed); } // explode $collapsed = explode(',', $collapsed); $collapsed = array_filter($collapsed, 'is_numeric'); // collapsed class if (in_array($i, $collapsed)) { $div['class'] .= ' -collapsed'; } // clone if (is_numeric($i)) { $order = $i + 1; } else { $div['class'] .= ' acf-clone'; } ?> <div <?php acf_esc_attr_e($div); ?> > <div class="acf-hidden"> <?php acf_hidden_input(array('name' => "{$field['name']}[{$i}][acf_fc_layout]", 'value' => $layout['name'])); ?> </div> <div class="acf-fc-layout-handle"> <span class="fc-layout-order"><?php echo $order; ?> </span> <?php echo $layout['label']; ?> </div> <ul class="acf-fc-layout-controlls acf-hl"> <li class="acf-fc-show-on-hover"> <a class="acf-icon -plus small" href="#" data-event="add-layout" title="<?php _e('Add layout', 'acf'); ?> "></a> </li> <li class="acf-fc-show-on-hover"> <a class="acf-icon -minus small" href="#" data-event="remove-layout" title="<?php _e('Remove layout', 'acf'); ?> "></a> </li> <li> <a class="acf-icon -collapse small" href="#" data-event="collapse-layout" title="<?php _e('Click to toggle', 'acf'); ?> "></a> </li> </ul> <?php if (!empty($layout['sub_fields'])) { ?> <?php if ($layout['display'] == 'table') { // update vars $el = 'td'; ?> <table class="acf-table"> <thead> <tr> <?php foreach ($layout['sub_fields'] as $sub_field) { $atts = array('class' => "acf-th acf-th-{$sub_field['name']}", 'data-key' => $sub_field['key']); // Add custom width if ($sub_field['wrapper']['width']) { $atts['data-width'] = $sub_field['wrapper']['width']; } ?> <th <?php acf_esc_attr_e($atts); ?> > <?php acf_the_field_label($sub_field); ?> <?php if ($sub_field['instructions']) { ?> <p class="description"><?php echo $sub_field['instructions']; ?> </p> <?php } ?> </th> <?php } ?> </tr> </thead> <tbody> <?php } else { ?> <div class="acf-fields <?php if ($layout['display'] == 'row') { ?> -left<?php } ?> "> <?php } ?> <?php // loop though sub fields foreach ($layout['sub_fields'] as $sub_field) { // prevent repeater field from creating multiple conditional logic items for each row if ($i !== 'acfcloneindex') { $sub_field['conditional_logic'] = 0; } // add value if (isset($value[$sub_field['key']])) { // this is a normal value $sub_field['value'] = $value[$sub_field['key']]; } elseif (isset($sub_field['default_value'])) { // no value, but this sub field has a default value $sub_field['value'] = $sub_field['default_value']; } // update prefix to allow for nested values $sub_field['prefix'] = "{$field['name']}[{$i}]"; // render input acf_render_field_wrap($sub_field, $el); } ?> <?php if ($layout['display'] == 'table') { ?> </tbody> </table> <?php } else { ?> </div> <?php } ?> <?php } ?> </div> <?php }
function render_field($field) { // ensure value is an array if (empty($field['value'])) { $field['value'] = array(); } // rows $field['min'] = empty($field['min']) ? 0 : $field['min']; $field['max'] = empty($field['max']) ? 0 : $field['max']; // populate the empty row data (used for acfcloneindex and min setting) $empty_row = array(); foreach ($field['sub_fields'] as $f) { $empty_row[$f['key']] = isset($f['default_value']) ? $f['default_value'] : false; } // If there are less values than min, populate the extra values if ($field['min']) { for ($i = 0; $i < $field['min']; $i++) { // continue if already have a value if (array_key_exists($i, $field['value'])) { continue; } // populate values $field['value'][$i] = $empty_row; } } // If there are more values than man, remove some values if ($field['max']) { for ($i = 0; $i < count($field['value']); $i++) { if ($i >= $field['max']) { unset($field['value'][$i]); } } } // setup values for row clone $field['value']['acfcloneindex'] = $empty_row; // show columns $show_order = true; $show_add = true; $show_remove = true; if ($field['max']) { if ($field['max'] == 1) { $show_order = false; } if ($field['max'] <= $field['min']) { $show_remove = false; $show_add = false; } } // field wrap $el = 'td'; $before_fields = ''; $after_fields = ''; if ($field['layout'] == 'row') { $el = 'tr'; $before_fields = '<td class="acf-table-wrap"><table class="acf-table">'; $after_fields = '</table></td>'; } elseif ($field['layout'] == 'block') { $el = 'div'; $before_fields = '<td class="acf-fields">'; $after_fields = '</td>'; } // hidden input acf_hidden_input(array('type' => 'hidden', 'name' => $field['name'])); ?> <div <?php acf_esc_attr_e(array('class' => 'acf-repeater', 'data-min' => $field['min'], 'data-max' => $field['max'])); ?> > <table <?php acf_esc_attr_e(array('class' => "acf-table acf-input-table {$field['layout']}-layout")); ?> > <?php if ($field['layout'] == 'table') { ?> <thead> <tr> <?php if ($show_order) { ?> <th class="order"><span class="order-spacer"></span></th> <?php } ?> <?php foreach ($field['sub_fields'] as $sub_field) { $atts = array('class' => "acf-th acf-th-{$sub_field['name']}", 'data-key' => $sub_field['key']); // Add custom width if ($sub_field['wrapper']['width']) { $atts['data-width'] = $sub_field['wrapper']['width']; } ?> <th <?php acf_esc_attr_e($atts); ?> > <?php acf_the_field_label($sub_field); ?> <?php if ($sub_field['instructions']) { ?> <p class="description"><?php echo $sub_field['instructions']; ?> </p> <?php } ?> </th> <?php } ?> <?php if ($show_remove) { ?> <th class="remove"><span class="remove-spacer"></span></th> <?php } ?> </tr> </thead> <?php } ?> <tbody> <?php foreach ($field['value'] as $i => $row) { ?> <tr class="acf-row<?php echo $i === 'acfcloneindex' ? ' acf-clone' : ''; ?> "> <?php if ($show_order) { ?> <td class="order" title="<?php _e('Drag to reorder', 'acf'); ?> "><?php echo intval($i) + 1; ?> </td> <?php } ?> <?php echo $before_fields; ?> <?php foreach ($field['sub_fields'] as $sub_field) { // prevent repeater field from creating multiple conditional logic items for each row if ($i !== 'acfcloneindex') { $sub_field['conditional_logic'] = 0; } // add value if (isset($row[$sub_field['key']])) { // this is a normal value $sub_field['value'] = $row[$sub_field['key']]; } elseif (isset($sub_field['default_value'])) { // no value, but this sub field has a default value $sub_field['value'] = $sub_field['default_value']; } // update prefix to allow for nested values $sub_field['prefix'] = "{$field['name']}[{$i}]"; // render input acf_render_field_wrap($sub_field, $el); ?> <?php } ?> <?php echo $after_fields; ?> <?php if ($show_remove) { ?> <td class="remove"> <a class="acf-icon small acf-repeater-add-row" href="#" data-before="1" title="<?php _e('Add row', 'acf'); ?> "><i class="acf-sprite-add"></i></a> <a class="acf-icon small acf-repeater-remove-row" href="#" title="<?php _e('Remove row', 'acf'); ?> "><i class="acf-sprite-remove"></i></a> </td> <?php } ?> </tr> <?php } ?> </tbody> </table> <?php if ($show_add) { ?> <ul class="acf-hl acf-clearfix"> <li class="acf-fr"> <a href="#" class="acf-button blue acf-repeater-add-row"><?php echo $field['button_label']; ?> </a> </li> </ul> <?php } ?> </div> <?php }
function render_layout($field, $layout, $i, $value) { // vars $order = 0; // atts $layout_atts = array('class' => 'layout', 'data-layout' => $layout['name'], 'data-toggle' => 'open'); $table_atts = array('class' => "acf-table acf-input-table {$layout['display']}-layout"); // collapsed if (!empty($_COOKIE["acf_collapsed_{$field['key']}"])) { $collapsed = $_COOKIE["acf_collapsed_{$field['key']}"]; $collapsed = explode('|', $collapsed); if (in_array($i, $collapsed)) { $layout_atts['data-toggle'] = 'closed'; $table_atts['style'] = 'display:none;'; } } // clone if (is_numeric($i)) { $order = $i + 1; } else { $layout_atts['class'] .= ' acf-clone'; } // field wrap $el = 'td'; $before_fields = ''; $after_fields = ''; if ($layout['display'] == 'row') { $el = 'tr'; $before_fields = '<td class="acf-table-wrap"><table class="acf-table">'; $after_fields = '</table></td>'; } elseif ($layout['display'] == 'block') { $el = 'div'; $before_fields = '<td class="acf-fields">'; $after_fields = '</td>'; } ?> <div <?php acf_esc_attr_e($layout_atts); ?> > <div style="display:none"> <?php acf_hidden_input(array('name' => "{$field['name']}[{$i}][acf_fc_layout]", 'value' => $layout['name'])); ?> </div> <div class="acf-fc-layout-handle"> <span class="fc-layout-order"><?php echo $order; ?> </span> <?php echo $layout['label']; ?> </div> <ul class="acf-fc-layout-controlls acf-hl acf-clearfix"> <li> <a class="acf-icon acf-icon-plus small acf-fc-add" href="#" data-before="1" title="<?php _e('Add layout', 'acf'); ?> "></a> </li> <li> <a class="acf-icon acf-icon-minus small acf-fc-remove" href="#" title="<?php _e('Remove layout', 'acf'); ?> "></a> </li> </ul> <?php if (!empty($layout['sub_fields'])) { ?> <table <?php acf_esc_attr_e($table_atts); ?> > <?php if ($layout['display'] == 'table') { ?> <thead> <tr> <?php foreach ($layout['sub_fields'] as $sub_field) { $atts = array('class' => "acf-th acf-th-{$sub_field['name']}", 'data-key' => $sub_field['key']); // Add custom width if ($sub_field['wrapper']['width']) { $atts['data-width'] = $sub_field['wrapper']['width']; } ?> <th <?php acf_esc_attr_e($atts); ?> > <?php acf_the_field_label($sub_field); ?> <?php if ($sub_field['instructions']) { ?> <p class="description"><?php echo $sub_field['instructions']; ?> </p> <?php } ?> </th> <?php } ?> </tr> </thead> <?php } ?> <tbody> <tr> <?php echo $before_fields; // loop though sub fields foreach ($layout['sub_fields'] as $sub_field) { // prevent repeater field from creating multiple conditional logic items for each row if ($i !== 'acfcloneindex') { $sub_field['conditional_logic'] = 0; } // add value if (isset($value[$sub_field['key']])) { // this is a normal value $sub_field['value'] = $value[$sub_field['key']]; } elseif (isset($sub_field['default_value'])) { // no value, but this sub field has a default value $sub_field['value'] = $sub_field['default_value']; } // update prefix to allow for nested values $sub_field['prefix'] = "{$field['name']}[{$i}]"; // render input acf_render_field_wrap($sub_field, $el); } // layout: Row echo $after_fields; ?> </tr> </tbody> </table> <?php } ?> </div> <?php }
<?php foreach ($field['sub_fields'] as $sub_field) { $atts = array('class' => "acf-th acf-th-{$sub_field['name']}", 'data-key' => $sub_field['key']); // Add custom width if ($sub_field['wrapper']['width']) { $atts['data-width'] = $sub_field['wrapper']['width']; } ?> <th <?php acf_esc_attr_e($atts); ?> > <?php acf_the_field_label($sub_field); ?> <?php if ($sub_field['instructions']) { ?> <p class="description"><?php echo $sub_field['instructions']; ?> </p> <?php } ?> </th> <?php }
function render_field($field) { // vars $div = array('class' => 'acf-repeater', 'data-min' => $field['min'], 'data-max' => $field['max']); // ensure value is an array if (empty($field['value'])) { $field['value'] = array(); $div['class'] .= ' -empty'; } // rows $field['min'] = empty($field['min']) ? 0 : $field['min']; $field['max'] = empty($field['max']) ? 0 : $field['max']; // populate the empty row data (used for acfcloneindex and min setting) $empty_row = array(); // If there are less values than min, populate the extra values if ($field['min']) { for ($i = 0; $i < $field['min']; $i++) { // continue if already have a value if (array_key_exists($i, $field['value'])) { continue; } // populate values $field['value'][$i] = $empty_row; } } // If there are more values than man, remove some values if ($field['max']) { for ($i = 0; $i < count($field['value']); $i++) { if ($i >= $field['max']) { unset($field['value'][$i]); } } } // setup values for row clone $field['value']['acfcloneindex'] = $empty_row; // show columns $show_order = true; $show_add = true; $show_remove = true; if ($field['max']) { if ($field['max'] == 1) { $show_order = false; } if ($field['max'] <= $field['min']) { $show_remove = false; $show_add = false; } } // field wrap $el = 'td'; $before_fields = ''; $after_fields = ''; if ($field['layout'] == 'row') { $el = 'div'; $before_fields = '<td class="acf-fields -left">'; $after_fields = '</td>'; } elseif ($field['layout'] == 'block') { $el = 'div'; $before_fields = '<td class="acf-fields">'; $after_fields = '</td>'; } // layout $div['class'] .= ' -' . $field['layout']; // hidden input acf_hidden_input(array('type' => 'hidden', 'name' => $field['name'])); // collapsed $collapsed = array(); if ($field['collapsed']) { // get user setting $collapsed = acf_get_user_setting('collapsed_' . $field['key'], ''); $collapsed = explode(',', $collapsed); $collapsed = array_filter($collapsed, 'is_numeric'); // add target class foreach (array_keys($field['sub_fields']) as $i) { if ($field['sub_fields'][$i]['key'] === $field['collapsed']) { $field['sub_fields'][$i]['wrapper']['class'] .= ' -collapsed-target'; } } } ?> <div <?php acf_esc_attr_e($div); ?> > <table class="acf-table"> <?php if ($field['layout'] == 'table') { ?> <thead> <tr> <?php if ($show_order) { ?> <th class="acf-row-handle"><span></span></th> <?php } ?> <?php foreach ($field['sub_fields'] as $sub_field) { $atts = array('class' => 'acf-th', 'data-key' => $sub_field['key']); // add type $atts['class'] .= ' acf-th-' . $sub_field['type']; // Add custom width if ($sub_field['wrapper']['width']) { $atts['data-width'] = $sub_field['wrapper']['width']; } ?> <th <?php acf_esc_attr_e($atts); ?> > <?php acf_the_field_label($sub_field); ?> <?php if ($sub_field['instructions']) { ?> <p class="description"><?php echo $sub_field['instructions']; ?> </p> <?php } ?> </th> <?php } ?> <?php if ($show_remove) { ?> <th class="acf-row-handle"><span></span></th> <?php } ?> </tr> </thead> <?php } ?> <tbody> <?php foreach ($field['value'] as $i => $row) { $row_class = 'acf-row'; if ($i === 'acfcloneindex') { $row_class .= ' acf-clone'; } elseif (in_array($i, $collapsed)) { $row_class .= ' -collapsed'; } ?> <tr class="<?php echo $row_class; ?> " data-id="<?php echo $i; ?> "> <?php if ($show_order) { ?> <td class="acf-row-handle order" title="<?php _e('Drag to reorder', 'acf'); ?> "> <?php if ($field['collapsed']) { ?> <a class="acf-icon -collapse small" href="#" data-event="collapse-row" title="<?php _e('Click to toggle', 'acf'); ?> "></a> <?php } ?> <span><?php echo intval($i) + 1; ?> </span> </td> <?php } ?> <?php echo $before_fields; ?> <?php foreach ($field['sub_fields'] as $sub_field) { // prevent repeater field from creating multiple conditional logic items for each row if ($i !== 'acfcloneindex') { $sub_field['conditional_logic'] = 0; } // add value if (isset($row[$sub_field['key']])) { // this is a normal value $sub_field['value'] = $row[$sub_field['key']]; } elseif (isset($sub_field['default_value'])) { // no value, but this sub field has a default value $sub_field['value'] = $sub_field['default_value']; } // update prefix to allow for nested values $sub_field['prefix'] = "{$field['name']}[{$i}]"; // render input acf_render_field_wrap($sub_field, $el); ?> <?php } ?> <?php echo $after_fields; ?> <?php if ($show_remove) { ?> <td class="acf-row-handle remove"> <a class="acf-icon -plus small" href="#" data-event="add-row" title="<?php _e('Add row', 'acf'); ?> "></a> <a class="acf-icon -minus small" href="#" data-event="remove-row" title="<?php _e('Remove row', 'acf'); ?> "></a> </td> <?php } ?> </tr> <?php } ?> </tbody> </table> <?php if ($show_add) { ?> <ul class="acf-hl"> <li class="acf-fr"> <a href="#" class="acf-button blue" data-event="add-row"><?php echo $field['button_label']; ?> </a> </li> </ul> <?php } ?> </div> <?php }