Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 General Discussions
  #1  
Old 06-24-2008, 09:13 PM
testboard testboard is offline
 
Join Date: Nov 2007
Location: Hampshire, United Kingdom
Posts: 7
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default How To Select Member Groups At Registration

Hi,

I have a vBulletin forum that requires users to register. At this point they receive the registration email & click on it's link. Then they must wait until they are Moderated in order to be allowed to post.

I want to provide all users with certain forums. I.e. Communal forums for all.
Depending on choices made at registration I wish to restrict access to other forums. E.g. Group A will have access to Forum A (but not Forums B & C) etc. Note: The 2 drop down lists for "Groups" both have the same contents - it just allows people to join 2 different groups out of the list).

I have edited the "register" template to add in 2 drop down boxes. The choice being the groups the new registrant may be in.

I have added a "plugin" to the "register_addmember_process" hook.
Code:
if (is_numeric($_REQUEST['group1']) && ($_REQUEST['group1']>8)) { $membergroupids = $_REQUEST['group1']; } else { $membergroupids = ''; }
if (is_numeric($_REQUEST['group2']) && ($_REQUEST['group2']>8))
{
	if ($membergroupids != $_REQUEST['group2'])
	{
		if ($membergroupids != '') { $membergroupids .= ','; }
		$membergroupids .= $_REQUEST['group2'];
	}
}
$userdata->set('membergroupids', $membergroupids);
All Groups are set up in usergroups & this all appears to work fine:
- The correct groups are entered into "membergroupids" in the DB.
- "usergroupid" is still set to 3.

However, the problem I have is that these members are now able to post even though they have not clicked on the email link or been moderated as members.

Any ideas on how to either fix this solution or another approach to fixing this issue?

I have proved this by adding a test user who is able to post. If I then remove the list of groups from "membergroupids" in the database, he is suddenly unable to post until he has clicked the link in the registration email & been moderated.

TIA for any fixes / explanations / advice / etc.
Reply With Quote
  #2  
Old 06-25-2008, 07:26 AM
Dismounted's Avatar
Dismounted Dismounted is offline
 
Join Date: Jun 2005
Location: Melbourne, Australia
Posts: 15,047
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

It is because users are put into the "awaiting confirmation" usergroup on registration. You are effectively putting them into another usergroup. A "yes" always overrides a "no" (in vBulletin).

What you should do is to only change the member group as they activate their account, not as they register.
Reply With Quote
  #3  
Old 06-25-2008, 09:57 AM
testboard testboard is offline
 
Join Date: Nov 2007
Location: Hampshire, United Kingdom
Posts: 7
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Thanks for the reply.

So, when the "membergroupids" field is blank it means "awaiting confirmation"?
I notice that "usergroupids" is set to 3 & stays that way.

If so, can you give me any pointers as to how to transfer the data from the initial registration form to a hook in the code after moderation / email confirmation is complete?

It seems to me that this would be an impossibility unless I create a DB table & store the data in there at registration time & then use a hook at some point in the manual moderation process (haven't looked that far into the code yet) that populates "membergroupids" from my DB table?

What do you think?
Thanks again for your input so far & any future advice.
Reply With Quote
  #4  
Old 06-25-2008, 11:49 AM
Dismounted's Avatar
Dismounted Dismounted is offline
 
Join Date: Jun 2005
Location: Melbourne, Australia
Posts: 15,047
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by testboard View Post
So, when the "membergroupids" field is blank it means "awaiting confirmation"?
No. With your code, the user is still in the "awaiting confirmation" (id 3) usergroup, but you add a secondary usergroup for that user. And in vBulletin, a "yes" in permissions overrides a "no", so the user will have the permissions combined, with a "yes" taking priority.
Quote:
Originally Posted by testboard View Post
If so, can you give me any pointers as to how to transfer the data from the initial registration form to a hook in the code after moderation / email confirmation is complete?
Create a new profile field which can only be changed at registration. Then when the user activates, check with this field that you have created.
Reply With Quote
  #5  
Old 06-25-2008, 02:57 PM
testboard testboard is offline
 
Join Date: Nov 2007
Location: Hampshire, United Kingdom
Posts: 7
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Thanks for the reply.

Quote:
"a yes over-rides a no"
I think I see. If "membergroupids" is set to a value then the "usergroupids==3" is over-riden with that value(s).

Quote:
"Create a new profile field which can only be changed at registration. Then when the user activates, check with this field that you have created."
OK, I think I can do this. Will it not cause complications though as I will now have to change the individual forums to use the profile field instead of vBulletin automatically restricting access based on "membergroupids"?

The only alternative I have worked out is to add code (there are no hooks) to usercp.php?do=domoderate.
I.e. Store the chosen groups into a seperate DB table at registration.
Then read this data in "domoderate" & populate "groupmemberids".

Of course this does mean that any upgrades to the site will need "usercp.php" editing.
Reply With Quote
  #6  
Old 06-26-2008, 07:17 AM
Dismounted's Avatar
Dismounted Dismounted is offline
 
Join Date: Jun 2005
Location: Melbourne, Australia
Posts: 15,047
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by testboard View Post
I think I see. If "membergroupids" is set to a value then the "usergroupids==3" is over-riden with that value(s).
No, I am referring to permissions. Users are members of both groups under the system you are running.
Quote:
Originally Posted by testboard View Post
Will it not cause complications though as I will now have to change the individual forums to use the profile field instead of vBulletin automatically restricting access based on "membergroupids"?
I don't think you understand. You are creating a profile field to check upon activation. At activated, you sort into your usergroups.
Reply With Quote
  #7  
Old 06-26-2008, 07:11 PM
testboard testboard is offline
 
Join Date: Nov 2007
Location: Hampshire, United Kingdom
Posts: 7
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
No, I am referring to permissions. Users are members of both groups under the system you are running.
OK, now I definitely do understand. Member of both groups but "yes" over-rides "no" as in being a member of group giving permissions mean you have those even if another group does not.

Quote:
You are creating a profile field to check upon activation.
I understand now & I have managed to create profile fields which appear to work as I want (Completed at activation, not editable in the users profile by the user).

Quote:
At activated, you sort into your usergroups.
Not sure about where "activated" / "activation" is - presumeably once an admin has moderated a new user so they are allowed to post.
I'm going to have a look through the code now to see if I can find a hook at some point.

If so, I think what I need to do is create a plugin that takes the contents of the profile field & adds the corresponding groups to "membergroupids" as appropriate.

Am I on the right track now?
Thanks for all your help so far.

--------------- Added [DATE]1214513317[/DATE] at [TIME]1214513317[/TIME] ---------------

It seems that the best place to add the code to set "membergroupids" is in:
/admincp/user.php?do=domoderated
at about this point in the code:
$userdata->set('usergroupid', 2);

However I see no hooks that I can use for a plugin.
Should I just add the code to user.php or am I missing what you mean by "activation"?
I will have a look through the ACP to see if there are any "activation" options in there.

--------------- Added [DATE]1214533841[/DATE] at [TIME]1214533841[/TIME] ---------------

SOLUTION:

1) In ACP/User Profile Fields/Add New User Profile Field
Add the new field by completing the form.

2) In ACP/Plugins & Products/Add New Plugin
Add a new plugin. This is the code I used:
$tradegroup = $db->query_first('SELECT field7 FROM userfield WHERE userid=\''.$userinfo['userid'].'\'');
$groupnum = $db->query_first('SELECT usergroupid FROM usergroup WHERE title=\''.$tradegroup['field7'].'\'');
$userdata->set('membergroupids', $groupnum);

Change mentions of field7 to whatever the field number is that you set up in step 1.
The hook is: register_activate_process

--------------- Added [DATE]1214534002[/DATE] at [TIME]1214534002[/TIME] ---------------

NOTES:
In case someone has searched & found the above soloution, this is still not perfect:

1) The dropdown list from step 1 is not auto-populated with additional member groups that may be created in the future.
2) I don't think there will ever be entries in "membergroupids" but if there is then the above code will overwrite them rather than add to them.

--------------- Added [DATE]1214534136[/DATE] at [TIME]1214534136[/TIME] ---------------

Finally, thanks for all your help, pointers & explanations "Dismounted".

--------------- Added [DATE]1214534432[/DATE] at [TIME]1214534432[/TIME] ---------------

Spoke too soon, the hook is wrong, users can post before they are moderated.
I think I have now officially lost the will to live with this.

--------------- Added [DATE]1214535946[/DATE] at [TIME]1214535946[/TIME] ---------------

--------------- Added [DATE]1214536511[/DATE] at [TIME]1214536511[/TIME] ---------------

Changed the code slightly & added to admincp/user.php in do="domoderate":

$tradegroup = $db->query_first('SELECT field7 FROM userfield WHERE userid=\''.$user['userid'].'\'');
$groupnum = $db->query_first('SELECT usergroupid FROM usergroup WHERE title=\''.$tradegroup['field7'].'\'');
$userdata->set('membergroupids', $groupnum);

All working now, although this is not a good way of doing it as vbulletin upgrades may fail as I've edited the code directly rather than using a hook with plugin code.
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 11:17 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.06661 seconds
  • Memory Usage 2,231KB
  • Queries Executed 11 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (1)bbcode_code
  • (9)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (7)post_thanks_box
  • (7)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (7)post_thanks_postbit_info
  • (7)postbit
  • (7)postbit_onlinestatus
  • (7)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete