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 01-10-2011, 05:58 PM
richy96's Avatar
richy96 richy96 is offline
 
Join Date: Apr 2008
Location: England
Posts: 93
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default 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
Reply With Quote
  #2  
Old 01-10-2011, 06:18 PM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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 a template and not have to do any special js (although I guess the above needs some quotes if it's a string value).


In any case, the javafields line would need curly braces like this:
Code:
<div id='JUSERLOC' style='display:none;'>{$vbulletin->javafields['fullLocation']}</div>
and the other $bbuserinfo line you had a problem with needs the single quotes removed (or it may also work if you surrounded it with curly braces).

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.
Reply With Quote
  #3  
Old 01-10-2011, 09:12 PM
richy96's Avatar
richy96 richy96 is offline
 
Join Date: Apr 2008
Location: England
Posts: 93
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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
Reply With Quote
  #4  
Old 01-10-2011, 10:18 PM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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).
Reply With Quote
  #5  
Old 01-11-2011, 04:43 PM
richy96's Avatar
richy96 richy96 is offline
 
Join Date: Apr 2008
Location: England
Posts: 93
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

@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
Attached Images
File Type: jpg femprof.jpg (48.1 KB, 0 views)
File Type: jpg cplprof.jpg (66.3 KB, 0 views)
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 11:33 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.10147 seconds
  • Memory Usage 2,237KB
  • Queries Executed 14 (?)
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
  • (2)bbcode_code
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (5)post_thanks_box
  • (5)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (5)post_thanks_postbit_info
  • (5)postbit
  • (2)postbit_attachment
  • (5)postbit_onlinestatus
  • (5)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_postinfo_query
  • fetch_postinfo
  • 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
  • postbit_attachment
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete