Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
03/27/2014 07:34:02 PM (10 years ago)
Author:
djpaul
Message:

xProfile: re-architecture profile field types and de-duplicate the templating and validation logic to make it easier for core and plugins to add new profile field types.

Until now, it's been pretty hard to add new types of profile field to BuddyPress. There are a couple of plugins that do a good job, but BuddyPress makes it much harder than it should be because, historically, we've hardcoded values and checks in templates throughout the project. For example, profile field templating was duplicated in the registration template, the member/profile/edit template, in parts of the wp-admin xProfile screens, and in the new wp-admin extended profile editor.

This change implements a new approach that creates a class for each profile field type; selectbox, textbox, textarea, and so on. They all share an abstract base class BP_XProfile_Field_Type which consolidates a lot of special behaviour that had been added to BuddyPress over the years (e.g. some fields accept null values, some accept multiple default values), and adds true field value validation. Unit tests are included.

We've also implemented a new "Numbers" field type with these changes. It behaves much the same as a regular textbox field does, but it only accepts numbers.

Fixes #5220 and #4694

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/bp-templates/bp-legacy/buddypress/members/register.php

    r7965 r8178  
    6969                        <div class="editfield">
    7070
    71                             <?php if ( 'textbox' == bp_get_the_profile_field_type() ) : ?>
     71                            <?php
     72                            $field_type = bp_xprofile_create_field_type( bp_get_the_profile_field_type() );
     73                            $field_type->edit_field_html();
    7274
    73                                 <label for="<?php bp_the_profile_field_input_name(); ?>"><?php bp_the_profile_field_name(); ?> <?php if ( bp_get_the_profile_field_is_required() ) : ?><?php _e( '(required)', 'buddypress' ); ?><?php endif; ?></label>
    74                                 <?php do_action( bp_get_the_profile_field_errors_action() ); ?>
    75                                 <input type="text" name="<?php bp_the_profile_field_input_name(); ?>" id="<?php bp_the_profile_field_input_name(); ?>" value="<?php bp_the_profile_field_edit_value(); ?>" />
     75                            do_action( 'bp_custom_profile_edit_fields_pre_visibility' );
    7676
    77                             <?php endif; ?>
    78 
    79                             <?php if ( 'textarea' == bp_get_the_profile_field_type() ) : ?>
    80 
    81                                 <label for="<?php bp_the_profile_field_input_name(); ?>"><?php bp_the_profile_field_name(); ?> <?php if ( bp_get_the_profile_field_is_required() ) : ?><?php _e( '(required)', 'buddypress' ); ?><?php endif; ?></label>
    82                                 <?php do_action( bp_get_the_profile_field_errors_action() ); ?>
    83                                 <textarea rows="5" cols="40" name="<?php bp_the_profile_field_input_name(); ?>" id="<?php bp_the_profile_field_input_name(); ?>"><?php bp_the_profile_field_edit_value(); ?></textarea>
    84 
    85                             <?php endif; ?>
    86 
    87                             <?php if ( 'selectbox' == bp_get_the_profile_field_type() ) : ?>
    88 
    89                                 <label for="<?php bp_the_profile_field_input_name(); ?>"><?php bp_the_profile_field_name(); ?> <?php if ( bp_get_the_profile_field_is_required() ) : ?><?php _e( '(required)', 'buddypress' ); ?><?php endif; ?></label>
    90                                 <?php do_action( bp_get_the_profile_field_errors_action() ); ?>
    91                                 <select name="<?php bp_the_profile_field_input_name(); ?>" id="<?php bp_the_profile_field_input_name(); ?>">
    92                                     <?php bp_the_profile_field_options(); ?>
    93                                 </select>
    94 
    95                             <?php endif; ?>
    96 
    97                             <?php if ( 'multiselectbox' == bp_get_the_profile_field_type() ) : ?>
    98 
    99                                 <label for="<?php bp_the_profile_field_input_name(); ?>"><?php bp_the_profile_field_name(); ?> <?php if ( bp_get_the_profile_field_is_required() ) : ?><?php _e( '(required)', 'buddypress' ); ?><?php endif; ?></label>
    100                                 <?php do_action( bp_get_the_profile_field_errors_action() ); ?>
    101                                 <select name="<?php bp_the_profile_field_input_name(); ?>" id="<?php bp_the_profile_field_input_name(); ?>" multiple="multiple">
    102                                     <?php bp_the_profile_field_options(); ?>
    103                                 </select>
    104 
    105                             <?php endif; ?>
    106 
    107                             <?php if ( 'radio' == bp_get_the_profile_field_type() ) : ?>
    108 
    109                                 <div class="radio">
    110                                     <span class="label"><?php bp_the_profile_field_name(); ?> <?php if ( bp_get_the_profile_field_is_required() ) : ?><?php _e( '(required)', 'buddypress' ); ?><?php endif; ?></span>
    111 
    112                                     <?php do_action( bp_get_the_profile_field_errors_action() ); ?>
    113                                     <?php bp_the_profile_field_options(); ?>
    114 
    115                                     <?php if ( !bp_get_the_profile_field_is_required() ) : ?>
    116                                         <a class="clear-value" href="javascript:clear( '<?php bp_the_profile_field_input_name(); ?>' );"><?php _e( 'Clear', 'buddypress' ); ?></a>
    117                                     <?php endif; ?>
    118                                 </div>
    119 
    120                             <?php endif; ?>
    121 
    122                             <?php if ( 'checkbox' == bp_get_the_profile_field_type() ) : ?>
    123 
    124                                 <div class="checkbox">
    125                                     <span class="label"><?php bp_the_profile_field_name(); ?> <?php if ( bp_get_the_profile_field_is_required() ) : ?><?php _e( '(required)', 'buddypress' ); ?><?php endif; ?></span>
    126 
    127                                     <?php do_action( bp_get_the_profile_field_errors_action() ); ?>
    128                                     <?php bp_the_profile_field_options(); ?>
    129                                 </div>
    130 
    131                             <?php endif; ?>
    132 
    133                             <?php if ( 'datebox' == bp_get_the_profile_field_type() ) : ?>
    134 
    135                                 <div class="datebox">
    136                                     <label for="<?php bp_the_profile_field_input_name(); ?>_day"><?php bp_the_profile_field_name(); ?> <?php if ( bp_get_the_profile_field_is_required() ) : ?><?php _e( '(required)', 'buddypress' ); ?><?php endif; ?></label>
    137                                     <?php do_action( bp_get_the_profile_field_errors_action() ); ?>
    138 
    139                                     <select name="<?php bp_the_profile_field_input_name(); ?>_day" id="<?php bp_the_profile_field_input_name(); ?>_day">
    140                                         <?php bp_the_profile_field_options( 'type=day' ); ?>
    141                                     </select>
    142 
    143                                     <select name="<?php bp_the_profile_field_input_name(); ?>_month" id="<?php bp_the_profile_field_input_name(); ?>_month">
    144                                         <?php bp_the_profile_field_options( 'type=month' ); ?>
    145                                     </select>
    146 
    147                                     <select name="<?php bp_the_profile_field_input_name(); ?>_year" id="<?php bp_the_profile_field_input_name(); ?>_year">
    148                                         <?php bp_the_profile_field_options( 'type=year' ); ?>
    149                                     </select>
    150                                 </div>
    151 
    152                             <?php endif; ?>
    153 
    154                             <?php do_action( 'bp_custom_profile_edit_fields_pre_visibility' ); ?>
    155 
    156                             <?php if ( bp_current_user_can( 'bp_xprofile_change_field_visibility' ) ) : ?>
     77                            if ( bp_current_user_can( 'bp_xprofile_change_field_visibility' ) ) : ?>
    15778                                <p class="field-visibility-settings-toggle" id="field-visibility-settings-toggle-<?php bp_the_profile_field_id() ?>">
    15879                                    <?php printf( __( 'This field can be seen by: <span class="current-visibility-level">%s</span>', 'buddypress' ), bp_get_the_profile_field_visibility_level_label() ) ?> <a href="#" class="visibility-toggle-link"><?php _ex( 'Change', 'Change profile field visibility level', 'buddypress' ); ?></a>
Note: See TracChangeset for help on using the changeset viewer.