0b65d7a2 by Marty Penner

Added ability to merge users from admin page (still bugs when deleting user)

1 parent 4618c883
......@@ -160,6 +160,10 @@ function _get_signups() {
return $users;
}
function merge_users() {
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR . 'merge_users.php');
}
class ProfileValidation extends Common\Validation {
public function prefix($val) {
update_user_meta($_POST['uid'], __FUNCTION__, $val);
......@@ -943,10 +947,169 @@ class Actions {
}
public static function wp_ajax_admin_search_merge_users() {
global $wpdb;
$direction = $_POST['which_user_search'];
$do_search = $_POST['do_search'];
$do_merge = $_POST['do_merge'];
// Make sure we have sane 'defaults'
if ($direction != 'from' && $direction != 'to') {
$direction = 'from';
}
if ($do_search != 'yes' && $do_search != 'no') {
$do_search = 'yes';
}
if ($do_merge != 'yes' && $do_merge != 'no') {
$do_merge = 'yes';
}
if ($do_search == 'yes') {
// Don't search for an empty string as it will return all results
if (empty($_POST['search_user_' . $direction])) {
die(json_encode(array(
'success' => 'false',
'msg' => 'You must enter a value to search for.'
)));
}
// Initialize
$html = '<div><ul class="user-list"><h4>Username</h4><h4>Member ID</h4><h4>Email</h4>';
$i = 0;
$query = "SELECT ID, user_login, user_email FROM $wpdb->users WHERE user_login LIKE '" . $wpdb->escape($_POST['search_user_' . $direction]) . "%'";
$user_list = $wpdb->get_results($query, ARRAY_A);
if (! empty($user_list)) {
foreach ($user_list as $user) {
// Get the member ID as well, but don't display it if it's the same as 'user_login'
$member_id = get_user_meta($user['ID'], 'member_id', TRUE);
if ($member_id == $user['user_login']) {
$member_id = '""';
}
$html .= <<<HTML
<li>
<input type="radio" name="merge_user_{$direction}" value="{$user['user_login']}" />
<label for="merge_user_{$direction}">{$user['user_login']}</label>
<label for="merge_user_{$direction}">{$member_id}</label>
<label for="merge_user_{$direction}">{$user['user_email']}</label>
</li>
HTML;
$i++;
}
} else {
die(json_encode(array(
'success' => 'false',
'msg' => 'No users found matching that criteria.'
)));
}
$html .= '</ul></div>';
$return = array(
'success' => 'true',
'direction' => $direction,
'html' => $html
);
} else if ($do_merge == 'yes') {
if (empty($_POST['merge_user_from'])) {
die(json_encode(array(
'success' => 'false',
'msg' => 'You must select a user to merge from.'
)));
}
if (empty($_POST['merge_user_to'])) {
die(json_encode(array(
'success' => 'false',
'msg' => 'You must select a user to merge to.'
)));
}
$unchanged_html = '';
$from_user = new User\Account($_POST['merge_user_from']);
$to_user = new User\Account($_POST['merge_user_to']);
$to_user_array = array();
$skipped_fields = array(
'user_login',
'user_email'
);
unset($from_user->data);
foreach ($skipped_fields as $field_name) {
$unchanged_html .= '<li>' . $field_name . ': ' . $from_user->$field_name . '</li>';
}
$unchanged_html = '<h6>Unchanged:</h6><ul>' . $unchanged_html . '</ul>';
foreach ($from_user as $key => $val) {
if (in_array($key, $skipped_fields)) {
continue;
}
// Special case: only transfer member_id if it's not blank
if ($key == 'member_id' && empty($val)) {
continue;
}
// Place all allowed fields into the new user array
$to_user_array[$key] = $val;
}
// Make sure we're updating the right user ID
$to_user_array['ID'] = $to_user->ID;
$to_user_array['id'] = $to_user->id;
// Perform the update
_update_user($to_user_array);
// Delete the old user if the checkbox is set
if (isset($_POST['delete_old_user']) && $_POST['delete_old_user'] == 'yes') {
@wp_delete_user($from_user->ID);
}
// Build a set of nested html lists that display the fields (goes 3 levels deep; bloody ugly, but works)
$html = '';
foreach ($to_user_array as $key => $val) {
$html_l2 = '';
if (is_array($val)) {
// Rinse and repeat
foreach ($val as $subk => $subv) {
$html_l3 = '';
if (is_array($subv)) {
// And yet again...
foreach ($subv as $k3 => $v3) {
$html_l3 .= "<li>$k3 = $v3</li>";
}
$html_l2 .= "<li><ul>$subk: [$html_l3]</ul></li>";
} else {
$html_l2 .= "<li>$subk = $subv</li>";
}
}
$html .= "<li><ul>$key: [$html_l2]</ul></li>";
} else {
$html .= "<li>$key: $val</li>";
}
}
$html = $unchanged_html . '<h6>Changed:</h6><ul>' . $html . '</ul>';
$return = array(
'success' => 'true',
'fields' => $html
);
} else {
$return = array(
'success' => 'false',
'msg' => 'Incorrect action. Please contact the webmaster.'
);
}
die(json_encode($return));
}
public static function admin_menu() {
add_menu_page('CBV Users','CBV Users',CAPABILITY,'cbv_users',__NAMESPACE__ . '\display_users',null,3 );
add_submenu_page('cbv_users','New User', 'New User',CAPABILITY,'cbv_users_create',__NAMESPACE__ . '\create_user');
add_submenu_page('cbv_users','New User', 'Awaiting Validation',CAPABILITY,'cbv_users_signups',__NAMESPACE__ . '\signups');
add_submenu_page('cbv_users', 'Merge Users', 'Merge Users', CAPABILITY, 'cbv_users_merge', __NAMESPACE__ . '\merge_users');
}
public static function admin_init() {
......
<?php
namespace Tz\WordPress\Tools\UserManager;
use Tz, Tz\Common;
use Tz\WordPress\CBV;
use Tz\WordPress\CBV\User;
use Tz\WordPress\UAM;
use Tz\WordPress\Tools;
use Tz\WordPress\Tools\Auth;
use Exception, StdClass;
use WP_User;
// Make sure some defaults are set because we use these values as is in the input boxes
if (! isset($_POST['search_user_from'])) {
$_POST['search_user_from'] = '';
}
if (! isset($_POST['search_user_to'])) {
$_POST['search_user_to'] = '';
}
?>
<style>
#post-body {
-moz-border-radius-bottomleft: 6px;
-moz-border-radius-bottomright: 6px;
-moz-border-radius-topright: 6px;
background: none repeat scroll 0 0 #FFFFFF;
border-width: 1px 1px 1px;
padding: 10px;
}
h4 {
float: left;
padding-right: 1em;
}
.merge-users {
float: left;
padding-right: 2em;
}
.merge-users label {
float: left;
font-weight: bold;
padding-right: 1em;
}
.merge-users input {
float: left;
}
.clear {
float: left;
clear: both;
}
.user-list, .user-list li {
float: left;
clear: both;
}
.changed {
float: left;
width: 250px;
margin-top: 5px;
border: 1px solid green;
clear: both;
display: none;
}
.changed h6 {
padding: 0px;
margin: 0px 0px 10px 0px;
font-size: 11px;
text-transform: uppercase;
}
.changed ul {
margin: 0;
padding: 0;
}
.changed ul li {
margin: 0px 0px 3px 0px;
padding: 0px;
font-size: 11px;
background: none;
}
</style>
<div class="wrap">
<div id="icon-users" class="icon32"><br /></div>
<h2>Merging CBV Users...</h2>
<div class="validation-errors" style="display:none; margin-top:10px;">
<div class="error-wrap">
<h6>OOPS...</h6>
<ul></ul>
</div>
</div>
<div id="post-body" style="padding:0px 10px 15px 10px;">
<form method="post" id="admin-search-merge-form">
<div class="merge-users">
<label for="search_user_from">Merge FROM User:</label>
<input class="clear" type="text" name="search_user_from" value="<?php echo $_POST['search_user_from'] ?>" />
<input type="button" name="btn_user_from" value="Search" />
<div id="user-list-from"></div>
</div>
<div class="merge-users">
<label for="search_user_to">Merge TO User:</label>
<input class="clear" type="text" name="search_user_to" value="<?php echo $_POST['search_user_to'] ?>" />
<input type="button" name="btn_user_to" value="Search" />
<div id="user-list-to"></div>
</div>
<div id="field-list" class="changed">
<h6>Success!</h6>
<ul></ul>
</div>
<div style="clear:both;"></div>
<div style="margin-top:10px;padding-top:5px; border-top:1px solid #e8e8e8;">
<input type="hidden" value="from" name="which_user_search" />
<input type="hidden" value="no" name="do_search" />
<input type="hidden" value="no" name="do_merge" />
<input type="checkbox" value="yes" name="delete_old_user" />
<label for="delete_old_user">Delete old user?</label>
<input type="button" value="Merge Users" name="btn_merge" />
</div>
</form>
</div>
</div>
<script src="<?php echo Tools\url('../UserManager.js', __FILE__);?>" type="text/javascript"></script>
<script type="text/javascript">
var $ = jQuery;
var $which_user_search = $('[name=which_user_search]');
var $do_search = $('[name=do_search]');
var $do_merge = $('[name=do_merge]');
var $form = $('#admin-search-merge-form');
var $error_container = $('.validation-errors');
var $field_list = $('#field-list');
$('[name=btn_user_from]').click(function() {
$which_user_search.val("from");
$do_search.val("yes");
$('[name=merge_user_from]').attr("checked", false);
$form.submit();
});
$('[name=btn_user_to]').click(function() {
$which_user_search.val("to");
$do_search.val("yes");
$('[name=merge_user_to]').attr("checked", false);
$form.submit();
});
$('[name=btn_merge]').click(function() {
$do_search.val("no");
$do_merge.val("yes");
$form.submit();
});
$(function() {
var options = {
url: ajaxurl,
dataType: 'json',
type: 'post',
data: ({ajax:"yes", action: 'admin_search_merge_users'}),
success: function(data) {
if (data.success == "false") {
$('h6', $error_container).html("OOPS...");
$('ul', $error_container).html(data.msg);
$field_list.hide();
$error_container.show();
} else {
$error_container.hide();
if (data.fields === undefined) {
$('#user-list-' + data.direction).html(data.html);
$field_list.hide();
} else {
$('#user-list-from').html("");
$('#user-list-to').html("");
$('ul', $field_list).html(data.fields);
$field_list.show();
}
}
}
};
$form.ajaxForm(options);
});
</script>