The Arcive of Official vBulletin Modifications Site.It is not a VB3 engine, just a parsed copy! |
|
#1
|
||||
|
||||
How do I declare a variable or array that is available in templates?
HI
I've read some similar posts to this but can't seem to find an answer that works for me What I am doing is passing some additional user data to the browser, so javascript can use it to re-format the display of members profiles Currently I have some AJAX doing this (modification done by another programmer) but I am trying to do away with the inneficient AJAX stuff by passing all the data I need in trhe first place What I have is some code like this in the footer template $ad_location[ad_footer_start] <div id='JUID' style='display:none;'>$bbuserinfo[userid]</div> <div id='JUSERNAME' style='display:none;'>$bbuserinfo[username]</div> <div id='JUSERPC' style='display:none;'>$bbuserinfo[field6]</div> This works fine and I have a file member.js which uses this 'hidden data' and that works hunky-dory I am now trying to pass some additional data that is not available in 'normal' vbulletin arrays So I have in member.php $Javafields = array( 'fullLocation' => findFullLocationFromPostcode($userinfo['field6'])); and in the footer template $ad_location[ad_footer_start] <div id='JUID' style='display:none;'>$bbuserinfo[userid]</div> <div id='JUSERNAME' style='display:none;'>$bbuserinfo[username]</div> <div id='JUSERPC' style='display:none;'>$bbuserinfo[field6]</div> <div id='JUSERLOC' style='display:none;'>$Javafields[fullLocation]</div> I know that $Javafields[fullLocation] contains the desired information in member.php as I am using FirePHP to debug and I can clearly see it is there - but by the time it gets to the footer template the data must be null as it is not output in the HTML So I thought.... this is to do with scope of the array I am declaring Next I did a bit of reading on here and tried this: $vbulletin->javafields = array( 'fullLocation' => findFullLocationFromPostcode($userinfo['field6']) ); using FirePHP again I can see $vbulletin->javafields['fullLocation'] contains the desired data in the footer template I tried <div id='JUSERLOC' style='display:none;'>$vbulletin->javafields[fullLocation]</div> which produces the text [fullLocation] in the generated HTML and also <div id='JUSERLOC' style='display:none;'>$vbulletin->javafields['fullLocation']</div> which produces the text ['fullLocation'] in the generated HTML getting frustrated now I tried adding a declaring a new field to the $bbuserinfo array in member.php like this $bbuserinfo['fullLocation'] = findFullLocationFromPostcode($userinfo['field6']); in member.php and in the footer template <div id='JUSERLOC' style='display:none;'>$bbuserinfo[fullLocation]</div> which gives nothing in the HTML and finally <div id='JUSERLOC' style='display:none;'>$bbuserinfo['fullLocation']</div> which gives a sytax error when tryng to save teh template So..... here is the question : how do I declare an array in member.php that I can access from the footer template? cheers Rich |
#2
|
|||
|
|||
I think you're having trouble putting things in the footer because that template is actually evaluated in global.php at the beginning of member.php. Is there a reason those need to be in the footer? You could probably put them somewhere else and have it work. Also, you have the part worked out that gets the value in js, but I think you could also do something like:
Code:
<script type="text/javascript"> var jusrerpc = $bbuserinfo[field6]; </script> In any case, the javafields line would need curly braces like this: Code:
<div id='JUSERLOC' style='display:none;'>{$vbulletin->javafields['fullLocation']}</div> But like I said, I don't think it'll work in the footer. If you really need it there you might be able to find a way to do it in an earlier hook in global.php. |
#3
|
||||
|
||||
hi kh99
No not really any reason why they sould be in the footer - just that is where a previous programmer who worked on my site passed some stuff to the javascript so I blindly followed suit.. Since I had these above problems trying to do it, that is probably exactly why he ended up resorting to AJAX to get the stuff he needed! But I would like to think I could do a little better now.... I will have a play with what you suggested above, but Yeah I've been thinking about this myself too (over a beer or three which always seems to level the reasoning lol) The stuff that I can successfully pass to the javascript comes out in the generated html like this : <!-- END TEMPLATE: ad_footer_start --> <div id='JUID' style='display:none;'>71</div> <div id='JUSERNAME' style='display:none;'>Support</div> <div id='JUSERPC' style='display:none;'>ST1</div> And I can then use jquery (for ease of DOM navigation) to do whatever I like with the generated HTML to reformat what the end user sees without making more changes to vbulletin code/templates. Which is nice So anything in a $array or $variable that I can 'see' in the template is easy enough to pass on to client side javascript. So what I am thinking now is.... if I knew where these global arrays like $bbuserfield[] were declared in vbulletin, it would be pretty easy to declare my own custom array in the same way and in the same place - and it stands to reason I would then have my own custom array with the same scope as $bbuserfield to do with whatever I liked from whatever vbulletin php file I wanted to tinker with - and the output 'client side' could be modified with javascript/jquery by adding more fields to my custom global array as I need them and passing them in HTML 'hidden' text That seems a pretty useful goal to me! Do you know where those vbulletin global arrays come from originally? best regards rich |
#4
|
|||
|
|||
Well, I was searching for where $bbuserinfo is set and I learned something - apparently it's not a real variable. There's a function that replaces references to it in templates with $GLOBALS['vbulletin']->userinfo . And that kind of runs up against the limit of my php knowledge - I don't really get the $GLOBALS thing. I guess it's an array of global variables, but then if you can access them that way, why use the 'global' statement? I'll have to look that up when I get a chance...
In any case, I think you probably just want to do your thing using the global_start hook location. ($vbulletin is set up in includes/init.php, to answer your question). |
#5
|
||||
|
||||
@kh99
Hi m8 - well it seems you were exactly correct in your first reply, this problem was not related to the scope of the $javafields[] array I created but in fact it was caused by me trying to output this array in HTML in a template (footer) that had already been evaluated before I declared the array! So I now got it working like this: 1. in member.php at line 432 (immediately after vbulletin creates the blocklist array // Get some data needed by member.js to format the members profile $javafields = array( 'fullLocation' => findFullLocationFromPostcode($userinfo['field6']) ) ; I can add some more fields to this array as needed later. findFullLocationFromPostcode is a self explanatory function I wrote myself. 2. In Template MEMBERLIST which I can see gets evaluated by member.php after I declared my $javafields array Near the start I added I added: $stylevar[htmldoctype] <html xmlns="http://www.w3.org/1999/xhtml" dir="$stylevar[textdirection]" lang="$stylevar[languagecode]"> <head> $headinclude <script src="member.js"></script> <div id='JUSERLOC' style='display:none;'>$javafields[fullLocation]</div> $usercss ............ ............ 3. In HTML source of the profile page this generates <script src="member.js"></script> <div id='JUSERLOC' style='display:none;'>Newcastle-under-Lyme, Staffordshire</div> 4. And then in member.js (my jquery/javascript that reformats the displayed profile page) At the moment the javascript uses AJAX to obtain the full location data for the user from their postcode (only the postcode is stored in the $userinfo[] array) like so: //get postcode var postcode = $('#J6 dd').text(); //alert(postcode); $.ajax({ url: "PostCodeSearch.php?do=PCFULL&pc=" + postcode , success: function(data) { //append location to DD. '#about' is a div id and dd is the first <dd> after that in the HTML DOM $('#aboutdd').append($(data).text()); }, async:false }); Now I can do away with the inefficient AJAX above, and simply refer to the full location in jquery as $('#aboutdd').append($(#JUSERLOC).text()); My site is as I have mentioned before an adult contacts (swingers) site What these mods, and others, basically allow me to do is for example display on users profiles informations such as This Member is xx Miles from you (calculated from my postcodes data file which contain x and y co-ords of all UK postcodes in metres) Also I can output a differently formatted profile page depending on memebr type (male, female, couple etc) Here are a couple examples of how I reformat profile pages depending on member type. These are excerpts of a single female and a couple profile - all the reformatting is done client side in javascript, not by trying to rewrite the templates and adding god knows how many conditionals for each member type! So I guess I am getting better with this vb stuff now so if anyone wants any help how to do similar mods (not that I suspect a lot of folks need them) maybe even I could help someone else for a change lol |
|
|
X vBulletin 3.8.12 by vBS Debug Information | |
---|---|
|
|
More Information | |
Template Usage:
Phrase Groups Available:
|
Included Files:
Hooks Called:
|