Repeatable()
Description #
Repeatable field.
Source #
File: lib/form/class-repeatable.php
class Repeatable extends Field {
/**
* Field type.
*
* @var string
*/
public $type = 'repeatable';
/**
* Total repeatable groups.
*
* @var integer
*/
public $total_items = 0;
/**
* Base fields used for repeatable groups.
*
* @var array
*/
public $main_fields = array();
/**
* Prepare field.
*
* @return void
*/
protected function prepare() {
$this->args = wp_parse_args(
$this->args,
array(
'label' => __( 'AnsPress Repeatable Field', 'anspress-question-answer' ),
)
);
$this->main_fields = $this->args['fields'];
unset( $this->args['fields'] );
$value_count = ! empty( $this->value() ) ? count( $this->value() ) : $this->get_groups_count() + 1;
$this->total_items = $value_count > 0 ? $value_count : 1;
$new_fields = array();
$i = 0;
while ( $this->total_items > $i ) {
++$i;
$this->args['fields'][ $i ] = array(
'label' => $this->get( 'label' ) . ' #' . number_format_i18n( $i ),
'fields' => $this->main_fields,
'type' => 'group',
'delete_button' => true,
);
}
$this->child = new Form( $this->form_name, $this->args );
$this->child->prepare();
// Call parent prepare().
parent::prepare();
// Make sure all text field are sanitized.
$this->sanitize_cb = array_merge( array( 'array_remove_empty' ), $this->sanitize_cb );
}
/**
* Get POST (unsafe) value of a field.
*
* @return null|mixed
*/
public function unsafe_value() {
$request_value = $this->get( ap_to_dot_notation( $this->field_name ), null, $_REQUEST ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
if ( $request_value ) {
$value = array_filter( wp_unslash( $request_value ) );
foreach ( $value as $k => $val ) {
$val = is_array( $val ) ? $val : array();
if ( empty( array_filter( $val ) ) ) {
unset( $value[ $k ] );
}
}
return $value;
}
}
/**
* Return last repeatable group.
*
* @return null|object Returns @see `AP_Field` object.
*/
public function get_last_field() {
if ( ! empty( $this->child ) && ! empty( $this->child->fields ) ) {
return $this->child->fields[ $this->total_items ];
}
}
/**
* Html order for a field.
*
* @return void
*/
protected function html_order() {
$this->output_order = array( 'wrapper_start', 'label', 'field_wrap_start', 'desc', 'errors', 'field_markup', 'field_wrap_end', 'wrapper_end' );
}
/**
* Get group count when requesting group from ajax.
*
* @return null|object Returns @see `AP_Field` object.
*/
public function get_groups_count() {
$current_groups = $this->get( sanitize_title( $this->field_name ) . '-g', null, $_REQUEST ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
$nonce = $this->get( sanitize_title( $this->field_name ) . '-n', null, $_REQUEST ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
if ( wp_verify_nonce( $nonce, $this->field_name . $current_groups ) ) {
return $current_groups;
}
}
/**
* Field markup.
*
* @return void
*/
public function field_markup() {
parent::field_markup();
$this->add_html( '<div class="ap-fieldrepeatable-c" data-role="ap-repeatable" data-args="">' );
$this->add_html( $this->child->generate_fields() );
$add_button_args = wp_json_encode(
array(
'action' => 'ap_repeatable_field',
'form_name' => $this->form_name,
'field_name' => $this->field_name,
'field_id' => sanitize_title( $this->field_name ),
'__nonce' => wp_create_nonce( 'repeatable-field' ),
)
);
// translators: %s is field label.
$this->add_html( '<a class="ap-btn ap-repeatable-add" href="#" apquery="' . esc_js( $add_button_args ) . '">' . sprintf( __( 'Add More %s', 'anspress-question-answer' ), $this->get( 'label' ) ) . '</a>' );
$this->add_html( '<input name="' . sanitize_title( $this->field_name ) . '-groups" value="' . $this->total_items . '" type="hidden" />' );
$this->add_html( '<input name="' . sanitize_title( $this->field_name ) . '-nonce" value="' . wp_create_nonce( $this->field_name . $this->total_items ) . '" type="hidden" />' );
$this->add_html( '</div>' );
/** This action is documented in lib/form/class-input.php */
do_action_ref_array( 'ap_after_field_markup', array( &$this ) );
}
}
Expand full source code Collapse full source code View on GitHub: lib/form/class-repeatable.php:28
Add your comment