category = _x( 'Single Fields', 'xprofile field type category', 'buddypress' ); $this->name = _x( 'Date Selector', 'xprofile field type', 'buddypress' ); $this->set_format( '/^\d{4}-\d{1,2}-\d{1,2} 00:00:00$/', 'replace' ); // "Y-m-d 00:00:00" $this->do_settings_section = true; /** * Fires inside __construct() method for BP_XProfile_Field_Type_Datebox class. * * @since 2.0.0 * * @param BP_XProfile_Field_Type_Datebox $this Current instance of * the field type datebox. */ do_action( 'bp_xprofile_field_type_datebox', $this ); } /** * Output the edit field HTML for this field type. * * Must be used inside the {@link bp_profile_fields()} template loop. * * @since 2.0.0 * * @param array $raw_properties Optional key/value array of * {@link http://dev.w3.org/html5/markup/input.html permitted attributes} * that you want to add. */ public function edit_field_html( array $raw_properties = array() ) { // User_id is a special optional parameter that we pass to. // {@link bp_the_profile_field_options()}. if ( isset( $raw_properties['user_id'] ) ) { $user_id = (int) $raw_properties['user_id']; unset( $raw_properties['user_id'] ); } else { $user_id = bp_displayed_user_id(); } $day_r = bp_parse_args( $raw_properties, array( 'id' => bp_get_the_profile_field_input_name() . '_day', 'name' => bp_get_the_profile_field_input_name() . '_day', ) ); $month_r = bp_parse_args( $raw_properties, array( 'id' => bp_get_the_profile_field_input_name() . '_month', 'name' => bp_get_the_profile_field_input_name() . '_month', ) ); $year_r = bp_parse_args( $raw_properties, array( 'id' => bp_get_the_profile_field_input_name() . '_year', 'name' => bp_get_the_profile_field_input_name() . '_year', ) ); ?>

field_obj->id, $args['user_id'] ); $day = 0; $month = 0; $year = 0; $html = ''; $eng_months = array( 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ); // Set day, month, year defaults. if ( ! empty( $date ) ) { // If Unix timestamp. if ( is_numeric( $date ) ) { $day = date( 'j', $date ); $month = date( 'F', $date ); $year = date( 'Y', $date ); // If MySQL timestamp. } else { $day = mysql2date( 'j', $date ); $month = mysql2date( 'F', $date, false ); // Not localized, so that selected() works below. $year = mysql2date( 'Y', $date ); } } // Check for updated posted values, and errors preventing them from // being saved first time. if ( ! empty( $_POST['field_' . $this->field_obj->id . '_day'] ) ) { $new_day = (int) $_POST['field_' . $this->field_obj->id . '_day']; $day = ( $day != $new_day ) ? $new_day : $day; } if ( ! empty( $_POST['field_' . $this->field_obj->id . '_month'] ) ) { if ( in_array( $_POST['field_' . $this->field_obj->id . '_month'], $eng_months ) ) { $new_month = $_POST['field_' . $this->field_obj->id . '_month']; } else { $new_month = $month; } $month = ( $month !== $new_month ) ? $new_month : $month; } if ( ! empty( $_POST['field_' . $this->field_obj->id . '_year'] ) ) { $new_year = (int) $_POST['field_' . $this->field_obj->id . '_year']; $year = ( $year != $new_year ) ? $new_year : $year; } // $type will be passed by calling function when needed. switch ( $args['type'] ) { case 'day': $html = sprintf( '', selected( $day, 0, false ), /* translators: no option picked in select box */ __( '----', 'buddypress' ) ); for ( $i = 1; $i < 32; ++$i ) { $html .= sprintf( '', (int) $i, selected( $day, $i, false ), (int) $i ); } break; case 'month': $months = array( __( 'January', 'buddypress' ), __( 'February', 'buddypress' ), __( 'March', 'buddypress' ), __( 'April', 'buddypress' ), __( 'May', 'buddypress' ), __( 'June', 'buddypress' ), __( 'July', 'buddypress' ), __( 'August', 'buddypress' ), __( 'September', 'buddypress' ), __( 'October', 'buddypress' ), __( 'November', 'buddypress' ), __( 'December', 'buddypress' ) ); $html = sprintf( '', selected( $month, 0, false ), /* translators: no option picked in select box */ __( '----', 'buddypress' ) ); for ( $i = 0; $i < 12; ++$i ) { $html .= sprintf( '', esc_attr( $eng_months[$i] ), selected( $month, $eng_months[$i], false ), $months[$i] ); } break; case 'year': $html = sprintf( '', selected( $year, 0, false ), /* translators: no option picked in select box */ __( '----', 'buddypress' ) ); $settings = $this->get_field_settings( $this->field_obj->id ); if ( 'relative' === $settings['range_type'] ) { $start = date( 'Y' ) + $settings['range_relative_start']; $end = date( 'Y' ) + $settings['range_relative_end']; } else { $start = $settings['range_absolute_start']; $end = $settings['range_absolute_end']; } for ( $i = $end; $i >= $start; $i-- ) { $html .= sprintf( '', (int) $i, selected( $year, $i, false ), (int) $i ); } break; } /** * Filters the output for the profile field datebox. * * @since 1.1.0 * * @param string $html HTML output for the field. * @param string $value Which date type is being rendered for. * @param string $day Date formatted for the current day. * @param string $month Date formatted for the current month. * @param string $year Date formatted for the current year. * @param int $id ID of the field object being rendered. * @param string $date Current date. */ echo apply_filters( 'bp_get_the_profile_field_datebox', $html, $args['type'], $day, $month, $year, $this->field_obj->id, $date ); } /** * Output HTML for this field type on the wp-admin Profile Fields screen. * * Must be used inside the {@link bp_profile_fields()} template loop. * * @since 2.0.0 * * @param array $raw_properties Optional key/value array of permitted attributes that you want to add. */ public function admin_field_html( array $raw_properties = array() ) { $day_r = bp_parse_args( $raw_properties, array( 'id' => bp_get_the_profile_field_input_name() . '_day', 'name' => bp_get_the_profile_field_input_name() . '_day', ) ); $month_r = bp_parse_args( $raw_properties, array( 'id' => bp_get_the_profile_field_input_name() . '_month', 'name' => bp_get_the_profile_field_input_name() . '_month', ) ); $year_r = bp_parse_args( $raw_properties, array( 'id' => bp_get_the_profile_field_input_name() . '_year', 'name' => bp_get_the_profile_field_input_name() . '_year', ) ); ?> 'Y-m-d', 'date_format_custom' => '', 'range_type' => 'absolute', 'range_absolute_start' => date( 'Y' ) - 60, 'range_absolute_end' => date( 'Y' ) + 10, 'range_relative_start' => '-10', 'range_relative_end' => '20', ); $settings = array(); foreach ( $defaults as $key => $value ) { $saved = bp_xprofile_get_meta( $field_id, 'field', $key, true ); if ( $saved ) { $settings[ $key ] = $saved; } else { $settings[ $key ] = $value; } } $settings = self::validate_settings( $settings ); return $settings; } /** * Validate date field settings. * * @since 2.7.0 * * @param array $settings Raw settings. * @return array Validated settings. */ public static function validate_settings( $settings ) { foreach ( $settings as $key => &$value ) { switch ( $key ) { case 'range_type' : if ( $value !== 'absolute' ) { $value = 'relative'; } break; // @todo More date restrictions? case 'range_absolute_start' : case 'range_absolute_end' : $value = absint( $value ); break; case 'range_relative_start' : case 'range_relative_end' : $value = intval( $value ); break; } } return $settings; } /** * Save settings from the field edit screen in the Dashboard. * * @param int $field_id ID of the field. * @param array $settings Array of settings. * @return bool True on success. */ public function admin_save_settings( $field_id, $settings ) { $existing_settings = self::get_field_settings( $field_id ); $saved_settings = array(); foreach ( array_keys( $existing_settings ) as $setting ) { switch ( $setting ) { case 'range_relative_start' : case 'range_relative_end' : $op_key = $setting . '_type'; if ( isset( $settings[ $op_key ] ) && 'past' === $settings[ $op_key ] ) { $value = 0 - intval( $settings[ $setting ] ); } else { $value = intval( $settings[ $setting ] ); } $saved_settings[ $setting ] = $value; break; default : if ( isset( $settings[ $setting ] ) ) { $saved_settings[ $setting ] = $settings[ $setting ]; } break; } } // Sanitize and validate saved settings. $saved_settings = self::validate_settings( $saved_settings ); foreach ( $saved_settings as $setting_key => $setting_value ) { bp_xprofile_update_meta( $field_id, 'field', $setting_key, $setting_value ); } return true; } /** * Generate the settings markup for Date fields. * * @since 2.7.0 * * @param BP_XProfile_Field $current_field The current profile field on the add/edit screen. * @param string $control_type Optional. HTML input type used to render the current * field's child options. */ public function admin_new_field_html( BP_XProfile_Field $current_field, $control_type = '' ) { $type = array_search( get_class( $this ), bp_xprofile_get_field_types() ); if ( false === $type ) { return; } $class = $current_field->type != $type ? 'display: none;' : ''; $settings = self::get_field_settings( $current_field->id ); ?>
get_date_formats() as $format ): ?>

', esc_attr( $settings['range_absolute_start'] ) ); ?> ', esc_attr( $settings['range_absolute_end'] ) ); ?>
', esc_attr( abs( $settings['range_relative_start'] ) ) ); ?> ', selected( true, $settings['range_relative_start'] <= 0, false ), esc_attr__( 'years ago', 'buddypress' ), selected( true, $settings['range_relative_start'] > 0, false ), esc_attr__( 'years from now', 'buddypress' ) ); ?> ', esc_attr( abs( $settings['range_relative_end'] ) ) ); ?> ', selected( true, $settings['range_relative_end'] <= 0, false ), esc_attr__( 'years ago', 'buddypress' ), selected( true, $settings['range_relative_end'] > 0, false ), esc_attr__( 'years from now', 'buddypress' ) ); ?>