Go Back   vb.org Archive > vBulletin 4 Discussion > vB4 Programming Discussions
  #1  
Old 07-26-2014, 07:02 PM
Dax IX Dax IX is offline
 
Join Date: Jul 2005
Posts: 153
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Custom Page: Permission based on age?

Please forgive me, I'm very new to PHP and vB programming.

For a custom page I'm creating, I'm trying to create access permissions based on a user's age.

For a function that I've placed in an external functions_*.php file, I've done what I *think* calculates the logged in user's age, but now I'm not so sure, because my access permissions aren't working. I've borrowed code from memberlist.php to calculate the user's age and return either their age or false.

PHP Code:
function calculate_age($userinfo)
{
    
    global 
$vbulletin;
    
    if (!isset(
$userinfo['birthday']))
    {
        return 
false;        
    } else {
        
        
$today_year vbdate('Y'TIMENOWfalsefalse);
        
$today_month vbdate('n'TIMENOWfalsefalse);
        
$today_day vbdate('j'TIMENOWfalsefalse);

        
$bday explode('-'$userinfo['birthday']);
        
        if (
date('Y') > $bday[2] AND $bday[2] > 1901 AND $bday[2] != '0000')
        {
            if (
$today_year $bday[2] AND $bday[2] != '0000')
            {
                
$userinfo['age'] = $today_year $bday[2];
                if (
$bday[0] > $today_month)
                {
                    
$userinfo['age']--;
                }
                else if (
$bday[0] == $today_month AND $today_day $bday[1])
                {
                    
$userinfo['age']--;
                }
            }
            else
            {
                return 
false;
            }
            
            if (!
$userinfo['age'] AND ($userinfo['age'] < 18))
            {
                return 
false;
            } else {
                return 
$userinfo['age'];
            }
        } else {
            return 
false;
        }
    }

Then, after including the function file, to try to calculate permissions based on the calculate_age() function, I used this:

PHP Code:
$age calculate_age($userinfo);

// access permissions
if ((!is_member_of($vbulletin->userinfo567)) OR ((!isset($age)) AND ($age != '$nbsp;')) OR ($age 18))  
{
// give no permission unless in usergroup x, y, or z
        
print_no_permission();

But, no matter what I do, I don't have permission to view this page's content.

Would anyone mind giving me some pointers as to where I'm going wrong?

Thanks!
Reply With Quote
  #2  
Old 07-26-2014, 07:17 PM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

If I'm following this correctly, I think the condition should be:

PHP Code:
// access permissions
if ((!is_member_of($vbulletin->userinfo567)) AND ((!isset($age)) OR ($age == '$nbsp;') OR ($age 18)))
{
// give no permission unless in usergroup x, y, or z
        
print_no_permission();


I'm assuming that if age isn't set or it's set to nbsp that the user won't have permission.
Reply With Quote
  #3  
Old 07-26-2014, 08:00 PM
Dax IX Dax IX is offline
 
Join Date: Jul 2005
Posts: 153
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Thank you.

I think that helped, but I'm still not getting the results I'm looking for.

I'm pretty sure I've translated something in my function code wrong, but I just can't see where.

This is now my function:
PHP Code:
function calculate_age($userinfo)
{
    
    global 
$vbulletin;
    
    if (!isset(
$userinfo['birthday']))
    {
        return 
false;        
    } else {
        
        
$today_year date('Y');
        
$today_month date('n');
        
$today_day date('j');

        
$bday explode('-'$userinfo['birthday']);
        
        if (
date('Y') > $bday[2] AND $bday[2] > 1901 AND $bday[2] != '0000')
        {
            if (
$today_year $bday[2] AND $bday[2] != '0000')
            {
                
$userinfo['age'] = $today_year $bday[2];
                if (
$bday[0] > $today_month)
                {
                    
$userinfo['age']--;
                }
                else if (
$bday[0] == $today_month AND $today_day $bday[1])
                {
                    
$userinfo['age']--;
                }
            }
            else
            {
                return 
false;
            }
            
            if (!isset(
$userinfo['age']) AND ($userinfo['age'] < 18))
            {
                return 
false;
            } else {
                return 
$userinfo['age'];
            }
        } else {
            return 
false;
        }
    }

Here's what I have now for my permissions statement:
PHP Code:
$age calculate_age($userinfo);

// access permissions
if ((!is_member_of($vbulletin->userinfo567)) OR (!$age))  
{
// give no permission unless in usergroup x, y, or z
        
print_no_permission();

Reply With Quote
  #4  
Old 07-26-2014, 09:21 PM
Scanu's Avatar
Scanu Scanu is offline
 
Join Date: Nov 2010
Posts: 829
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

There are easier functions to calculate age from birthday, give a look here: http://stackoverflow.com/questions/3...-calculate-age
Reply With Quote
  #5  
Old 07-26-2014, 09:39 PM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Dax IX View Post
Here's what I have now for my permissions statement:
PHP Code:
$age calculate_age($userinfo);

// access permissions
if ((!is_member_of($vbulletin->userinfo567)) OR (!$age))  
{
// give no permission unless in usergroup x, y, or z
        
print_no_permission();

It seems like that should be AND. Like if they're not an admin or moderator and they are younger than 18, then no permission.
Reply With Quote
  #6  
Old 07-26-2014, 10:05 PM
tbworld tbworld is offline
 
Join Date: Oct 2008
Posts: 2,126
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

The problem you are having is the user condition $userinfo['showbirthday'], which alters when $age is valid in the vbulletin code. In reality all you need to check is if $userinfo['birthday'] is valid.

Using @Scanu suggestion, this is all you need -- although, that code needs to be fully vetted. I believe $userinfo['birthday'] should be properly validated from vBulletin. I would re-validate it if you run many modifications, that might tamper with it.

Code:
   // For testing purposes use an expanded format,
   //   you can always combine terms after you have it working.


    // Exempt: smods, mods, admins    
    if (!is_member_of($vbulletin->userinfo, 5, 6, 7))
    {
        // Should already be validated if comming from vbulletin.
        //   or add additional validation to be on the safe side.
        if (!empty($userinfo['birthday']) && ($userinfo['birthday'] != '&nbsp;')) 
        {  
            $birthdate = $userinfo['birthday'];
            $birthdate = explode("-", $birthdate);
              
            //Calculate Age (@Scanu's suggestion)
            $age = (date("md", date("U", mktime(0, 0, 0, $birthdate[0], $birthdate[1], $birthdate[2]))) > date("md")  
                  ? ((date("Y") - $birthdate[2]) - 1) : (date("Y") - $birthdate[2]));
           
             // $Age Check
             if (isset($age) && ($age < 18)) 
             {
                    print_no_permission();
              }    
          }      
      }
Reply With Quote
  #7  
Old 07-26-2014, 10:26 PM
Dax IX Dax IX is offline
 
Join Date: Jul 2005
Posts: 153
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Thanks everyone for their help!

I have it working MUCH more simply now, thanks to suggestions here.

Yes, ordinarily it would be AND, but in this case, while I'm testing some things, it's OR.

Age will be a big factor in what I'm working on, used on several pages, therefore I wanted to do it as a function, which I now have.

PHP Code:
function calculate_age($userinfo)
{    
    global 
$vbulletin;
    
    if (!isset(
$vbulletin->userinfo['birthday']))
    {
        return 
false;        
    } else {
        
$bday explode('-'$vbulletin->userinfo['birthday']);
        
$bday $bday[2] . '-' $bday[0] . '-' $bday[1];
        
$age floor( (strtotime(date('Y-n-j')) - strtotime($bday)) / 31536000);
        return 
$age;
    }

And I have my permissions code:
PHP Code:
$age calculate_age($userinfo);

// access permissions
if ((!is_member_of($vbulletin->userinfo567)) OR ($age 18))
{
// give no permission unless in usergroup x, y, or z
        
print_no_permission();

Thanks again, all!

The only thing I'm confused about now is why I can't seem to use $userinfo['birthday'] instead of $vbulletin->userinfo['birthday'] in my function file.

If it's not to much to ask, what is the explanation of that?

--------------- Added 27 Jul 2014 at 15:22 ---------------

Stupid question. I just figured it out.

--------------- Added 27 Jul 2014 at 15:57 ---------------

Even better age code, borrowed from class_userprofile.php and modified to fit:

PHP Code:
function prepare_age($userinfo)
{
    global 
$vbulletin;
    
    
$userinfo $vbulletin->userinfo;
    
$userid $userinfo['userid'];

    
$age '';

    if (
$userinfo['birthday'])
    {
        
$bday explode('-'$userinfo['birthday']);

        
$year vbdate('Y'TIMENOWfalsetruetruefalse$userid);
        
$month vbdate('n'TIMENOWfalsetruetruefalse$userid);
        
$day vbdate('j'TIMENOWfalsetruetruefalse$userid);
        if (
$year $bday[2] AND $bday[2] != '0000')
        {
            
$age $year $bday[2];
            if (
$month $bday[0] OR ($month == $bday[0] AND $day $bday[1]))
            {
                
$age--;
            }
        }
    }
    
    return 
$age;

Reply With Quote
Reply

Thread Tools
Display Modes

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 07:00 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.04831 seconds
  • Memory Usage 2,294KB
  • Queries Executed 11 (?)
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
  • (1)bbcode_code
  • (9)bbcode_php
  • (1)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (7)post_thanks_box
  • (7)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (7)post_thanks_postbit_info
  • (7)postbit
  • (7)postbit_onlinestatus
  • (7)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
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete