Skip to:
Content

BuddyPress.org

Ticket #6549: 6549-2.patch

File 6549-2.patch, 8.9 KB (added by DJPaul, 7 years ago)
  • src/bp-xprofile/bp-xprofile-functions.php

    From fcb0791a9b6576be3c29d5b46937d94d80455f71 Mon Sep 17 00:00:00 2001
    From: Paul Gibbs <djpaul@gmail.com>
    Date: Sun, 4 Feb 2018 16:35:20 +0000
    Subject: [PATCH 1/2] Phone number profile field type
    
    Fixes #6549
    ---
     src/bp-xprofile/bp-xprofile-functions.php          |   3 +-
     .../class-bp-xprofile-field-type-telephone.php     | 151 +++++++++++++++++++++
     .../xprofile/class-bp-xprofile-field-type.php      |   9 +-
     3 files changed, 161 insertions(+), 2 deletions(-)
     create mode 100644 src/bp-xprofile/classes/class-bp-xprofile-field-type-telephone.php
    
    diff --git a/src/bp-xprofile/bp-xprofile-functions.php b/src/bp-xprofile/bp-xprofile-functions.php
    index e4c16d3d7..337d2cd79 100644
    a b function bp_xprofile_get_field_types() { 
    158158                'selectbox'      => 'BP_XProfile_Field_Type_Selectbox',
    159159                'textarea'       => 'BP_XProfile_Field_Type_Textarea',
    160160                'textbox'        => 'BP_XProfile_Field_Type_Textbox',
     161                'telephone'      => 'BP_XProfile_Field_Type_Telephone',
    161162        );
    162163
    163164        /**
    function xprofile_sync_bp_profile( &$errors, $update, &$user ) { 
    868869 * @param BP_XProfile_ProfileData $data Current instance of the profile data being saved.
    869870 */
    870871function xprofile_sync_wp_profile_on_single_field_set( $data ) {
    871        
     872
    872873        if ( bp_xprofile_fullname_field_id() !== $data->field_id ) {
    873874                return;
    874875        }
  • new file src/bp-xprofile/classes/class-bp-xprofile-field-type-telephone.php

    diff --git a/src/bp-xprofile/classes/class-bp-xprofile-field-type-telephone.php b/src/bp-xprofile/classes/class-bp-xprofile-field-type-telephone.php
    new file mode 100644
    index 000000000..4b00dd810
    - +  
     1<?php
     2/**
     3 * BuddyPress XProfile Classes.
     4 *
     5 * @package BuddyPress
     6 * @subpackage XProfileClasses
     7 * @since 3.0.0
     8 */
     9
     10// Exit if accessed directly.
     11defined( 'ABSPATH' ) || exit;
     12
     13/**
     14 * Telephone number xprofile field type.
     15 *
     16 * @since 3.0.0
     17 */
     18class BP_XProfile_Field_Type_Telephone extends BP_XProfile_Field_Type {
     19
     20        /**
     21         * Constructor for the telephone number field type.
     22         *
     23         * @since 3.0.0
     24         */
     25        public function __construct() {
     26                parent::__construct();
     27
     28                $this->category = _x( 'Single Fields', 'xprofile field type category', 'buddypress' );
     29                $this->name     = _x( 'Phone Number', 'xprofile field type', 'buddypress' );
     30
     31                $this->set_format( '/^.*$/', 'replace' );
     32
     33                /**
     34                 * Fires inside __construct() method for BP_XProfile_Field_Type_Telephone class.
     35                 *
     36                 * @since 3.0.0
     37                 *
     38                 * @param BP_XProfile_Field_Type_Telephone $this Current instance of the field type.
     39                 */
     40                do_action( 'bp_xprofile_field_type_telephone', $this );
     41        }
     42
     43        /**
     44         * Output the edit field HTML for this field type.
     45         *
     46         * Must be used inside the {@link bp_profile_fields()} template loop.
     47         *
     48         * @since 3.0.0
     49         *
     50         * @param array $raw_properties Optional key/value array of
     51         *                              {@link http://dev.w3.org/html5/markup/input.text.html permitted attributes}
     52         *                              that you want to add.
     53         */
     54        public function edit_field_html( array $raw_properties = array() ) {
     55                /*
     56                 * User_id is a special optional parameter that certain other fields
     57                 * types pass to {@link bp_the_profile_field_options()}.
     58                 */
     59                if ( isset( $raw_properties['user_id'] ) ) {
     60                        unset( $raw_properties['user_id'] );
     61                }
     62
     63                $r = bp_parse_args( $raw_properties, array(
     64                        'type'  => 'tel',
     65                        'value' => bp_get_the_profile_field_edit_value(),
     66                ) ); ?>
     67
     68                <legend id="<?php bp_the_profile_field_input_name(); ?>-1">
     69                        <?php bp_the_profile_field_name(); ?>
     70                        <?php bp_the_profile_field_required_label(); ?>
     71                </legend>
     72
     73                <?php
     74
     75                /** This action is documented in bp-xprofile/bp-xprofile-classes */
     76                do_action( bp_get_the_profile_field_errors_action() ); ?>
     77
     78                <input <?php echo $this->get_edit_field_html_elements( $r ); ?> aria-labelledby="<?php bp_the_profile_field_input_name(); ?>-1" aria-describedby="<?php bp_the_profile_field_input_name(); ?>-3">
     79
     80                <?php if ( bp_get_the_profile_field_description() ) : ?>
     81                        <p class="description" id="<?php bp_the_profile_field_input_name(); ?>-3"><?php bp_the_profile_field_description(); ?></p>
     82                <?php endif; ?>
     83
     84                <?php
     85        }
     86
     87        /**
     88         * Output HTML for this field type on the wp-admin Profile Fields screen.
     89         *
     90         * Must be used inside the {@link bp_profile_fields()} template loop.
     91         *
     92         * @since 3.0.0
     93         *
     94         * @param array $raw_properties Optional key/value array of permitted attributes that you want to add.
     95         */
     96        public function admin_field_html( array $raw_properties = array() ) {
     97                $r = bp_parse_args( $raw_properties, array(
     98                        'type' => 'tel',
     99                ) ); ?>
     100
     101                <label for="<?php bp_the_profile_field_input_name(); ?>" class="screen-reader-text"><?php
     102                        /* translators: accessibility text */
     103                        esc_html_e( 'Phone Number', 'buddypress' );
     104                ?></label>
     105                <input <?php echo $this->get_edit_field_html_elements( $r ); ?>>
     106
     107                <?php
     108        }
     109
     110        /**
     111         * This method usually outputs HTML for this field type's children options on the wp-admin Profile Fields
     112         * "Add Field" and "Edit Field" screens, but for this field type, we don't want it, so it's stubbed out.
     113         *
     114         * @since 3.0.0
     115         *
     116         * @param BP_XProfile_Field $current_field The current profile field on the add/edit screen.
     117         * @param string            $control_type  Optional. HTML input type used to render the
     118         *                                         current field's child options.
     119         */
     120        public function admin_new_field_html( BP_XProfile_Field $current_field, $control_type = '' ) {}
     121
     122        /**
     123         * Format URL values for display.
     124         *
     125         * @since 3.0.0
     126         *
     127         * @param string     $field_value The URL value, as saved in the database.
     128         * @param string|int $field_id    Optional. ID of the field.
     129         *
     130         * @return string URL converted to a link.
     131         */
     132        public static function display_filter( $field_value, $field_id = '' ) {
     133                $url   = wp_strip_all_tags( $field_value );
     134                $parts = parse_url( $url );
     135
     136                // Add the tel:// protocol to the field value.
     137                if ( isset( $parts['scheme'] ) && strtolower( $parts['scheme'] ) !== 'tel' ) {
     138                        $url      = preg_replace( '#^' . $parts['scheme'] . '#i', 'tel', $url );
     139                        $url_text = preg_replace( '#^tel://#i', '', $url );
     140                } else {
     141                        $url_text = $url;
     142                        $url      = 'tel://' . $url;
     143                }
     144
     145                return sprintf(
     146                        '<a href="%1$s" rel="nofollow">%2$s</a>',
     147                        esc_url( $url, array( 'tel' ) ),
     148                        esc_html( $url_text )
     149                );
     150        }
     151}
  • tests/phpunit/testcases/xprofile/class-bp-xprofile-field-type.php

    diff --git a/tests/phpunit/testcases/xprofile/class-bp-xprofile-field-type.php b/tests/phpunit/testcases/xprofile/class-bp-xprofile-field-type.php
    index 6fa264464..6b07a1124 100644
    a b public function test_datebox_do_not_validate_date_with_timestamp() { 
    7575
    7676        public function test_number_do_not_validate_string() {
    7777                $field = bp_xprofile_create_field_type( 'number' );
    78                 $this->assertFalse( $field->is_valid( 'telephone fields only accept integers' ) );
     78                $this->assertFalse( $field->is_valid( 'number fields only accept integers' ) );
    7979                $this->assertFalse( $field->is_valid( '' ) );
    8080        }
    8181
    public function test_placeholder_validate_any_value() { 
    176176                $this->assertTrue( $field->is_valid( 'bar' ) );
    177177                $this->assertTrue( $field->is_valid( array( 'bar' ) ) );
    178178        }
     179
     180        public function test_telephone_validate_number_formats() {
     181                $field = bp_xprofile_create_field_type( 'telephone' );
     182                $this->assertTrue( $field->is_valid( '07700 900461' ) );
     183                $this->assertTrue( $field->is_valid( '555-2368' ) );
     184                $this->assertTrue( $field->is_valid( '(212) 664-7665' ) );
     185        }
    179186}
  • src/bp-xprofile/classes/class-bp-xprofile-field-type-telephone.php

    From d9a6a0be7e80dc8e5c9dd92000558a891d109f23 Mon Sep 17 00:00:00 2001
    From: Paul Gibbs <djpaul@gmail.com>
    Date: Wed, 7 Feb 2018 15:25:12 +0000
    Subject: [PATCH 2/2] Update telephone patch
    
    ---
     .../classes/class-bp-xprofile-field-type-telephone.php           | 9 +++++++--
     1 file changed, 7 insertions(+), 2 deletions(-)
    
    diff --git a/src/bp-xprofile/classes/class-bp-xprofile-field-type-telephone.php b/src/bp-xprofile/classes/class-bp-xprofile-field-type-telephone.php
    index 4b00dd810..275bb3abd 100644
    a b public static function display_filter( $field_value, $field_id = '' ) { 
    134134                $parts = parse_url( $url );
    135135
    136136                // Add the tel:// protocol to the field value.
    137                 if ( isset( $parts['scheme'] ) && strtolower( $parts['scheme'] ) !== 'tel' ) {
    138                         $url      = preg_replace( '#^' . $parts['scheme'] . '#i', 'tel', $url );
     137                if ( isset( $parts['scheme'] ) ) {
     138                        if ( strtolower( $parts['scheme'] ) !== 'tel' ) {
     139                                $scheme = preg_quote( $parts['scheme'], '#' );
     140                                $url    = preg_replace( '#^' . $scheme . '#i', 'tel', $url );
     141                        }
     142
    139143                        $url_text = preg_replace( '#^tel://#i', '', $url );
     144
    140145                } else {
    141146                        $url_text = $url;
    142147                        $url      = 'tel://' . $url;