PDA

View Full Version : How to set user to multiple secondary usergroups


Bobbo
04-05-2010, 08:54 PM
I'm working on a plugin where I hook in at register_addmember_process and query against an external datasource.

Based on the results of the query, I need to add the user to multiple secondary usergroups.

I can add them to a single secondary usergroup like this, where X is the usergroup.

$userdata->set('membergroupids', X);

What I need to do is be able to add them to usergroups X, Y, and Z, etc...


I'm not quite sure logically how to make this work. If anyone has any tips it would be greatly apprecaited.

Regards,

Bobbo

--------------- Added 1270569683 at 1270569683 ---------------

Nevermind, I figured it out.

I needed to implode my array result first and ensure the values were comma separated before I set the membergroupids.

reddyink
05-23-2011, 07:24 PM
Can you please post how you did this. I am trying to do the same and not able to accomplish.

Thanks for sharing.

Sarteck
05-23-2011, 10:52 PM
@reddyink, Well, it might not be the way you are SUPPOSED to do it, but this is how I do it in a lot of my modifications:


// initialize data manger
require_once(DIR . '/includes/class_dm.php');
require_once(DIR . '/includes/class_dm_user.php');
require_once(DIR . '/includes/functions_ranks.php');
$userdm =& datamanager_init('User', $vbulletin, ERRTYPE_CP);

// Get User Info
$user = fetch_userinfo($userid);

// Get current User Groups
$groups = $user['membergroupids'];

// If the member is NOT part of the groups you want to add, then add those values to $groups
if (!in_array($new_group_1, $groups)) {$groups[] = $new_group_1;}
if (!in_array($new_group_2, $groups)) {$groups[] = $new_group_2;}
if (!in_array($new_group_3, $groups)) {$groups[] = $new_group_3;}

// Set the user data to a datamanager
$userdm->set_existing($user);

// If the new groups could change the user's "rank" somehow, be sure to get the user's new "rank" (have to set the new groups to the $user info first)
$user['membergroupids'] = implode(',',$groups);
$userrank =& fetch_rank($user);

// Set the new user groups
$userdm->set('membergroupids', $user['membergroupids']);

// Set the user rank, if applicable
$userdm->setr('rank', $userrank);

// Save the data
$userdm->save();

Bobbo
05-24-2011, 12:40 PM
Sarteck's method probably works.

My code is pretty unique, so I'm not sure it makes sense to post it all here. I've integrated vBulletin with our CRM system. Only authorized customers can register and use our site.

I ended up building several plugins. One includes logic that dips into a MS SQL data base and checks to see what active service contracts our customers have. Depending on their contracts, they get assigned to various secondary usergroups.

Since they could have contracts for multiple products (and would need to be assigned to multiple usergroups), I create an array and then populate it in a do while loop.

So for example, $mygroup=array();

Then in the while loop based on my query results, I add the secondary usergroup to the array with $mygroup[] = 'x'; (where x is the usergroup id)

Once the while loop is completed, I convert the array to a normal string with a comma between each of the values with: $mydata = implode(",", $mygroup);

And then finally, I write the data to the table with $userdata->set('membergroupids', $mydata);



The extent of your specific code will really depend on what you are trying to accomplish. For example, what I do as described above is really for when the customer first registers and is hooked at register_activate_process. I have a different plugin that hooks at other locations that does current real time validation. So basically, if a service contract expires in our CRM system, when they use the site, their usergroup permissions get removed in real time. The code in this plugin removes the expiring usergroup id from an array and writes it back to the vBulletin database. There are also checks upon login, etc...

Hope that at least helps a little and gets you thinking.

B :)

Sarcoth
03-07-2014, 07:21 PM
@Sarteck - Thank you. Good information.