Skip to:
Content

BuddyPress.org

Ticket #7226: 7226.ray.patch

File 7226.ray.patch, 13.2 KB (added by r-a-y, 3 years ago)
  • src/bp-core/classes/class-bp-button.php

     
    1414 * API to create BuddyPress buttons.
    1515 *
    1616 * @since 1.2.6
     17 * @since 2.7.0 Introduced $parent_element, $parent_attr, $button_element, $button_attr as
     18 *              $args parameters. Deprecated $wrapper, $wrapper_id, $wrapper_class,
     19 *              $link_href, $link_class, $link_id, $link_rel, $link_title as $args params.
    1720 *
    1821 * @param array $args {
    1922 *     Array of arguments.
    2023 *
    2124 *     @type string      $id                String describing the button type.
    22  *     @type string      $component         The name of the component the button belongs to.
    23  *                                          Default: 'core'.
    24  *     @type bool        $must_be_logged_in Optional. Does the user need to be logged
    25  *                                          in to see this button? Default: true.
    26  *     @type bool        $block_self        Optional. True if the button should be hidden
    27  *                                          when a user is viewing his own profile.
    28  *                                          Default: true.
    29  *     @type string|bool $wrapper           Optional. HTML element type that should wrap
    30  *                                          the button: 'div', 'span', 'p', or 'li'.
    31  *                                          False for no wrapper at all. Default: 'div'.
    32  *     @type string      $wrapper_id        Optional. DOM ID of the button wrapper element.
    33  *                                          Default: ''.
    34  *     @type string      $wrapper_class     Optional. DOM class of the button wrapper
    35  *                                          element. Default: ''.
    36  *     @type string      $link_href         Optional. Destination link of the button.
    37  *                                          Default: ''.
    38  *     @type string      $link_class        Optional. DOM class of the button. Default: ''.
    39  *     @type string      $link_id           Optional. DOM ID of the button. Default: ''.
    40  *     @type string      $link_rel          Optional. DOM 'rel' attribute of the button.
    41  *                                          Default: ''.
    42  *     @type string      $link_title        Optional. Title attribute of the button.
    43  *                                          Default: ''.
    44  *     @type string      $link_text         Optional. Text to appear on the button.
    45  *                                          Default: ''.
     25 *     @type string      $component         The name of the component the button belongs to. Default: 'core'.
     26 *     @type bool        $must_be_logged_in Optional. Does the user need to be logged in to see this button? Default:
     27 *                                          true.
     28 *     @type bool        $block_self        Optional. True if the button should be hidden when a user is viewing his
     29 *                                          own profile. Default: true.
     30 *     @type string      $parent_element    Optional. Parent element to wrap button around. Default: 'div'.
     31 *     @type array       $parent_attr       Optional. Element attributes for parent element. Set whatever attributes
     32 *                                          like 'id', 'class' as array keys.
     33 *     @type string      $button_element    Optional. Button element. Default: 'a'.
     34 *     @type array       $button_attr       Optional. Button attributes. Set whatever attributes like 'id', 'class' as
     35 *                                          array keys.
     36 *     @type string      $link_text         Optional. Text to appear on the button. Default: ''.
     37 *     @type string|bool $wrapper           Deprecated. Use $parent_element instead.
     38 *     @type string      $wrapper_id        Deprecated. Use $parent_attr and set 'id' as array key.
     39 *     @type string      $wrapper_class     Deprecated. Use $parent_attr and set 'class' as array key.
     40 *     @type string      $link_href         Deprecated. Use $button_attr and set 'href' as array key.
     41 *     @type string      $link_class        Deprecated. Use $button_attr and set 'class' as array key.
     42 *     @type string      $link_id           Deprecated. Use $button_attr and set 'id' as array key.
     43 *     @type string      $link_rel          Deprecated. Use $button_attr and set 'rel' as array key.
     44 *     @type string      $link_title        Deprecated. Use $button_attr and set 'title' as array key.
    4645 * }
    4746 */
    4847class BP_Button {
     
    8079        /** Wrapper ***************************************************************/
    8180
    8281        /**
     82         * Parent element to wrap button around.
     83         *
     84         * @since 2.7.0
     85         *
     86         * @var string Default: 'div'.
     87         */
     88        public $parent_element = 'div';
     89
     90        /**
     91         * Element attributes for parent element.
     92         *
     93         * @since 2.7.0
     94         *
     95         * @var array Set whatever attributes like 'id', 'class' as array key.
     96         */
     97        public $parent_attr = array();
     98
     99        /** Button ****************************************************************/
     100
     101        /**
     102         * Button element.
     103         *
     104         * @since 2.7.0
     105         *
     106         * @var string Default: 'a'.
     107         */
     108        public $button_element = 'a';
     109
     110        /**
     111         * Button attributes.
     112         *
     113         * @since 2.7.0
     114         *
     115         * @var array Set whatever attributes like 'id', 'href' as array key.
     116         */
     117        public $button_attr = array();
     118
     119        /**
     120         * The contents of the button link.
     121         *
     122         * @var string
     123         */
     124        public $link_text = '';
     125
     126        /** HTML result
     127         *
     128         * @var string
     129         */
     130        public $contents = '';
     131
     132        /** Deprecated ***********************************************************/
     133
     134        /**
    83135         * The type of DOM element to use for a wrapper.
    84136         *
    85          * @var string|bool 'div', 'span', 'p', 'li', or false for no wrapper.
     137         * @deprecated 2.7.0 Use $parent_element instead.
     138         *
     139         * @var string|bool
    86140         */
    87         public $wrapper = 'div';
     141        public $wrapper = '';
    88142
    89143        /**
    90144         * The DOM class of the button wrapper.
    91145         *
     146         * @deprecated 2.7.0 Set 'class' key in $parent_attr instead.
     147         *
    92148         * @var string
    93149         */
    94150        public $wrapper_class = '';
     
    96152        /**
    97153         * The DOM ID of the button wrapper.
    98154         *
     155         * @deprecated 2.7.0 Set 'id' key in $parent_attr instead.
     156         *
    99157         * @var string
    100158         */
    101159        public $wrapper_id = '';
    102160
    103         /** Button ****************************************************************/
    104 
    105161        /**
    106162         * The destination link of the button.
    107163         *
     164         * @deprecated 2.7.0 Set 'href' key in $button_attr instead.
     165         *
    108166         * @var string
    109167         */
    110168        public $link_href = '';
     
    112170        /**
    113171         * The DOM class of the button link.
    114172         *
     173         * @deprecated 2.7.0 Set 'class' key in $button_attr instead.
     174         *
    115175         * @var string
    116176         */
    117177        public $link_class = '';
     
    119179        /**
    120180         * The DOM ID of the button link.
    121181         *
     182         * @deprecated 2.7.0 Set 'id' key in $button_attr instead.
     183         *
    122184         * @var string
    123185         */
    124186        public $link_id = '';
     
    126188        /**
    127189         * The DOM rel value of the button link.
    128190         *
     191         * @deprecated 2.7.0 Set 'rel' key in $button_attr instead.
     192         *
    129193         * @var string
    130194         */
    131195        public $link_rel = '';
     
    133197        /**
    134198         * Title of the button link.
    135199         *
    136          * @var string
    137          */
    138         public $link_title = '';
    139 
    140         /**
    141          * The contents of the button link.
    142          *
    143          * @var string
    144          */
    145         public $link_text = '';
    146 
    147         /** HTML result
     200         * @deprecated 2.7.0 Set 'title' key in $button_attr instead.
    148201         *
    149202         * @var string
    150203         */
    151         public $contents = '';
     204        public $link_title = '';
    152205
    153206        /** Methods ***************************************************************/
    154207
     
    163216
    164217                $r = wp_parse_args( $args, get_class_vars( __CLASS__ ) );
    165218
     219                // Backward compatibility with deprecated parameters.
     220                $r = $this->backward_compatibility_args( $r );
     221                $this->wrapper = $r['wrapper'];
     222
    166223                // Required button properties.
    167224                $this->id                = $r['id'];
    168225                $this->component         = $r['component'];
    169226                $this->must_be_logged_in = (bool) $r['must_be_logged_in'];
    170227                $this->block_self        = (bool) $r['block_self'];
    171                 $this->wrapper           = $r['wrapper'];
    172 
    173                 // $id and $component are required
    174                 if ( empty( $r['id'] ) || empty( $r['component'] ) )
    175                         return false;
    176228
    177                 // No button if component is not active.
    178                 if ( ! bp_is_active( $this->component ) )
     229                // $id and $component are required and component must be active.
     230                if ( empty( $r['id'] ) || empty( $r['component'] ) || ! bp_is_active( $this->component ) ) {
    179231                        return false;
     232                }
    180233
    181                 // No button for guests if must be logged in.
    182                 if ( true == $this->must_be_logged_in && ! is_user_logged_in() )
     234                // No button for guests if must be logged in. {
     235                if ( true == $this->must_be_logged_in && ! is_user_logged_in() ) {
    183236                        return false;
     237                }
    184238
    185239                // The block_self property.
    186240                if ( true == $this->block_self ) {
     
    199253                        }
    200254                }
    201255
    202                 // Wrapper properties.
    203                 if ( false !== $this->wrapper ) {
    204 
    205                         // Wrapper ID.
    206                         if ( !empty( $r['wrapper_id'] ) ) {
    207                                 $this->wrapper_id    = ' id="' . $r['wrapper_id'] . '"';
     256                // Should we use a parent element?
     257                $parent_elem = sanitize_html_class( $r['parent_element'] );
     258                if ( ! empty( $parent_elem ) ) {
     259                        if ( ! isset( $r['parent_attr']['class'] ) ) {
     260                                $r['parent_attr']['class'] = '';
    208261                        }
    209262
    210                         // Wrapper class.
    211                         if ( !empty( $r['wrapper_class'] ) ) {
    212                                 $this->wrapper_class = ' class="generic-button ' . $r['wrapper_class'] . '"';
    213                         } else {
    214                                 $this->wrapper_class = ' class="generic-button"';
     263                        // Always add 'generic-button' class.
     264                        if ( false === strpos( $r['parent_attr']['class'], 'generic-button' ) ) {
     265                                if ( ! empty( $r['parent_attr']['class'] ) ) {
     266                                        $r['parent_attr']['class'] .= ' ';
     267                                }
     268                                $r['parent_attr']['class'] .= 'generic-button';
    215269                        }
    216270
    217271                        // Set before and after.
    218                         $before = '<' . $r['wrapper'] . $this->wrapper_class . $this->wrapper_id . '>';
    219                         $after  = '</' . $r['wrapper'] . '>';
     272                        $parent_attr = '';
     273                        foreach( $r['parent_attr'] as $attr => $val ) {
     274                                $parent_attr .= sprintf( '%s="%s" ', sanitize_html_class( $attr ), esc_attr( $val ) );
     275                        }
     276                        $before = sprintf( '<%1$s %2$s>', $parent_elem, $parent_attr );
     277                        $after  = sprintf( '</%s>', $parent_elem );
    220278
    221                 // No wrapper.
     279                // No parent element.
    222280                } else {
    223281                        $before = $after = '';
    224282                }
    225283
    226                 // Link properties.
     284                // Button properties.
     285                $button = '';
     286                $button_elem = sanitize_html_class( $r['button_element'] );
     287                if ( ! empty( $button_elem ) ) {
     288                        $button_attr = '';
     289                        foreach( $r['button_attr'] as $attr => $val ) {
     290                                $button_attr .= sprintf( '%s="%s" ', sanitize_html_class( $attr ), esc_attr( $val ) );
     291                        }
     292                        $button = sprintf( '<%1$s %2$s>%3$s</%1$s>',
     293                                $button_elem,
     294                                $button_attr,
     295                                ! empty( $r['link_text'] ) ? $r['link_text'] : ''
     296                        );
     297                }
     298
     299                // Ugh... keep for backpat.
    227300                if ( !empty( $r['link_id']    ) ) $this->link_id    = ' id="' .    $r['link_id']    . '"';
    228301                if ( !empty( $r['link_href']  ) ) $this->link_href  = ' href="' .  $r['link_href']  . '"';
    229302                if ( !empty( $r['link_title'] ) ) $this->link_title = ' title="' . $r['link_title'] . '"';
     
    232305                if ( !empty( $r['link_text']  ) ) $this->link_text  =              $r['link_text'];
    233306
    234307                // Build the button.
    235                 $this->contents = $before . '<a'. $this->link_href . $this->link_title . $this->link_id . $this->link_rel . $this->link_class . '>' . $this->link_text . '</a>' . $after;
     308                $this->contents = $before . $button . $after;
    236309
    237310                /**
    238311                 * Filters the button based on class parameters.
     
    241314                 * allows button to be manipulated externally.
    242315                 *
    243316                 * @since 1.2.6
     317                 * @since 2.7.0 Added $r as a parameter.
    244318                 *
    245319                 * @param string    $contents HTML being used for the button.
    246320                 * @param BP_Button $this     Current BP_Button instance.
    247321                 * @param string    $before   HTML appended before the actual button.
    248322                 * @param string    $after    HTML appended after the actual button.
     323                 * @param array     $r        Parsed button arguments.
    249324                 */
    250                 $this->contents = apply_filters( 'bp_button_' . $this->component . '_' . $this->id, $this->contents, $this, $before, $after );
     325                $this->contents = apply_filters( 'bp_button_' . $this->component . '_' . $this->id, $this->contents, $this, $before, $after, $r );
     326        }
     327
     328        /**
     329         * Provide backward compatibility for deprecated button arguments.
     330         *
     331         * @since 2.7.0.
     332         *
     333         * @param  array $r See {@link BP_Button} class for full documentation.
     334         * @return array
     335         */
     336        protected function backward_compatibility_args( $r = array() ) {
     337                // Array of deprecated arguments.
     338                $backpat_args = array(
     339                        'wrapper', 'wrapper_class', 'wrapper_id',
     340                        'link_href', 'link_class', 'link_id', 'link_rel', 'link_title'
     341                );
     342
     343                foreach ( $backpat_args as $prop ) {
     344                        if ( empty( $r[ $prop ] ) ) {
     345                                continue;
     346                        }
     347
     348                        $parent = $child = false;
     349                        $sep    = strpos( $prop, '_' );
     350
     351                        // Check if this is an attribute.
     352                        if ( false !== $sep ) {
     353                                $child  = true;
     354                                $parent = substr( $prop, 0, $sep );
     355                        } else {
     356                                $parent = $prop;
     357                        }
     358
     359                        if ( 'wrapper' === $parent ) {
     360                                $parent = 'parent';
     361                        } else {
     362                                $parent = 'button';
     363                        }
     364
     365                        // Set element.
     366                        if ( false === $child ) {
     367                                $r[ $parent . '_element' ] = $r[ $prop ];
     368
     369                        // Set attributes.
     370                        } else {
     371                                $new_prop = substr( $prop, strpos( $prop, '_' ) +1 );
     372                                if ( empty( $r[ "{$parent}_attr" ] ) ) {
     373                                        $r[ "{$parent}_attr" ] = array();
     374                                }
     375                                $r[ "{$parent}_attr" ][ $new_prop ] = $r[ $prop ];
     376                        }
     377                }
     378
     379                return $r;
    251380        }
    252381
    253382        /**