name = 'date_time_picker'; $this->title = __( 'Date and Time Picker' ); $this->domain = 'acf-field-date-time-picker'; $this->defaults = array( 'label' => __( 'Choose Time', $this->domain ), 'time_format' => 'hh:mm', 'show_date' => 'true', 'date_format' => 'yy-mm-dd', 'show_week_number' => 'false', 'picker' => 'slider', 'save_as_timestamp' => 'true', 'get_as_timestamp' => 'false', ); $this->settings = array( 'path' => $this->helpers_get_path( __FILE__ ), 'dir' => $this->helpers_get_dir( __FILE__ ), 'version' => ACFFIELDDATETIMEPICKER_VERSION, ); } /* * helpers_get_path * * @description: calculates the path (works for plugin / theme folders) * @since: 3.6 * @created: 30/01/13 */ function helpers_get_path( $file ) { return trailingslashit( dirname( $file ) ); } /* * helpers_get_dir * * @description: calculates the directory (works for plugin / theme folders) * @since: 3.6 * @created: 30/01/13 */ function helpers_get_dir( $file ) { $dir = trailingslashit( dirname( $file ) ); $count = 0; // sanitize for Win32 installs $dir = str_replace( '\\', '/', $dir ); // if file is in plugins folder $wp_plugin_dir = str_replace( '\\', '/', WP_PLUGIN_DIR ); $dir = str_replace( $wp_plugin_dir, WP_PLUGIN_URL, $dir, $count ); if ( $count < 1 ) { // if file is in wp-content folder $wp_content_dir = str_replace( '\\', '/', WP_CONTENT_DIR ); $dir = str_replace( $wp_content_dir, WP_CONTENT_URL, $dir, $count ); } if ( $count < 1 ) { // if file is in ??? folder $wp_dir = str_replace( '\\', '/', ABSPATH ); $dir = str_replace( $wp_dir, site_url( '/' ), $dir ); } return $dir; } /*-------------------------------------------------------------------------------------- * * create_options * - this function is called from core/field_meta_box.php to create extra options * for your field * * @params * - $key (int) - the $_POST obejct key required to save the options to the field * - $field (array) - the field object * * @author Elliot Condon * @since 2.2.0 * *-------------------------------------------------------------------------------------*/ function create_options( $key, $field ) { $field = array_merge( $this->defaults, $field ); ?> parent->create_field(array( 'type' => 'radio', 'name' => 'fields[' . $key . '][show_date]', 'value' => $field['show_date'], 'layout' => 'horizontal', 'choices' => array( 'true' => __( 'Date and Time Picker', $this->domain ), 'false' => __( 'Time Picker', $this->domain ), ), )); ?>

domain ); ?> formatDate

parent->create_field(array( 'type' => 'text', 'name' => 'fields[' . $key . '][date_format]', 'value' => $field['date_format'], )); ?>

formatting time', $this->domain ), 'http://trentrichardson.com/examples/timepicker/#tp-formatting' ); ?>

parent->create_field(array( 'type' => 'text', 'name' => 'fields[' . $key . '][time_format]', 'value' => $field['time_format'], )); ?> parent->create_field(array( 'type' => 'radio', 'name' => 'fields[' . $key . '][show_week_number]', 'value' => $field['show_week_number'], 'layout' => 'horizontal', 'choices' => array( 'true' => __( 'Yes', $this->domain ), 'false' => __( 'No', $this->domain ), ), )); ?> parent->create_field(array( 'type' => 'radio', 'name' => 'fields[' . $key . '][picker]', 'value' => $field['picker'], 'layout' => 'horizontal', 'choices' => array( 'slider' => __( 'Slider', $this->domain ), 'select' => __( 'Dropdown', $this->domain ), ), )); ?>

strtotime', $this->domain ), 'http://php.net/manual/en/function.strtotime.php' ); ?>

parent->create_field(array( 'type' => 'radio', 'name' => 'fields[' . $key . '][save_as_timestamp]', 'value' => $field['save_as_timestamp'], 'layout' => 'horizontal', 'choices' => array( 'true' => __( 'Yes', $this->domain ), 'false' => __( 'No', $this->domain ), ), )); ?>

the_field() or get_field() ', $this->domain ), 'http://www.advancedcustomfields.com/resources/functions/the_field/', 'http://www.advancedcustomfields.com/resources/functions/get_field/'); ?>

parent->create_field(array( 'type' => 'radio', 'name' => 'fields[' . $key . '][get_as_timestamp]', 'value' => $field['get_as_timestamp'], 'layout' => 'horizontal', 'choices' => array( 'true' => __( 'Yes', $this->domain ), 'false' => __( 'No', $this->domain ), ), )); ?> defaults, $field ); if ( true != $field['show_date'] ) { echo ''; } else { echo ''; } } /*-------------------------------------------------------------------------------------- * * update_value * - this function is called when saving a post object that your field is assigned to. * the function will pass through the 3 parameters for you to use. * * @params * - $post_id (int) - usefull if you need to save extra data or manipulate the current * post object * - $field (array) - usefull if you need to manipulate the $value based on a field option * - $value (mixed) - the new value of your field. * * @author Elliot Condon * @since 2.2.0 * *-------------------------------------------------------------------------------------*/ function update_value( $post_id, $field, $value ) { $field = array_merge( $this->defaults, $field ); if ( '' != $value && 'true' == $field['save_as_timestamp'] ) { if ( preg_match( '/^dd?\//', $field['date_format'] ) ) { //if start with dd/ or d/ (not supported by strtotime()) $value = str_replace( '/', '-', $value ); } $value = strtotime( $value ); } parent::update_value( $post_id, $field, $value ); } /*-------------------------------------------------------------------------------------- * * get_value * - called from the edit page to get the value of your field. This function is useful * if your field needs to collect extra data for your create_field() function. * * @params * - $post_id (int) - the post ID which your value is attached to * - $field (array) - the field object. * * @author Elliot Condon * @since 2.2.0 * *-------------------------------------------------------------------------------------*/ function get_value( $post_id, $field ) { $field = array_merge( $this->defaults, $field ); $value = parent::get_value( $post_id, $field ); if ( '' != $value && 'true' == $field['save_as_timestamp'] && $this->isValidTimeStamp( $value ) ) { if ( 'true' == $field['show_date'] ) { $value = date( sprintf( '%s %s', $this->js_to_php_dateformat( $field['date_format'] ), $this->js_to_php_timeformat( $field['time_format'] ) ), $value ); } else { $value = date( sprintf( '%s', $this->js_to_php_timeformat( $field['time_format'] ) ), $value ); } } return $value; } function get_value_for_api( $post_id, $field ) { $field = array_merge( $this->defaults, $field ); $value = parent::get_value( $post_id, $field ); if ( '' != $value && 'true' == $field['save_as_timestamp'] && 'true' != $field['get_as_timestamp'] && $this->isValidTimeStamp( $value ) ) { if ( 'true' == $field['show_date'] ) { $value = date( sprintf( '%s %s', $this->js_to_php_dateformat( $field['date_format'] ), $this->js_to_php_timeformat( $field['time_format'] ) ), $value ); } else { $value = date( sprintf( '%s', $this->js_to_php_timeformat( $field['time_format'] ) ), $value ); } } return $value; } function js_to_php_dateformat( $date_format ) { $chars = array( // Day 'dd' => 'd', 'd' => 'j', 'DD' => 'l', 'D' => 'D', 'o' => 'z', // Month 'mm' => 'm', 'm' => 'n', 'MM' => 'F', 'M' => 'M', // Year 'yy' => 'Y', 'y' => 'y', ); return strtr( (string) $date_format, $chars ); } function js_to_php_timeformat( $time_format ) { $chars = array( //hour 'HH' => 'H', 'H' => 'G', 'hh' => 'h', 'h' => 'g', //minute 'mm' => 'i', 'm' => 'i', //second 'ss' => 's', 's' => 's', //am/pm 'TT' => 'A', 'T' => 'A', 'tt' => 'a', 't' => 'a', ); return strtr( (string) $time_format, $chars ); } function isValidTimeStamp( $timestamp ) { return ( (string) (int) $timestamp === (string) $timestamp ); } /*-------------------------------------------------------------------------------------- * * admin_print_scripts / admin_print_styles * - this function is called in the admin_print_scripts / admin_print_styles where * your field is created. Use this function to register css and javascript to assist * your create_field() function. * * @author Elliot Condon * @since 3.0.0 * *-------------------------------------------------------------------------------------*/ function admin_print_scripts() { global $wp_locale; $has_locale = false; $js_locale = $this->get_js_locale( get_locale() ); wp_enqueue_script('jquery-ui-timepicker', $this->settings['dir'] . 'js/jquery-ui-timepicker-addon.js', array( 'acf-datepicker', 'jquery-ui-slider', ), $this->settings['version'], true); if ( file_exists( dirname( __FILE__ ) . '/js/localization/jquery-ui-timepicker-' . $js_locale . '.js' ) ) { wp_enqueue_script('timepicker-localization', $this->settings['dir'] . 'js/localization/jquery-ui-timepicker-' . $js_locale . '.js', array( 'jquery-ui-timepicker' ), $this->settings['version'], true); wp_enqueue_script('timepicker', $this->settings['dir'] . 'js/timepicker.js', array( 'timepicker-localization' ), $this->settings['version'], true); $has_locale = true; } else { wp_enqueue_script('timepicker', $this->settings['dir'] . 'js/timepicker.js', array( 'jquery-ui-timepicker' ), $this->settings['version'], true); } if ( ! $has_locale && 'en' != $js_locale ) { $timepicker_locale = array( 'closeText' => __( 'Done', $this->domain ), 'currentText' => __( 'Today', $this->domain ), 'prevText' => __( 'Prev', $this->domain ), 'nextText' => __( 'Next', $this->domain ), 'monthStatus' => __( 'Show a different month', $this->domain ), 'weekHeader' => __( 'Wk', $this->domain ), 'timeText' => __( 'Time', $this->domain ), 'hourText' => __( 'Hour', $this->domain ), 'minuteText' => __( 'Minute', $this->domain ), 'secondText' => __( 'Second', $this->domain ), 'millisecText' => __( 'Millisecond', $this->domain ), 'timezoneText' => __( 'Time Zone', $this->domain ), 'isRTL' => $wp_locale->is_rtl(), ); } $timepicker_wp_locale = array( 'monthNames' => $this->strip_array_indices( $wp_locale->month ), 'monthNamesShort' => $this->strip_array_indices( $wp_locale->month_abbrev ), 'dayNames' => $this->strip_array_indices( $wp_locale->weekday ), 'dayNamesShort' => $this->strip_array_indices( $wp_locale->weekday_abbrev ), 'dayNamesMin' => $this->strip_array_indices( $wp_locale->weekday_initial ), 'showMonthAfterYear' => false, 'showWeek' => false, 'firstDay' => get_option( 'start_of_week' ), ); $l10n = (isset( $timepicker_locale )) ? array_merge( $timepicker_wp_locale, $timepicker_locale ) : $timepicker_wp_locale; wp_localize_script( 'timepicker', 'timepicker_objectL10n', $l10n ); } /** * helper function, see: http://www.renegadetechconsulting.com/tutorials/jquery-datepicker-and-wordpress-i18n * @param array $ArrayToStrip * @return array */ function strip_array_indices( $array_to_strip ) { foreach ( $array_to_strip as $obj_array_item ) { $new_array[] = $obj_array_item; } return $new_array; } function get_js_locale( $locale ) { $dir_path = $this->settings['path'] . 'js/localization/'; $exclude_list = array( '.', '..' ); $languages = $this->ps_preg_filter( '/jquery-ui-timepicker-(.*?)\.js/', '$1', array_diff( scandir( $dir_path ), $exclude_list ) ); $locale = strtolower( str_replace( '_', '-', $locale ) ); if ( false !== strpos( $locale, '-' ) ) { $l = explode( '-', $locale ); $pattern = array( '/' . $locale . '/', '/' . $l[0] . '/', '/' . $l[1] . '/' ); } else { $pattern = array( '/' . $locale . '/' ); } $res = $this->ps_preg_filter( $pattern, '$0', $languages, -1, $count ); return ($count) ? implode( '', $res ) : 'en'; } function ps_preg_filter( $pattern, $replace, $subject, $limit = -1, &$count = 0 ) { if ( function_exists( 'preg_filter' ) ) { return preg_filter( $pattern, $replace, $subject, $limit, $count ); } else { return array_diff( preg_replace( $pattern, $replace, $subject, $limit, $count ), $subject ); } } function admin_print_styles() { wp_enqueue_style( 'jquery-style', $this->settings['dir'] . 'css/jquery-ui.css' ); wp_enqueue_style('timepicker', $this->settings['dir'] . 'css/jquery-ui-timepicker-addon.css', array( 'jquery-style' ), $this->settings['version']); } }