PDA

View Full Version : Bitwise checking problem with PHP code in plugin


thalamus
12-18-2007, 12:43 AM
I hope the title's descriptive enough... ;)

Basically, I'm writing a plugin that hooks into the postbit_display_complete function, where I'm bringing in a user-defined profile field ("field5") that has, for its content, a multiple selection. I know that these are bit-set (i.e. & 1, & 2 etc for the options selected) and if I post it directly into the template as an '<if condition="$post[field5] & 1">' and so on for all the relevant bit fields, it works great.

Now I'm putting it into a plugin, to avoid core template changes on upgrades, and I'm trying to set the relevant variables within the plugin PHP code. The problem is, that I can't seem to get vBulletin to recognise that the $post[field5] value is a numeric...

The code I'm using is this (following this is a template str_replace):

$wnum = intval($this->post['field5']);
if ($wnum > 0) {
$add .= '<div>|$wnum|';
if ($wnum & 1) $add .= 'bit 1 set code';
if ($wnum & 2) $add .= 'bit 2 set code';
if ($wnum & 4) $add .= 'bit 4 set code';
if ($wnum & 8) $add .= 'bit 8 set code';
$add .= '</div>';
}

but $wnum always comes out as 0. I've also tried $wnum = vb_number_format($this->post['field5']) but same thing... doesn't really pick up the number.

Now, if I output the value to the template as in:

$wnum = intval($this->post['field5']);
$add .= '<div>Value: $wnum</div>';

it outputs the correct value.

Any thoughts or am I missing something really simple?

Marco van Herwaarden
12-18-2007, 07:11 AM
$this should only be used inside a class, where is this code located?

thalamus
12-19-2007, 03:41 PM
It's in the plugin PHP code.

Guest190829
12-19-2007, 03:47 PM
Yes, but what hook?

TigerWare
12-19-2007, 04:37 PM
Yes, but what hook?

He alread said.

postbit_display_complete

thalamus
12-20-2007, 01:39 AM
Yep - 'postbit_display_complete'.

All the other code I place into the plugin for that hook works fine (I won't even count the number of debug lines for output that I've put in there with other class variables... and they all work) but it's just the process of picking up this particular field as the value it's supposed to be, and being able to do a bitwise operation on it.

Marco van Herwaarden
12-21-2007, 07:58 AM
As already replied, you can not use $this outside of the class. You wil need the name of the object that using that class, ie. something like $postinfo->post['field5']. (replace $postinfo with the variable name used on that place.

thalamus
12-21-2007, 04:02 PM
I appreciate what you say, but by using it in the context of the plugin, it should pick up the object name. For instance, I have always used:

$vbulletin->templatecache[$this->templatename] = str_replace($find, $add, $vbulletin->templatecache[$this->templatename]);

where applicable within plugin code (for template replacements) and this has worked perfectly.

Additionally, as mentioned above, when I output the value of the contents of $wnum = intval($this->post['field5']); it echoes the correct value relative to the postbit output (one example is options 4 and 9 of field5 are set, bitvals = 8 + 512; the output on the postbit is 520 which is correct). The only problem I get is when I try to treat the $wnum as an int and not a string (to make a bitwise operation on it) that it falls over.

<edit> I've now tried it with just:$wnum = intval($post[field5]); and $wnum = $post[field5]; both of which output the correct value (520) but neither of which can be used within the plugin code to evaluate bits set...

thalamus
12-24-2007, 04:16 PM
After checking other methods, I still can't seem to get the code to pick up a bitwise condition on the value.

So if it can't be done, does anyone have any ideas as to how I can define instructions within a plugin, based upon the bit-values of custom profile fields?

i.e.:
Custom Profile Fields set to a multiple selection box (call it Languages Spoken), users can select more than one that they can speak (i.e. English, French, German). These are called "field5".

Based on this, a plugin would pick up the value of 'field5' and check the bits set in the value (see which languages were selected) and, based on this value, a country flag is placed in the user's profile information bit on the forum posts. Therefore, if a user selectes english (bit 1), French (bit 2) and German (bit 3) = 1+2+4 then the userpostbit (say under the number of posts made by user) says "Languages: " then the UK, FR and DE flags are displayed.

As I said I know this can be done with a direct edit of the postbit/postbit_legacy template, but surely there has to be a way to place this into a plugin, in order to minimize direct edits of the default templates? Or is this simply not incorporated yet into the vbulletin plugin facilities/functions?

Antivirus
12-28-2007, 03:50 AM
There's a bunch of $template_hook locatons within both postbit templates. Simply eval your custom template to one of these template hook variables.

thalamus
12-30-2007, 12:10 AM
Thank you antivirus... that certainly did the trick :) I eval'd the template_hook at the end of the user info panel on the postbit and had to set up a custom template with the details...

But although it worked, I'm still convinced that there must be a way to actually use the values of the bit variables on the custom profile fields as pure php code within the plugins, and not a pseudo-mix of a template glue-together system...

Anyway many thanks for the suggestion - at least it works :)