diff --git src/bp-activity/bp-activity-loader.php src/bp-activity/bp-activity-loader.php
index 2a34aca..9366910 100644
--- src/bp-activity/bp-activity-loader.php
+++ src/bp-activity/bp-activity-loader.php
@@ -114,6 +114,9 @@ class BP_Activity_Component extends BP_Component {
'search_string' => __( 'Search Activity...', 'buddypress' ),
'global_tables' => $global_tables,
'meta_tables' => $meta_tables,
+ 'feedback_messages' => array(
+ array( 'code' => 2, 'message' => sprintf( __( 'Please use less than %d links in your update', 'buddypress' ), get_option( 'comment_max_links' ) ), 'data' => '' ),
+ ),
);
parent::setup_globals( $args );
diff --git src/bp-core/bp-core-classes.php src/bp-core/bp-core-classes.php
index 41be065..ccd8804 100644
--- src/bp-core/bp-core-classes.php
+++ src/bp-core/bp-core-classes.php
@@ -9,6 +9,7 @@
// Exit if accessed directly
defined( 'ABSPATH' ) || exit;
+require dirname( __FILE__ ) . '/classes/class-bp-feedback.php';
require dirname( __FILE__ ) . '/classes/class-bp-user-query.php';
require dirname( __FILE__ ) . '/classes/class-bp-core-user.php';
require dirname( __FILE__ ) . '/classes/class-bp-date-query.php';
diff --git src/bp-core/bp-core-component.php src/bp-core/bp-core-component.php
index a24de99..2b7a592 100644
--- src/bp-core/bp-core-component.php
+++ src/bp-core/bp-core-component.php
@@ -125,6 +125,15 @@ class BP_Component {
*/
public $global_tables = array();
+ /**
+ * Feedback for the component (if applicable)
+ *
+ * @since BuddyPress (2.4.0)
+ *
+ * @var object
+ */
+ public $feedback = null;
+
/** Methods ***************************************************************/
/**
@@ -221,6 +230,7 @@ class BP_Component {
'search_string' => '',
'global_tables' => '',
'meta_tables' => '',
+ 'feedback_messages' => array(),
) );
/**
@@ -287,6 +297,15 @@ class BP_Component {
$this->register_meta_tables( $r['meta_tables'] );
}
+ // Set the feedback messages
+ if ( ! empty( $r['feedback_messages'] ) ) {
+ $this->feedback = new BP_Feedback;
+
+ foreach ( (array) $r['feedback_messages'] as $feedback_message ) {
+ $this->feedback->add( $feedback_message['code'], $feedback_message['message'], $feedback_message['data'] );
+ }
+ }
+
/** BuddyPress ********************************************************/
// Register this component in the loaded components array
diff --git src/bp-core/bp-core-functions.php src/bp-core/bp-core-functions.php
index 55449bf..2707f6a 100644
--- src/bp-core/bp-core-functions.php
+++ src/bp-core/bp-core-functions.php
@@ -917,6 +917,7 @@ function bp_core_get_root_domain() {
* headers. Default: 302.
*/
function bp_core_redirect( $location = '', $status = 302 ) {
+ $bp = buddypress();
// On some setups, passing the value of wp_get_referer() may result in an
// empty value for $location, which results in an error. Ensure that we
@@ -925,9 +926,19 @@ function bp_core_redirect( $location = '', $status = 302 ) {
$location = bp_get_root_domain();
}
+ if ( ! empty( $bp->template_message_code ) ) {
+ $args = array( 'success' => $bp->template_message_code );
+
+ if ( ! empty( $bp->template_message_type ) ) {
+ $args = array( $bp->template_message_type => $bp->template_message_code );
+ }
+
+ $location = esc_url_raw( add_query_arg( $args, $location ) );
+ }
+
// Make sure we don't call status_header() in bp_core_do_catch_uri() as this
// conflicts with wp_redirect() and wp_safe_redirect().
- buddypress()->no_status_set = true;
+ $bp->no_status_set = true;
wp_safe_redirect( $location, $status );
die;
@@ -1260,6 +1271,36 @@ function bp_core_add_message( $message, $type = '' ) {
*/
$bp->template_message = $message;
$bp->template_message_type = $type;
+
+ // Template message code defaults to 1
+ $bp->template_message_code = 1;
+}
+
+/**
+ * Set the feedback message code
+ *
+ * @param mixed $codes single message code, array or comma separated list of message codes
+ * @param string $type Message type. 'updated', 'success', 'error', 'warning'.
+ * Default: 'success'.
+ */
+function bp_core_add_message_code( $codes = '', $type = '' ) {
+
+ // Success is the default
+ if ( empty( $type ) ) {
+ $type = 'success';
+ }
+
+ // Get BuddyPress
+ $bp = buddypress();
+
+ $message_codes = wp_parse_id_list( $codes );
+
+ /***
+ * Send the values to the $bp global so we can still output messages
+ * without a page reload
+ */
+ $bp->template_message_code = join( ',', $message_codes );
+ $bp->template_message_type = $type;
}
/**
@@ -1300,19 +1341,93 @@ function bp_core_setup_message() {
add_action( 'bp_actions', 'bp_core_setup_message', 5 );
/**
+ * Get feedback messages for given codes and component
+ *
+ * @since BuddyPress (2.4.0)
+ *
+ * @param array $codes the code of the feedback messages to get
+ * @param string $component the id of the component messages are related to
+ * @return array list of matching feedback messages
+ */
+function bp_core_get_feedback_messages( $codes = array(), $component = '' ) {
+ $bp = buddypress();
+
+ if ( empty( $component ) ) {
+ $component = 'core';
+
+ if ( bp_current_component() ) {
+ $component = bp_current_component();
+ }
+ }
+
+ if ( ! bp_is_active( $component ) || empty( $codes ) ) {
+ return false;
+ }
+
+ /**
+ * Filter to edit the feedback messages
+ *
+ * @since BuddyPress (2.4.0)
+ *
+ * @param array list of feedback messages
+ * @param array $codes list of feedback codes
+ * @param string $component the component id the messages are related to
+ */
+ return (array) apply_filters( 'bp_core_get_feedback_messages', $bp->{$component}->feedback->get_feedback_messages( $codes ), $codes, $component );
+}
+
+/**
* Render the 'template_notices' feedback message.
*
* The hook action 'template_notices' is used to call this function, it is not
* called directly.
*/
-function bp_core_render_message() {
+function bp_core_render_message( $class = '', $echo = true ) {
// Get BuddyPress
$bp = buddypress();
- if ( !empty( $bp->template_message ) ) :
- $type = ( 'success' === $bp->template_message_type ) ? 'updated' : 'error';
+ if ( ! empty( $_REQUEST ) ) {
+ $is_feedback = array_intersect_key( $_REQUEST, array( 'error' => true, 'success' => true ) );
+
+ if ( ! empty( $is_feedback ) ) {
+ $bp->template_message_type = key( $is_feedback );
+ $bp->template_message_code = $is_feedback[ $bp->template_message_type ];
+ }
+ }
+
+ if ( isset( $bp->template_message_code ) && 1 !== (int) $bp->template_message_code ) {
+ $codes = wp_parse_id_list( $bp->template_message_code );
+ $messages = bp_core_get_feedback_messages( $codes );
+
+ } elseif ( ! empty( $bp->template_message ) ) {
+ $messages = array( $bp->template_message );
+ }
+
+ if ( empty( $messages ) ) {
+ return;
+ }
+
+ // Set the type
+ $type = ( 'success' === $bp->template_message_type ) ? 'updated' : 'error';
+
+ if ( empty( $class ) ) {
+ $class = 'bp-template-notice';
+ }
+
+ /**
+ * Filters the classes of the 'template_notices'
+ *
+ * @since BuddyPress (2.4.0)
+ *
+ * @param array the classes for the template notices
+ */
+ $classes = apply_filters( 'bp_core_render_message_classes', array( $class, $type ) );
+
+ // Build the output
+ $output = '
';
+ foreach ( $messages as $message ) {
/**
* Filters the 'template_notices' feedback message content.
*
@@ -1322,24 +1437,25 @@ function bp_core_render_message() {
* @param string $type The type of message being displayed.
* Either 'updated' or 'error'.
*/
- $content = apply_filters( 'bp_core_render_message_content', $bp->template_message, $type ); ?>
-
-
+ $output .= apply_filters( 'bp_core_render_message_content', $message, $type );
+ }
-
+ $output .= '
';
-
-
- = $max_links ) {
+ bp_core_add_message_code( 2, 'error' );
return false;
}
}
diff --git src/bp-core/classes/class-bp-feedback.php src/bp-core/classes/class-bp-feedback.php
index e69de29..14ebd40 100644
--- src/bp-core/classes/class-bp-feedback.php
+++ src/bp-core/classes/class-bp-feedback.php
@@ -0,0 +1,67 @@
+ 1 ) {
+ $selected_messages = array_flip( $codes );
+
+ foreach ( (array) $this->errors as $code => $messages ) {
+ if ( isset( $selected_messages[ $code ] ) ) {
+ $selected_messages[ $code ] = $messages[0];
+ }
+ }
+ } else {
+ $selected_messages = array( $this->get_feedback_message( $codes[0] ) );
+ }
+
+ return $selected_messages;
+ }
+
+ /**
+ * Get all feedback messages
+ *
+ * @since BuddyPress (2.4.0)
+ *
+ * @return array all feedback messages
+ */
+ public function get_all_feedback_messages() {
+ return parent::get_error_messages();
+ }
+
+ /**
+ * Get a specific feedback message
+ *
+ * @since BuddyPress (2.4.0)
+ *
+ * @param int $code the requested code
+ * @return string the feedback message
+ */
+ public function get_feedback_message( $code = 0 ) {
+ return parent::get_error_message( $code );
+ }
+}
diff --git src/bp-members/bp-members-loader.php src/bp-members/bp-members-loader.php
index e02daaa..8cf64b2 100644
--- src/bp-members/bp-members-loader.php
+++ src/bp-members/bp-members-loader.php
@@ -104,7 +104,10 @@ class BP_Members_Component extends BP_Component {
'global_tables' => array(
'table_name_last_activity' => bp_core_get_table_prefix() . 'bp_activity',
'table_name_signups' => bp_core_get_table_prefix() . 'signups',
- )
+ ),
+ 'feedback_messages' => array(
+ array( 'code' => 15, 'message' => __( 'The account was successfully deleted.', 'buddypress' ), 'data' => '' ),
+ ),
);
parent::setup_globals( $args );
diff --git src/bp-settings/bp-settings-actions.php src/bp-settings/bp-settings-actions.php
index 6eb9bc4..aa57ae1 100644
--- src/bp-settings/bp-settings-actions.php
+++ src/bp-settings/bp-settings-actions.php
@@ -215,16 +215,16 @@ Regards,
// Email feedback
switch ( $email_error ) {
case 'invalid' :
- $feedback['email_invalid'] = __( 'That email address is invalid. Check the formatting and try again.', 'buddypress' );
+ $feedback['email_invalid'] = 2;
break;
case 'blocked' :
- $feedback['email_blocked'] = __( 'That email address is currently unavailable for use.', 'buddypress' );
+ $feedback['email_blocked'] = 3;
break;
case 'taken' :
- $feedback['email_taken'] = __( 'That email address is already taken.', 'buddypress' );
+ $feedback['email_taken'] = 4;
break;
case 'empty' :
- $feedback['email_empty'] = __( 'Email address cannot be empty.', 'buddypress' );
+ $feedback['email_empty'] = 5;
break;
case false :
// No change
@@ -234,16 +234,16 @@ Regards,
// Password feedback
switch ( $pass_error ) {
case 'invalid' :
- $feedback['pass_error'] = __( 'Your current password is invalid.', 'buddypress' );
+ $feedback['pass_error'] = 6;
break;
case 'mismatch' :
- $feedback['pass_mismatch'] = __( 'The new password fields did not match.', 'buddypress' );
+ $feedback['pass_mismatch'] = 7;
break;
case 'empty' :
- $feedback['pass_empty'] = __( 'One of the password fields was empty.', 'buddypress' );
+ $feedback['pass_empty'] = 8;
break;
case 'same' :
- $feedback['pass_same'] = __( 'The new password must be different from the current password.', 'buddypress' );
+ $feedback['pass_same'] = 9;
break;
case false :
// No change
@@ -252,20 +252,20 @@ Regards,
// No errors so show a simple success message
if ( ( ( false === $email_error ) || ( false == $pass_error ) ) && ( ( true === $pass_changed ) || ( true === $email_changed ) ) ) {
- $feedback[] = __( 'Your settings have been saved.', 'buddypress' );
+ $feedback[] = 10;
$feedback_type = 'success';
// Some kind of errors occurred
} elseif ( ( ( false === $email_error ) || ( false === $pass_error ) ) && ( ( false === $pass_changed ) || ( false === $email_changed ) ) ) {
if ( bp_is_my_profile() ) {
- $feedback['nochange'] = __( 'No changes were made to your account.', 'buddypress' );
+ $feedback['nochange'] = 11;
} else {
- $feedback['nochange'] = __( 'No changes were made to this account.', 'buddypress' );
+ $feedback['nochange'] = 12;
}
}
// Set the feedback
- bp_core_add_message( implode( "\n", $feedback ), $feedback_type );
+ bp_core_add_message_code( $feedback, $feedback_type );
/**
* Fires after the general settings have been saved, and before redirect.
@@ -312,9 +312,9 @@ function bp_settings_action_notifications() {
// Switch feedback for super admins
if ( bp_is_my_profile() ) {
- bp_core_add_message( __( 'Your notification settings have been saved.', 'buddypress' ), 'success' );
+ bp_core_add_message_code( 13, 'success' );
} else {
- bp_core_add_message( __( "This user's notification settings have been saved.", 'buddypress' ), 'success' );
+ bp_core_add_message_code( 14, 'success' );
}
/**
@@ -431,17 +431,21 @@ function bp_settings_action_delete_account() {
// Nonce check
check_admin_referer( 'delete-account' );
- // Get username now because it might be gone soon!
- $username = bp_get_displayed_user_fullname();
-
// delete the users account
if ( bp_core_delete_account( bp_displayed_user_id() ) ) {
// Add feedback after deleting a user
- bp_core_add_message( sprintf( __( '%s was successfully deleted.', 'buddypress' ), $username ), 'success' );
+ bp_core_add_message_code( 15, 'success' );
+
+ $redirect = bp_get_root_domain();
+
+ // Should always be the case!
+ if ( bp_is_active( 'members' ) ) {
+ $redirect = bp_get_members_directory_permalink();
+ }
// Redirect to the root domain
- bp_core_redirect( bp_get_root_domain() );
+ bp_core_redirect( $redirect );
}
}
add_action( 'bp_actions', 'bp_settings_action_delete_account' );
@@ -484,10 +488,10 @@ function bp_settings_verify_email_change(){
bp_delete_user_meta( bp_displayed_user_id(), 'pending_email_change' );
// Post a success message and redirect
- bp_core_add_message( __( 'You have successfully verified your new email address.', 'buddypress' ) );
+ bp_core_add_message_code( 15 );
} else {
// Unknown error
- bp_core_add_message( __( 'There was a problem verifying your new email address. Please try again.', 'buddypress' ), 'error' );
+ bp_core_add_message_code( 16, 'error' );
}
bp_core_redirect( $redirect_to );
@@ -495,8 +499,8 @@ function bp_settings_verify_email_change(){
// Email change is being dismissed
} elseif ( ! empty( $_GET['dismiss_email_change'] ) ) {
- bp_delete_user_meta( bp_displayed_user_id(), 'pending_email_change' );
- bp_core_add_message( __( 'You have successfully dismissed your pending email change.', 'buddypress' ) );
+ bp_delete_user_meta( bp_displayed_user_id(), 'pending_email_change' );
+ bp_core_add_message_code( 17 );
bp_core_redirect( $redirect_to );
die();
diff --git src/bp-settings/bp-settings-loader.php src/bp-settings/bp-settings-loader.php
index c310125..e6a07fd 100644
--- src/bp-settings/bp-settings-loader.php
+++ src/bp-settings/bp-settings-loader.php
@@ -58,8 +58,26 @@ class BP_Settings_Component extends BP_Component {
// All globals for settings component.
parent::setup_globals( array(
- 'slug' => BP_SETTINGS_SLUG,
- 'has_directory' => false,
+ 'slug' => BP_SETTINGS_SLUG,
+ 'has_directory' => false,
+ 'feedback_messages' => array(
+ array( 'code' => 2, 'message' => __( 'That email address is invalid. Check the formatting and try again.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 3, 'message' => __( 'That email address is currently unavailable for use.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 4, 'message' => __( 'That email address is already taken.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 5, 'message' => __( 'Email address cannot be empty.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 6, 'message' => __( 'Your current password is invalid.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 7, 'message' => __( 'The new password fields did not match.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 8, 'message' => __( 'One of the password fields was empty.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 9, 'message' => __( 'The new password must be different from the current password.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 10, 'message' => __( 'Your settings have been saved.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 11, 'message' => __( 'No changes were made to your account.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 12, 'message' => __( 'No changes were made to this account.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 13, 'message' => __( 'Your notification settings have been saved.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 14, 'message' => __( "This user's notification settings have been saved.", 'buddypress' ), 'data' => '' ),
+ array( 'code' => 15, 'message' => __( 'You have successfully verified your new email address.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 16, 'message' => __( 'There was a problem verifying your new email address. Please try again.', 'buddypress' ), 'data' => '' ),
+ array( 'code' => 17, 'message' => __( 'You have successfully dismissed your pending email change.', 'buddypress' ), 'data' => '' ),
+ ),
) );
}
diff --git src/bp-templates/bp-legacy/buddypress-functions.php src/bp-templates/bp-legacy/buddypress-functions.php
index 7ebf90e..0f4128d 100644
--- src/bp-templates/bp-legacy/buddypress-functions.php
+++ src/bp-templates/bp-legacy/buddypress-functions.php
@@ -920,8 +920,16 @@ function bp_legacy_theme_post_update() {
$activity_id = apply_filters( 'bp_activity_custom_update', false, $_POST['object'], $_POST['item_id'], $_POST['content'] );
}
- if ( empty( $activity_id ) )
- exit( '-1' . __( 'There was a problem posting your update. Please try again.', 'buddypress' ) . '
' );
+ if ( empty( $activity_id ) ) {
+ $feedback_message = '-1' . __( 'There was a problem posting your update. Please try again.', 'buddypress' ) . '
';
+
+ // Do we have a specific feedback message for the error ?
+ if ( ! empty( $bp->template_message_code ) ) {
+ $feedback_message = '-1' . bp_core_render_message( 'bp-ajax-message', false );
+ }
+
+ exit( $feedback_message );
+ }
$last_recorded = ! empty( $_POST['since'] ) ? date( 'Y-m-d H:i:s', intval( $_POST['since'] ) ) : 0;
if ( $last_recorded ) {
diff --git src/bp-templates/bp-legacy/buddypress/members/index.php src/bp-templates/bp-legacy/buddypress/members/index.php
index 1cefe5e..48becd5 100644
--- src/bp-templates/bp-legacy/buddypress/members/index.php
+++ src/bp-templates/bp-legacy/buddypress/members/index.php
@@ -41,6 +41,10 @@ do_action( 'bp_before_directory_members_page' ); ?>
do_action( 'bp_before_directory_members_tabs' ); ?>