Skip to:
Content

BuddyPress.org

Ticket #5501: 5501.03.patch

File 5501.03.patch, 6.2 KB (added by williamsba1, 7 years ago)
  • bp-xprofile/bp-xprofile-functions.php

     
    7272                'datebox'        => 'BP_XProfile_Field_Type_Datebox',
    7373                'multiselectbox' => 'BP_XProfile_Field_Type_Multiselectbox',
    7474                'number'         => 'BP_XProfile_Field_Type_Number',
     75                'url'            => 'BP_XProfile_Field_Type_URL',
    7576                'radio'          => 'BP_XProfile_Field_Type_Radiobutton',
    7677                'selectbox'      => 'BP_XProfile_Field_Type_Selectbox',
    7778                'textarea'       => 'BP_XProfile_Field_Type_Textarea',
     
    286287                $field_type_obj->set_whitelist_values( wp_list_pluck( $field->get_children(), 'name' ) );
    287288        }
    288289
     290        /**
     291         * If the field type is a URL and doesn't appear to contain a scheme,
     292         * we presume it needs http:// appended (unless a relative
     293         * link starting with / or a php file).
     294         */
     295        if ( 'url' == $field_type )
     296                if ( strpos( $value, ':' ) === false &&
     297                        substr( $value, 0, 1 ) != '/' && substr( $value, 0, 1 ) != '#' && !preg_match('/^[a-z0-9-]+?\.php/i', $value) )
     298                        $value = 'http://' . $value;
     299
    289300        // Check the value is in an accepted format for this form field.
    290301        if ( ! $field_type_obj->is_valid( $value ) ) {
    291302                return false;
  • bp-xprofile/bp-xprofile-classes.php

     
    24972497}
    24982498
    24992499/**
     2500 * URL xprofile field type.
     2501 *
     2502 * @since BuddyPress (2.1.0)
     2503 */
     2504class BP_XProfile_Field_Type_URL extends BP_XProfile_Field_Type {
     2505
     2506        /**
     2507         * Constructor for the URL field type
     2508         *
     2509         * @since BuddyPress (2.1.0)
     2510         */
     2511        public function __construct() {
     2512                parent::__construct();
     2513
     2514                $this->category = _x( 'Single Fields', 'xprofile field type category', 'buddypress' );
     2515                $this->name     = _x( 'URL', 'xprofile field type', 'buddypress' );
     2516
     2517                $this->set_format( '_^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:/[^\s]*)?$_iuS', 'replace' );
     2518                do_action( 'bp_xprofile_field_type_url', $this );
     2519        }
     2520
     2521        /**
     2522         * Output the edit field HTML for this field type.
     2523         *
     2524         * Must be used inside the {@link bp_profile_fields()} template loop.
     2525         *
     2526         * @param array $raw_properties Optional key/value array of
     2527         *        {@link http://dev.w3.org/html5/markup/input.number.html permitted attributes}
     2528         *        that you want to add.
     2529         * @since BuddyPress (2.1.0)
     2530         */
     2531        public function edit_field_html( array $raw_properties = array() ) {
     2532                // user_id is a special optional parameter that certain other
     2533                // fields types pass to {@link bp_the_profile_field_options()}.
     2534                if ( isset( $raw_properties['user_id'] ) ) {
     2535                        unset( $raw_properties['user_id'] );
     2536                }
     2537
     2538                $html = $this->get_edit_field_html_elements( array_merge(
     2539                        array(
     2540                                'type'  => 'url',
     2541                                'value' =>  esc_url( bp_get_the_profile_field_edit_value() ),
     2542                        ),
     2543                        $raw_properties
     2544                ) );
     2545        ?>
     2546                <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 esc_html_e( '(required)', 'buddypress' ); ?><?php endif; ?></label>
     2547                <input <?php echo $html; ?>>
     2548        <?php
     2549        }
     2550
     2551        /**
     2552         * Output HTML for this field type on the wp-admin Profile Fields screen.
     2553         *
     2554         * Must be used inside the {@link bp_profile_fields()} template loop.
     2555         *
     2556         * @param array $raw_properties Optional key/value array of permitted
     2557         *        attributes that you want to add.
     2558         * @since BuddyPress (2.1.0)
     2559         */
     2560        public function admin_field_html( array $raw_properties = array() ) {
     2561                $html = $this->get_edit_field_html_elements( array_merge(
     2562                        array( 'type' => 'url' ),
     2563                        $raw_properties
     2564                ) );
     2565        ?>
     2566                <input <?php echo $html; ?>>
     2567        <?php
     2568        }
     2569
     2570        /**
     2571         * This method usually outputs HTML for this field type's children options on the wp-admin Profile Fields
     2572         * "Add Field" and "Edit Field" screens, but for this field type, we don't want it, so it's stubbed out.
     2573         *
     2574         * @param BP_XProfile_Field $current_field The current profile field on the add/edit screen.
     2575         * @param string $control_type Optional. HTML input type used to render the current field's child options.
     2576         * @since BuddyPress (2.1.0)
     2577         */
     2578        public function admin_new_field_html( BP_XProfile_Field $current_field, $control_type = '' ) {}
     2579}
     2580
     2581/**
    25002582 * Represents a type of XProfile field and holds meta information about the type of value that it accepts.
    25012583 *
    25022584 * @since BuddyPress (2.0.0)
  • tests/testcases/xprofile/class-bp-xprofile-field-type.php

     
    153153                $this->assertFalse( $field->is_valid( '' ) );
    154154                $this->assertTrue( $field->is_valid( array() ) );
    155155        }
     156
     157        /**
     158         * @group url
     159         */
     160        public function test_url_validate_url() {
     161                $field = bp_xprofile_create_field_type( 'url' );
     162
     163                $this->assertTrue( $field->is_valid( 'http://foo.com' ) );
     164                $this->assertTrue( $field->is_valid( 'https://foo.com' ) );
     165                $this->assertTrue( $field->is_valid( 'http://foo.bar.com' ) );
     166                $this->assertTrue( $field->is_valid( 'http://foo.bar.com/' ) );
     167                $this->assertTrue( $field->is_valid( 'http://foo.com/bar' ) );
     168                $this->assertTrue( $field->is_valid( 'http://foo.com/index.php' ) );
     169                $this->assertTrue( $field->is_valid( 'http://foo.com/?bar=baz' ) );
     170
     171                $this->assertFalse( $field->is_valid( 'htp://foo.com' ) );
     172                $this->assertFalse( $field->is_valid( 'http:/foo.com' ) );
     173                $this->assertFalse( $field->is_valid( 'http//foo.com' ) );
     174                $this->assertFalse( $field->is_valid( 'http://foo' ) );
     175                $this->assertFalse( $field->is_valid( 'foo.com' ) );
     176        }
    156177}