PDA

View Full Version : Create PHP Email Submission


thunderclap82
07-14-2011, 12:20 AM
I'm trying to create a page that allows visitors to enter their email address to be added to a mailing list. I was going to just use the HTML <form>, but the 'mailto:' code keeps forcing email programs open, something that is messy and I don't want. Because of this I've elected to go with a PHP script instead.

Here is the code I have for the form itself:

<?php

# This block must be placed at the very top of page.
# --------------------------------------------------
require_once( dirname(__FILE__).'/form.lib.php' );
phpfmg_display_form();
# --------------------------------------------------



function phpfmg_form( $sErr = false ){
$style=" class='form_text' ";

?>

<form name="frmFormMail" action='' method='post' enctype='multipart/form-data' onsubmit='return fmgHandler.onsubmit(this);'>
<input type='hidden' name='formmail_submit' value='Y'>
<div id='err_required' class="form_error" style='display:none;'>
<label class='form_error_title'>Please check the required fields</label>
</div>



<ol class='phpfmg_form' >

<li class='field_block' id='field_0_div'><div class='col_label'>
<label class='form_field'>Email</label> <label class='form_required' >*</label> </div>
<div class='col_field'>
<input type="text" name="field_0" id="field_0" value="<?php phpfmg_hsc("field_0", ""); ?>" class='text_box'>
<div id='field_0_tip' class='instruction'>Please enter your email address</div>
</div>
</li>


<li class='field_block' id='phpfmg_captcha_div'>
<div class='col_label'><label class='form_field'>Security Code:</label> <label class='form_required' >*</label> </div><div class='col_field'>
<?php phpfmg_show_captcha(); ?>
</div>
</li>


<li>
<div class='col_label'>&nbsp;</div>
<div class='form_submit_block col_field'>

<input type='submit' value='Submit' class='form_button'>
<span id='phpfmg_processing' style='display:none;'>
<img id='phpfmg_processing_gif' src='<?php echo PHPFMG_ADMIN_URL . '?mod=image&amp;func=processing' ;?>' border=0 alt='Processing...'> <label id='phpfmg_processing_dots'></label>
</span>
</div>
</li>

</ol>




</form>




<?php

phpfmg_javascript($sErr);

}
# end of form




function phpfmg_form_css(){
?>
<style type='text/css'>

body{
margin-left: 18px;
margin-top: 18px;
}

body{
font-family : Verdana, Arial, Helvetica, sans-serif;
font-size : 13px;
color : #474747;
background-color: transparent;
}

select, option{
font-size:13px;
}

ol.phpfmg_form{
list-style-type:none;
padding:0px;
margin:0px;
}

ol.phpfmg_form li{
margin-bottom:5px;
clear:both;
display:block;
overflow:hidden;
width: 100%
}


.form_field, .form_required{
font-weight : bold;
}

.form_required{
color:red;
margin-right:8px;
}

.field_block_over{
}

.form_submit_block{
padding-top: 3px;
}

.text_box, .text_area, .text_select {
width:300px;
}

.text_area{
height:80px;
}

.form_error_title{
font-weight: bold;
color: red;
}

.form_error{
background-color: #F4F6E5;
border: 1px dashed #ff0000;
padding: 10px;
margin-bottom: 10px;
}

.form_error_highlight{
background-color: #F4F6E5;
border-bottom: 1px dashed #ff0000;
}

div.instruction_error{
color: red;
font-weight:bold;
}

hr.sectionbreak{
height:1px;
color: #ccc;
}

#one_entry_msg{
background-color: #F4F6E5;
border: 1px dashed #ff0000;
padding: 10px;
margin-bottom: 10px;
}

<?php phpfmg_text_align();?>



</style>

<?php
}
# end of css

# By: formmail-maker.com
?>

I've tried putting this in a PHP Direct Evaluation page as well as a Static Page, but I just get errors.

I've tried creating a vB page as documented here (https://vborg.vbsupport.ru/showthread.php?t=228112) but either the form php script is ignored or I get errors. Here is the vB page I created (called newslettersubscription.php):

<?php

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

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

define('THIS_SCRIPT', 'newslettersubscription');
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('newsletter_subscription',
);

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

// ###### YOUR CUSTOM CODE GOES HERE #####
$pagetitle = 'Newsletter Subscription';

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

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

print_output($templater->render());

?>

The form code I list previously I put in this page under YOUR CUSTOM CODE GOES HERE.

And with this file it calls a template, one I created called newsletter_subscription:

{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> -->
</div>

<center><h2 class="blockhead">Newsletter Subscription</h2></center>
<div class="blockbody">
<div class="blockrow">

</div>
</div>

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

So any ideas what's going on? Either it doesn't display the form at all, or I get an error message, usually stating that an unknown command < is on such-a-such line.

Any help would be greatly appreciated.

kh99
07-14-2011, 12:36 AM
Try this: put the form php code in a php file (different from newslettersubscription.php, which you also need) and upload it to your server (form.lib.php has to be there too). Then create a new plugin using hook location global_start and this code:


ob_start();
include('formcode.php');
$mailform = ob_get_contents();
ob_end_clean();

vB_Template:preRegister('newsletter_subscription', array('mailform' => $mailform));


(You can change 'formcode.php' to be whatever you named the file).

Then in your newsletter_subscription template, put {vb:raw mailform} where you want the form.

thunderclap82
07-14-2011, 04:22 PM
So here is my new code. First the page iteself (newslettersubscription.php):

<?php

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

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

define('THIS_SCRIPT', 'newslettersubscription');
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('newsletter_subscription',
);

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

// ###### YOUR CUSTOM CODE GOES HERE #####
$pagetitle = 'Newsletter Subscription';

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

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

print_output($templater->render());

?>

I then created the form.php file:

<?php

# This block must be placed at the very top of page.
# --------------------------------------------------
require_once( dirname(__FILE__).'form.lib.php' );
phpfmg_display_form();
# --------------------------------------------------



function phpfmg_form( $sErr = false ){
$style=" class='form_text' ";

?>

<form name="frmFormMail" action='' method='post' enctype='multipart/form-data' onsubmit='return fmgHandler.onsubmit(this);'>
<input type='hidden' name='formmail_submit' value='Y'>
<div id='err_required' class="form_error" style='display:none;'>
<label class='form_error_title'>Please check the required fields</label>
</div>



<ol class='phpfmg_form' >

<li class='field_block' id='field_0_div'><div class='col_label'>
<label class='form_field'>Email</label> <label class='form_required' >*</label> </div>
<div class='col_field'>
<input type="text" name="field_0" id="field_0" value="<?php phpfmg_hsc("field_0", ""); ?>" class='text_box'>
<div id='field_0_tip' class='instruction'>Please enter your email address</div>
</div>
</li>


<li class='field_block' id='phpfmg_captcha_div'>
<div class='col_label'><label class='form_field'>Security Code:</label> <label class='form_required' >*</label> </div><div class='col_field'>
<?php phpfmg_show_captcha(); ?>
</div>
</li>


<li>
<div class='col_label'>&nbsp;</div>
<div class='form_submit_block col_field'>

<input type='submit' value='Submit' class='form_button'>
<span id='phpfmg_processing' style='display:none;'>
<img id='phpfmg_processing_gif' src='<?php echo PHPFMG_ADMIN_URL . '?mod=image&amp;func=processing' ;?>' border=0 alt='Processing...'> <label id='phpfmg_processing_dots'></label>
</span>
</div>
</li>

</ol>




</form>




<?php

phpfmg_javascript($sErr);

}
# end of form




function phpfmg_form_css(){
?>
<style type='text/css'>

body{
margin-left: 18px;
margin-top: 18px;
}

body{
font-family : Verdana, Arial, Helvetica, sans-serif;
font-size : 13px;
color : #474747;
background-color: transparent;
}

select, option{
font-size:13px;
}

ol.phpfmg_form{
list-style-type:none;
padding:0px;
margin:0px;
}

ol.phpfmg_form li{
margin-bottom:5px;
clear:both;
display:block;
overflow:hidden;
width: 100%
}


.form_field, .form_required{
font-weight : bold;
}

.form_required{
color:red;
margin-right:8px;
}

.field_block_over{
}

.form_submit_block{
padding-top: 3px;
}

.text_box, .text_area, .text_select {
width:300px;
}

.text_area{
height:80px;
}

.form_error_title{
font-weight: bold;
color: red;
}

.form_error{
background-color: #F4F6E5;
border: 1px dashed #ff0000;
padding: 10px;
margin-bottom: 10px;
}

.form_error_highlight{
background-color: #F4F6E5;
border-bottom: 1px dashed #ff0000;
}

div.instruction_error{
color: red;
font-weight:bold;
}

hr.sectionbreak{
height:1px;
color: #ccc;
}

#one_entry_msg{
background-color: #F4F6E5;
border: 1px dashed #ff0000;
padding: 10px;
margin-bottom: 10px;
}

<?php phpfmg_text_align();?>



</style>

<?php
}
# end of css

# By: formmail-maker.com
?>

Then the template (newsletter_subscription):

{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> -->
</div>

<center><h2 class="blockhead">Newsletter Subscription</h2></center>
<div class="blockbody">
<div class="blockrow">

{vb:raw mailform}

</div>
</div>

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

And finally the plugin (mailform):

ob_start();
include('form.php');
$mailform = ob_get_contents();
ob_end_clean();

vB_Template:reRegister('newsletter_subscription', ('mailform' => $mailform));

When I try to load the page the page comes up, but no form.

Did I follow your directions correctly? I appreciate your help in this.

kh99
07-14-2011, 04:29 PM
There are a couple problems: one is that there was a typo in my post, in the plugin code it should be:

vB_Template::preRegister('newsletter_subscription' , array('mailform' => $mailform));


Also, you have to use the same variable name in the template that you used in the preRegister statement, so your template should have:

{vb:raw mailform}


...or else change the plugin code to be
vB_Template::preRegister('newsletter_subscription' , ('newsletter_form' => $mailform));

thunderclap82
07-14-2011, 04:42 PM
I spotted "mailform" as I posted, and edited my code accordingly. :)

But it still didn't work. The plugin (called MAILFORM):


ob_start();
include('form.php');
$mailform = ob_get_contents();
ob_end_clean();

vB_Template::preRegister('newsletter_subscription' , ('mailform' => $mailform));

And I altered the template to be

vb:raw mailform

Still comes up blank. I assume by "variable" you mean the plugins title?

Also, when I activate the plugin it causes an error while Searching the forum.

kh99
07-14-2011, 04:50 PM
What you're doing should work, I think, but I just realized that there really is no reason to use a plugin, you could just put the plugin code in newslettersubscription.php, in the custom code section. And then you don't need to preRegister, you can just register like you're doing with the other variables. Sorry, I guess I was too tired last night to think straight.

Anyway, what I'd do next is see if $mailform has anything in it. You maybe could just echo() it then look at the page source (or maybe you'll just see it in the browser.

thunderclap82
07-14-2011, 04:59 PM
I thank you for trying. So I put the form.php code back into newslettersubscription.php and this is the error I get:

Parse error: syntax error, unexpected '<' in /home/fpaul46/public_html/forum/newslettersubscription.php on line 41

Here is the code:

<?php

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

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

define('THIS_SCRIPT', 'newslettersubscription');
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('newsletter_subscription',
);

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

// ###### YOUR CUSTOM CODE GOES HERE #####
$pagetitle = 'Newsletter Subscription';

<?php

# This block must be placed at the very top of page.
# --------------------------------------------------
require_once( dirname(__FILE__).'form.lib.php' );
phpfmg_display_form();
# --------------------------------------------------

function phpfmg_form( $sErr = false ){
$style=" class='form_text' ";

?>

<form name="frmFormMail" action='' method='post' enctype='multipart/form-data' onsubmit='return fmgHandler.onsubmit(this);'>
<input type='hidden' name='formmail_submit' value='Y'>
<div id='err_required' class="form_error" style='display:none;'>
<label class='form_error_title'>Please check the required fields</label>
</div>

<ol class='phpfmg_form' >

<li class='field_block' id='field_0_div'><div class='col_label'>
<label class='form_field'>Email</label> <label class='form_required' >*</label> </div>
<div class='col_field'>
<input type="text" name="field_0" id="field_0" value="<?php phpfmg_hsc("field_0", ""); ?>" class='text_box'>
<div id='field_0_tip' class='instruction'>Please enter your email address</div>
</div>
</li>


<li class='field_block' id='phpfmg_captcha_div'>
<div class='col_label'><label class='form_field'>Security Code:</label> <label class='form_required' >*</label> </div><div class='col_field'>
<?php phpfmg_show_captcha(); ?>
</div>
</li>


<li>
<div class='col_label'>&nbsp;</div>
<div class='form_submit_block col_field'>

<input type='submit' value='Submit' class='form_button'>
<span id='phpfmg_processing' style='display:none;'>
<img id='phpfmg_processing_gif' src='<?php echo PHPFMG_ADMIN_URL . '?mod=image&amp;func=processing' ;?>' border=0 alt='Processing...'> <label id='phpfmg_processing_dots'></label>
</span>
</div>
</li>

</ol>

</form>

<?php

phpfmg_javascript($sErr);

}
# end of form

function phpfmg_form_css(){
?>
<style type='text/css'>

body{
margin-left: 18px;
margin-top: 18px;
}

body{
font-family : Verdana, Arial, Helvetica, sans-serif;
font-size : 13px;
color : #474747;
background-color: transparent;
}

select, option{
font-size:13px;
}

ol.phpfmg_form{
list-style-type:none;
padding:0px;
margin:0px;
}

ol.phpfmg_form li{
margin-bottom:5px;
clear:both;
display:block;
overflow:hidden;
width: 100%
}


.form_field, .form_required{
font-weight : bold;
}

.form_required{
color:red;
margin-right:8px;
}

.field_block_over{
}

.form_submit_block{
padding-top: 3px;
}

.text_box, .text_area, .text_select {
width:300px;
}

.text_area{
height:80px;
}

.form_error_title{
font-weight: bold;
color: red;
}

.form_error{
background-color: #F4F6E5;
border: 1px dashed #ff0000;
padding: 10px;
margin-bottom: 10px;
}

.form_error_highlight{
background-color: #F4F6E5;
border-bottom: 1px dashed #ff0000;
}

div.instruction_error{
color: red;
font-weight:bold;
}

hr.sectionbreak{
height:1px;
color: #ccc;
}

#one_entry_msg{
background-color: #F4F6E5;
border: 1px dashed #ff0000;
padding: 10px;
margin-bottom: 10px;
}

<?php phpfmg_text_align();?>



</style>

<?php
}
# end of css

# By: formmail-maker.com
?>

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

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

print_output($templater->render());

?>

And this is line 41:

<?php

This is the very first line of the custom code. If I delete it I get this error:

Warning: require_once([path]form.lib.php) [function.require-once]: failed to open stream: No such file or directory in [path]/newslettersubscription.php on line 45

Fatal error: require_once() [function.require]: Failed opening required '/home/fpaul46/public_html/forumform.lib.php' (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/fpaul46/public_html/forum/newslettersubscription.php on line 45

kh99
07-14-2011, 05:03 PM
Well, don't put the form code in newslettersubscription.php, put the code that you had in the plugin. (in fact you can leave the preRegister for now, there's no reason it shouldn't work).

Did you upload form.lib.php to the same directory with newslettersubscription.php?

At this point, maybe someone else has a better idea for you. :)

nhawk
07-14-2011, 05:05 PM
I hope I don't confuse things for you, but your entire form should be in the template being used (<form>...<div>...<input>...</div>...</form>... etc). Then when the submit button is clicked, send the data collected to the PHP file that processes it.

kh99
07-14-2011, 05:07 PM
I hope I don't confuse things for you, but your entire form should be in the template being used (<form>...<div>...<input>...</div>...</form>... etc). Then when the submit button is clicked, send the data collected to the PHP file that processes it.

Yeah, that would be another way to do it, but since the form code has calls to php functions in it, I thought it would be easier to use the ob_start()...ob_end_clean() thing. If you put it all in a template you'd ahve to take out the php calls, assign them to variables, register them, etc.

thunderclap82
07-14-2011, 05:20 PM
Well, don't put the form code in newslettersubscription.php, put the code that you had in the plugin. (in fact you can leave the preRegister for now, there's no reason it shouldn't work).

Did you upload form.lib.php to the same directory with newslettersubscription.php?

At this point, maybe someone else has a better idea for you. :)

Now I'm getting scattered brained. hehehe Bear with me.

So I disabled the plugin entirely and moved that code to newslettersubscription.php. I then add {vb:raw mailform} to the template.

Now the error is:

Parse error: syntax error, unexpected T_DOUBLE_ARROW in /home/fpaul46/public_html/forum/newslettersubscription.php on line 46

Line 46 is:

vB_Template::preRegister('newsletter_subscription' , ('mailform' => $mailform));

Not sure what I'm doing wrong. This is what happens when a non-programmer tries to do this. (Though in my defense, it doesn't seem like it should be this complicated.)

kh99
07-14-2011, 05:26 PM
Now the error is:

Parse error: syntax error, unexpected T_DOUBLE_ARROW in /home/fpaul46/public_html/forum/newslettersubscription.php on line 46

Line 46 is:

vB_Template::preRegister('newsletter_subscription' , ('mailform' => $mailform));

Not sure what I'm doing wrong. This is what happens when a non-programmer tries to do this. (Though in my defense, it doesn't seem like it should be this complicated.)

Yeah, that one's my fault again. it should be

vB_Template::preRegister('newsletter_subscription' , array('mailform' => $mailform));
I copied and pasted that code from another thread where someone asked about it last night, but I guess I screwed it up. Sorry about that.

You're right, it shouldn't be this hard. I should have put the code together and tried it before posting, sorry.

thunderclap82
07-14-2011, 05:27 PM
That fixed it. :)

I really appreciate your help in this. Thank you so much!

kh99
07-14-2011, 05:28 PM
Is it actually working now? If it's not, don't give up - someone else here can probably help. :)

thunderclap82
07-14-2011, 05:32 PM
Is it actually working now? If it's not, don't give up - someone else here can probably help. :)

I actually got a security token error, but I think that's a different problem. Time to Google...