vb.org Archive

vb.org Archive (https://vborg.vbsupport.ru/index.php)
-   vB4 Programming Discussions (https://vborg.vbsupport.ru/forumdisplay.php?f=252)
-   -   Dynamic custom profile field (https://vborg.vbsupport.ru/showthread.php?t=284116)

Carpesimia 06-07-2012 06:22 PM

Dynamic custom profile field
 
Ok, heres what I WANT to accomplish.

In usercp, allow the user to enter "YEAR YOU BECAME A MEMBER". The user might enter the year of "1986" for example.

Then, on the user PROFILE page, I want one of the entries to say "Member: 26 years".

How do I do this? I had an idea in my head of a second hidden field that I would run a cron nightly to fill in the numbers, but that seems like overkill.

Anyone?

kh99 06-07-2012 06:43 PM

You could add it to the join date, like the age is done with the birthday. Create a plugin using hook userprofile_prepare and code like this:

Code:

if ($field == 'joindate')
{
    $this->prepare_joindate();
    $jd = vbdate('Y', $this->userinfo['joindate']);
    $td = vbdate('Y', TIMENOW);
    $years = $jd - $td;
    $this->prepared['joindate'] .= " (Member for $years years)";
    $handled = true;
}


Obvious you could expand that to go to months if they joined less than a year ago, etc. (BTW, look in includes/class_userprofile.php to see what's going on).

Carpesimia 06-07-2012 07:03 PM

Quote:

Originally Posted by kh99 (Post 2337543)
You could add it to the join date, like the age is done with the birthday.

First, thank you.

I actually used "year became member" as a generic example. The date in quesiton has nothing to do with how long the person has been a member on the forum. How would I do the above using a custom profile field instead of joindate?

kh99 06-07-2012 07:54 PM

OK, first of all I posted something by accident that wasn't ready, then I deleted it and realized that it had merged with my previous post, so that got deleted too. But it's OK, I think I have a better answer for you: as you said in your first post, you want to work with custom profile fields, which aren't handled the same way that the built in ones are.

So here's some code for a plugin using hook member_profileblock_profilebit:

Code:

if ($profilefield['profilefieldid'] == X)
{
    $td = intval(vbdate('Y', TIMENOW));
    $joinyear = intval($this->profile->userinfo['fieldX']);
    if ($joinyear > 0 && $joinyear < 100)
    {
        $joinyear += ($joinyear < ($td - 2000) ? 2000 : 1900); // fix 2 digit years.
    }
    if ($joinyear > 0 && $joindate <= $td)
    {
        $profilefield['value'] .= " (Member for " . ($td - $joinyear)  . " Years)";
    }
}


The X's in red need to be replaced with the id of your year profile field. But I think they also don't need to be the same: you could probably create a text field just for holding the "Member for X years" message and have it set dynamically by ths code. In that case the first X would be the text field, and the second X the Year field.

Carpesimia 06-07-2012 09:24 PM

kh99,

Thanks again. I actually did something VERY similar to what you have. I have a custom profile field with the title "Year Began Bowling". On the view profile page (member.php), I used the same hook you did and put this in my plugin:

if ($profilefield['title'] == "Year Began Bowling") {

$profilefield['title'] = "Years Bowling";
$doit = intval($profilefield['value']);
if ($doit > 1900 && $doit < 2100) {
$year = intval(date("Y"));
$diff = $year - $doit;
$profilefield['value'] = "$diff years";
}

}

This changes the title to "Years bowling", and then shows the number of years if they put in a year between 1900 and 2100. This custom field already existed in our system as "Years Bowling", so I let thier old values still stay just like they used to. The ONLY differences to the end user are 1) Now asks for the year when filling out the profile, and 2) Autocomputes if a valid year was entered. I only add " years" on an autocompute, so we know it was autocomputed.

I'll probably modify my code to use the CORRECT fields instead of the profilefield['title'], but other than that the code is working like a charm.

Thanks so much for the shove in the right direction!

kh99 06-07-2012 09:28 PM

That is pretty much the same. I guess I'm used to people wanting things written for them instead of just asking for some info. :)


Quote:

Originally Posted by Carpesimia (Post 2337579)
I'll probably modify my code to use the CORRECT fields instead of the profilefield['title'], but other than that the code is working like a charm.


I don't think there's anything wrong with using the title instead of the id.


All times are GMT. The time now is 12:07 PM.

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.01102 seconds
  • Memory Usage 1,731KB
  • Queries Executed 10 (?)
More Information
Template Usage:
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (2)bbcode_code_printable
  • (2)bbcode_quote_printable
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)post_thanks_navbar_search
  • (1)printthread
  • (6)printthreadbit
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • showthread
Included Files:
  • ./printthread.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/class_bbcode_alt.php
  • ./includes/class_bbcode.php
  • ./includes/functions_bigthree.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
  • printthread_start
  • bbcode_fetch_tags
  • bbcode_create
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • printthread_post
  • printthread_complete