Ticket #5500: 5500_update3_abweb.patch
| File 5500_update3_abweb.patch, 22.4 KB (added by , 10 years ago) |
|---|
-
bp-xprofile/bp-xprofile-admin.php
IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8
331 331 xprofile_admin( $message, $type ); 332 332 } 333 333 334 function xprofile_admin_manage_datebox_option( $message ) { 335 if( empty( $_POST['datebox_option'] ) ) return; 336 337 $_POST['datebox_option'][0] = isset( $_POST['datebox_option'][0] ) ? 'yes' : 'no'; 338 339 $_POST['datebox_option'][1] = ( isset( $_POST['datebox_option'][1] ) || $_POST['datebox_option'][7] == 'elapsed' ) ? 'yes' : 'no'; 340 341 $_POST['datebox_option'][2] = ( isset( $_POST['datebox_option'][2] ) && $_POST['datebox_option'][2] == 'year' ) ? 'year' : 'ago'; 342 343 $message .= ( $_POST['datebox_option'][3] == '' ) ? __( 'Field "Max years ago" - required! ', 'buddypress' ) : ''; 344 $_POST['datebox_option'][3] = isset( $_POST['datebox_option'][3] ) ? mb_substr( abs ( intval ( $_POST['datebox_option'][3] ) ), 0, 4, 'UTF-8' ) : 100; 345 346 $message .= ( $_POST['datebox_option'][4] == '' ) ? __( 'Field "Min years ago" - required! ', 'buddypress' ) : ''; 347 $_POST['datebox_option'][4] = 348 isset( $_POST['datebox_option'][4] ) ? mb_substr( intval( $_POST['datebox_option'][4] ), 0, 5, 'UTF-8' ) : 18; 349 350 if ( isset( $_POST['datebox_option_3_from_type'] ) && $_POST['datebox_option_3_from_type'] ) { 351 $test_from = intval( date('Y') + $_POST['datebox_option'][3] ); 352 } else { 353 $test_from = intval( date('Y') - $_POST['datebox_option'][3] ); 354 $_POST['datebox_option'][3] = -intval( $_POST['datebox_option'][3] ); 355 } 356 357 if ( isset( $_POST['datebox_option_3_to_type'] ) && $_POST['datebox_option_3_to_type'] ) { 358 $test_to = intval( date('Y') + $_POST['datebox_option'][4] ); 359 } else { 360 $test_to = intval( date('Y') - $_POST['datebox_option'][4] ); 361 $_POST['datebox_option'][4] = -intval( $_POST['datebox_option'][4] ); 362 } 363 364 $message .= ( $test_from < $test_to ) ? __( 'Wrong year range! ', 'buddypress' ) : ''; 365 366 $message .= ( $_POST['datebox_option'][5] == '' ) ? __( 'Field "Erliest" - required! ', 'buddypress' ) : ''; 367 $_POST['datebox_option'][5] = ( isset( $_POST['datebox_option'][5] ) ) 368 ? mb_substr( intval($_POST['datebox_option'][5] ), 0, 5, 'UTF-8' ) : date("Y") - 100; 369 370 $message .= ( $_POST['datebox_option'][5] == '' ) ? __( 'Field "Latest" - required! ', 'buddypress' ) : ''; 371 $_POST['datebox_option'][6] = ( isset($_POST['datebox_option'][6] ) ) 372 ? mb_substr( abs( intval( $_POST['datebox_option'][6] ) ), 0, 4, 'UTF-8') : date("Y") - 18; 373 374 $message .= ( $_POST['datebox_option'][5] > $_POST['datebox_option'][6] ) ? __( 'Wrong Erliest/Latest range! ', 'buddypress' ) : ''; 375 376 ksort( $_POST['datebox_option'], SORT_NUMERIC ); 377 reset( $_POST['datebox_option'] ); 378 379 if(!empty($message)){ 380 $GLOBALS['message'] = $message; 381 } 382 } 383 334 384 /** 335 385 * Handles the adding or editing of profile field data for a user. 336 386 * … … 351 401 $field->group_id = $group_id; 352 402 353 403 if ( isset( $_POST['saveField'] ) ) { 404 xprofile_admin_manage_datebox_option($message); 405 354 406 if ( BP_XProfile_Field::admin_validate() ) { 355 407 $field->is_required = $_POST['required']; 356 408 $field->type = $_POST['fieldtype']; -
bp-xprofile/classes/class-bp-xprofile-field-type-datebox.php
IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8
28 28 $this->category = _x( 'Single Fields', 'xprofile field type category', 'buddypress' ); 29 29 $this->name = _x( 'Date Selector', 'xprofile field type', 'buddypress' ); 30 30 31 $this->supports_options = true; # This parameter - added 32 31 33 $this->set_format( '/^\d{4}-\d{1,2}-\d{1,2} 00:00:00$/', 'replace' ); // "Y-m-d 00:00:00" 32 34 33 35 /** … … 41 43 do_action( 'bp_xprofile_field_type_datebox', $this ); 42 44 } 43 45 46 public function is_valid($value) { 47 if ($value) { 48 return true; 49 } 50 return false; 51 } 52 44 53 /** 45 54 * Output the edit field HTML for this field type. 46 55 * … … 162 171 163 172 // If MySQL timestamp. 164 173 } else { 165 $day = mysql2date( 'j', $date ); 166 $month = mysql2date( 'F', $date, false ); // Not localized, so that selected() works below. 167 $year = mysql2date( 'Y', $date ); 174 $DT = new DateTime($date); // problem 2038 year http://php.net/manual/en/class.datetime.php 175 $day = $DT->format('j'); 176 $month = $DT->format('F'); 177 $year = $DT->format('Y'); 168 178 } 169 179 } 170 180 … … 226 236 case 'year': 227 237 $html = sprintf( '<option value="" %1$s>%2$s</option>', selected( $year, 0, false ), /* translators: no option picked in select box */ __( '----', 'buddypress' ) ); 228 238 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 ); 231 } 239 $ord = bp_xprofile_get_meta( 'bp_date_field', 'field', 'BPOptRegData' ); 240 $ord = unserialize($ord); 241 $opt = $this->field_obj->get_children(); 242 243 if(isset($opt[2]->name)){ 244 $ord['range-curr'] = ($opt[2]->name == 'year') ? 'year' : 'ago'; 245 } else { 246 $ord['range-curr'] = 'ago'; 247 } 248 249 if(isset($opt[3]->name)) { 250 $ord['range-year']['ago']['max'] = $opt[3]->name; 251 } 252 253 if(isset($opt[4]->name)){ 254 $ord['range-year']['ago']['min'] = $opt[4]->name; 255 } 256 257 if(isset($opt[5]->name)){ 258 $ord['range-year']['year']['earliest'] = $opt[5]->name; 259 } 260 261 if(isset($opt[6]->name)){ 262 $ord['range-year']['year']['latest'] = $opt[6]->name; 263 } 264 265 if($ord['range-curr'] == 'ago'){ 266 $ord['range-year']['year']['latest'] = date("Y") + $ord['range-year']['ago']['min']; 267 $ord['range-year']['year']['earliest'] = date("Y") + $ord['range-year']['ago']['max']; 268 } 269 270 for ( $i = $ord['range-year']['year']['latest']; $i > ($ord['range-year']['year']['earliest']-1); $i-- ) { 271 $html .= sprintf( '<option value="%1$s" %2$s>%3$s</option>', (int) $i, selected( $year, $i, false ), (int) $i ); 272 } 232 273 break; 233 274 } 234 275 … … 272 313 $year_r = bp_parse_args( $raw_properties, array( 273 314 'id' => bp_get_the_profile_field_input_name() . '_year', 274 315 'name' => bp_get_the_profile_field_input_name() . '_year' 275 ) ); ?>316 ) ); 276 317 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> 318 // Change the location of selects, depending on the "date_format" 319 320 ob_start(); 321 ?> 322 <select <?php echo $this->get_edit_field_html_elements( $day_r ); ?>> 323 <?php bp_the_profile_field_options( array( 'type' => 'day' ) ); ?> 324 </select> 325 <?php 326 $selectDay = ob_get_contents(); 327 ob_end_clean(); 281 328 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> 329 ob_start(); 330 ?> 331 <select <?php echo $this->get_edit_field_html_elements( $month_r ); ?>> 332 <?php bp_the_profile_field_options( array( 'type' => 'month' ) ); ?> 333 </select> 334 <?php 335 $selectMonth = ob_get_contents(); 336 ob_end_clean(); 286 337 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> 338 ob_start(); 339 ?> 340 <select <?php echo $this->get_edit_field_html_elements( $year_r ); ?>> 341 <?php bp_the_profile_field_options( array( 'type' => 'year' ) ); ?> 342 </select> 343 <?php 344 $selectYear = ob_get_contents(); 345 ob_end_clean(); 291 346 347 // Change the location of selects, depending on the "date_format" 348 349 $format = get_option('date_format', 'd/m/Y'); 350 351 switch( $format ) 352 { 353 case 'm/d/Y';#m/d/Y 354 case 'm-d-Y'; 355 case 'm.d.Y'; 356 echo $selectMonth; 357 echo $selectDay; 358 echo $selectYear; 359 break; 360 361 case 'd/m/Y'; #d/m/Y 362 case 'd-m-Y'; 363 case 'd.m.Y'; 364 echo $selectDay; 365 echo $selectMonth; 366 echo $selectYear; 367 break; 368 369 default; #Y-m-d 370 echo $selectYear; 371 echo $selectMonth; 372 echo $selectDay; 373 break; 374 } 375 376 ?> 377 378 292 379 <?php 293 380 } 294 381 … … 302 389 * @param string $control_type Optional. HTML input type used to render the current 303 390 * field's child options. 304 391 */ 305 public function admin_new_field_html( BP_XProfile_Field $current_field, $control_type = '' ) {} 392 public function admin_new_field_html( BP_XProfile_Field $current_field, $control_type = '' ) { 393 //parent::admin_new_field_html( $current_field, 'checkbox' ); 394 $type = array_search( get_class( $this ), bp_xprofile_get_field_types() ); 306 395 396 if ( false === $type ) { 397 return; 398 } 399 400 $class = $current_field->type != $type ? 'display: none;' : ''; 401 $current_type_obj = bp_xprofile_create_field_type( $type ); 402 $SET = $current_field->BPOptRegData; 403 $SET = unserialize( $SET ); 404 $OPT = $current_field->get_children( true ); 405 406 407 ?> 408 409 <div id="<?php echo esc_attr( $type ); ?>" class="postbox bp-options-box" style="<?php echo esc_attr( $class ); ?> margin-top: 15px;"> 410 <h3><?php esc_html_e( 'Please enter options for this Field:', 'buddypress' ); ?></h3> 411 412 <div class="inside"> 413 414 <div id="datebox_div1" class="bp-option sortable"> 415 416 <h2 style="font-size: 23px;">Date field</h2> 417 418 <table class="form-table" style="margin: 8px 13px;"> 419 <tr> 420 <th style="width: 100px;">Date format</th> 421 <td> 422 <fieldset> 423 424 <legend class="screen-reader-text"><span>Date format</span></legend> 425 <?php 426 $date_formats = array_unique( apply_filters( 'date_formats', array( __( 'F j, Y' ), 'Y-m-d', 'm/d/Y', 'd/m/Y' ) ) ); 427 ?> 428 <?php if( !empty( $date_formats ) ): ?> 429 <?php foreach ( $date_formats as $key => $format ): ?> 430 <?php 431 $checked = ''; 432 if( $OPT[7]->name == $format || ( !$OPT[7]->name && !$key ) ) { 433 $checked = 'checked'; 434 $custom_format = false; 435 } 436 ?> 437 438 <label title='<?=esc_attr( $format ); ?>'> 439 <input <?=$checked; ?> type='radio' name='datebox_option[7]' value='<?= esc_attr($format); ?>' /> 440 <span class="date-time-text format-i18n"><?=date_i18n( $format );?></span> 441 <code><?=$format?></code> 442 </label><br/> 443 444 <?php endforeach;?> 445 <?php endif; ?> 446 447 <label> 448 <input type="radio" <?= ( $SET['show-time'] == 'yes' OR $OPT[1]->name == 'yes' ) ? ' checked="checked" ' : ''; ?> value="elapsed" id="date_format_elapsed_radio" name="datebox_option[7]"> 449 Time elapsed 450 <span style="padding-left: 15px;"> Examples: </span> 451 <code>4 years ago</code>, 452 <code>4 years from now</code> 453 </label> 454 455 <label> 456 <input type="radio" <?=( $custom_format )? 'checked': ''; ?> value="custom" id="date_format_custom_radio" name="datebox_option[7]"> 457 Custom: 458 <input type="text" style="width: 80px;" class="small-text" value='<?= esc_attr( $OPT[7]->name ); ?>' id="date_format_custom" name="date_format_custom"> 459 <span style="padding-left: 15px;"> Example: </span> 460 <code>d.m.Y</code> 461 </label><br/> 462 463 </fieldset> 464 </td> 465 </tr> 466 <tr> 467 <th style="width: 100px;">Range</th> 468 <td> 469 <fieldset> 470 <legend class="screen-reader-text"><span>Range</span></legend> 471 472 <label> 473 <input type="radio" name="datebox_option[2]" value="year" 474 <?= ( $SET['range-curr'] == 'year' || $OPT[2]->name == 'year' ) ? ' checked="checked" ' : ''; ?> /> 475 476 <span class="date-time-text format-i18n">From</span> 477 <input type="text" name="datebox_option[5]" size="3" maxlength="5" 478 value="<?= isset( $OPT[5]->name ) ? $OPT[5]->name : $SET['range-year']['year']['earliest']; ?>" /> 479 480 <span class="date-time-text format-i18n" style="padding-left:7px;padding-right:7px;">to</span> 481 <input type="text" name="datebox_option[6]" size="3" maxlength="4" 482 value="<?= isset( $OPT[6]->name ) ? $OPT[6]->name : $SET['range-year']['year']['latest']; ?>" /> 483 </label><br/> 484 485 <label> 486 <input type="radio" name="datebox_option[2]" value="ago" 487 <?= ( $SET['range-curr'] == 'ago' || $OPT[2]->name == 'ago' ) ? ' checked="checked" ' : ''; ?> /> 488 489 <span class="date-time-text format-i18n">From</span> 490 <input type="text" name="datebox_option[3]" size="3" maxlength="4" 491 value="<?= isset( $OPT[3]->name ) ? abs( $OPT[3]->name ) : $SET['range-year']['ago']['max']; ?>" /> 492 <select name="datebox_option_3_from_type"> 493 <option value="0" <?php if ( isset( $OPT[3]->name ) && intval( $OPT[3]->name ) < 0 ) echo 'selected="selected"'; ?>>years ago</option> 494 <option value="1" <?php if ( isset( $OPT[3]->name ) && intval( $OPT[3]->name ) > 0 ) echo 'selected="selected"'; ?>>years from now</option> 495 </select> 496 497 <span class="date-time-text format-i18n" style="padding-left:7px;padding-right:7px;">to</span> 498 <input type="text" name="datebox_option[4]" size="3" maxlength="5" 499 value="<?= isset( $OPT[4]->name ) ? abs( $OPT[4]->name ) : $SET['range-year']['ago']['min']; ?>" /> 500 <select name="datebox_option_3_to_type"> 501 <option value="0" <?php if (isset( $OPT[4]->name ) && intval( $OPT[4]->name ) < 0) echo 'selected="selected"'; ?>>years ago</option> 502 <option value="1" <?php if (isset( $OPT[4]->name ) && intval( $OPT[4]->name ) > 0) echo 'selected="selected"'; ?>>years from now</option> 503 </select> 504 </label><br/> 505 506 </fieldset> 507 </td> 508 </tr> 509 <tr> 510 <td></td> 511 <td colspan="3"> 512 <p><a href="https://codex.wordpress.org/Formatting_Date_and_Time">Documentation on date and time formatting</a>.</p> 513 <p><b>Note</b>: Range is allowed between 1902 and 2037 years only.</p> 514 </td> 515 </tr> 516 </table> 517 </div> 518 519 <input type="hidden" name="datebox_option_number" id="datebox_option_number" value="8"/> 520 <input type="hidden" name="sort_order_datebox" id="sort_order_datebox" value="custom"/> 521 522 <?php /*div id="datebox_more"></div> 523 <p><a href="javascript:add_option('datebox')">Add Another Option</a></p*/ ?> 524 </div> 525 </div> 526 <script> 527 jQuery(document).ready(function($) { 528 $("input[name='date_format']").click(function(){ 529 if ( "date_format_custom_radio" != $(this).attr("id") ) 530 $( "input[name='date_format_custom']" ).val( $( this ).val() ).siblings( '.example' ).text( $( this ).parent( 'label' ).text() ); 531 }); 532 533 $("input[name='date_format_custom']").focus(function(){ 534 $( '#date_format_custom_radio' ).prop( 'checked', true ); 535 }); 536 537 $("input[name='date_format_custom'], input[name='time_format_custom']").change( function() { 538 var format = $(this); 539 $('#date_format_custom_radio' ).val(format.val()); 540 format.siblings( '.spinner' ).addClass( 'is-active' ); 541 $.post(ajaxurl, { 542 action: 'date_format_custom' == format.attr('name') ? 'date_format' : 'time_format', 543 date : format.val() 544 }, function(d) { 545 format.siblings( '.spinner' ).removeClass( 'is-active' ); format.siblings('.example').text(d); 546 547 } ); 548 }); 549 }); 550 </script> 551 552 <?php 553 } 554 307 555 /** 308 556 * Format Date values for display. 309 557 * … … 322 570 $field_value = strtotime( $field_value ); 323 571 } 324 572 325 return bp_format_time( $field_value, true, false ); 326 } 573 global $wpdb, $bp; 574 $option = unserialize( bp_xprofile_get_meta( 'bp_date_field', 'field', 'BPOptRegData' ) ); 575 //$uid = bp_displayed_user_id(); 576 $parent_id = isset( $GLOBALS['field']->id ) ? $GLOBALS['field']->id : $field_id; 577 $sort_sql = 'ORDER BY option_order ASC'; 578 $sql = $wpdb->prepare( "SELECT * FROM {$bp->profile->table_name_fields} WHERE parent_id = %d $sort_sql", $parent_id); 579 $opt = $wpdb->get_results( $sql ); 580 581 $option['date-format'] = $opt[7]->name; 582 583 if(isset($opt[0]) && isset($opt[1])){ 584 $option['show-year'] = $opt[0]->name; 585 $option['show-time'] = $opt[1]->name; 586 } 587 588 589 if($option['show-time'] == 'yes'){ 590 $field_value = self::formatDateByBPOptRegData($field_value,$option, true, true); 591 592 }else { 593 $field_value = self::formatDateByBPOptRegData($field_value,$option, true, false); 594 } 595 596 return $field_value; 597 } 598 599 private function formatDateByBPOptRegData( $time, $option, $localize_time = true, $show) { 600 601 if ( ! isset( $time ) || ! is_numeric( $time ) ) { 602 return false; 603 } 604 605 if ( ! empty( $localize_time ) ) { 606 $root_blog_offset = get_blog_option( bp_get_root_blog_id(), 'gmt_offset' ); 607 }else{ 608 $root_blog_offset = false; 609 } 610 611 $time_offset = $time + ( $root_blog_offset * 3600 ); 612 613 if($show === false){ 614 $date = date_i18n( $option['date-format'], $time_offset ); 615 } else { // Here we calculate the number of years 616 $current_year = intval( date("Y") ); 617 $selected_year = intval( date( "Y", $time_offset ) ); 618 if ( $selected_year > $current_year ) { 619 $date = ' ' . ( $selected_year - $current_year ) . __(' years from now', 'buddypress'); 620 } else { 621 $date = ' ' . ( $current_year - $selected_year ) . __(' years ago', 'buddypress'); 622 } 623 } 624 625 return $date; 626 } 327 627 } -
bp-xprofile/bp-xprofile-screens.php
IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8
65 65 return; 66 66 } 67 67 68 68 69 // No errors. 69 70 $errors = false; 70 71 … … 91 92 92 93 if ( !empty( $_POST['field_' . $field_id . '_day'] ) && !empty( $_POST['field_' . $field_id . '_month'] ) && !empty( $_POST['field_' . $field_id . '_year'] ) ) { 93 94 // Concatenate the values. 94 $date_value = $_POST['field_' . $field_id . '_day'] . ' ' . $_POST['field_' . $field_id . '_month'] . ' ' . $_POST['field_' . $field_id . '_year']; 95 $eng_months = array( 1=>'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ); 96 $_POST['field_' . $field_id . '_month'] = array_search( $_POST['field_' . $field_id . '_month'], $eng_months ); 97 $date_value = $_POST['field_' . $field_id . '_year'] . '-' . $_POST['field_' . $field_id . '_month'] . '-' . $_POST['field_' . $field_id . '_day']; 95 98 96 99 // Turn the concatenated value into a timestamp. 97 $_POST['field_' . $field_id] = date( 'Y-m-d H:i:s', strtotime( $date_value ) ); 100 $date = new DateTime( $date_value ); 101 $_POST['field_' . $field_id] = $date->getTimestamp(); 98 102 } 99 103 100 104 } … … 114 118 115 119 // Reset the errors var. 116 120 $errors = false; 117 118 121 // Now we've checked for required fields, lets save the values. 119 122 $old_values = $new_values = array(); 120 123 foreach ( (array) $posted_field_ids as $field_id ) { -
bp-xprofile/classes/class-bp-xprofile-field.php
IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8
162 162 */ 163 163 protected $member_types; 164 164 165 166 167 public $BPOptRegData = array(); 168 165 169 /** 166 170 * Initialize and/or populate profile field. 167 171 * … … 181 185 $this->type_obj = bp_xprofile_create_field_type( 'textbox' ); 182 186 $this->type_obj->field_obj = $this; 183 187 } 188 189 $this->BPOptRegData = $this->runCheckBPOptRegDate(); 190 } 191 192 193 public function runCheckBPOptRegDate() { 194 195 $BPOptRegData = bp_xprofile_get_meta( 'bp_date_field', 'field', 'BPOptRegData' ); 196 197 $serialize = serialize( 198 array( 199 'show-year' => 'yes', 200 'show-time' => 'no', 201 'range-curr' => 'year', 202 'range-year' => array( 203 'ago' => array('min' => 18, 'max' => 100), 204 'year' => array('earliest' => (date("Y")-101), 'latest' => (date("Y")-18)) 205 ), 206 'date-format' => "Y-m-d", 207 ) 208 ); 209 210 bp_xprofile_update_meta( 'bp_date_field', 'field', 'BPOptRegData', $serialize ); 211 212 return $serialize; 184 213 } 185 214 186 215 /** -
bp-xprofile/bp-xprofile-functions.php
IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8
434 434 } 435 435 436 436 // 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' ) { 438 438 $field_type_obj->set_whitelist_values( wp_list_pluck( $field->get_children(), 'name' ) ); 439 439 } 440 440
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)