PDA

View Full Version : New to VB programming, but not PHP. Simple plugin question


kvnband
03-01-2011, 08:34 PM
OK - I am new to the world of programming products and plugins for VB, but not to PHP development in general. For my first project, I have created 5 custom profile fields in the admincp. We have a large, established user-base, and I need to make sure that these 5 fields are filled out, for tax purposes (We are a non-profit org).

So, how do I proceed? I basically just need to know how I check the logged-in user's custom profile fields at the start of each page load. I assume writing a small plugin is the way forward here, but aside from that, I'm completely clueless.

Any help?

Thanks!

Lynne
03-01-2011, 09:08 PM
When you create (or edit) the profile field, there is the option to make the Field Required. If you have it set to show on the Edit Profile page, then the user will get told they need to edit their profile before continuing to do anything on the site. (Admins are exempt from this, I believe.)

kvnband
03-01-2011, 09:26 PM
That's what I thought, Lynne. But since implementing the fields, we have had about 10 users sign on and post in the forum. None of them have updated those fields. The fields are set to be required at registration and profile editing, and are set to be editable by the user.

Since nobody updated their information, I assumed it wasn't a built-in feature and that I would need to write a little plugin to force them to.

--------------- Added 1299022976 at 1299022976 ---------------

So I'm just an idiot. I didn't notice that one of the options for "required" was "Yes, Always". Set that, and it appears to be working.

Now - Where can I go to learn about VB programming in general? I need to come up with an election voting module here in the next 3 months. I could do it in a few hours in pure PHP but I'm clueless where to even start with making a VB product....

Lynne
03-01-2011, 09:47 PM
Do not set it to Field Required "Yes, at registration and profile updating", set it to "Yes, always". And, what did you set for Which page display this option?

kvnband
03-01-2011, 10:24 PM
Lynne - I edited my post right before you replied...Your solution was spot on though.

Now - Where can I go to learn about VB programming in general? I need to come up with an election voting module here in the next 3 months. I could do it in a few hours in pure PHP but I'm clueless where to even start with making a VB product....

Lynne
03-02-2011, 03:27 AM
Glad you got that working.

The way I learned how to code vb was by first downloading simply mods and seeing how they were done. Then I started wanting to do things my self and so I would download mods that kinda did what I wanted and then I would modify them to do what I wanted. So, I kinda learned how things worked by doing it that way.

kvnband
03-02-2011, 11:43 AM
I think I'm going to do just that, but keep it basic at first. Create my new bitfield permissions (Who can create elections, who can vote in elections, who can see election results) and then just use the forum front-end for the administration of things at first. That way I can just have plain PHP files out there that only tie in to VB when checking for permissions. Seems like a decent way to get started....

And yes - I will definitely need to check out other products for inspiration. I think I can figure things out.

Thanks for your help.

--------------- Added 1299097555 at 1299097555 ---------------

Soooo I need help again. I created my product, set up my bitfields, and set up my permissions. But I absolutely cannot figure out how to check those permissions in my script. I see that I'm obviously not accessing the correct values, but I don't know where else to check. I am trying to see if the currently logged in user has permission to vote or not. This is just real basic while I'm trying to acclimate myself to the system. Can you help me / point me in the right direction?

<?php

// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);

// #################### DEFINE IMPORTANT CONSTANTS #######################

define('THIS_SCRIPT', 'voting_booth');
define('CSRF_PROTECTION', true);
// change this depending on your filename

// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array();

// get special data templates from the datastore
$specialtemplates = array();

// pre-cache templates used by all actions
$globaltemplates = array('tsgvotingbooth',
);

// pre-cache templates used by specific actions
$actiontemplates = array();

// ######################### REQUIRE BACK-END ############################
// if your page is outside of your normal vb forums directory, you should change directories by uncommenting the next line
// chdir ('/path/to/your/forums');
require_once('./global.php');

// ################################################## #####################
// ######################## START MAIN SCRIPT ############################
// ################################################## #####################

$navbits = construct_navbits(array('' => 'Voting Booth'));
$navbar = render_navbar_template($navbits);

// ###### YOUR CUSTOM CODE GOES HERE #####
$pagetitle = 'Voting Booth';

// ###### NOW YOUR TEMPLATE IS BEING RENDERED ######

if(!$vbulletin->bf_ugp['tsgvb_permissions']['canvote']) {
print_no_permission();
}

$templater = vB_Template::create('tsgvotingbooth');
$templater->register_page_templates();
$templater->register('navbar', $navbar);
$templater->register('pagetitle', $pagetitle);
print_output($templater->render());

?>

wpeloquin
03-02-2011, 08:02 PM
If you set up a Setting Group for the plugin in the AdminCP > Options, you would use something like

if (($vbulletin->options['customplugin_enable'] == 1) AND is_member_of($vbulletin->userinfo, explode(',', $vbulletin->options['customplugin_votegroups'])))


customplugin_enable would be a yesno field (turn on/off the plugin) and the customplugin_votegroups would be a comma separated list

i'd recommend putting the typical 5, 6, 7 as default for the _votegroups, blank Option Code, and add something like (comma separated ID list) in the description

kvnband
03-02-2011, 08:17 PM
Thanks for your response. I actually came with that method on my own on another product I was tinkering with, but I don't want to go that route with this product. With this product, I want to control the usergroup permissions in the usergroup editor. So I've successfully set up the /admincp stuff, but I just can't figure out how to check if one of the current member's usergroups 'canvote'.

I do appreciate your help. Hopefully you have an idea on how to accomplish it this alternative way...

wpeloquin
03-02-2011, 08:53 PM
I assume you mean add a custom section in the AdminCP > Usergroups > Usergroup Manager > Edit Usergroup, something like how it has Forum Viewing Permissions, Forum Searching Permissions, etc?


Vote Settings
Can members use the Vote System? yes/no
Option 2? yes/no
Option 3? yes/no


if so, i am sure there is a way to do it, as i've seen other plugins do it. However, i cannot help with that :(. Hopefully this helps some though, if anyone else does know!

kvnband
03-02-2011, 09:08 PM
Yes, that is exactly what I'm talking about. I have already implemented the bitfields (That part is incredibly easy, actually) but I don't know how to check them on the front-end. Hopefully someone can chime in.

kvnband
03-04-2011, 12:18 AM
So, I've made some progress. I thought I was doing good, until I went to create an update form. Does vBulletin have some sort of special trickery regarding $_POST? I have a basic update form that posts back to itself. But no matter what I do, I cannot get the dang thing to do anything. When I hit submit, I just get a blank page. Getting frustrated here...

Here is my PHP:

<?php

// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);

// #################### DEFINE IMPORTANT CONSTANTS #######################

define('THIS_SCRIPT', 'voting_booth');
define('CSRF_PROTECTION', false);
// change this depending on your filename

// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array();

// get special data templates from the datastore
$specialtemplates = array();

// pre-cache templates used by all actions
$globaltemplates = array('tsgvotingbooth',
);

// pre-cache templates used by specific actions
$actiontemplates = array();

require_once('./global.php');

/****************************************
Define usergroups. Will move to admincp eventually
****************************************/
$ug_voting_members=17;



/*****************************************
If the user is not logged in, kill it here
*****************************************/
//if(!isset($bbuserinfo['userid'])) {
// print_no_permission();
//}

/*****************************************
List Elections
*****************************************/
if($_SERVER['REQUEST_METHOD']=='GET' && (!isset($_GET['do']) || $_GET['do'] == '')) {

}


/****************************************
Show registration form
****************************************/
else if($_SERVER['REQUEST_METHOD'] == 'GET' && $_GET['do'] == 'register') {
//print_r(get_defined_vars());
$navbits = construct_navbits(array('' => 'Voting Booth Registration'));
$navbar = render_navbar_template($navbits);
$pagetitle = 'Voting Booth Registration';

$templater = vB_Template::create('tsgvb_register_form');
$templater->register_page_templates();
$templater->register('navbar', $navbar);
$templater->register('pagetitle', $pagetitle);
$templater->register('ug_voting_members', $ug_voting_members);
print_output($templater->render());
}

else if($_SREVER['REQUEST_METHOD'] == 'POST' && $_POST['do'] == 'register') {
print_r($_POST);
}

?>

Here is my form template:

{vb:stylevar htmldoctype}
<html xmlns="http://www.w3.org/1999/xhtml" dir="{vb:stylevar textdirection}" lang="{vb:stylevar languagecode}" id="vbulletin_html">
<head>
<title>{vb:raw vboptions.bbtitle} - {vb:raw pagetitle}</title>
{vb:raw headinclude}
{vb:raw headinclude_bottom}
</head>
<body>

{vb:raw header}

{vb:raw navbar}

<div id="pagetitle">
<h1>{vb:raw pagetitle}</h1>
<p class="description">In order to vote in elections, you must be registered. Please fill out the following form to become a registered voter or to update your information.</p>

</div>

<h2 class="blockhead">Registration Form</h2>
<div class="blockbody formcontrols settings_form_border">
<fieldset class="blockrow">
<form action="voting_booth.php" method="post">
<input type="hidden" name="do" value="register" />
<legend>Registration Information</legend>
<ul class="group">
<li>
<label for="first_name">First Name: </label>
<input type="text" name="first_name" id="first_name" <vb:if condition="is_member_of($bbuserinfo, $ug_voting_members)">value="{vb:raw bbuserinfo.field5}"</vb:if> />
</li>
<li>
<label for="last_name">Last Name: </label>
<input type="text" name="last_name" id="last_name" <vb:if condition="is_member_of($bbuserinfo, $ug_voting_members)">value="{vb:raw bbuserinfo.field6}"</vb:if> />
</li>
<li>
<label for="phone">Phone Number: </label>
<input type="text" name="phone" id="phone" <vb:if condition="is_member_of($bbuserinfo, $ug_voting_members)">value="{vb:raw bbuserinfo.field7}"</vb:if> />
</li>
<li>
<label for="street">Street Address: </label>
<input type="text" name="street" id="street" <vb:if condition="is_member_of($bbuserinfo, $ug_voting_members)">value="{vb:raw bbuserinfo.field8}"</vb:if> />
</li>
<li>
<label for="city">City: </label>
<input type="text" name="city" id="city" <vb:if condition="is_member_of($bbuserinfo, $ug_voting_members)">value="{vb:raw bbuserinfo.field9}"</vb:if> />
</li>
<li>
<label for="state">State: </label>
<input type="text" size="2" name="state" id="state" <vb:if condition="is_member_of($bbuserinfo, $ug_voting_members)">value="{vb:raw bbuserinfo.field10}"</vb:if> />
</li>
<li>
<label for="zip">Zip Code: </label>
<input type="text" name="zip" id="zip" <vb:if condition="is_member_of($bbuserinfo, $ug_voting_members)">value="{vb:raw bbuserinfo.field11}"</vb:if> />
</li>
<li>
<input type="submit" name="submit" value="Submit Registration Information" />
</li>
</ul>
</form>
</fieldset>
</div>
</div>

{vb:raw footer}
</body>
</html>

The form loads up and looks fine, and is prefilled with the user's data, if it is available (I realize that this code is not exactly right, but it's working for now). But when I hit submit, I get a blank page, even though I have coded for it in the PHP file.

Obviously I'm missing something important here.

Any advice is appreciated.

--------------- Added 1299205201 at 1299205201 ---------------

Edit - Wow. I looked at this code for 20 minutes and couldn't figure out my problem. Posted here and almost instantly realized that I wrote $_SREVER instead of $_SERVER......

I'm leaving it here as a learning experience for others.

Boofo
03-04-2011, 12:43 AM
Spell check is your friend. ;)

kvnband
03-04-2011, 12:51 AM
I normally would catch an issue like that. But since this is all going on inside of VB, I'm quick to think I've messed something up inside there.

This really isn't all that hard so far. Just have to remember what variables I can access and it's pretty breezy.