Multiple forums connecting to each other?

Started by razorblitz07, June 19, 2008, 10:17:37 PM

Previous topic - Next topic

razorblitz07

This is just an idea coming off of this thread I made (needs a response to it): http://www.simplemachines.org/community/index.php?topic=244868.0

Umm, my current forums both use different databases.  I am wondering if there was a way I can make it so that users can create only one account on both and any additional forums I make so that they don't have to keep on registering over and over again....they can just login once and go to whichever forum they want.  Is that possible?  I could change the prefixes of my other forums to smf1_, smf2_, etc, etc. and put it all into one database....would that work?  If so, how would I make it all work? 

[SiNaN]

Maybe this works:

Install 2 smf with different db prefixes into one database. Suppose that the first SMF's db prefix is smf_ and the second SMF's is smf1_.

In the all the files in the Sources directory of the second SMF, find:

{$db_prefix}members
{$db_prefix}pm_recipients
{$db_prefix}personal_messages

Change {$db_prefix} as smf_.

Also change;
{$db_prefix}attachments - To share the attachments and avatars.
{$db_prefix}themes - To share the themes.
{$db_prefix}ban_groups - To share the bans.
{$db_prefix}ban_items - To share the bans.
{$db_prefix}log_banned - To share the bans.
{$db_prefix}log_online - To share the online users.

But do not forget to set the cookie name same for both of the forums. Also change the avatar and attachment directory if you share them.

I didn't try it. But seems working in the theory.




Former SMF Core Developer | My Mods | SimplePortal

razorblitz07

Thanks man!  Most helpful reply I've gotten.  Which cookie should I use to set on all the other forums?  forum A or B (forums i want to merge together) or forum C (the forum I want all the forums to be merged into).

[SiNaN]

Doesn't matter, just be sure that are they are all the same.
Former SMF Core Developer | My Mods | SimplePortal

razorblitz07

Cool man!  You're my hero!!  I'll try it out as soon as I finish importing both my database files into my new database.  I'll post up if I'm confused with anything but your instructions are already simple enough.

razorblitz07

Just wondering, what would I do if I was trying to merge 3 forums together instead of just 2?  I ask this because my attempts to take your instructions on merging 2 forums together failed....I'm trying to merge my newly created 3rd forum now so that my destination forum will have all 3 forums merged together.

Another thing, when I log into one forum, it redirects me into the other....however, the forum with the biggest database...when I try to log into it, no redirection occurs.

razorblitz07


epicurean

when i search for {$db_prefix}members (for example) i cant find results... but when i try {db_prefix}members i do find many results... i guess you made an error in your post... or am i wrong?

Kays

That was written for SMF 1 where {$db_prefix} was used. It looks like the same changes should work for SMF 2 by substituting {db_prefix} with the prefix for the first forum.

If at first you don't succeed, use a bigger hammer. If that fails, read the manual.
My Mods

ciscko

#9
Quote from: [SiNaN] on June 20, 2008, 02:18:21 AM
Maybe this works:

Install 2 smf with different db prefixes into one database. Suppose that the first SMF's db prefix is smf_ and the second SMF's is smf1_.

In the all the files in the Sources directory of the second SMF, find:

{$db_prefix}members
{$db_prefix}pm_recipients
{$db_prefix}personal_messages

Change {$db_prefix} as smf_.

Also change;
{$db_prefix}attachments - To share the attachments and avatars.

{$db_prefix}themes - To share the themes.
{$db_prefix}ban_groups - To share the bans.
{$db_prefix}ban_items - To share the bans.
{$db_prefix}log_banned - To share the bans.
{$db_prefix}log_online - To share the online users.

But do not forget to set the cookie name same for both of the forums. Also change the avatar and attachment directory if you share them.

I didn't try it. But seems working in the theory.


hi


I can not give someone ready edited files?

For one night I lost it and not working

thanks

////edit///

example- filees
SMF/Source/ManageMembers

what changes are made to this script


<?php
/**********************************************************************************
* ManageMembers.php                                                               *
***********************************************************************************
* SMF: Simple Machines Forum                                                      *
* Open-Source Project Inspired by Zef Hemel ([email protected])                    *
* =============================================================================== *
* Software Version:           SMF 1.1.6                                           *
* Software by:                Simple Machines (http://www.simplemachines.org)     *
* Copyright 2006 by:          Simple Machines LLC (http://www.simplemachines.org) *
*           2001-2006 by:     Lewis Media (http://www.lewismedia.com)             *
* Support, News, Updates at:  http://www.simplemachines.org                       *
***********************************************************************************
* This program is free software; you may redistribute it and/or modify it under   *
* the terms of the provided license as published by Simple Machines LLC.          *
*                                                                                 *
* This program is distributed in the hope that it is and will be useful, but      *
* WITHOUT ANY WARRANTIES; without even any implied warranty of MERCHANTABILITY    *
* or FITNESS FOR A PARTICULAR PURPOSE.                                            *
*                                                                                 *
* See the "license.txt" file for details of the Simple Machines license.          *
* The latest version can always be found at http://www.simplemachines.org.        *
**********************************************************************************/
if (!defined('SMF'))
die('Hacking attempt...');

/* Show a list of members or a selection of members.

void ViewMembers()
- the main entrance point for the Manage Members screen.
- called by ?action=viewmembers.
- requires the moderate_forum permission.
- loads the ManageMembers template and ManageMembers language file.
- calls a function based on the given sub-action.

void ViewMemberlist()
- shows a list of members.
- called by ?action=viewmembers;sa=all or ?action=viewmembers;sa=query.
- requires the moderate_forum permission.
- uses the view_members sub template of the ManageMembers template.
- allows sorting on several columns.
- handles deletion of selected members.
- handles the search query sent by ?action=viewmembers;sa=search.

void SearchMembers()
- search the member list, using one or more criteria.
- called by ?action=viewmembers;sa=search.
- requires the moderate_forum permission.
- uses the search_members sub template of the ManageMembers template.
- form is submitted to action=viewmembers;sa=query.

void MembersAwaitingActivation()
- show a list of members awaiting approval or activation.
- called by ?action=viewmembers;sa=browse;type=approve or
 ?action=viewmembers;sa=browse;type=activate.
- requires the moderate_forum permission.
- uses the admin_browse sub template of the ManageMembers template.
- allows instant approval or activation of (a selection of) members.
- list can be sorted on different columns.
- form submits to ?action=viewmembers;sa=approve.

void AdminApprove()
- handles the approval, rejection, activation or deletion of members.
- called by ?action=viewmembers;sa=approve.
- requires the moderate_forum permission.
- redirects to ?action=viewmembers;sa=browse with the same parameters
 as the calling page.

int jeffsdatediff(int old)
- nifty function to calculate the number of days ago a given date was.
- requires a unix timestamp as input, returns an integer.
- in honour of Jeff Lewis, the original creator of...this function.
- the returned number of days is based on the forum time.
*/

function ViewMembers()
{
global $txt, $scripturl, $context, $modSettings, $db_prefix;

$subActions = array(
'all' => array('ViewMemberlist', 'moderate_forum'),
'approve' => array('AdminApprove', 'moderate_forum'),
'browse' => array('MembersAwaitingActivation', 'moderate_forum'),
'search' => array('SearchMembers', 'moderate_forum'),
'query' => array('ViewMemberlist', 'moderate_forum'),
);

// Default to sub action 'index' or 'settings' depending on permissions.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'all';

// We know the sub action, now we know what you're allowed to do.
isAllowedTo($subActions[$_REQUEST['sa']][1]);

// Administration bar, I choose you!
adminIndex('view_members');

// Load the essentials.
loadLanguage('ManageMembers');
loadTemplate('ManageMembers');

// Get counts on every type of activation - for sections and filtering alike.
$request = db_query("
SELECT COUNT(*) AS totalMembers, is_activated
FROM
{$db_prefix}members
WHERE is_activated != 1
GROUP BY is_activated"
, __FILE__, __LINE__);
$context['activation_numbers'] = array();
$context['awaiting_activation'] = 0;
$context['awaiting_approval'] = 0;
while ($row = mysql_fetch_assoc($request))
$context['activation_numbers'][$row['is_activated']] = $row['totalMembers'];
mysql_free_result($request);

foreach ($context['activation_numbers'] as $activation_type => $total_members)
{
if (in_array($activation_type, array(0, 2)))
$context['awaiting_activation'] += $total_members;
elseif (in_array($activation_type, array(3, 4, 5)))
$context['awaiting_approval'] += $total_members;
}

// For the page header... do we show activation?
$context['show_activate'] = (!empty($modSettings['registration_method']) && $modSettings['registration_method'] == 1) || !empty($context['awaiting_activation']);

// What about approval?
$context['show_approve'] = (!empty($modSettings['registration_method']) && $modSettings['registration_method'] == 2) || !empty($context['awaiting_approval']);

// Setup the admin tabs.
$context['admin_tabs'] = array(
'title' => $txt[9],
'help' => 'view_members',
'description' => $txt[11],
'tabs' => array(),
);
if (allowedTo('moderate_forum'))
{
$context['admin_tabs']['tabs'] = array(
'viewmembers' => array(
'title' => $txt[303],
'description' => $txt[11],
'href' => $scripturl . '?action=viewmembers;sa=all',
'is_selected' => $_REQUEST['sa'] == 'all',
),
'search' => array(
'title' => $txt['mlist_search'],
'description' => $txt[11],
'href' => $scripturl . '?action=viewmembers;sa=search',
'is_selected' => $_REQUEST['sa'] == 'search' || $_REQUEST['sa'] == 'query',
),
'approve' => array(
'title' => sprintf($txt['admin_browse_awaiting_approval'], $context['awaiting_approval']),
'description' => $txt['admin_browse_approve_desc'],
'href' => $scripturl . '?action=viewmembers;sa=browse;type=approve',
'is_selected' => false,
),
'activate' => array(
'title' => sprintf($txt['admin_browse_awaiting_activate'], $context['awaiting_activation']),
'description' => $txt['admin_browse_activate_desc'],
'href' => $scripturl . '?action=viewmembers;sa=browse;type=activate',
'is_selected' => false,
'is_last' => true,
),
);
}

// Sort out the tabs for the ones which may not exist!
if (!$context['show_activate'])
{
$context['admin_tabs']['tabs']['approve']['is_last'] = true;
unset($context['admin_tabs']['tabs']['activate']);
}
if (!$context['show_approve'])
{
if (!$context['show_activate'])
$context['admin_tabs']['tabs']['search']['is_last'] = true;
unset($context['admin_tabs']['tabs']['approve']);
}

$subActions[$_REQUEST['sa']][0]();
}

// View all members.
function ViewMemberlist()
{
global $txt, $scripturl, $db_prefix, $context, $modSettings, $sourcedir;

// Set the current sub action.
$context['sub_action'] = $_REQUEST['sa'];

// Are we performing a delete?
if (isset($_POST['delete_members']) && !empty($_POST['delete']) && allowedTo('profile_remove_any'))
{
checkSession();

// Clean the input.
foreach ($_POST['delete'] as $key => $value)
$_POST['delete'][$key] = (int) $value;

// Delete all the selected members.
require_once($sourcedir . '/Subs-Members.php');
deleteMembers($_POST['delete']);
}

// Check input after a member search has been submitted.
if ($context['sub_action'] == 'query' && empty($_REQUEST['params']))
{
// Retrieving the membergroups and postgroups.
$context['membergroups'] = array(
array(
'id' => 0,
'name' => $txt['membergroups_members'],
'can_be_additional' => false
)
);
$context['postgroups'] = array();

$request = db_query("
SELECT ID_GROUP, groupName, minPosts
FROM
{$db_prefix}membergroups
WHERE ID_GROUP != 3
ORDER BY minPosts, IF(ID_GROUP < 4, ID_GROUP, 4), groupName"
, __FILE__, __LINE__);
while ($row = mysql_fetch_assoc($request))
{
if ($row['minPosts'] == -1)
$context['membergroups'][] = array(
'id' => $row['ID_GROUP'],
'name' => $row['groupName'],
'can_be_additional' => true
);
else
$context['postgroups'][] = array(
'id' => $row['ID_GROUP'],
'name' => $row['groupName']
);
}
mysql_free_result($request);

// Some data about the form fields and how they are linked to the database.
$params = array(
'mem_id' => array(
'db_fields' => array('ID_MEMBER'),
'type' => 'int',
'range' => true
),
'age' => array(
'db_fields' => array('birthdate'),
'type' => 'age',
'range' => true
),
'posts' => array(
'db_fields' => array('posts'),
'type' => 'int',
'range' => true
),
'reg_date' => array(
'db_fields' => array('dateRegistered'),
'type' => 'date',
'range' => true
),
'last_online' => array(
'db_fields' => array('lastLogin'),
'type' => 'date',
'range' => true
),
'gender' => array(
'db_fields' => array('gender'),
'type' => 'checkbox',
'values' => array('0', '1', '2'),
),
'activated' => array(
'db_fields' => array('IF(is_activated IN (1, 11), 1, 0)'),
'type' => 'checkbox',
'values' => array('0', '1'),
),
'membername' => array(
'db_fields' => array('memberName', 'realName'),
'type' => 'string'
),
'email' => array(
'db_fields' => array('emailAddress'),
'type' => 'string'
),
'website' => array(
'db_fields' => array('websiteTitle', 'websiteUrl'),
'type' => 'string'
),
'location' => array(
'db_fields' => array('location'),
'type' => 'string'
),
'ip' => array(
'db_fields' => array('memberIP'),
'type' => 'string'
),
'messenger' => array(
'db_fields' => array('ICQ', 'AIM', 'YIM', 'MSN'),
'type' => 'string'
)
);
$range_trans = array(
'--' => '<',
'-' => '<=',
'=' => '=',
'+' => '>=',
'++' => '>'
);

// !!! Validate a little more.

// Loop through every field of the form.
$query_parts = array();
foreach ($params as $param_name => $param_info)
{
// Not filled in?
if (!isset($_POST[$param_name]) || $_POST[$param_name] == '')
continue;

// Make sure numeric values are really numeric.
if (in_array($param_info['type'], array('int', 'age')))
$_POST[$param_name] = (int) $_POST[$param_name];
// Date values have to match the specified format.
elseif ($param_info['type'] == 'date')
{
// Check if this date format is valid.
if (preg_match('/^\d{4}-\d{1,2}-\d{1,2}$/', $_POST[$param_name]) == 0)
continue;

$_POST[$param_name] = strtotime($_POST[$param_name]);
}

// Those values that are in some kind of range (<, <=, =, >=, >).
if (!empty($param_info['range']))
{
// Default to '=', just in case...
if (empty($range_trans[$_POST['types'][$param_name]]))
$_POST['types'][$param_name] = '=';

// Handle special case 'age'.
if ($param_info['type'] == 'age')
{
// All people that were born between $lowerlimit and $upperlimit are currently the specified age.
$datearray = getdate(forum_time());
$upperlimit = sprintf('%04d-%02d-%02d', $datearray['year'] - $_POST[$param_name], $datearray['mon'], $datearray['mday']);
$lowerlimit = sprintf('%04d-%02d-%02d', $datearray['year'] - $_POST[$param_name] - 1, $datearray['mon'], $datearray['mday']);
if (in_array($_POST['types'][$param_name], array('-', '--', '=')))
$query_parts[] = "{$param_info['db_fields'][0]} > '" . ($_POST['types'][$param_name] == '--' ? $upperlimit : $lowerlimit) . "'";
if (in_array($_POST['types'][$param_name], array('+', '++', '=')))
{
$query_parts[] = "{$param_info['db_fields'][0]} <= '" . ($_POST['types'][$param_name] == '++' ? $lowerlimit : $upperlimit) . "'";

// Make sure that members that didn't set their birth year are not queried.
$query_parts[] = "{$param_info['db_fields'][0]} > '0000-12-31'";
}
}
elseif ($param_info['type'] == 'date' && $_POST['types'][$param_name] == '=')
$query_parts[] = $param_info['db_fields'][0] . ' > ' . $_POST[$param_name] . ' AND ' . $param_info['db_fields'][0] . ' < ' . ($_POST[$param_name] + 86400);
else
$query_parts[] = $param_info['db_fields'][0] . ' ' . $range_trans[$_POST['types'][$param_name]] . ' ' . $_POST[$param_name];
}
// Checkboxes.
elseif ($param_info['type'] == 'checkbox')
{
// Each checkbox or no checkbox at all is checked -> ignore.
if (!is_array($_POST[$param_name]) || count($_POST[$param_name]) == 0 || count($_POST[$param_name]) == count($param_info['values']))
continue;

$query_parts[] = "{$param_info['db_fields'][0]} IN ('" . implode("', '", $_POST[$param_name]) . "')";
}
else
{
// Replace the wildcard characters ('*' and '?') into MySQL ones.
$_POST[$param_name] = strtolower(addslashes(strtr($_POST[$param_name], array('%' => '\%', '_' => '\_', '*' => '%', '?' => '_'))));

$query_parts[] = '(' . implode(" LIKE '%{$_POST[$param_name]}%' OR ", $param_info['db_fields']) . " LIKE '%{$_POST[$param_name]}%')";
}
}

// Set up the membergroup query part.
$mg_query_parts = array();

// Primary membergroups, but only if at least was was not selected.
if (!empty($_POST['membergroups'][1]) && count($context['membergroups']) != count($_POST['membergroups'][1]))
$mg_query_parts[] = "ID_GROUP IN (" . implode(", ", $_POST['membergroups'][1]) . ")";

// Additional membergroups (these are only relevant if not all primary groups where selected!).
if (!empty($_POST['membergroups'][2]) && (empty($_POST['membergroups'][1]) || count($context['membergroups']) != count($_POST['membergroups'][1])))
foreach ($_POST['membergroups'][2] as $mg)
$mg_query_parts[] = "FIND_IN_SET(" . (int) $mg . ", additionalGroups)";

// Combine the one or two membergroup parts into one query part linked with an OR.
if (!empty($mg_query_parts))
$query_parts[] = '(' . implode(' OR ', $mg_query_parts) . ')';

// Get all selected post count related membergroups.
if (!empty($_POST['postgroups']) && count($_POST['postgroups']) != count($context['postgroups']))
$query_parts[] = "ID_POST_GROUP IN (" . implode(", ", $_POST['postgroups']) . ")";

// Construct the where part of the query.
$where = empty($query_parts) ? '1' : implode('
AND '
, $query_parts);
}
// If the query information was already packed in the URL, decode it.
// !!! Change this.
elseif ($context['sub_action'] == 'query')
$where = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));

// Construct the additional URL part with the query info in it.
$context['params_url'] = $context['sub_action'] == 'query' ? ';sa=query;params=' . base64_encode($where) : '';

// Get the title and sub template ready..
$context['page_title'] = $txt[9];
$context['sub_template'] = 'view_members';

// Determine whether to show the 'delete members' checkboxes.
$context['can_delete_members'] = allowedTo('profile_remove_any');

// All the columns they have to pick from...
$context['columns'] = array(
'ID_MEMBER' => array('label' => $txt['member_id']),
'memberName' => array('label' => $txt[35]),
'realName' => array('label' => $txt['display_name']),
'emailAddress' => array('label' => $txt['email_address']),
'memberIP' => array('label' => $txt['ip_address']),
'lastLogin' => array('label' => $txt['viewmembers_online']),
'posts' => array('label' => $txt[26])
);

// Default sort column to 'memberName' if the current one is unknown or not set.
if (!isset($_REQUEST['sort']) || !isset($context['columns'][$_REQUEST['sort']]))
$_REQUEST['sort'] = 'memberName';

// Provide extra information about each column - the link, whether it's selected, etc.
foreach ($context['columns'] as $col => $dummy)
{
$context['columns'][$col]['href'] = $scripturl . '?action=viewmembers' . $context['params_url'] . ';sort=' . $col . ';start=0';
if (!isset($_REQUEST['desc']) && $col == $_REQUEST['sort'])
$context['columns'][$col]['href'] .= ';desc';

$context['columns'][$col]['link'] = '<a href="' . $context['columns'][$col]['href'] . '">' . $context['columns'][$col]['label'] . '</a>';
$context['columns'][$col]['selected'] = $_REQUEST['sort'] == $col;
}

$context['sort_by'] = $_REQUEST['sort'];
$context['sort_direction'] = !isset($_REQUEST['desc']) ? 'down' : 'up';

// Calculate the number of results.
if (empty($where) or $where == '1')
$num_members = $modSettings['totalMembers'];
else
{
$request = db_query("
SELECT COUNT(*)
FROM
{$db_prefix}members
WHERE
$where", __FILE__, __LINE__);
list ($num_members) = mysql_fetch_row($request);
mysql_free_result($request);
}

// Construct the page links.
$context['page_index'] = constructPageIndex($scripturl . '?action=viewmembers' . $context['params_url'] . ';sort=' . $_REQUEST['sort'] . (isset($_REQUEST['desc']) ? ';desc' : ''), $_REQUEST['start'], $num_members, $modSettings['defaultMaxMembers']);
$context['start'] = (int) $_REQUEST['start'];

$request = db_query("
SELECT ID_MEMBER, memberName, realName, emailAddress, memberIP, lastLogin, posts, is_activated
FROM
{$db_prefix}members" . ($context['sub_action'] == 'query' && !empty($where) ? "
WHERE
$where" : '') . "
ORDER BY
$_REQUEST[sort]" . (!isset($_REQUEST['desc']) ? '' : ' DESC') . "
LIMIT
$context[start], $modSettings[defaultMaxMembers]", __FILE__, __LINE__);
while ($row = mysql_fetch_assoc($request))
{
// Calculate number of days since last online.
if (empty($row['lastLogin']))
$difference = $txt['never'];
else
{
// Today or some time ago?
$difference = jeffsdatediff($row['lastLogin']);
if (empty($difference))
$difference = $txt['viewmembers_today'];
elseif ($difference == 1)
$difference .= ' ' . $txt['viewmembers_day_ago'];
else
$difference .= ' ' . $txt['viewmembers_days_ago'];
}

// Show it in italics if they're not activated...
if ($row['is_activated'] % 10 != 1)
$difference = '<i title="' . $txt['not_activated'] . '">' . $difference . '</i>';

$context['members'][] = array(
'id' => $row['ID_MEMBER'],
'username' => $row['memberName'],
'name' => $row['realName'],
'email' => $row['emailAddress'],
'ip' => $row['memberIP'],
'last_active' => $difference,
'is_activated' => $row['is_activated'] % 10 == 1,
'posts' => $row['posts'],
'href' => $scripturl . '?action=profile;u=' . $row['ID_MEMBER'],
'link' => '<a href="' . $scripturl . '?action=profile;u=' . $row['ID_MEMBER'] . '">' . $row['realName'] . '</a>'
);
}
mysql_free_result($request);
}

// Search the member list, using one or more criteria.
function SearchMembers()
{
global $db_prefix, $context, $txt;

// Get a list of all the membergroups and postgroups that can be selected.
$context['membergroups'] = array(
array(
'id' => 0,
'name' => $txt['membergroups_members'],
'can_be_additional' => false
)
);
$context['postgroups'] = array();

$request = db_query("
SELECT ID_GROUP, groupName, minPosts
FROM
{$db_prefix}membergroups
WHERE ID_GROUP != 3
ORDER BY minPosts, IF(ID_GROUP < 4, ID_GROUP, 4), groupName"
, __FILE__, __LINE__);
while ($row = mysql_fetch_assoc($request))
{
if ($row['minPosts'] == -1)
$context['membergroups'][] = array(
'id' => $row['ID_GROUP'],
'name' => $row['groupName'],
'can_be_additional' => true
);
else
$context['postgroups'][] = array(
'id' => $row['ID_GROUP'],
'name' => $row['groupName']
);
}
mysql_free_result($request);

$context['page_title'] = $txt[9];
$context['sub_template'] = 'search_members';
}

// List all members who are awaiting approval / activation
function MembersAwaitingActivation()
{
global $txt, $context, $db_prefix, $scripturl, $modSettings;

// Not a lot here!
$context['page_title'] = $txt[9];
$context['sub_template'] = 'admin_browse';
$context['browse_type'] = isset($_REQUEST['type']) ? $_REQUEST['type'] : (!empty($modSettings['registration_method']) && $modSettings['registration_method'] == 1 ? 'activate' : 'approve');
if (isset($context['admin_tabs']['tabs'][$context['browse_type']]))
$context['admin_tabs']['tabs'][$context['browse_type']]['is_selected'] = true;

// Allowed filters are those we can have, in theory.
$context['allowed_filters'] = $context['browse_type'] == 'approve' ? array(3, 4, 5) : array(0, 2);
$context['current_filter'] = isset($_REQUEST['filter']) && in_array($_REQUEST['filter'], $context['allowed_filters']) && !empty($context['activation_numbers'][$_REQUEST['filter']]) ? (int) $_REQUEST['filter'] : -1;

// Sort out the different sub areas that we can actually filter by.
$context['available_filters'] = array();
foreach ($context['activation_numbers'] as $type => $amount)
{
// We have some of these...
if (in_array($type, $context['allowed_filters']) && $amount > 0)
$context['available_filters'][] = array(
'type' => $type,
'amount' => $amount,
'desc' => isset($txt['admin_browse_filter_type_' . $type]) ? $txt['admin_browse_filter_type_' . $type] : '?',
'selected' => $type == $context['current_filter']
);
}

// If the filter was not sent, set it to whatever has people in it!
if ($context['current_filter'] == -1 && !empty($context['available_filters'][0]['amount']))
$context['current_filter'] = $context['available_filters'][0]['type'];

// This little variable is used to determine if we should flag where we are looking.
if (($context['current_filter'] != 0 && $context['current_filter'] != 3) && count($context['available_filters']) == 1)
$context['show_filter'] = true;

// The columns that can be sorted.
$context['columns'] = array(
'ID_MEMBER' => array('label' => $txt['admin_browse_id']),
'memberName' => array('label' => $txt['admin_browse_username']),
'emailAddress' => array('label' => $txt['admin_browse_email']),
'memberIP' => array('label' => $txt['admin_browse_ip']),
'dateRegistered' => array('label' => $txt['admin_browse_registered']),
);

// Default sort column to 'dateRegistered' if the current one is unknown or not set.
if (!isset($_REQUEST['sort']) || !isset($context['columns'][$_REQUEST['sort']]))
$_REQUEST['sort'] = 'dateRegistered';

// Provide extra information about each column - the link, whether it's selected, etc.
foreach ($context['columns'] as $col => $dummy)
{
$context['columns'][$col]['href'] = $scripturl . '?action=viewmembers;sa=browse;type=' . $context['browse_type'] . ';sort=' . $col . ';start=0';
if (!isset($_REQUEST['desc']) && $col == $_REQUEST['sort'])
$context['columns'][$col]['href'] .= ';desc';

$context['columns'][$col]['link'] = '<a href="' . $context['columns'][$col]['href'] . '">' . $context['columns'][$col]['label'] . '</a>';
$context['columns'][$col]['selected'] = $_REQUEST['sort'] == $col;
}

$context['sort_by'] = $_REQUEST['sort'];
$context['sort_direction'] = !isset($_REQUEST['desc']) ? 'down' : 'up';

// Calculate the number of results.
$request = db_query("
SELECT COUNT(*)
FROM
{$db_prefix}members
WHERE is_activated =
$context[current_filter]", __FILE__, __LINE__);
list ($context['num_members']) = mysql_fetch_row($request);
mysql_free_result($request);

// Construct the page links.
$context['page_index'] = constructPageIndex($scripturl . '?action=viewmembers;sa=browse;type=' . $context['browse_type'] . ';sort=' . $_REQUEST['sort'] . (isset($_REQUEST['desc']) ? ';desc' : ''), $_REQUEST['start'], $context['num_members'], $modSettings['defaultMaxMembers']);
$context['start'] = (int) $_REQUEST['start'];

// Determine which actions we should allow on this page.
if ($context['browse_type'] == 'approve')
{
// If we are approving deleted accounts we have a slightly different list... actually a mirror ;)
if ($context['current_filter'] == 4)
$context['allowed_actions'] = array(
'reject' => $txt['admin_browse_w_approve_deletion'],
'ok' => $txt['admin_browse_w_reject'],
);
else
$context['allowed_actions'] = array(
'ok' => $txt['admin_browse_w_approve'],
'okemail' => $txt['admin_browse_w_approve'] . ' ' . $txt['admin_browse_w_email'],
'require_activation' => $txt['admin_browse_w_approve_require_activate'],
'reject' => $txt['admin_browse_w_reject'],
'rejectemail' => $txt['admin_browse_w_reject'] . ' ' . $txt['admin_browse_w_email'],
);
}
elseif ($context['browse_type'] == 'activate')
$context['allowed_actions'] = array(
'ok' => $txt['admin_browse_w_activate'],
'okemail' => $txt['admin_browse_w_activate'] . ' ' . $txt['admin_browse_w_email'],
'delete' => $txt['admin_browse_w_delete'],
'deleteemail' => $txt['admin_browse_w_delete'] . ' ' . $txt['admin_browse_w_email'],
'remind' => $txt['admin_browse_w_remind'] . ' ' . $txt['admin_browse_w_email'],
);

$request = db_query("
SELECT ID_MEMBER, memberName, emailAddress, memberIP, dateRegistered
FROM
{$db_prefix}members
WHERE is_activated =
$context[current_filter]
ORDER BY
$_REQUEST[sort]" . (!isset($_REQUEST['desc']) ? '' : ' DESC') . "
LIMIT
$context[start], $modSettings[defaultMaxMembers]", __FILE__, __LINE__);

while ($row = mysql_fetch_assoc($request))
$context['members'][] = array(
'id' => $row['ID_MEMBER'],
'username' => $row['memberName'],
'href' => $scripturl . '?action=profile;u=' . $row['ID_MEMBER'],
'link' => '<a href="' . $scripturl . '?action=profile;u=' . $row['ID_MEMBER'] . '">' . $row['memberName'] . '</a>',
'email' => $row['emailAddress'],
'ip' => $row['memberIP'],
'dateRegistered' => timeformat($row['dateRegistered']),
);
mysql_free_result($request);
}

// Do the approve/activate/delete stuff
function AdminApprove()
{
global $txt, $context, $db_prefix, $scripturl, $modSettings, $sourcedir, $language, $user_info;

require_once($sourcedir . '/Subs-Post.php');

// We also need to the login languages here - for emails.
loadLanguage('Login');

// Sort out where we are going...
$browse_type = isset($_REQUEST['type']) ? $_REQUEST['type'] : (!empty($modSettings['registration_method']) && $modSettings['registration_method'] == 1 ? 'activate' : 'approve');
$current_filter = (int) $_REQUEST['orig_filter'];

// If we are applying a filter do just that - then redirect.
if (isset($_REQUEST['filter']) && $_REQUEST['filter'] != $_REQUEST['orig_filter'])
redirectexit('action=viewmembers;sa=browse;type=' . $_REQUEST['type'] . ';sort=' . $_REQUEST['sort'] . ';filter=' . $_REQUEST['filter'] . ';start=' . $_REQUEST['start']);

// Nothing to do?
if (!isset($_POST['todoAction']) && !isset($_POST['time_passed']))
redirectexit('action=viewmembers;sa=browse;type=' . $_REQUEST['type'] . ';sort=' . $_REQUEST['sort'] . ';filter=' . $current_filter . ';start=' . $_REQUEST['start']);

// Are we dealing with members who have been waiting for > set amount of time?
if (isset($_POST['time_passed']))
{
$timeBefore = time() - 86400 * (int) $_POST['time_passed'];
$condition = "
AND dateRegistered <
$timeBefore";
}
// Coming from checkboxes - validate the members passed through to us.
else
{
$members = array();
foreach ($_POST['todoAction'] as $id)
$members[] = (int) $id;
$condition = "
AND ID_MEMBER IN ("
. implode(', ', $members) . ")";
}

// Get information on each of the members, things that are important to us, like email address...
$request = db_query("
SELECT ID_MEMBER, memberName, realName, emailAddress, validation_code, lngfile
FROM
{$db_prefix}members
WHERE is_activated =
$current_filter$condition
ORDER BY lngfile"
, __FILE__, __LINE__);

$member_count = mysql_num_rows($request);

// If no results then just return!
if ($member_count == 0)
redirectexit('action=viewmembers;sa=browse;type=' . $_REQUEST['type'] . ';sort=' . $_REQUEST['sort'] . ';filter=' . $current_filter . ';start=' . $_REQUEST['start']);

$member_info = array();
$members = array();
// Fill the info array.
while ($row = mysql_fetch_assoc($request))
{
$members[] = $row['ID_MEMBER'];
$member_info[] = array(
'id' => $row['ID_MEMBER'],
'username' => $row['memberName'],
'name' => $row['realName'],
'email' => $row['emailAddress'],
'language' => empty($row['lngfile']) || empty($modSettings['userLanguage']) ? $language : $row['lngfile'],
'code' => $row['validation_code']
);
}
mysql_free_result($request);

// Are we activating or approving the members?
if ($_POST['todo'] == 'ok' || $_POST['todo'] == 'okemail')
{
// Approve/activate this member.
db_query("
UPDATE
{$db_prefix}members
SET validation_code = '', is_activated = 1
WHERE is_activated =
$current_filter$condition
LIMIT
$member_count", __FILE__, __LINE__);

// Do we have to let the integration code know about the activations?
if (isset($modSettings['integrate_activate']) && function_exists($modSettings['integrate_activate']))
{
foreach ($member_info as $member)
call_user_func($modSettings['integrate_activate'], $member['username']);
}

// Check for email.
if ($_POST['todo'] == 'okemail')
{
foreach ($member_info as $member)
{
if (empty($current_language) || $current_language != $member['language'])
{
$current_language = loadLanguage('index', $member['language'], false);
loadLanguage('ManageMembers', $member['language'], false);
}

sendmail($member['email'], $txt['register_subject'],
"$txt[hello_guest] $member[name]!\n\n" .
"$txt[admin_approve_accept_desc] $txt[719] $member[username]\n\n" .
"$txt[701]\n" .
"$scripturl?action=profile\n\n" .
$txt[130]);
}
}
}
// Maybe we're sending it off for activation?
elseif ($_POST['todo'] == 'require_activation')
{
require_once($sourcedir . '/Subs-Members.php');

// We have to do this for each member I'm afraid.
foreach ($member_info as $member)
{
// Generate a random activation code.
$validation_code = generateValidationCode();

// Set these members for activation - I know this includes two ID_MEMBER checks but it's safer than bodging $condition ;).
db_query("
UPDATE
{$db_prefix}members
SET validation_code = '
$validation_code', is_activated = 0
WHERE is_activated =
$current_filter
$condition
AND ID_MEMBER =
$member[id]
LIMIT 1"
, __FILE__, __LINE__);

if (empty($current_language) || $current_language != $member['language'])
{
$current_language = loadLanguage('index', $member['language'], false);
loadLanguage('ManageMembers', $member['language'], false);
}

// Send out the activation email.
sendmail($member['email'], $txt['register_subject'],
"$txt[hello_guest] $member[name]!\n\n" .
"$txt[admin_approve_require_activation] $txt[admin_approve_remind_desc2]\n" .
"$scripturl?action=activate;u=$member[id];code=$validation_code\n\n" .
$txt[130]);
}
}
// Are we rejecting them?
elseif ($_POST['todo'] == 'reject' || $_POST['todo'] == 'rejectemail')
{
require_once($sourcedir . '/Subs-Members.php');
deleteMembers($members);

// Send email telling them they aren't welcome?
if ($_POST['todo'] == 'rejectemail')
{
foreach ($member_info as $member)
{
if (empty($current_language) || $current_language != $member['language'])
$current_language = loadLanguage('ManageMembers', $member['language'], false);

sendmail($member['email'], $txt['admin_approve_reject'],
"$member[name],\n\n" .
"$txt[admin_approve_reject_desc]\n\n" .
$txt[130]);
}
}
}
// A simple delete?
elseif ($_POST['todo'] == 'delete' || $_POST['todo'] == 'deleteemail')
{
require_once($sourcedir . '/Subs-Members.php');
deleteMembers($members);

// Send email telling them they aren't welcome?
if ($_POST['todo'] == 'deleteemail')
{
foreach ($member_info as $member)
{
if (empty($current_language) || $current_language != $member['language'])
$current_language = loadLanguage('ManageMembers', $member['language'], false);

sendmail($member['email'], $txt['admin_approve_delete'],
"$member[name],\n\n" .
"$txt[admin_approve_delete_desc]\n\n" .
$txt[130]);
}
}
}
// Remind them to activate their account?
elseif ($_POST['todo'] == 'remind')
{
foreach ($member_info as $member)
{
if (empty($current_language) || $current_language != $member['language'])
$current_language = loadLanguage('ManageMembers', $member['language'], false);

sendmail($member['email'], $txt['admin_approve_remind'],
"$member[name],\n\n" .
"$txt[admin_approve_remind_desc] $context[forum_name].\n\n$txt[admin_approve_remind_desc2]\n\n" .
"$scripturl?action=activate;u=$member[id];code=$member[code]\n\n" .
$txt[130]);
}
}

// Back to the user's language!
if (isset($current_language) && $current_language != $user_info['language'])
{
loadLanguage('index');
loadLanguage('ManageMembers');
}

// Although updateStats *may* catch this, best to do it manually just incase (Doesn't always sort out unapprovedMembers).
if (in_array($current_filter, array(3, 4)))
updateSettings(array('unapprovedMembers' => ($modSettings['unapprovedMembers'] > $member_count ? $modSettings['unapprovedMembers'] - $member_count : 0)));

// Update the member's stats. (but, we know the member didn't change their name.)
updateStats('member', false);

// If they haven't been deleted, update the post group statistics on them...
if (!in_array($_POST['todo'], array('delete', 'deleteemail', 'reject', 'rejectemail', 'remind')))
updateStats('postgroups', 'ID_MEMBER IN (' . implode(', ', $members) . ')');

redirectexit('action=viewmembers;sa=browse;type=' . $_REQUEST['type'] . ';sort=' . $_REQUEST['sort'] . ';filter=' . $current_filter . ';start=' . $_REQUEST['start']);
}

function
jeffsdatediff($old)
{
// Get the current time as the user would see it...
$forumTime = forum_time();

// Calculate the seconds that have passed since midnight.
$sinceMidnight = date('H', $forumTime) * 60 * 60 + date('i', $forumTime) * 60 + date('s', $forumTime);

// Take the difference between the two times.
$dis = time() - $old;

// Before midnight?
if ($dis < $sinceMidnight)
return 0;
else
$dis -= $sinceMidnight;

// Divide out the seconds in a day to get the number of days.
return ceil($dis / (24 * 60 * 60));






// Get counts on every type of activation - for sections and filtering alike.
   $request = db_query("
      SELECT COUNT(*) AS totalMembers, is_activated
      FROM {$db_prefix}members
      WHERE is_activated != 1
      GROUP BY is_activated", __FILE__, __LINE__);



As we exchange


I kept trying and I got errors from errors in DB


   
thanks

Advertisement: