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(02)))
$context['awaiting_activation'] += $total_members;
elseif (in_array($activation_type, array(345)))
$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]) == || 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'] == '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(345) : array(02);
$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'] == -&& !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'] != && $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'] == '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(34)))
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: