PDA

View Full Version : Globalizing a Variable/Function


GameWizard
05-05-2008, 08:12 AM
This is becoming a serious problem for me, as I need to find a way to have a certain function work on other areas of my board. The function is:

$prepared['isfriend']

It checks for friendship on the MEMBERINFO template, but not on any other page. What would I need to do in order to have it function on other pages. Any help or suggestions are welcome.

Boofo
05-05-2008, 08:16 AM
Here's how I used it in my User CP Referrer hack to get the referrer name in the profile, it this helps at all:

global $show;

if ($this->registry->options['usereferrer'])
{
$referral = $this->registry->db->query_first_slave("
SELECT userid, username FROM " . TABLE_PREFIX . "user
WHERE userid = " . $this->userinfo['referrerid'] . "
");
$this->prepared['referralsname'] = $referral['username'];
$this->prepared['referralsuserid'] = $referral['userid'];

if ($this->prepared['referralsuserid'] > 0)
{
$show['referrer'] = true;
}
else
{
$show['referrer'] = false;
}
}

I used it in the userprofile_create hook.

GameWizard
05-05-2008, 09:23 AM
Thanks for your reply, I think I may have stumbled upon what I need, but am having no luck with the result.

Inside includes/functions.php I discovered the following lines:

Line 1226:
define('FETCH_USERINFO_ISFRIEND', 0x80);
Line 1269:
// no cache available - query the user
$user = $vbulletin->db->query_first_slave("
SELECT " .
iif(($option & FETCH_USERINFO_ADMIN), ' administrator.*, ') . "
userfield.*, usertextfield.*, user.*, UNIX_TIMESTAMP(passworddate) AS passworddate,
IF(displaygroupid=0, user.usergroupid, displaygroupid) AS displaygroupid" .
iif(($option & FETCH_USERINFO_AVATAR) AND $vbulletin->options['avatarenabled'], ', avatar.avatarpath, NOT ISNULL(customavatar.userid) AS hascustomavatar, customavatar.dateline AS avatardateline, customavatar.width AS avwidth, customavatar.height AS avheight, customavatar.height_thumb AS avheight_thumb, customavatar.width_thumb AS avwidth_thumb, customavatar.filedata_thumb').
iif(($option & FETCH_USERINFO_PROFILEPIC), ', customprofilepic.userid AS profilepic, customprofilepic.dateline AS profilepicdateline, customprofilepic.width AS ppwidth, customprofilepic.height AS ppheight') .
iif(($option & FETCH_USERINFO_SIGPIC), ', sigpic.userid AS sigpic, sigpic.dateline AS sigpicdateline, sigpic.width AS sigpicwidth, sigpic.height AS sigpicheight') .
(($option & FETCH_USERINFO_USERCSS) ? ', usercsscache.cachedcss, IF(usercsscache.cachedcss IS NULL, 0, 1) AS hascachedcss, usercsscache.buildpermissions AS cssbuildpermissions' : '') .
iif(!isset($vbphrase), fetch_language_fields_sql(), '') .
(($vbulletin->userinfo['userid'] AND ($option & FETCH_USERINFO_ISFRIEND)) ?
", IF(userlist1.friend = 'yes', 1, 0) AS isfriend, IF (userlist1.friend = 'pending' OR userlist1.friend = 'denied', 1, 0) AS ispendingfriend" .
", IF(userlist1.userid IS NOT NULL, 1, 0) AS u_iscontact_of_bbuser, IF (userlist2.friend = 'pending', 1, 0) AS requestedfriend" .
", IF(userlist2.userid IS NOT NULL, 1, 0) AS bbuser_iscontact_of_user" : "") . "
$hook_query_fields
FROM " . TABLE_PREFIX . "user AS user
LEFT JOIN " . TABLE_PREFIX . "userfield AS userfield ON (user.userid = userfield.userid)
LEFT JOIN " . TABLE_PREFIX . "usertextfield AS usertextfield ON (usertextfield.userid = user.userid) " .
iif(($option & FETCH_USERINFO_AVATAR) AND $vbulletin->options['avatarenabled'], "LEFT JOIN " . TABLE_PREFIX . "avatar AS avatar ON (avatar.avatarid = user.avatarid) LEFT JOIN " . TABLE_PREFIX . "customavatar AS customavatar ON (customavatar.userid = user.userid) ") .
iif(($option & FETCH_USERINFO_PROFILEPIC), "LEFT JOIN " . TABLE_PREFIX . "customprofilepic AS customprofilepic ON (user.userid = customprofilepic.userid) ") .
iif(($option & FETCH_USERINFO_ADMIN), "LEFT JOIN " . TABLE_PREFIX . "administrator AS administrator ON (administrator.userid = user.userid) ") .
iif(($option & FETCH_USERINFO_SIGPIC), "LEFT JOIN " . TABLE_PREFIX . "sigpic AS sigpic ON (user.userid = sigpic.userid) ") .
(($option & FETCH_USERINFO_USERCSS) ? 'LEFT JOIN ' . TABLE_PREFIX . 'usercsscache AS usercsscache ON (user.userid = usercsscache.userid)' : '') .
iif(!isset($vbphrase), "LEFT JOIN " . TABLE_PREFIX . "language AS language ON (language.languageid = " . (!empty($languageid) ? $languageid : "IF(user.languageid = 0, " . intval($vbulletin->options['languageid']) . ", user.languageid)") . ") ") .
(($vbulletin->userinfo['userid'] AND ($option & FETCH_USERINFO_ISFRIEND)) ?
"LEFT JOIN " . TABLE_PREFIX . "userlist AS userlist1 ON (userlist1.relationid = user.userid AND userlist1.type = 'buddy' AND userlist1.userid = " . $vbulletin->userinfo['userid'] . ")" .
"LEFT JOIN " . TABLE_PREFIX . "userlist AS userlist2 ON (userlist2.userid = user.userid AND userlist2.type = 'buddy' AND userlist2.relationid = " . $vbulletin->userinfo['userid'] . ")" : "") . "
$hook_query_joins
WHERE user.userid = $userid
");
The code in red seems to be defining what it is that the isfriend function is suposed to do, am I correct? I tried different ways of creating a plugin based on this code and merging it into yours in different ways but came up with errors. It seems that what i need to do is re-fetch this command, rather than copying and pasting it over again.

Can anyone help me with this?

Boofo
05-05-2008, 09:52 AM
Are you trying to get a list of friends or just for one user? You should be able to do a query for that, I would think.

GameWizard
05-05-2008, 10:05 AM
No, actually I want to use the function to verify if the user is a friend, and if so, it would display the information accordingly.

For example:
<if condition="$prepared['isfriend']">
This message will be displayed if I am a friend of this user
<else />
This message will be displayed If I am not a friend of this user
</if>

GameWizard
05-07-2008, 01:26 AM
Inside member.php, line 277, I found:

$fetch_userinfo_options = (
FETCH_USERINFO_AVATAR | FETCH_USERINFO_LOCATION |
FETCH_USERINFO_PROFILEPIC | FETCH_USERINFO_SIGPIC |
FETCH_USERINFO_USERCSS | FETCH_USERINFO_ISFRIEND
);I copied and pasted this info a plugin with the hook postbit_display_start and it had no effect unfortunately, I received no errors though.

What else could I be missing in my plugin code that isn't allowing this function to run? I have tried including both these in my postbit template and neither appear:

<if condition="$userinfo['isfriend']">
content
</if>

<if condition="$prepared['isfriend']">
content
</if>

Marco van Herwaarden
05-07-2008, 10:13 AM
Please post the entire plugin.

GameWizard
05-07-2008, 10:23 AM
That's the problem, I don't have a plugin and need to create one but have no little idea as to what I should include in it. I'm positive I am using the correct hook, but the contents of my plugin are what I need help in creating. Here is all the code associated with my function in question.

This is found in functions.php, line 1248:

function fetch_userinfo(&$userid, $option = 0, $languageid = 0)
{
global $vbulletin, $usercache, $vbphrase, $permissions, $phrasegroups;

if ($userid == $vbulletin->userinfo['userid'] AND $option != 0 AND isset($usercache["$userid"]))
{
// clear the cache if we are looking at ourself and need to add one of the JOINS to our information.
unset($usercache["$userid"]);
}

$userid = intval($userid);

// return the cached result if it exists
if (isset($usercache["$userid"]))
{
return $usercache["$userid"];
}

$hook_query_fields = $hook_query_joins = '';
($hook = vBulletinHook::fetch_hook('fetch_userinfo_query')) ? eval($hook) : false;

// no cache available - query the user
$user = $vbulletin->db->query_first_slave("
SELECT " .
iif(($option & FETCH_USERINFO_ADMIN), ' administrator.*, ') . "
userfield.*, usertextfield.*, user.*, UNIX_TIMESTAMP(passworddate) AS passworddate,
IF(displaygroupid=0, user.usergroupid, displaygroupid) AS displaygroupid" .
iif(($option & FETCH_USERINFO_AVATAR) AND $vbulletin->options['avatarenabled'], ', avatar.avatarpath, NOT ISNULL(customavatar.userid) AS hascustomavatar, customavatar.dateline AS avatardateline, customavatar.width AS avwidth, customavatar.height AS avheight, customavatar.height_thumb AS avheight_thumb, customavatar.width_thumb AS avwidth_thumb, customavatar.filedata_thumb').
iif(($option & FETCH_USERINFO_PROFILEPIC), ', customprofilepic.userid AS profilepic, customprofilepic.dateline AS profilepicdateline, customprofilepic.width AS ppwidth, customprofilepic.height AS ppheight') .
iif(($option & FETCH_USERINFO_SIGPIC), ', sigpic.userid AS sigpic, sigpic.dateline AS sigpicdateline, sigpic.width AS sigpicwidth, sigpic.height AS sigpicheight') .
(($option & FETCH_USERINFO_USERCSS) ? ', usercsscache.cachedcss, IF(usercsscache.cachedcss IS NULL, 0, 1) AS hascachedcss, usercsscache.buildpermissions AS cssbuildpermissions' : '') .
iif(!isset($vbphrase), fetch_language_fields_sql(), '') .
(($vbulletin->userinfo['userid'] AND ($option & FETCH_USERINFO_ISFRIEND)) ?
", IF(userlist1.friend = 'yes', 1, 0) AS isfriend, IF (userlist1.friend = 'pending' OR userlist1.friend = 'denied', 1, 0) AS ispendingfriend" .
", IF(userlist1.userid IS NOT NULL, 1, 0) AS u_iscontact_of_bbuser, IF (userlist2.friend = 'pending', 1, 0) AS requestedfriend" .
", IF(userlist2.userid IS NOT NULL, 1, 0) AS bbuser_iscontact_of_user" : "") . "
$hook_query_fields
FROM " . TABLE_PREFIX . "user AS user
LEFT JOIN " . TABLE_PREFIX . "userfield AS userfield ON (user.userid = userfield.userid)
LEFT JOIN " . TABLE_PREFIX . "usertextfield AS usertextfield ON (usertextfield.userid = user.userid) " .
iif(($option & FETCH_USERINFO_AVATAR) AND $vbulletin->options['avatarenabled'], "LEFT JOIN " . TABLE_PREFIX . "avatar AS avatar ON (avatar.avatarid = user.avatarid) LEFT JOIN " . TABLE_PREFIX . "customavatar AS customavatar ON (customavatar.userid = user.userid) ") .
iif(($option & FETCH_USERINFO_PROFILEPIC), "LEFT JOIN " . TABLE_PREFIX . "customprofilepic AS customprofilepic ON (user.userid = customprofilepic.userid) ") .
iif(($option & FETCH_USERINFO_ADMIN), "LEFT JOIN " . TABLE_PREFIX . "administrator AS administrator ON (administrator.userid = user.userid) ") .
iif(($option & FETCH_USERINFO_SIGPIC), "LEFT JOIN " . TABLE_PREFIX . "sigpic AS sigpic ON (user.userid = sigpic.userid) ") .
(($option & FETCH_USERINFO_USERCSS) ? 'LEFT JOIN ' . TABLE_PREFIX . 'usercsscache AS usercsscache ON (user.userid = usercsscache.userid)' : '') .
iif(!isset($vbphrase), "LEFT JOIN " . TABLE_PREFIX . "language AS language ON (language.languageid = " . (!empty($languageid) ? $languageid : "IF(user.languageid = 0, " . intval($vbulletin->options['languageid']) . ", user.languageid)") . ") ") .
(($vbulletin->userinfo['userid'] AND ($option & FETCH_USERINFO_ISFRIEND)) ?
"LEFT JOIN " . TABLE_PREFIX . "userlist AS userlist1 ON (userlist1.relationid = user.userid AND userlist1.type = 'buddy' AND userlist1.userid = " . $vbulletin->userinfo['userid'] . ")" .
"LEFT JOIN " . TABLE_PREFIX . "userlist AS userlist2 ON (userlist2.userid = user.userid AND userlist2.type = 'buddy' AND userlist2.relationid = " . $vbulletin->userinfo['userid'] . ")" : "") . "
$hook_query_joins
WHERE user.userid = $userid
");
if (!$user)
{
return false;
}

if (!isset($vbphrase) AND $user['lang_options'] === null)
{
trigger_error('The requested language does not exist, reset via tools.php.', E_USER_ERROR);
}

$user['languageid'] = (!empty($languageid) ? $languageid : $user['languageid']);

// decipher 'options' bitfield
$user['options'] = intval($user['options']);

foreach ($vbulletin->bf_misc_useroptions AS $optionname => $optionval)
{
$user["$optionname"] = ($user['options'] & $optionval ? 1 : 0);
//DEVDEBUG("$optionname = $user[$optionname]");
}

foreach($vbulletin->bf_misc_adminoptions AS $optionname => $optionval)
{
$user["$optionname"] = ($user['adminoptions'] & $optionval ? 1 : 0);
}

// make a username variable that is safe to pass through URL links
$user['urlusername'] = urlencode(unhtmlspecialchars($user['username']));

fetch_musername($user);

// get the user's real styleid (not the cookie value)
$user['realstyleid'] = $user['styleid'];

$user['securitytoken'] = sha1($user['userid'] . sha1($user['salt']) . sha1(COOKIE_SALT));
$user['logouthash'] =& $user['securitytoken'];

if ($option & FETCH_USERINFO_LOCATION)
{ // Process Location info for this user
require_once(DIR . '/includes/functions_online.php');
$user = fetch_user_location_array($user);
}

($hook = vBulletinHook::fetch_hook('fetch_userinfo')) ? eval($hook) : false;

$usercache["$userid"] = $user;
return $usercache["$userid"];
}
This is the only page which contains the isfriend conditional in this fashion.

The location where it is functional now, only on the member.php includes the following code on line 277:
$fetch_userinfo_options = (
FETCH_USERINFO_AVATAR | FETCH_USERINFO_LOCATION |
FETCH_USERINFO_PROFILEPIC | FETCH_USERINFO_SIGPIC |
FETCH_USERINFO_USERCSS | FETCH_USERINFO_ISFRIEND
);The code above does not appear to be inside another function but rather by itself. I tested the code by removing it and I noticed all the accociated functions with the isfriend function ceased to work, so it seems that it is indeed the right code.

The issue is my lacking ability to create a plugin for this function to work on other areas of my board, that's all.

Marco van Herwaarden
05-07-2008, 10:35 AM
If you want to use the friend code on any other page then member.php, you will need to retrieve the data first.

Create a plugin that will retrieve it for the userid you need, something like:

$friendinfo = fetch_userinfo(<<userid>>, FETCH_USERINFO_ISFRIEND);
Info should be available in $friendinfo after this.

PS If you plan to do this on posts, then please be aware that this can be very server intensive if you want to retrieve this for each post on a page.

GameWizard
05-07-2008, 10:48 AM
I think there was some confusion, or I am simply misinterpreting the code. Based on my understanding of plugin you created, I am to assume that it will fetch specific data (and display it) by using the $friendinfo function on a template.

This is not what I am looking for, as the content I wish to appear is already in the template, I simply want to restrict the content to only those permitted, in this case being the friends of the user.

At the moment in my profile if i specify 'friends only', it will only show the content in the following conditional to only that users friends.
<if condition="$prepared['isfriend']">
content
</if>The issue is that this code was hard coded to only function only certain pages, although I would like to extend this functionality elsewhere. I have already posted above how it is included inside member.php, it is also included inside profile.php, but this code is very specific to this page, so I can't use it in my plugin exactly as is:
$userinfo = verify_id('user', $vbulletin->GPC['userid'], true, true, FETCH_USERINFO_ISFRIEND);
I tried using your plugin as follows:
$friendinfo = fetch_userinfo($vbulletin->GPC['userid'], FETCH_USERINFO_ISFRIEND); But I am almost postive this is incorrect, but received no error. Neither did my content appear as it should by using <if condition="$userinfo['friendinfo']">

GameWizard
05-09-2008, 11:04 AM
lol, still hoping someone out there will find the time to help me.