The Arcive of Official vBulletin Modifications Site.It is not a VB3 engine, just a parsed copy! |
|
#1
|
|||
|
|||
Calculation on date profile fields
This might be a tricky one and I am counting on those who are smarter as I am to help me
Scenario: Our members must attend at least 1 meeting every 12 months to retain membership. I created 2 custom user fields (field 16 and 19) where we enter the dates from the last 2 meetings they attended. Data is entered like 2012-12-01. What we need: First we have to see which field is closest to TODAY (actual date) Then we have to use that field and calculate how many days are left from TODAY they are still member. For example TODAY = 2012-09-03 and the last meeting = 2012-08-03 The output should be 365 (days in a year) minus 31 (difference from TODAY and Last Meeting) and should say something like "Your membership will expire in xxx days" Hope somebody can help me Thanks |
#2
|
|||
|
|||
Here's a test program that seems to work:
Code:
$field1 = "2012-08-03"; $field2 = "2010-08-03"; $last_meeting = strtotime($field1); if (($t = strtotime($field2)) AND ($t > $last_meeting)) { $last_meeting = $t; } if ($last_meeting) { $days_left = intval(365 - ((time() - $last_meeting) / 86400)) + 1; echo "$days_left days left in membership"; } else { echo "Failed to find any valid meeting dates"; } (Of course this just shows the calculation, you'll need to change it to use your profile fields and do something with the value other than echo it). |
#3
|
|||
|
|||
thx for the quick reply.
I have been playing around with it and tried to put it in a php forum block: Code:
$field1 = "2005-09-02"; $field2 = "2005-09-02"; $last_meeting = strtotime($field1); if (($t = strtotime($field2)) AND ($t > $last_meeting)) { $last_meeting = $t; } if ($last_meeting) { $days_left = intval(365 - ((time() - $last_meeting) / 86400)) + 1; } else { $days_left= "Overdue"; } return $days_left; Normally when those fields exceed the 365 days I think I should see the output from the "else" statement ("overdue") but instead I get a minus value (for example: -640) |
#4
|
||||
|
||||
add
Code:
AND ($t <= 365) |
#5
|
|||
|
|||
This didn't do it.
Maybe I explained wrong: When the result of Code:
$days_left = intval(365 - ((time() - $last_meeting) / 86400)) + 1; If the result of Code:
$days_left = intval(365 - ((time() - $last_meeting) / 86400)) + 1; Thanks for trying to help guys. Appreciate it |
#6
|
|||
|
|||
The "else" in the code I posted was the case where there was no last meeting date entered in either field (or the format was invalid or something like that). If in that situation you want it to display the "overdue" message, then you could use something like this:
Code:
$field1 = "2005-09-02"; $field2 = "2005-09-02"; $last_meeting = strtotime($field1); if (($t = strtotime($field2)) AND ($t > $last_meeting)) { $last_meeting = $t; } if ($last_meeting) { $days_left = intval(365 - ((time() - $last_meeting) / 86400)) + 1; } if (!isset($days_left) OR $days_left < 0) { $days_left= "Overdue"; } return $days_left; A couple other things I should mention - because it uses timestamps, if there is a "leap day" between the last meeting day and today, that will add an extra day (i.e. it will show their membership as expiring one day earlier). And the "+ 1" at the end of the calculations rounds up, so that if there is a fraction of a day left it will show as 1 day. If you'd rather have a fraction show as 0 (have it say "0 days left" on their last day) you could remove the + 1. Also, this may mean that you want the condition to be "< 1" instead of "< 0" to display the overdue message. Also, you'll probably want to remove the $field1 and $field2 variables and replace them with $vbulletin->userinfo['fieldX'] and $vbulletin->userinfo['fieldY'] (where X and Y are the numbers of your custom fields). One more thing - if you're using a PHP type forum block, you probably need to set the "Cache Time" to 0 for it to work correctly. |
#7
|
|||
|
|||
WOW.... Thanks so much.
Works perfect now. As I am a complete beginner with coding I just want to share my full block code for those who are not that familiar either. Don't know if it is perfect but it gives me the right display: Code:
$field1 = "2012-09-02"; $field2 = "2007-09-02"; $text1 = "TCMAS membership expires in "; $text2 = " days!"; $last_meeting = strtotime($field1); if (($t = strtotime($field2)) AND ($t > $last_meeting)) { $last_meeting = $t; } if ($last_meeting) { $days_left = intval(365 - ((time() - $last_meeting) / 86400)) + 1; } if (!isset($days_left) OR $days_left < 0) { $days_left= "TCMAS membership expired"; } else { $days_left= ($text1.$days_left.$text2); } return $days_left; |
|
|
X vBulletin 3.8.12 by vBS Debug Information | |
---|---|
|
|
More Information | |
Template Usage:
Phrase Groups Available:
|
Included Files:
Hooks Called:
|