Skip to:
Content

BuddyPress.org

Changeset 13584


Ignore:
Timestamp:
09/20/2023 01:00:54 AM (10 months ago)
Author:
imath
Message:

BP Legacy: improve private messages user feedback management

  • Use a redirect to be sure to clear template notices when a required field is missing at next page load.
  • Preserve submitted texts and contacts in case of missing required fields (using cookies, see messages_add_callback_values()).
  • Improve the template so that it directly informs about all missing required fields at once.

Props niftythree, amitgrhr

Fixes #8578
Closes https://github.com/buddypress/buddypress/pull/167

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-messages/actions/compose.php

    r13503 r13584  
    2929    $feedback    = '';
    3030    $success     = false;
     31    $is_notice   = isset( $_POST['send-notice'] );
     32    $path_chunks = array( bp_get_messages_slug() );
    3133
    32     // Missing subject or content.
    33     if ( empty( $_POST['subject'] ) || empty( $_POST['content'] ) ) {
    34         $success  = false;
     34    // List required vars and error messages.
     35    $required_vars = array(
     36        'subject' => __( 'Please enter a subject line.', 'buddypress' ),
     37        'content' => __( 'Please enter some content.', 'buddypress' ),
     38    );
    3539
    36         if ( empty( $_POST['subject'] ) ) {
    37             $feedback = __( 'Your message was not sent. Please enter a subject line.', 'buddypress' );
    38         } else {
    39             $feedback = __( 'Your message was not sent. Please enter some content.', 'buddypress' );
     40    // The username is only needed for private messages.
     41    if ( ! $is_notice ) {
     42        $required_vars = array_merge(
     43            array(
     44                'send_to_usernames' => __( 'Please enter a username or Friend\'s name.', 'buddypress' ),
     45            ),
     46            $required_vars
     47        );
     48    }
     49
     50    // Calculate whether some required vars are missing.
     51    $needed_keys    = array_intersect_key( $_POST, $required_vars );
     52    $needs_feedback = count( array_filter( $needed_keys ) ) !== count( $required_vars );
     53
     54    // Prevent notice errors.
     55    $required_args = array_map(
     56        'wp_unslash',
     57        bp_parse_args(
     58            $needed_keys,
     59            array(
     60                'send_to_usernames' => '',
     61                'subject'           => '',
     62                'content'           => ''
     63            )
     64        )
     65    );
     66
     67    // Use cookies to preserve existing values.
     68    messages_add_callback_values(
     69        implode( ' ', wp_parse_list( $required_args['send_to_usernames'] ) ),
     70        esc_html( $required_args['subject'] ),
     71        esc_textarea( $required_args['content'] )
     72    );
     73
     74    // Handle required vars.
     75    if ( $needs_feedback ) {
     76        $success       = false;
     77        $path_chunks[] = 'compose';
     78        $feedbacks     = array( __( 'Your message was not sent.', 'buddypress' ) );
     79
     80        foreach ( $required_vars as $required_key => $required_var_feedback ) {
     81            if ( ! $required_args[ $required_key ] ) {
     82                $feedbacks[] = $required_var_feedback;
     83            }
    4084        }
    4185
    42     // Subject and content present.
     86        // Set the feedback message.
     87        $feedback    = implode( "\n", $feedbacks );
     88        $redirect_to = bp_loggedin_user_url( bp_members_get_path_chunks( $path_chunks ) );
    4389    } else {
    4490
    45         // Setup the link to the logged-in user's messages.
    46         $path_chunks = array( bp_get_messages_slug() );
    47 
    4891        // Site-wide notice.
    49         if ( isset( $_POST['send-notice'] ) ) {
     92        if ( $is_notice ) {
    5093
    5194            // Attempt to save the notice and redirect to notices.
    52             if ( messages_send_notice( $_POST['subject'], $_POST['content'] ) ) {
     95            if ( messages_send_notice( $required_args['subject'], $required_args['content'] ) ) {
    5396                $success       = true;
    5497                $feedback      = __( 'Notice successfully created.', 'buddypress' );
    5598                $path_chunks[] = 'notices';
    56                 $redirect_to   = bp_loggedin_user_url( bp_members_get_path_chunks( $path_chunks ) );
    5799
    58             // Notice could not be sent.
     100                // Notice could not be sent.
    59101            } else {
    60                 $success  = false;
    61                 $feedback = __( 'Notice was not created. Please try again.', 'buddypress' );
     102                $success       = false;
     103                $path_chunks[] = 'compose';
     104                $feedback      = __( 'Notice was not created. Please try again.', 'buddypress' );
    62105            }
    63106
    64         // Private conversation.
     107            $redirect_to = bp_loggedin_user_url( bp_members_get_path_chunks( $path_chunks ) );
     108
     109            // Private conversation.
    65110        } else {
    66111
    67112            // Filter recipients into the format we need - array( 'username/userid', 'username/userid' ).
    68             $autocomplete_recipients = (array) explode( ',', $_POST['send-to-input'] );
    69             $typed_recipients        = (array) explode( ' ', $_POST['send_to_usernames'] );
    70             $recipients              = array_merge( $autocomplete_recipients, $typed_recipients );
     113            $autocomplete_recipients = array();
     114            if ( isset( $_POST['send-to-input'] ) && $_POST['send-to-input'] ) {
     115                $autocomplete_recipients = (array) explode( ',', $_POST['send-to-input'] );
     116            }
     117
     118            $typed_recipients = (array) explode( ' ', $required_args['send_to_usernames'] );
     119            $recipients       = array_merge( $autocomplete_recipients, $typed_recipients );
    71120
    72121            /**
     
    80129
    81130            // Attempt to send the message.
    82             $send = messages_new_message( array(
    83                 'recipients' => $recipients,
    84                 'subject'    => $_POST['subject'],
    85                 'content'    => $_POST['content'],
    86                 'error_type' => 'wp_error',
    87             ) );
     131            $send = messages_new_message(
     132                array(
     133                    'recipients' => $recipients,
     134                    'subject'    => $required_args['subject'],
     135                    'content'    => $required_args['content'],
     136                    'error_type' => 'wp_error',
     137                )
     138            );
    88139
    89140            // Send the message and redirect to it.
     
    93144                $path_chunks[] = 'view';
    94145                $path_chunks[] = array( $send );
    95                 $redirect_to   = bp_loggedin_user_url( bp_members_get_path_chunks( $path_chunks ) );
    96146
    97             // Message could not be sent.
     147                // Message could not be sent.
    98148            } else {
    99                 $success  = false;
    100                 $feedback = $send->get_error_message();
     149                $success       = false;
     150                $path_chunks[] = 'compose';
     151                $feedback      = $send->get_error_message();
    101152            }
     153
     154            $redirect_to = bp_loggedin_user_url( bp_members_get_path_chunks( $path_chunks ) );
    102155        }
    103156    }
  • trunk/src/bp-messages/bp-messages-template.php

    r13503 r13584  
    10041004
    10051005        // Sanitized in bp-messages-filters.php.
    1006         $subject = ! empty( $_POST['subject'] )
    1007             ? $_POST['subject']
    1008             : '';
     1006        $subject = '';
     1007        if ( isset( $_POST['subject'] ) && $_POST['subject'] ) {
     1008            $subject = $_POST['subject'];
     1009        } elseif ( isset( $_COOKIE['bp_messages_subject'] ) && $_COOKIE['bp_messages_subject'] ) {
     1010            $subject = $_COOKIE['bp_messages_subject'];
     1011        }
    10091012
    10101013        /**
     
    10351038
    10361039        // Sanitized in bp-messages-filters.php.
    1037         $content = ! empty( $_POST['content'] )
    1038             ? $_POST['content']
    1039             : '';
     1040        $content = '';
     1041        if ( isset( $_POST['content'] ) && $_POST['content'] ) {
     1042            $content = $_POST['content'];
     1043        } elseif ( isset( $_COOKIE['bp_messages_content'] ) && $_COOKIE['bp_messages_content'] ) {
     1044            $content = $_COOKIE['bp_messages_content'];
     1045        }
    10401046
    10411047        /**
     
    16801686
    16811687        // Sanitized in bp-messages-filters.php.
    1682         $recipients = isset( $_GET['r'] )
    1683             ? $_GET['r']
    1684             : '';
     1688        $recipients = '';
     1689        if ( isset( $_GET['r'] ) && $_GET['r'] ) {
     1690            $recipients = $_GET['r'];
     1691        } elseif ( isset( $_COOKIE['bp_messages_send_to'] ) && $_COOKIE['bp_messages_send_to'] ) {
     1692            $recipients = $_COOKIE['bp_messages_send_to'];
     1693        }
    16851694
    16861695        /**
  • trunk/src/bp-templates/bp-legacy/buddypress/members/single/messages/compose.php

    r13295 r13584  
    1111<h2 class="bp-screen-reader-text"><?php
    1212    /* translators: accessibility text */
    13     _e( 'Compose Message', 'buddypress' );
     13    esc_html_e( 'Compose Message', 'buddypress' );
    1414?></h2>
    1515
     
    2525    do_action( 'bp_before_messages_compose_content' ); ?>
    2626
    27     <label for="send-to-input"><?php _e("Send To (Username or Friend's Name)", 'buddypress' ); ?></label>
     27    <label for="send-to-input"><?php esc_html_e( 'Send To (Username or Friend\'s Name)', 'buddypress' ); ?></label>
    2828    <ul class="first acfb-holder">
    2929        <li>
     
    3434
    3535    <?php if ( bp_current_user_can( 'bp_moderate' ) ) : ?>
    36         <p><label for="send-notice"><input type="checkbox" id="send-notice" name="send-notice" value="1" /> <?php _e( "This is a notice to all users.", 'buddypress' ); ?></label></p>
     36        <p><label for="send-notice"><input type="checkbox" id="send-notice" name="send-notice" value="1" /> <?php esc_html_e( "This is a notice to all users.", 'buddypress' ); ?></label></p>
    3737    <?php endif; ?>
    3838
    39     <label for="subject"><?php _e( 'Subject', 'buddypress' ); ?></label>
     39    <label for="subject"><?php esc_html_e( 'Subject', 'buddypress' ); ?></label>
    4040    <input type="text" name="subject" id="subject" value="<?php bp_messages_subject_value(); ?>" />
    4141
    42     <label for="message_content"><?php _e( 'Message', 'buddypress' ); ?></label>
     42    <label for="message_content"><?php esc_html_e( 'Message', 'buddypress' ); ?></label>
    4343    <textarea name="content" id="message_content" rows="15" cols="40"><?php bp_messages_content_value(); ?></textarea>
    4444
Note: See TracChangeset for help on using the changeset viewer.