PDA

View Full Version : i need a developer/coder/sourcer's help


AK Houston
06-16-2011, 05:21 AM
hello, i have a question on a system i'm trying to use.
its a vbulletin_musername i believe. i'm trying to get my gold member's to be able to change the color of their name excluding the usergroup.
I own vbulletin 4.1.4 and my site is akmods.net
there is this other site, thetechgame.com, which has a paid subscription called "gold member" which allows you to do the following:

https://vborg.vbsupport.ru/external/2011/06/31.png

which allows you to select the color of your username from a drop down menu.

thetechgame.com runs on a different forum software which i don't know. they could possibly be on vbulletin.

i want to be able for my gold members to select the color of their username without having to make a whole new usergroup so they can change their color via user id.

if this is possible, could someone please help me do it to my forum. thanks.

~ALSO~

i want to be able to make a usergroup with names that scroll marquee of different colors. an example is on the link as follows:

http://www.thetechgame.com/xKryptic

if someone knows a PhP code that can do that for a usergroup, that would be great if someone could help me!

thanks, Houston

Sarteck
06-16-2011, 04:06 PM
On the hook fetch_musername, you could use something like:

if (is_member_of($user, $special_group))
{
$user['musername'] = '<span style="color:'.$my_special_color.'">'.$user['username'].'</span>';
}


If you had a special User Field that you created (Admin CP -> User Profile Fields -> Add User Profile Field), you could use that value for the colour like so:


if (is_member_of($user, $special_group))
{
$my_special_color = $user['fieldXX'];
$user['musername'] = '<span style="color:'.$my_special_color.'">'.$user['username'].'</span>';
}


In some areas there fetch_musername() is called, it doesn't send the UserFields along with the UserInfo. So you might want to check to make sure the field exists on the array, first.


if (is_member_of($user, $special_group))
{
if (!array_key_exists('fieldXX', $user)) {$user = fetch_userinfo($user['userid']);}
$my_special_color = $user['fieldXX'];
$user['musername'] = '<span style="color:'.$my_special_color.'">'.$user['username'].'</span>';
}


(Note that if a User's Info is already in the userinfo cache, it will just fetch what's in the cache, but you probably won't run into that problem. If you do, that can be gotten around with an extra line or two of code, to unset that User's $usercache entry. Just post back if you have problems.)

You can specify a Default colour, in case one is not yet set for the user.


if (is_member_of($user, $special_group))
{
if (!array_key_exists('fieldXX', $user)) {$user = fetch_userinfo($user['userid']);}
$my_special_color = ($user['fieldXX']) ? $user['fieldXX'] : $my_default_color;
$user['musername'] = '<span style="color:'.$my_special_color.'">'.$user['username'].'</span>';
}



Note, of course, that you will have to change fieldXX to whatever your field is, and set a value for $special_group. I do recommend that you use a User Profile Field, too, although you CAN make an extra field right on the user table. (That's actually what I did myself before I found out about user Profile Fields and felt dumb for doing so, heh.)

Post back if you have any questions or run into any problems.

--------------- Added 1308244982 at 1308244982 ---------------

Oh, as for that marquee, I have something similar, but it was a rainbow text I programmed for my members who want to act all gay.

Use the fetch_musername hook again, and this code:


$len = 16;
$base='123456789abcdefghijklmnopqrstuvwxyzABCDEFGH IJKLMNOPQRSTUVWXYZ';
$max=strlen($base)-1;
$randstr='';
mt_srand((double)microtime()*1000000);
while (strlen($randstr)<$len+1) {$randstr .= $base[mt_rand(0,$max)];}
$user['musername'] = '
<span id="spastic_username_container_'.$randstr.'">' . $user['username'] . '</span>
<script type="text/javascript">
set_as_spastic(document.getElementById(\'spastic_u sername_container_'.$randstr.'\'),\''.$user['username'].'\');
</script>';


That Random String bit is important because each place a name occurs has to have a random ID. Don't worry, though--it doesn't take a lot of processing power, even though it looks kind of complicated. XD

ALSO, you must enter the following javaScript into your headinclude template:



<script type="text/javascript">

function set_as_spastic(el,name)
{
var randid = 0;
randid = Math.floor(Math.random() * 102400);
//randid = randint(12);
el.id = 'spastic_username_container_' + randid;
spastic_Timer[randid] = 0;
spastic_index[randid] = 0;
spastic_letters[randid] = name.split("");
setInterval("spastic_username("+randid+")", 50);
}


function randint(len)
{
var chars = "0123456789";
if (!len) {len=8;}
var randomstring = '';
for (var i=0; i<len; i++)
{
var rnum = Math.floor(Math.random() * chars.length);
randomstring += chars.substring(rnum,rnum+1);
}
return randomstring;
}


var spastic_Timer = new Array();
var spastic_index = new Array();
var spastic_letters = new Array();

function spastic_username(idstring)
{
var colors = new Array('ff00ff', 'ff0099', 'ff0000', 'ff9900', 'ffff00', '99ff00', '00ff00', '00ff99', '00ffff', '0099ff', '0000ff', '9900ff');
var bgcolors = new Array('880088', '880033', '880000', '883300', '888800', '338800', '008800', '008833', '008888', '003388', '000088', '330088');
spastic_index[idstring]++;
if (spastic_index[idstring] > colors.length-1) {spastic_index[idstring] = 0;}
var temp_index = spastic_index[idstring];
var output = '';
for (var i=0; i<spastic_letters[idstring].length; i++)
{
if (temp_index > colors.length-1) {temp_index = 0;}
output += '<span style="color:#'+colors[temp_index]+'; background-color:#'+bgcolors[temp_index]+';">' + spastic_letters[idstring][i] + '</span>';
temp_index++;
}
document.getElementById('spastic_username_containe r_'+idstring).innerHTML = output;
}
</script>


Just change the values in the colors and bgcolors array in the JavaScript to however you want. The values I have in there now are rainbow-ish, but you can set them however you want. Tinker around with it and see how you like it.

--------------- Added 1308245060 at 1308245060 ---------------

Oh! One more thing... When you put that Script into your headinclude template, you might have to wrap <vb:literal></vb:literal> tags around it, due to the curly braces.

AK Houston
06-16-2011, 05:33 PM
Thanks man! Big help!

Sarteck
06-16-2011, 05:48 PM
No prob. :> I know how much members like them fancy names. XD

AK Houston
06-16-2011, 05:53 PM
whats the HTML markup for the marquee?

and when i do the profile field, what type of text box do i use?

Sarteck
06-16-2011, 06:02 PM
whats the HTML markup for the marquee?



$user['musername'] = '
<span id="spastic_username_container_'.$randstr.'">' . $user['username'] . '</span>
<script type="text/javascript">
set_as_spastic(document.getElementById(\'spastic_u sername_container_'.$randstr.'\'),\''.$user['username'].'\');
</script>';


That makes it so the SPAN element is "set as spastic," which is my way for saying it's set for the JavaScript to execute. :>

and when i do the profile field, what type of text box do i use?

I'd use a Single-Selection Menu, but that's just my preference.

AK Houston
06-16-2011, 06:19 PM
do you think if i gave you developer for my forum for a couple of minutes you could do it for me? appreciation would be much given :)

Sarteck
06-16-2011, 08:05 PM
https://vborg.vbsupport.ru/external/2011/06/31.png


I be having a wee bit of trouble getting this part of his plugin to work, heh.

On the profile_fetch_profilefields hook, I have the following code:



if ($profilefield['profilefieldid'] == '16')
{
$startbox = '<div style="border:1px solid #000000; margin:1px;padding:1px;"><h2>Gold Membership Extras</h2><br />';
$endbox = '</div>';


$data = unserialize($profilefield['data']);
$selectbits = '';
$foundselect = 0;
foreach ($data AS $key => $val)
{
$key++;
$selected = '';
if ($vbulletin->userinfo["$profilefieldname"])
{
if (trim($val) == $vbulletin->userinfo["$profilefieldname"])
{
$selected = 'selected="selected"';
$foundselect = 1;
}
}
else if ($profilefield['def'] AND $key == 1)
{
$selected = 'selected="selected"';
$foundselect = 1;
}
$templater = vB_Template::create('userfield_select_option');
$templater->register('key', $key);
$templater->register('selected', $selected);
$templater->register('val', $val);
$selectbits .= $templater->render();
}
if ($profilefield['optional'])
{
if (!$foundselect AND (!empty($vbulletin->userinfo["$profilefieldname"]) OR $vbulletin->userinfo["$profilefieldname"] === '0'))
{
$optional = $vbulletin->userinfo["$profilefieldname"];
}
$templater = vB_Template::create('userfield_optional_input');
$templater->register('optional', $optional);
$templater->register('optionalname', $optionalname);
$templater->register('profilefield', $profilefield);
$templater->register('tabindex', $tabindex);
$optionalfield = $templater->render();
}
if (!$foundselect)
{
$selected = 'selected="selected"';
}
else
{
$selected = '';
}
$show['noemptyoption'] = iif($profilefield['def'] != 2, true, false);
$templater = vB_Template::create('userfield_select');
$templater->register('optionalfield', $optionalfield);
$templater->register('profilefield', $profilefield);
$templater->register('profilefieldname', $profilefieldname);
$templater->register('selectbits', $selectbits);
$templater->register('selected', $selected);
$custom_field_holder = $templater->render();

$templater = vB_Template::create($wrapper_template);
$templater->register('custom_field_holder', $custom_field_holder);
$templater->register('profilefield', $profilefield);
$returnval = $startbox.$templater->render().$endbox;
//if ($vbulletin->userinfo['userid'] == 533) {die($returnval.'<!-- test -->');}
return $returnval;
}


Now, when I uncomment //if ($vbulletin->userinfo['userid'] == 533) {die($returnval.'<!-- test -->');}, I get the expected output--the field is wrapped in between my "$startbox" and "$endbox" values. However, left commented, there is nothing that gets changed.

Could someone maybe point out a mistake I might be making?

Sarteck
06-18-2011, 02:38 AM
In some areas there fetch_musername() is called, it doesn't send the UserFields along with the UserInfo. So you might want to check to make sure the field exists on the array, first.


if (is_member_of($user, $special_group))
{
if (!array_key_exists('fieldXX', $user)) {$user = fetch_userinfo($user['userid']);}
$my_special_color = $user['fieldXX'];
$user['musername'] = '<span style="color:'.$my_special_color.'">'.$user['username'].'</span>';
}



If anyone happens to use this thread as a reference for anything, take note that I made a mistake here. Calling fetch_userinfo() inside of the fetch_musername hook is not a good idea. Instead, it should be written like this:


if (is_member_of($user, $special_group))
{
if (!array_key_exists('fieldXX', $user))
{
global $vbulletin;
$tempuser = $vbulletin->db->query_first(sprintf("SELECT fieldXX FROM ".TABLE_PREFIX."userfield WHERE userid=%d",$user['userid']));
$user['fieldXX'] = $tempuser['fieldXX'];
}
$my_special_color = $user['fieldXX'];
$user['musername'] = '<span style="color:'.$my_special_color.'">'.$user['username'].'</span>';
}