Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 12-18-2007, 12:43 AM
thalamus's Avatar
thalamus thalamus is offline
 
Join Date: Sep 2005
Location: UK
Posts: 66
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Bitwise checking problem with PHP code in plugin

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):
Code:
$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:
Code:
$wnum = intval($this->post['field5']); 
$add .= '<div>Value: $wnum</div>';

it outputs the correct value.

Any thoughts or am I missing something really simple?

Reply With Quote
  #2  
Old 12-18-2007, 07:11 AM
Marco van Herwaarden Marco van Herwaarden is offline
 
Join Date: Jul 2004
Posts: 25,415
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

$this should only be used inside a class, where is this code located?
Reply With Quote
  #3  
Old 12-19-2007, 03:41 PM
thalamus's Avatar
thalamus thalamus is offline
 
Join Date: Sep 2005
Location: UK
Posts: 66
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

It's in the plugin PHP code.
Reply With Quote
  #4  
Old 12-19-2007, 03:47 PM
Guest190829
Guest
 
Posts: n/a
Default

Yes, but what hook?
Reply With Quote
  #5  
Old 12-19-2007, 04:37 PM
TigerWare TigerWare is offline
 
Join Date: Feb 2007
Location: England, UK
Posts: 282
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Danny.VBT View Post
Yes, but what hook?
He alread said.

Quote:
Originally Posted by thalamus View Post
postbit_display_complete
Reply With Quote
  #6  
Old 12-20-2007, 01:39 AM
thalamus's Avatar
thalamus thalamus is offline
 
Join Date: Sep 2005
Location: UK
Posts: 66
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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.
Reply With Quote
  #7  
Old 12-21-2007, 07:58 AM
Marco van Herwaarden Marco van Herwaarden is offline
 
Join Date: Jul 2004
Posts: 25,415
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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.
Reply With Quote
  #8  
Old 12-21-2007, 04:02 PM
thalamus's Avatar
thalamus thalamus is offline
 
Join Date: Sep 2005
Location: UK
Posts: 66
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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:
Code:
$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...
Reply With Quote
  #9  
Old 12-24-2007, 04:16 PM
thalamus's Avatar
thalamus thalamus is offline
 
Join Date: Sep 2005
Location: UK
Posts: 66
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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?
Reply With Quote
  #10  
Old 12-28-2007, 03:50 AM
Antivirus's Avatar
Antivirus Antivirus is offline
 
Join Date: Sep 2004
Location: Black Lagoon
Posts: 1,090
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

There's a bunch of $template_hook locatons within both postbit templates. Simply eval your custom template to one of these template hook variables.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 12:16 AM.


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.04943 seconds
  • Memory Usage 2,260KB
  • Queries Executed 13 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (3)bbcode_code
  • (2)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (1)pagenav
  • (1)pagenav_curpage
  • (1)pagenav_pagelink
  • (10)post_thanks_box
  • (10)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (10)post_thanks_postbit_info
  • (10)postbit
  • (9)postbit_onlinestatus
  • (10)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.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/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.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
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • pagenav_page
  • pagenav_complete
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete