Skip to:
Content

BuddyPress.org

Ticket #5500: 5500.diff

File 5500.diff, 19.3 KB (added by boonebgorges, 4 years ago)
  • src/bp-xprofile/bp-xprofile-admin.php

    diff --git src/bp-xprofile/bp-xprofile-admin.php src/bp-xprofile/bp-xprofile-admin.php
    index 541a105..76e19d8 100644
    function xprofile_admin_delete_group( $group_id ) { 
    333333        xprofile_admin( $message, $type );
    334334}
    335335
     336        function xprofile_admin_manage_datebox_option($message)
     337        {
     338                if(empty($_POST['datebox_option'])) return;
     339
     340                $_POST['datebox_option'][0] = isset($_POST['datebox_option'][0]) ? 'yes' : 'no';
     341                $_POST['datebox_option'][1] = isset($_POST['datebox_option'][1]) ? 'yes' : 'no';
     342
     343                $_POST['datebox_option'][2] = (isset($_POST['datebox_option'][2]) && $_POST['datebox_option'][2] == 'year') ? 'year' : 'ago';
     344
     345                $message .= ($_POST['datebox_option'][3] == '') ? __( 'Field "Max years ago" - required! ', 'buddypress' ) : '';
     346                $_POST['datebox_option'][3] =
     347                        isset($_POST['datebox_option'][3]) ? mb_substr(abs(intval($_POST['datebox_option'][3])), 0, 4, 'UTF-8') : 100;
     348
     349                $message .= ($_POST['datebox_option'][4] == '') ? __( 'Field "Min years ago" - required! ', 'buddypress' ) : '';
     350                $_POST['datebox_option'][4] =
     351                        isset($_POST['datebox_option'][4]) ? mb_substr(intval($_POST['datebox_option'][4]), 0, 5, 'UTF-8') : 18;
     352
     353                $message .= ($_POST['datebox_option'][3] < $_POST['datebox_option'][4]) ? __( 'Wrong year range! ', 'buddypress' ) : '';
     354
     355                $message .= ($_POST['datebox_option'][5] == '') ? __( 'Field "Erliest" - required! ', 'buddypress' ) : '';
     356                $_POST['datebox_option'][5] = (isset($_POST['datebox_option'][5]))
     357                        ? mb_substr(intval($_POST['datebox_option'][5]), 0, 5, 'UTF-8') : date("Y") - 100;
     358
     359                $message .= ($_POST['datebox_option'][5] == '') ? __( 'Field "Latest" - required! ', 'buddypress' ) : '';
     360                $_POST['datebox_option'][6] = (isset($_POST['datebox_option'][6]))
     361                        ? mb_substr(abs(intval($_POST['datebox_option'][6])), 0, 4, 'UTF-8') : date("Y") - 18;
     362
     363                $message .= ($_POST['datebox_option'][5] > $_POST['datebox_option'][6]) ? __( 'Wrong Erliest/Latest range! ', 'buddypress' ) : '';
     364
     365                ksort($_POST['datebox_option'], SORT_NUMERIC);
     366                reset($_POST['datebox_option']);
     367
     368                if(!empty($message)){
     369                        $GLOBALS['message'] = $message;
     370                }
     371        }
     372
    336373/**
    337374 * Handles the adding or editing of profile field data for a user.
    338375 *
    function xprofile_admin_manage_field( $group_id, $field_id = null ) { 
    353390        $field->group_id = $group_id;
    354391
    355392        if ( isset( $_POST['saveField'] ) ) {
     393
     394                xprofile_admin_manage_datebox_option($message);
     395
    356396                if ( BP_XProfile_Field::admin_validate() ) {
    357397                        $field->is_required = $_POST['required'];
    358398                        $field->type        = $_POST['fieldtype'];
  • src/bp-xprofile/bp-xprofile-functions.php

    diff --git src/bp-xprofile/bp-xprofile-functions.php src/bp-xprofile/bp-xprofile-functions.php
    index 0996257..1b059f7 100644
    function xprofile_set_field_data( $field, $user_id, $value, $is_required = false 
    434434        }
    435435
    436436        // For certain fields, only certain parameters are acceptable, so add them to the whitelist.
    437         if ( $field_type_obj->supports_options ) {
     437        if ( $field_type_obj->supports_options && $field_type_obj->name != 'Date Selector' ) {
    438438                $field_type_obj->set_whitelist_values( wp_list_pluck( $field->get_children(), 'name' ) );
    439439        }
    440440
  • src/bp-xprofile/bp-xprofile-screens.php

    diff --git src/bp-xprofile/bp-xprofile-screens.php src/bp-xprofile/bp-xprofile-screens.php
    index 103e24e..91bcd93 100644
    function xprofile_screen_edit_profile() { 
    9191
    9292                                if ( !empty( $_POST['field_' . $field_id . '_day'] ) && !empty( $_POST['field_' . $field_id . '_month'] ) && !empty( $_POST['field_' . $field_id . '_year'] ) ) {
    9393                                        // Concatenate the values.
    94                                         $date_value =   $_POST['field_' . $field_id . '_day'] . ' ' . $_POST['field_' . $field_id . '_month'] . ' ' . $_POST['field_' . $field_id . '_year'];
     94                                        $eng_months = array( 1=>'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' );
     95                                        $_POST['field_' . $field_id . '_month'] = array_search($_POST['field_' . $field_id . '_month'], $eng_months);
     96                                        $date_value =   $_POST['field_' . $field_id . '_year'] . '-' . $_POST['field_' . $field_id . '_month'] . '-' . $_POST['field_' . $field_id . '_day'];
    9597
    9698                                        // Turn the concatenated value into a timestamp.
    97                                         $_POST['field_' . $field_id] = date( 'Y-m-d H:i:s', strtotime( $date_value ) );
     99                                        $date = new DateTime($date_value);
     100                                        $_POST['field_' . $field_id] =  $date->format('Y-m-d H:i:s');
    98101                                }
    99102
    100103                        }
  • src/bp-xprofile/classes/class-bp-xprofile-field-type-datebox.php

    diff --git src/bp-xprofile/classes/class-bp-xprofile-field-type-datebox.php src/bp-xprofile/classes/class-bp-xprofile-field-type-datebox.php
    index 2098cb9..800e52b 100644
    class BP_XProfile_Field_Type_Datebox extends BP_XProfile_Field_Type { 
    2828                $this->category = _x( 'Single Fields', 'xprofile field type category', 'buddypress' );
    2929                $this->name     = _x( 'Date Selector', 'xprofile field type', 'buddypress' );
    3030
     31                $this->supports_options = true; # This parameter - added
     32
    3133                $this->set_format( '/^\d{4}-\d{1,2}-\d{1,2} 00:00:00$/', 'replace' ); // "Y-m-d 00:00:00"
    3234
    3335                /**
    class BP_XProfile_Field_Type_Datebox extends BP_XProfile_Field_Type { 
    162164
    163165                        // If MySQL timestamp.
    164166                        } else {
    165                                 $day   = mysql2date( 'j', $date );
    166                                 $month = mysql2date( 'F', $date, false ); // Not localized, so that selected() works below.
    167                                 $year  = mysql2date( 'Y', $date );
     167                                $DT = new DateTime($date); // problem 2038 year http://php.net/manual/en/class.datetime.php
     168                                $day = $DT->format('j');
     169                                $month = $DT->format('F');
     170                                $year = $DT->format('Y');
    168171                        }
    169172                }
    170173
    class BP_XProfile_Field_Type_Datebox extends BP_XProfile_Field_Type { 
    226229                        case 'year':
    227230                                $html = sprintf( '<option value="" %1$s>%2$s</option>', selected( $year, 0, false ), /* translators: no option picked in select box */ __( '----', 'buddypress' ) );
    228231
    229                                 for ( $i = 2037; $i > 1901; $i-- ) {
    230                                         $html .= sprintf( '<option value="%1$s" %2$s>%3$s</option>', (int) $i, selected( $year, $i, false ), (int) $i );
     232
     233                                $ord = get_option('BPOptRegData');
     234                                $ord = unserialize($ord);
     235                                $opt = $this->field_obj->get_children();
     236
     237
     238                                if(isset($opt[2]->name)){
     239                                        $ord['range-curr'] = ($opt[2]->name == 'year') ? 'year' : 'ago';
     240                                } else {
     241                                        $ord['range-curr'] = 'ago';
     242                                }
     243
     244                                if(isset($opt[3]->name)) {
     245                                        $ord['range-year']['ago']['max'] = $opt[3]->name;
     246                                }
     247
     248                                if(isset($opt[4]->name)){
     249                                        $ord['range-year']['ago']['min'] = $opt[4]->name;
     250                                }
     251
     252                                if(isset($opt[5]->name)){
     253                                        $ord['range-year']['year']['earliest'] = $opt[5]->name;
     254                                }
     255
     256                                if(isset($opt[6]->name)){
     257                                        $ord['range-year']['year']['latest'] = $opt[6]->name;
     258                                }
     259
     260                                if($ord['range-curr'] == 'ago'){
     261                                        $ord['range-year']['year']['latest'] = date("Y") - $ord['range-year']['ago']['min'];
     262                                        $ord['range-year']['year']['earliest'] = date("Y") - $ord['range-year']['ago']['max'];
    231263                                }
     264
     265                                for ( $i = $ord['range-year']['year']['latest']; $i > ($ord['range-year']['year']['earliest']-1); $i-- ) {
     266                                        $html .= sprintf( '<option value="%1$s" %2$s>%3$s</option>', (int) $i, selected( $year, $i, false ), (int) $i );
     267                                }
    232268                        break;
    233269                }
    234270
    class BP_XProfile_Field_Type_Datebox extends BP_XProfile_Field_Type { 
    272308                $year_r = bp_parse_args( $raw_properties, array(
    273309                        'id'   => bp_get_the_profile_field_input_name() . '_year',
    274310                        'name' => bp_get_the_profile_field_input_name() . '_year'
    275                 ) ); ?>
     311                ) );
    276312
    277                 <label for="<?php bp_the_profile_field_input_name(); ?>_day" class="screen-reader-text"><?php esc_html_e( 'Select day', 'buddypress' ); ?></label>
    278                 <select <?php echo $this->get_edit_field_html_elements( $day_r ); ?>>
    279                         <?php bp_the_profile_field_options( array( 'type' => 'day' ) ); ?>
    280                 </select>
     313                // Change the location of selects, depending on the "date_format"
     314
     315                ob_start();
     316                ?>
     317            <select <?php echo $this->get_edit_field_html_elements( $day_r ); ?>>
     318                        <?php bp_the_profile_field_options( array( 'type' => 'day' ) ); ?>
     319            </select>
     320                <?php
     321                $selectDay = ob_get_contents();
     322                ob_end_clean();
     323
     324                ob_start();
     325                ?>
     326            <select <?php echo $this->get_edit_field_html_elements( $month_r ); ?>>
     327                        <?php bp_the_profile_field_options( array( 'type' => 'month' ) ); ?>
     328            </select>
     329                <?php
     330                $selectMonth = ob_get_contents();
     331                ob_end_clean();
     332
     333                ob_start();
     334                ?>
     335            <select <?php echo $this->get_edit_field_html_elements( $year_r ); ?>>
     336                        <?php bp_the_profile_field_options( array( 'type' => 'year' ) ); ?>
     337            </select>
     338                <?php
     339                $selectYear = ob_get_contents();
     340                ob_end_clean();
     341
     342                // Change the location of selects, depending on the "date_format"
     343
     344                $format = get_option('date_format', 'd/m/Y');
     345
     346                switch($format)
     347                {
     348                        case 'm/d/Y';#m/d/Y
     349                        case 'm-d-Y';
     350                        case 'm.d.Y';
     351                                echo $selectMonth;
     352                                echo $selectDay;
     353                                echo $selectYear;
     354                                break;
     355
     356                        case 'd/m/Y'; #d/m/Y
     357                        case 'd-m-Y';
     358                        case 'd.m.Y';
     359                                echo $selectDay;
     360                                echo $selectMonth;
     361                                echo $selectYear;
     362                                break;
     363
     364                        default; #Y-m-d
     365                                echo $selectYear;
     366                                echo $selectMonth;
     367                                echo $selectDay;
     368                                break;
     369                }
    281370
    282                 <label for="<?php bp_the_profile_field_input_name(); ?>_month" class="screen-reader-text"><?php esc_html_e( 'Select month', 'buddypress' ); ?></label>
    283                 <select <?php echo $this->get_edit_field_html_elements( $month_r ); ?>>
    284                         <?php bp_the_profile_field_options( array( 'type' => 'month' ) ); ?>
    285                 </select>
     371                ?>
    286372
    287                 <label for="<?php bp_the_profile_field_input_name(); ?>_year" class="screen-reader-text"><?php esc_html_e( 'Select year', 'buddypress' ); ?></label>
    288                 <select <?php echo $this->get_edit_field_html_elements( $year_r ); ?>>
    289                         <?php bp_the_profile_field_options( array( 'type' => 'year' ) ); ?>
    290                 </select>
    291373
    292374        <?php
    293375        }
    class BP_XProfile_Field_Type_Datebox extends BP_XProfile_Field_Type { 
    302384         * @param string            $control_type  Optional. HTML input type used to render the current
    303385         *                                         field's child options.
    304386         */
    305         public function admin_new_field_html( BP_XProfile_Field $current_field, $control_type = '' ) {}
     387        public function admin_new_field_html( BP_XProfile_Field $current_field, $control_type = '' ) {
     388                //parent::admin_new_field_html( $current_field, 'checkbox' );
     389                $type = array_search( get_class( $this ), bp_xprofile_get_field_types() );
     390
     391                if ( false === $type ) {
     392                        return;
     393                }
     394
     395                $class = $current_field->type != $type ? 'display: none;' : '';
     396                $current_type_obj = bp_xprofile_create_field_type( $type );
     397                $SET = $current_field->BPOptRegData;
     398                $SET = unserialize($SET);
     399                $OPT = $current_field->get_children( true );
     400
     401                ?>
     402
     403    <div id="<?php echo esc_attr( $type ); ?>" class="postbox bp-options-box" style="<?php echo esc_attr( $class ); ?> margin-top: 15px;">
     404        <h3><?php esc_html_e( 'Please enter options for this Field:', 'buddypress' ); ?></h3>
     405
     406        <div class="inside">
     407
     408            <div id="datebox_div1" class="bp-option sortable">
     409
     410                <?php /*input type="text" name="datebox_option[0]" id="datebox_option1" value="value"/*/ ?>
     411
     412
     413            <h3>Date format</h3>
     414
     415                        <?php
     416
     417                $date_formats = array_unique( apply_filters( 'date_formats', array( __( 'F j, Y' ), 'Y-m-d', 'm/d/Y', 'd/m/Y' ) ) );
     418            ?>
     419                        <?php if(!empty($date_formats)): ?>
     420                                <?php $custom_format = true; ?>
     421                                <?php foreach ( $date_formats as $format ): ?>
     422                                <?php
     423                                        $checked = '';
     424
     425                                        if($OPT[7]->name == $format) {
     426                                                $checked = 'checked';
     427                                                $custom_format = false;
     428                                        }
     429
     430                                ?>
     431                                                <label title='<?=esc_attr($format); ?>'><input <?=$checked; ?> type='radio' name='datebox_option[7]' value='<?= esc_attr($format); ?>' /><?=date_i18n( $format );?></label><br />
     432                                <?php endforeach;?>
     433                        <?php endif; ?>
     434
     435                        <label>
     436                                <input type="radio" <?=($custom_format)? 'checked': ''; ?> value="custom" id="date_format_custom_radio" name="datebox_option[7]"> Custom:<span class="screen-reader-text" style="cursor: move;"> enter a custom date format in the following field</span>
     437                        </label>
     438                        <input type="text" style="width: 80px;" class="small-text" value='<?= esc_attr($OPT[7]->name); ?>' id="date_format_custom" name="date_format_custom">
     439                         <span class="screen-reader-text"><? _e( 'example:' ) ;?> </span><span class="example"><?=date_i18n( $OPT[7]->name );?></span> <span class='spinner'></span>
     440                        <br /><br />
     441                <label>
     442                    <input type="checkbox" name="datebox_option[1]"
     443                            <?= ($SET['show-time'] == 'yes' OR $OPT[1]->name == 'yes') ? ' checked="checked" ' : ''; ?>   value="yes"/>
     444                    Show time lapsed instead of date , e.g. show age (overrides show year)
     445            </label>
     446            <table>
     447                        <tr>
     448                        <td>Year range</td>
     449                        <td><input type="radio" name="datebox_option[2]"  value="ago"
     450                                <?= ($SET['range-curr'] == 'ago' OR $OPT[2]->name == 'ago') ? ' checked="checked" ' : ''; ?> /></td>
     451                        <td>
     452                                Max <input type="text" name="datebox_option[3]" size="3" maxlength="4"
     453                                           value="<?= isset($OPT[3]->name) ? $OPT[3]->name : $SET['range-year']['ago']['max']; ?>" /> years ago,
     454                        </td>
     455                        <td>
     456                            Min <input type="text" name="datebox_option[4]" size="3" maxlength="5"
     457                                       value="<?= isset($OPT[4]->name) ? $OPT[4]->name : $SET['range-year']['ago']['min']; ?>" /> years ago
     458                        </td>
     459                        </tr>
     460                    <tr>
     461                        <td></td>
     462                        <td><input type="radio" name="datebox_option[2]" value="year"
     463                                <?= ($SET['range-curr'] == 'year' OR $OPT[2]->name == 'year') ? ' checked="checked" ' : ''; ?> /></td>
     464                        <td>
     465                                Earliest <input type="text" name="datebox_option[5]" size="3" maxlength="5"
     466                                                value="<?= isset($OPT[5]->name) ? $OPT[5]->name : $SET['range-year']['year']['earliest']; ?>" />
     467                        </td>
     468                        <td>
     469                            Latest <input type="text" name="datebox_option[6]" size="3" maxlength="4"
     470                                          value="<?= isset($OPT[6]->name) ? $OPT[6]->name : $SET['range-year']['year']['latest']; ?>" />
     471                        </td>
     472                    </tr>
     473                    <tr>
     474                        <td></td>
     475                        <td colspan="3"><b>Note</b>: Year range is allowed between 1902 and 2037 years only.</td>
     476                        </tr>
     477                </table>
     478
     479         </div>
     480
     481            <input type="hidden" name="datebox_option_number" id="datebox_option_number" value="8"/>
     482            <input type="hidden" name="sort_order_datebox" id="sort_order_datebox" value="custom"/>
     483
     484            <?php /*div id="datebox_more"></div>
     485            <p><a href="javascript:add_option('datebox')">Add Another Option</a></p*/ ?>
     486        </div>
     487    </div>
     488           <script>
     489                   jQuery(document).ready(function($) {
     490                                $("input[name='date_format']").click(function(){
     491                                                if ( "date_format_custom_radio" != $(this).attr("id") )
     492                                                        $( "input[name='date_format_custom']" ).val( $( this ).val() ).siblings( '.example' ).text( $( this ).parent( 'label' ).text() );
     493                                        });
     494
     495                                        $("input[name='date_format_custom']").focus(function(){
     496                                                $( '#date_format_custom_radio' ).prop( 'checked', true );
     497                                        });
     498
     499                           $("input[name='date_format_custom'], input[name='time_format_custom']").change( function() {
     500                                                var format = $(this);
     501                                                $('#date_format_custom_radio' ).val(format.val());
     502                                                format.siblings( '.spinner' ).addClass( 'is-active' );
     503                                                $.post(ajaxurl, {
     504                                                                action: 'date_format_custom' == format.attr('name') ? 'date_format' : 'time_format',
     505                                                                date : format.val()
     506                                                                }, function(d) {
     507                                                                        format.siblings( '.spinner' ).removeClass( 'is-active' ); format.siblings('.example').text(d);
     508
     509                                                                } );
     510                                                });
     511                       });
     512            </script>
     513
     514                <?php
     515        }
    306516
    307517        /**
    308518         * Format Date values for display.
    class BP_XProfile_Field_Type_Datebox extends BP_XProfile_Field_Type { 
    322532                        $field_value = strtotime( $field_value );
    323533                }
    324534
    325                 return bp_format_time( $field_value, true, false );
     535                global $wpdb, $bp;
     536                $option = unserialize(get_option( 'BPOptRegData'));
     537                //$uid = bp_displayed_user_id();
     538                $parent_id = isset($GLOBALS['field']->id) ? $GLOBALS['field']->id : $field_id;
     539                $sort_sql = 'ORDER BY option_order ASC';
     540                $sql = $wpdb->prepare( "SELECT * FROM {$bp->profile->table_name_fields} WHERE parent_id = %d $sort_sql", $parent_id);
     541                $opt = $wpdb->get_results( $sql );
     542
     543                $option['date-format'] = $opt[7]->name;
     544
     545                if(isset($opt[0]) && isset($opt[1])){
     546                        $option['show-year'] = $opt[0]->name;
     547                        $option['show-time'] = $opt[1]->name;
     548                }
     549
     550
     551                if($option['show-time'] == 'yes'){
     552                        $field_value = self::formatDateByBPOptRegData($field_value,$option, true, true);
     553
     554                }else {
     555                        $field_value = self::formatDateByBPOptRegData($field_value,$option, true, false);
     556                }
     557
     558                return $field_value;
    326559        }
     560
     561        private function formatDateByBPOptRegData( $time, $option,$localize_time = true, $show) {
     562
     563                        if ( ! isset( $time ) || ! is_numeric( $time ) ) {
     564                                return false;
     565                        }
     566
     567                        if ( ! empty( $localize_time ) ) {
     568                                $root_blog_offset = get_blog_option( bp_get_root_blog_id(), 'gmt_offset' );
     569                        }else{
     570                                $root_blog_offset = false;
     571                        }
     572
     573                        $time_offset = $time + ( $root_blog_offset * 3600 );
     574
     575                        if($show === false){
     576
     577                                $date = date_i18n($option['date-format'], $time_offset );
     578
     579                        }else{  // Here we calculate the number of years
     580
     581                                $time_curr = time();
     582                                $def = $time_curr - $time_offset;
     583                                $date = floor($def / (60*60*24*365));
     584                                $date = ' ' . $date . __(' years', 'buddypress');
     585                        }
     586
     587                        return $date;
     588                }
    327589}
  • src/bp-xprofile/classes/class-bp-xprofile-field.php

    diff --git src/bp-xprofile/classes/class-bp-xprofile-field.php src/bp-xprofile/classes/class-bp-xprofile-field.php
    index 43155e1..97d7ea1 100644
    class BP_XProfile_Field { 
    162162         */
    163163        protected $member_types;
    164164
     165
     166
     167        public $BPOptRegData = array();
     168
    165169        /**
    166170         * Initialize and/or populate profile field.
    167171         *
    class BP_XProfile_Field { 
    181185                        $this->type_obj            = bp_xprofile_create_field_type( 'textbox' );
    182186                        $this->type_obj->field_obj = $this;
    183187                }
     188
     189                $this->BPOptRegData = $this->runCheckBPOptRegDate();
     190        }
     191
     192
     193        public function runCheckBPOptRegDate()
     194        {
     195
     196
     197                $BPOptRegData = get_option('BPOptRegData');
     198
     199                if($BPOptRegData === false){
     200
     201                        $serialize = serialize(
     202                                array(
     203                                        'show-year' => 'yes',
     204                                        'show-time' => 'no',
     205                                        'range-curr' => 'ago',
     206                                        'range-year' => array(
     207                                                'ago' => array('min' => 18, 'max' => 100),
     208                                                'year' => array('earliest' => (date("Y")-101), 'latest' => (date("Y")-18))
     209                                        ),
     210                                        'date-format' => "Y-m-d",
     211                                )
     212                        );
     213
     214                        add_option('BPOptRegData', $serialize, '', 'no');
     215
     216                        return $serialize;
     217
     218                } else {
     219                        return $BPOptRegData;
     220                }
    184221        }
    185222
    186223        /**