vb.org Archive

vb.org Archive (https://vborg.vbsupport.ru/index.php)
-   vB4 Programming Discussions (https://vborg.vbsupport.ru/forumdisplay.php?f=252)
-   -   Plugin Update Question (https://vborg.vbsupport.ru/showthread.php?t=278430)

KGodel 02-11-2012 07:01 PM

Plugin Update Question
 
Hey guys!

I am using a plugin from a 3.8.x series of vBulletin on VB4 with no errors as far as it getting the job done. It's pretty simple an adds a hook when you save a user. Th plugin can be found here:

https://vborg.vbsupport.ru/showthread.php?t=157919

Now, because of how I sort usergroups (I use an HTML comment) I have altered it a bit to trim off that HTML. However, upon saving I am getting errors evaluating the "foreach" statements in the hook. I'm not expert, but if anyone could give me a hint as to what in these statement might be giving me eval() errors, that'd be great!

PHP Code:

if ($vbulletin->GPC['userid'])
{
    
$usernote_message '';
    
    function 
fetch_usergroup_title($usergroupid)
    {
        global 
$vbulletin;
        return 
$vbulletin->usergroupcache["$usergroupid"]['title'];
    }
    
    
//////////// Check for Primary Group Change ////////////
    
if ($vbulletin->GPC['user']['usergroupid'] != $userinfo['usergroupid'])
    {
        
$usernote_message .= construct_phrase($vbphrase['primary_group_changed_x_to_y'],substr(fetch_usergroup_title($userinfo['usergroupid']), 16),substr(fetch_usergroup_title($vbulletin->GPC['user']['usergroupid']), 16));
    }

    
/////////// Check for Member (Secondary) Group Change ////////////
    
    // Find NEW member group IDs (Added Member Groups)
    
foreach ($vbulletin->GPC['user']['membergroupids'] AS $newmembergroupid)
    {
        if (!
in_array$newmembergroupidexplode(','$userinfo['membergroupids']) ) )
        {
            
$addedmembergroupids[] = $newmembergroupid;
        }
    }
    
    
// Find OLD member group IDs (Removed Member Groups)
    
foreach (explode(','$userinfo['membergroupids']) AS $oldmembergroupid)
    {
        if (
intval($oldmembergroupid) AND !in_array$oldmembergroupid$vbulletin->GPC['user']['membergroupids'] ))
        {
            
$removedmembergroupids[] = $oldmembergroupid;
        }
    }

    foreach (
$addedmembergroupids AS $membergroupid)
    {
        
$usernote_message .= construct_phrase($vbphrase['added_to_secondary_group_x'],substr(fetch_usergroup_title($membergroupid), 16));
    }
    
    foreach (
$removedmembergroupids AS $membergroupid)
    {
        
$usernote_message .= construct_phrase($vbphrase['removed_from_secondary_group_x'],substr(fetch_usergroup_title($membergroupid), 16));
    }

    
// If we have a message then something was changed, create the log entry
    
if ($usernote_message != '')
    {
        
//Insert a new usernote
        
$db->query_write("
                INSERT INTO " 
TABLE_PREFIX "usernote
                (message, dateline, userid, posterid, title, allowsmilies)
                VALUES ('" 
$db->escape_string($usernote_message) . "', " TIMENOW ", ".$userinfo['userid'].", " $vbulletin->userinfo['userid'] . ", '".$db->escape_string($vbphrase['usergroup_changed'])."', 1)
            "
);
    }




kh99 02-11-2012 07:08 PM

An error from foreach is usually because what you're giving it isn't an array, and I can see a couple places in the code where if conditions aren't met, nothing gets added to the array so it will end up not being defined at all. So you could make sure they are defined as empty array, like for instance:


Code:

    // Find OLD member group IDs (Removed Member Groups)
    $addedmembergroupids = array();   
    foreach (explode(',', $userinfo['membergroupids']) AS $oldmembergroupid)
    {


KGodel 02-11-2012 07:26 PM

I added two such lines am still getting another error. Since its run as a hook I am not sure what line in the code exactly is giving me the issue, but the changed code is now:

PHP Code:

if ($vbulletin->GPC['userid'])
{
    
$usernote_message '';
    
    function 
fetch_usergroup_title($usergroupid)
    {
        global 
$vbulletin;
        return 
$vbulletin->usergroupcache["$usergroupid"]['title'];
    }
    
    
//////////// Check for Primary Group Change ////////////
    
if ($vbulletin->GPC['user']['usergroupid'] != $userinfo['usergroupid'])
    {
        
$usernote_message .= construct_phrase($vbphrase['primary_group_changed_x_to_y'],substr(fetch_usergroup_title($userinfo['usergroupid']), 16),substr(fetch_usergroup_title($vbulletin->GPC['user']['usergroupid']), 16));
    }

    
/////////// Check for Member (Secondary) Group Change ////////////
    
    // Find NEW member group IDs (Added Member Groups)
    
$addedmembergroupids = array();
    foreach (
$vbulletin->GPC['user']['membergroupids'] AS $newmembergroupid)
    {
        if (!
in_array$newmembergroupidexplode(','$userinfo['membergroupids']) ) )
        {
            
$addedmembergroupids[] = $newmembergroupid;
        }
    }
    
    
// Find OLD member group IDs (Removed Member Groups)
    
$removedmembergroupids = array();
    foreach (
explode(','$userinfo['membergroupids']) AS $oldmembergroupid)
    {
        if (
intval($oldmembergroupid) AND !in_array$oldmembergroupid$vbulletin->GPC['user']['membergroupids'] ))
        {
            
$removedmembergroupids[] = $oldmembergroupid;
        }
    }

    foreach (
$addedmembergroupids AS $membergroupid)
    {
        
$usernote_message .= construct_phrase($vbphrase['added_to_secondary_group_x'],substr(fetch_usergroup_title($membergroupid), 16));
    }
    
    foreach (
$removedmembergroupids AS $membergroupid)
    {
        
$usernote_message .= construct_phrase($vbphrase['removed_from_secondary_group_x'],substr(fetch_usergroup_title($membergroupid), 16));
    }

    
// If we have a message then something was changed, create the log entry
    
if ($usernote_message != '')
    {
        
//Insert a new usernote
        
$db->query_write("
                INSERT INTO " 
TABLE_PREFIX "usernote
                (message, dateline, userid, posterid, title, allowsmilies)
                VALUES ('" 
$db->escape_string($usernote_message) . "', " TIMENOW ", ".$userinfo['userid'].", " $vbulletin->userinfo['userid'] . ", '".$db->escape_string($vbphrase['usergroup_changed'])."', 1)
            "
);
    }



Also, thanks for the help kh99!

EDIT: I think I narrow it down. It gives me:

Warning: Invalid argument supplied for foreach() in [path]/admincp/user.php(1076) : eval()'d code on line 21

Which I think is this line:

PHP Code:

foreach ($vbulletin->GPC['user']['membergroupids'] AS $newmembergroupid


kh99 02-11-2012 07:57 PM

Same problem I suppose. Another thing you can do is to check if it's an array, like:

Code:

// Find NEW member group IDs (Added Member Groups)
    $addedmembergroupids = array();
    if (is_array($vbulletin->GPC['user']['membergroupids'])
    {
        foreach ($vbulletin->GPC['user']['membergroupids'] AS $newmembergroupid)
        {
            if (!in_array( $newmembergroupid, explode(',', $userinfo['membergroupids']) ) )
            {
                $addedmembergroupids[] = $newmembergroupid;
            }
        }
    }


But you say it was working in vb3.8 so I'm not sure why this stuff would need to be added now.

KGodel 02-11-2012 08:32 PM

Thanks again kh99. That last array check worked well. Yea, the issues existed after a recent update but no one had posted a fix, so I wasn't sure if it was a vb 3.8.x thing or not. This now works great on vBulletin 4.x. Thanks so much for your help in resolving these issues mate!

DavidsMods 02-12-2012 12:18 AM

Quote:

Originally Posted by KGodel (Post 2298669)
Thanks again kh99. That last array check worked well. Yea, the issues existed after a recent update but no one had posted a fix, so I wasn't sure if it was a vb 3.8.x thing or not. This now works great on vBulletin 4.x. Thanks so much for your help in resolving these issues mate!

As a shorthand way of doing this in future, the following is legal:

PHP Code:

foreach ((array)$vbulletin->GPC['user']['membergroupids'] AS $newmembergroupid



All times are GMT. The time now is 03:34 PM.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.

X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.01174 seconds
  • Memory Usage 1,787KB
  • Queries Executed 10 (?)
More Information
Template Usage:
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (2)bbcode_code_printable
  • (4)bbcode_php_printable
  • (1)bbcode_quote_printable
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)post_thanks_navbar_search
  • (1)printthread
  • (6)printthreadbit
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • showthread
Included Files:
  • ./printthread.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/class_bbcode_alt.php
  • ./includes/class_bbcode.php
  • ./includes/functions_bigthree.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
  • printthread_start
  • bbcode_fetch_tags
  • bbcode_create
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • printthread_post
  • printthread_complete