PDA

View Full Version : External PHP forms not posting properly, also question about structure


razec
01-04-2010, 04:23 PM
Regarding my last thread (https://vborg.vbsupport.ru/showthread.php?t=231999)...

When I attempt to post the form that I created, vBulletin gives an error:

Your submission could not be processed because a security token was missing.

If this occurred unexpectedly, please inform the administrator and describe the action you performed before you received this error.

The form was just a simple test form that posts a hidden field and a text field. The form's script looks like this:

<?

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

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

define('THIS_SCRIPT', 'testform');
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('TESTFORM',
);

// 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('' => 'Test Form'));
$navbar = render_navbar_template($navbits);

// ###### YOUR CUSTOM CODE GOES HERE #####
$pagetitle = 'Test Form Submission';

$poutput = '';

if( $vbulletin->userinfo['userid'] == '' )
{
$poutput = '<p>You must be logged in to use this form.</p>';
}
else
{
$poutput = '
<p>Hello, user #' . $vbulletin->userinfo['userid'] . '. Please fill out the form below.</p>

<form action="testform_submit.php" method="post">
<input type="hidden" name="t" value="1"/>

<table border="0">
<tr>
<td align="right" valign="center"><b>Name:</b></td>
<td valign="center"><input type="text" name="uname" size="30"/></td>
</tr>
</table><br/><br/>

<input type="submit" name="submit" value="OK"/>
</form>';
}

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

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

?>

The target of the form:


<?

/*
* Test Form - Submit Script
*/

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

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

define('THIS_SCRIPT', 'testformsubmit');
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('TESTFORMSUBMIT',
);

// 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('' => 'Test Form Submit'));
$navbar = render_navbar_template($navbits);

// ###### YOUR CUSTOM CODE GOES HERE #####
$pagetitle = 'Test Form Submission Script';

$presult = '';
if( $vbulletin->userinfo['userid'] == '' )
{
$presult = '<p>You must be logged in to process user forms.</p>';
}
else
{
if( $_POST['t'] != '1' )
{
$presult = '<p>This script cannot be run directly.</p>';
}
else if( $_POST['uname'] == '' )
{
$presult = '<p>You must enter your name.</p>';
}
else
{
$presult = '<p>Your name is ' . $_POST['uname'] . '.</p>';
}
}

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

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

?>


I did some browsing around and found a similar problem that someone experienced with VB3, so I added a line to my form: <input type="hidden" name="securitytoken" value="$bbuserinfo[securitytoken]" />

This had no effect, however. The problem persists. Viewing source on the form, there is no value set for the securitytoken field.

So, my two questions here:


How can I fix this error that I'm getting?
Is there a better way to check to see if the user is logged in (and ultimately, to check to see if the user is a member of a specific group) rather than me doing it like I am in the above examples? It'd obviously be more ideal if I could have the form itself in a template, rather than sending it to a template as a variable.

Dygear
01-04-2010, 04:47 PM
I'm not sure about this one. But it could be a case of the varable is not populated in the source code directly, but later inside of a javascript function call.
As for structure, I have two things.
The sort open tags '<?' tend to be a REALLY bad choice for cross platform compatibility. Sure it offers some nice things like '<?=' that's basiclly a quick echo statment with short tags turned on. However, this is very much platform depended, and not something you can turn on at run time. Avoid!
This seems to check if they are logged in via styles:
<vb:if condition="$show['member']">
<!-- Logged In -->
<vb:else />
<!-- Logged Out -->
<vb:if />

And the rest of the template conditionals can be found here:
vB4 Template Conditionals List (https://vborg.vbsupport.ru/showthread.php?t=231525)

razec
01-04-2010, 05:47 PM
That doesn't seem to be working. When I try to save the template with:

{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}</title>
{vb:raw headinclude}
</head>
<body>

{vb:raw header}

{vb:raw navbar}

<div id="pagetitle">
<h1>{vb:raw pagetitle}</h1>
</div>

<h2 class="blockhead">Test Form Data</h2>
<div class="blockbody">
<div class="blockrow">
<vb:if condition="$show['member']">
<p>You are logged in.</p>
<vb:else />
<p>You are not logged in.</p>
<vb:if />
</div>
</div>

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

vBulletin gives me an error that says "unclosed_tag". If I remove the vb:if section, it saves properly.

Dygear
01-05-2010, 05:39 AM
Sorry, that was my syntax error.

<vb:if condition="$show['member']">

<vb:else />

</vb:if>

Incorrect:<vb:if />

Correct:</vb:if>

The tags them selfs a kinda inconsistent.

Lynne
01-05-2010, 02:40 PM
For a vB4 template..
Incorrect:
<input type="hidden" name="securitytoken" value="$bbuserinfo[securitytoken]" />

Correct:
<input type="hidden" name="securitytoken" value="{vb:raw bbuserinfo.securitytoken}" />

razec
01-06-2010, 04:23 AM
Dygear, Lynne: You two are great. Those suggestions work perfectly. Thanks for your time and assistance :)

Dygear
01-06-2010, 05:12 PM
For a vB4 template..
Incorrect:
<input type="hidden" name="securitytoken" value="$bbuserinfo[securitytoken]" />

Correct:
<input type="hidden" name="securitytoken" value="{vb:raw bbuserinfo.securitytoken}" />

Lynne, thanks for that. The new syntax never hit me, even tho I read it like 5 times, I did not see that problem.