name = 'repeater'; $this->label = __("Repeater",'acf'); $this->category = __("Layout",'acf'); $this->defaults = array( 'sub_fields' => array(), 'row_min' => 0, 'row_limit' => 0, 'layout' => 'table', 'button_label' => __("Add Row",'acf'), ); $this->l10n = array( 'min' => __("Minimum rows reached ( {min} rows )",'acf'), 'max' => __("Maximum rows reached ( {max} rows )",'acf'), ); // do not delete! parent::__construct(); // settings $this->settings = array( 'path' => apply_filters('acf/helpers/get_path', __FILE__), 'dir' => apply_filters('acf/helpers/get_dir', __FILE__), 'version' => '1.1.1' ); } /* * input_admin_enqueue_scripts() * * This action is called in the admin_enqueue_scripts action on the edit screen where your field is created. * Use this action to add css + javascript to assist your create_field() action. * * $info http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts * @type action * @since 3.6 * @date 23/01/13 */ function input_admin_enqueue_scripts() { // register acf scripts wp_register_script( 'acf-input-repeater', $this->settings['dir'] . 'input.js', array('acf-input') ); wp_register_style( 'acf-input-repeater', $this->settings['dir'] . 'input.css', array('acf-input') ); // scripts wp_enqueue_script(array( 'acf-input-repeater', )); // styles wp_enqueue_style(array( 'acf-input-repeater', )); } /* * field_group_admin_enqueue_scripts() * * This action is called in the admin_enqueue_scripts action on the edit screen where your field is edited. * Use this action to add css + javascript to assist your create_field_options() action. * * $info http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts * @type action * @since 3.6 * @date 23/01/13 */ function field_group_admin_enqueue_scripts() { wp_register_script( 'acf-field-group-repeater', $this->settings['dir'] . 'field-group.js', array('acf-field-group') ); // scripts wp_enqueue_script(array( 'acf-field-group-repeater', )); } /* * load_field() * * This filter is appied to the $field after it is loaded from the database * * @type filter * @since 3.6 * @date 23/01/13 * * @param $field - the field array holding all the field options * * @return $field - the field array holding all the field options */ function load_field( $field ) { // apply_load field to all sub fields if( isset($field['sub_fields']) && is_array($field['sub_fields']) ) { foreach( $field['sub_fields'] as $k => $sub_field ) { // apply filters $sub_field = apply_filters('acf/load_field_defaults', $sub_field); // apply filters foreach( array('type', 'name', 'key') as $key ) { // run filters $sub_field = apply_filters('acf/load_field/' . $key . '=' . $sub_field[ $key ], $sub_field); // new filter } // update sub field $field['sub_fields'][ $k ] = $sub_field; } } // return return $field; } /* * create_field() * * Create the HTML interface for your field * * @param $field - an array holding all the field's data * * @type action * @since 3.6 * @date 23/01/13 */ function create_field( $field ) { // validate $field['row_limit'] = intval( $field['row_limit'] ); $field['row_min'] = intval( $field['row_min'] ); // value may be false if( !is_array($field['value']) ) { $field['value'] = array(); } // row limit = 0? if( $field['row_limit'] < 1 ) { $field['row_limit'] = 999; } // min rows if( $field['row_min'] > count($field['value']) ) { for( $i = 0; $i < $field['row_min']; $i++ ) { // already have a value? continue... if( isset($field['value'][$i]) ) { continue; } // populate values $field['value'][ $i ] = array(); foreach( $field['sub_fields'] as $sub_field) { $sub_value = false; if( !empty($sub_field['default_value']) ) { $sub_value = $sub_field['default_value']; } $field['value'][ $i ][ $sub_field['key'] ] = $sub_value; } } } // max rows $row_count = count($field['value']); if( $row_count > $field['row_limit'] ) { for( $i = 0; $i < $row_count; $i++ ) { if( $i >= $field['row_limit'] ) { unset( $field['value'][ $i ] ); } } } // setup values for row clone $field['value']['acfcloneindex'] = array(); foreach( $field['sub_fields'] as $sub_field ) { $sub_value = false; if( isset($sub_field['default_value']) ) { $sub_value = $sub_field['default_value']; } $field['value']['acfcloneindex'][ $sub_field['key'] ] = $sub_value; } // helper function which does not exist yet in acf if( !function_exists('acf_get_join_attr') ): function acf_get_join_attr( $attributes = false ) { // validate if( empty($attributes) ) { return ''; } // vars $e = array(); // loop through and render foreach( $attributes as $k => $v ) { $e[] = $k . '="' . esc_attr( $v ) . '"'; } // echo return implode(' ', $e); } endif; if( !function_exists('acf_join_attr') ): function acf_join_attr( $attributes = false ) { echo acf_get_join_attr( $attributes ); } endif; ?>
1 ): ?> 1 && isset($sub_field['column_width']) && $sub_field['column_width'] ) { $attr = 'width="' . $sub_field['column_width'] . '%"'; } // required $required_label = ""; if( $sub_field['required'] ) { $required_label = ' *'; } ?> $value ): ?> "> 1 ): ?>
>
"field sub_field field_type-{$sub_field['type']} field_key-{$sub_field['key']}", 'data-field_type' => $sub_field['type'], 'data-field_key' => $sub_field['key'], 'data-field_name' => $sub_field['name'] ); // required if( $sub_field['required'] ) { $attributes['class'] .= ' required'; } // layout: Row if( $field['layout'] == 'row' ): ?> >
>
'field_clone', 'label' => __("New Field",'acf'), 'name' => __("new_field",'acf'), 'type' => 'text', )); // get name of all fields for use in field type drop down $fields_names = apply_filters('acf/registered_fields', array()); unset( $fields_names[ __("Layout",'acf') ]['tab'] ); // conditional logic dummy data $conditional_logic_rule = array( 'field' => '', 'operator' => '==', 'value' => '' ); ?>
1){ echo 'style="display:none;"'; } ?>>

'text', 'name' => 'fields[' . $fake_name . '][label]', 'value' => $sub_field['label'], 'class' => 'label', )); ?>

'text', 'name' => 'fields[' . $fake_name . '][name]', 'value' => $sub_field['name'], 'class' => 'name', )); ?>
'select', 'name' => 'fields[' . $fake_name . '][type]', 'value' => $sub_field['type'], 'class' => 'type', 'choices' => $fields_names, 'optgroup' => true )); ?>
'text', 'name' => 'fields[' . $fake_name . '][instructions]', 'value' => $sub_field['instructions'], 'class' => 'instructions', )); ?>
'radio', 'name' => 'fields[' .$fake_name . '][required]', 'value' => $sub_field['required'], 'choices' => array( 1 => __("Yes",'acf'), 0 => __("No",'acf'), ), 'layout' => 'horizontal', )); ?>
'number', 'name' => 'fields[' . $fake_name . '][column_width]', 'value' => $sub_field['column_width'], 'class' => 'column_width', 'append' => '%' )); ?>
'radio', 'name' => 'fields[' . $fake_name . '][conditional_logic][status]', 'value' => $sub_field['conditional_logic']['status'], 'choices' => array( 1 => __("Yes",'acf'), 0 => __("No",'acf'), ), 'layout' => 'horizontal', )); // no rules? if( ! $sub_field['conditional_logic']['rules'] ) { $sub_field['conditional_logic']['rules'] = array( array() // this will get merged with $conditional_logic_rule ); } ?>
> $rule ): // validate $rule = array_merge($conditional_logic_rule, $rule); // fix PHP error in 3.5.4.1 if( strpos($rule['value'],'Undefined index: value in') !== false ) { $rule['value'] = ''; } ?>
'select', 'name' => 'fields[' . $fake_name . '][conditional_logic][rules][' . $rule_i . '][operator]', 'value' => $rule['operator'], 'choices' => array( '==' => __("is equal to",'acf'), '!=' => __("is not equal to",'acf'), ), )); ?>
  • 'select', 'name' => 'fields[' . $fake_name . '][conditional_logic][allorany]', 'value' => $sub_field['conditional_logic']['allorany'], 'choices' => array( 'all' => __("all",'acf'), 'any' => __("any",'acf'), ), )); ?>
'text', 'name' => 'fields['.$key.'][row_min]', 'value' => $field['row_min'], )); ?> 'text', 'name' => 'fields['.$key.'][row_limit]', 'value' => $field['row_limit'], )); ?> 'radio', 'name' => 'fields['.$key.'][layout]', 'value' => $field['layout'], 'layout' => 'horizontal', 'choices' => array( 'table' => __("Table",'acf'), 'row' => __("Row",'acf') ) )); ?> 'text', 'name' => 'fields['.$key.'][button_label]', 'value' => $field['button_label'], )); ?> $total ) { for ( $j = $total; $j < $old_total; $j++ ) { foreach( $field['sub_fields'] as $sub_field ) { do_action('acf/delete_value', $post_id, $field['name'] . '_' . $j . '_' . $sub_field['name'] ); } } } // update $value and return to allow for the normal save function to run $value = $total; return $value; } /* * update_field() * * This filter is appied to the $field before it is saved to the database * * @type filter * @since 3.6 * @date 23/01/13 * * @param $field - the field array holding all the field options * @param $post_id - the field group ID (post_type = acf) * * @return $field - the modified field */ function update_field( $field, $post_id ) { // format sub_fields if( $field['sub_fields'] ) { // remove dummy field unset( $field['sub_fields']['field_clone'] ); // loop through and save fields $i = -1; $sub_fields = array(); foreach( $field['sub_fields'] as $key => $f ) { $i++; // order $f['order_no'] = $i; $f['key'] = $key; // save $f = apply_filters('acf/update_field/type=' . $f['type'], $f, $post_id ); // new filter // add $sub_fields[] = $f; } // update sub fields $field['sub_fields'] = $sub_fields; } // return updated repeater field return $field; } /* * format_value() * * This filter is appied to the $value after it is loaded from the db and before it is passed to the create_field action * * @type filter * @since 3.6 * @date 23/01/13 * * @param $value - the value which was loaded from the database * @param $post_id - the $post_id from which the value was loaded * @param $field - the field array holding all the field options * * @return $value - the modified value */ function format_value( $value, $post_id, $field ) { // vars $values = array(); if( $value > 0 ) { // loop through rows for($i = 0; $i < $value; $i++) { // loop through sub fields foreach( $field['sub_fields'] as $sub_field ) { // update full name $key = $sub_field['key']; $sub_field['name'] = $field['name'] . '_' . $i . '_' . $sub_field['name']; $v = apply_filters('acf/load_value', false, $post_id, $sub_field); $v = apply_filters('acf/format_value', $v, $post_id, $sub_field); $values[ $i ][ $key ] = $v; } } } // return return $values; } /* * format_value_for_api() * * This filter is appied to the $value after it is loaded from the db and before it is passed back to the api functions such as the_field * * @type filter * @since 3.6 * @date 23/01/13 * * @param $value - the value which was loaded from the database * @param $post_id - the $post_id from which the value was loaded * @param $field - the field array holding all the field options * * @return $value - the modified value */ function format_value_for_api( $value, $post_id, $field ) { // vars $values = array(); if( $value > 0 ) { // loop through rows for($i = 0; $i < $value; $i++) { // loop through sub fields foreach( $field['sub_fields'] as $sub_field ) { // update full name $key = $sub_field['name']; $sub_field['name'] = $field['name'] . '_' . $i . '_' . $sub_field['name']; $v = apply_filters('acf/load_value', false, $post_id, $sub_field); $v = apply_filters('acf/format_value_for_api', $v, $post_id, $sub_field); $values[ $i ][ $key ] = $v; } } } // return return $values; } } new acf_field_repeater(); ?>