Page 1 of 2 12 LastLast
Results 1 to 10 of 18

Thread: Contact form processor not getting value

  1. #1
    Join Date
    Jul 2008
    Posts
    134
    Thanks
    13
    Thanked 1 Time in 1 Post

    Default Contact form processor not getting value

    I generally use a self submitting form and processor all in one to keep things clean, but the project I'm working on uses an HTML form that POSTS to a separate PHP script that handles the mailing.

    The email will go to different users based on the query string in the URL like:

    index.php?page=contact&user=User%20One
    Will go to to User One's email address

    In the form I have a hidden field that grabs the user from the URL

    Code:
    <input type="hidden" name="user" value="User One">
    In the processing script I have

    PHP Code:
    switch ($_POST['user']) {
    case 
    "user%20One":
    $owner_email "user_one@domain.com";
    break;

    case 
    "user%20Two":
    $owner_email "user_two@domain.com";
    break;

    default:
    $owner_email "default@domain.com"
    break;
    }
    mail($owner_email$subject, ...rest of mail function... 
    My issue is getting the specific "user" value to the processing form to be able to email the correct user. Any help would be appreciated, thank you.

  2. #2
    Join Date
    Mar 2005
    Location
    SE PA USA
    Posts
    28,951
    Thanks
    43
    Thanked 3,194 Times in 3,157 Posts
    Blog Entries
    12

    Default

    If:

    Code:
    <input type="hidden" name="user" value="User One">
    is on an HTML page, then it's hard coded and will always be "User One".

    So unless you make that page a PHP page or use javascript (not recommended) to set that value, I see no way to achieve what you're asking.

    If I've misunderstood the question, please be more specific.
    - John
    ________________________

    Show Additional Thanks: International Rescue Committee - Donate or: The Ocean Conservancy - Donate or: PayPal - Donate

  3. #3
    Join Date
    Jul 2008
    Posts
    134
    Thanks
    13
    Thanked 1 Time in 1 Post

    Default

    My apologies for not clarifying. The form has PHP coding in it, and the input is
    PHP Code:
    <input type="hidden" name="user" value="<? echo "$getuser"?>">
    and
    PHP Code:
    <?php $getuser $_GET['user']; ?>
    get's the user from the URL like - User One - User Two etc.

    All the other form fields POST to the processing page so figured I could set it up as a hidden field and POST it to the processing page.

    It seems to work, but fails when it tries to determine the correct email to associate with the user because my switch statement isn't getting the correct user. Last night I tried passing this through $_SESSION and I didn't have any luck.

    I basically need the form to read John Doe in the URL index.php?page=contact&user=John%20Doe and mail that email address or user=Jane%20Doe email Jane etc. Thank you.

  4. #4
    Join Date
    Mar 2005
    Location
    SE PA USA
    Posts
    28,951
    Thanks
    43
    Thanked 3,194 Times in 3,157 Posts
    Blog Entries
    12

    Default

    But is the form on a page with the .php extension? I thought you said it was HTML.

    But, if that's not an issue, even if it is, this is a problem:

    index.php?page=contact&user=User%20One
    It should be:

    index.php?page=contact&user=User+One
    - John
    ________________________

    Show Additional Thanks: International Rescue Committee - Donate or: The Ocean Conservancy - Donate or: PayPal - Donate

  5. #5
    Join Date
    Jul 2008
    Location
    Derbyshire, UK
    Posts
    1,945
    Thanks
    16
    Thanked 304 Times in 303 Posts
    Blog Entries
    11

    Default

    Yes, I was thinking the interpretation of the space could be problem too.

    Just a small suggestion - ignoring the switch for the time being, can you echo what's being posted onto the page to see how the hidden field and/or the query string is being formatted/interpretted? Once you know that, it might be easier to match it in your php switch code.
    Focus on Function Web Design | Latest News RSS | Facebook | Twitter |
    Fast Edit (A flat file, PHP web page editor & CMS. Small, FREE, no database!) | Fast Edit BE (Snippet Manager) (Web content editor for multiple editable regions!) | Fast Apps |
    The only limit to creativity is imagination: JemCon.org

  6. #6
    Join Date
    Jul 2008
    Posts
    134
    Thanks
    13
    Thanked 1 Time in 1 Post

    Default

    @jscheuer1 - Yes, the form does have a .php extension and I used PHP to extract the user variable from the URL to insert it into the hidden field. Using the + certainly does help. To make it easier I can use only first names since there will only be 4 users, but I added the last name so it displays above the contact form without additional coding so the user know who they're contacting.

    @Beverleyh - I coded the processing form to redirect to the form if accessed directly, and I tried the echo but it returns the results to the form rather quickly.

    FORM (has linked jquery file that does the validation) - JQUERY file validates and redirects to FORM PROCESSOR which returns the mail sent message directly to the form without leaving the contact form page.

  7. #7
    Join Date
    Mar 2005
    Location
    SE PA USA
    Posts
    28,951
    Thanks
    43
    Thanked 3,194 Times in 3,157 Posts
    Blog Entries
    12

    Default

    A + sign in a query string value means a space, so using it instead of %20 is the only valid way to go. In the value of the hidden input, it should be a literal space though. Like:

    Code:
    <input type="hidden" name="user" value="User One">
    is correct. When that's submitted it will be:

    user=User+One

    But if you're submitting via jQuery.ajax(); unless you're serializing the whole form, you probably have to convert spaces in values to + signs before assigning them as part of the data for the request in order to get the correct result.

    See:

    http://api.jquery.com/serialize/

    for info on how serialize works. It will make the conversion of space to + for you.

    If you want more help, please include a link to the page on your site that contains the problematic code so we can check it out.
    Last edited by jscheuer1; 08-01-2013 at 08:32 PM. Reason: detail
    - John
    ________________________

    Show Additional Thanks: International Rescue Committee - Donate or: The Ocean Conservancy - Donate or: PayPal - Donate

  8. #8
    Join Date
    Jul 2008
    Posts
    134
    Thanks
    13
    Thanked 1 Time in 1 Post

    Default

    After plugging in index.php?page=contact&user=User+One into the address bar I can view the source and "User One" is set as the value like
    Code:
    <input type="hidden" name="user" value="User One">
    This might be easier than digging through code from a link.

    Form
    PHP Code:
    <?php 
    session_start
    (); 
    $_SESSION['user'] = (isset($_GET['user']) ? $_GET['user'] : ''); 
    $user $_GET['user'];?>     
                <?php if (isset($user)) { echo "Get In Touch With $user"; } else { echo "Get In Touch"; } ?></h2> 
                    <form id="contact-form"> 
                    <input type="hidden" name="user" value="<? echo "$user"?>"> 
                        <div class="success">Contact form submitted!<br> 
                            <strong>We will be in touch soon.</strong> 
                        </div> 
                        <fieldset> 
                          <label class="name"> 
                            <input type="text" value="Name:"> 
                              <span class="error">*This is not a valid name.</span> <span class="empty">*This field is required.</span> 
                          </label> 
                          <label class="email"> 
                            <input type="text" value="E-mail:"> 
                              <span class="error">*This is not a valid email address.</span> <span class="empty">*This field is required.</span> 
                          </label> 
                          <label class="message"> 
                            <textarea>Message:</textarea> 
                              <span class="error">*The message is too short.</span> <span class="empty">*This field is required.</span> 
                          </label> 
                          <? $a rand() % 2$b rand() % 3$c $a $b?> 
                          <label class="security"> 
                            <input type="text" value="<?php echo "Security question: $a + $b =";?>"> 
                              <span class="error">*This is not a valid response.</span> <span class="empty">*This field is required.</span> 
                          </label> 
                          <div class="buttons2"> 
                              <a href="#" data-type="reset" class="button1">Clear</a> 
                              <a href="#" data-type="submit" class="button1">Submit</a> 
                          </div> 
                        </fieldset> 
                    </form>
    Jquery to validate form (where I don't think I would have to define "user" since this only validates the required fields in the form and sends it to the processor.
    Code:
    //forms
    ;(function($){
    	$.fn.forms=function(o){
    		return this.each(function(){
    			var th=$(this)
    				,_=th.data('forms')||{
    					errorCl:'error',
    					emptyCl:'empty',
    					invalidCl:'invalid',
    					notRequiredCl:'notRequired',
    					successCl:'success',
    					successShow:'4000',
    					mailHandlerURL:'bat/MailHandler.php',
    					ownerEmail:'#',
    					stripHTML:true,
    					smtpMailServer:'localhost',
    					targets:'input,textarea',
    					controls:'a[data-type=reset],a[data-type=submit]',
    					validate:true,
    					rx:{
    						".name":{rx:/^[a-zA-Z'][a-zA-Z-' ]+[a-zA-Z']?$/,target:'input'},
    						".state":{rx:/^[a-zA-Z'][a-zA-Z-' ]+[a-zA-Z']?$/,target:'input'},
    						".email":{rx:/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i,target:'input'},
    						".security":{rx:/^\+?(\b0*[0-5]\b)/,target:'input'},
    						".fax":{rx:/^\+?(\d[\d\-\+\(\) ]{5,}\d$)/,target:'input'},
    						".message":{rx:/.{20}/,target:'textarea'}
    					},
    					preFu:function(){
    						_.labels.each(function(){
    							var label=$(this),
    								inp=$(_.targets,this),
    								defVal=inp.val(),
    								trueVal=(function(){
    											var tmp=inp.is('input')?(tmp=label.html().match(/value=['"](.+?)['"].+/),!!tmp&&!!tmp[1]&&tmp[1]):inp.html()
    											return defVal==''?defVal:tmp
    										})()
    							trueVal!=defVal
    								&&inp.val(defVal=trueVal||defVal)
    							label.data({defVal:defVal})								
    							inp
    								.bind('focus',function(){
    									inp.val()==defVal
    										&&(inp.val(''),_.hideEmptyFu(label),label.removeClas  s(_.invalidCl))
    								})
    								.bind('blur',function(){
    									_.validateFu(label)
    									if(_.isEmpty(label))
    										inp.val(defVal)
    										,_.hideErrorFu(label.removeClass(_.invalidCl))											
    								})
    								.bind('keyup',function(){
    									label.hasClass(_.invalidCl)
    										&&_.validateFu(label)
    								})
    							label.find('.'+_.errorCl+',.'+_.emptyCl).css({disp  lay:'block'}).hide()
    						})
    						_.success=$('.'+_.successCl,_.form).hide()
    					},
    					isRequired:function(el){							
    						return !el.hasClass(_.notRequiredCl)
    					},
    					isValid:function(el){							
    						var ret=true
    						$.each(_.rx,function(k,d){
    							if(el.is(k))
    								ret=d.rx.test(el.find(d.target).val())										
    						})
    						return ret							
    					},
    					isEmpty:function(el){
    						var tmp
    						return (tmp=el.find(_.targets).val())==''||tmp==el.data('  defVal')
    					},
    					validateFu:function(el){							
    						el.each(function(){
    							var th=$(this)
    								,req=_.isRequired(th)
    								,empty=_.isEmpty(th)
    								,valid=_.isValid(th)								
    							
    							if(empty&&req)
    								_.showEmptyFu(th.addClass(_.invalidCl))
    							else
    								_.hideEmptyFu(th.removeClass(_.invalidCl))
    							
    							if(!empty)
    								if(valid)
    									_.hideErrorFu(th.removeClass(_.invalidCl))
    								else
    									_.showErrorFu(th.addClass(_.invalidCl))								
    						})
    					},
    					getValFromLabel:function(label){
    						var val=$('input,textarea',label).val()
    							,defVal=label.data('defVal')								
    						return label.length?val==defVal?'nope':val:'nope'
    					}
    					,submitFu:function(){
    						_.validateFu(_.labels)							
    						if(!_.form.has('.'+_.invalidCl).length)
    							$.ajax({
    								type: "POST",
    								url:_.mailHandlerURL,
    								data:{
    									name:_.getValFromLabel($('.name',_.form)),
    									email:_.getValFromLabel($('.email',_.form)),
    									//phone:_.getValFromLabel($('.phone',_.form)),
    									fax:_.getValFromLabel($('.fax',_.form)),
    									state:_.getValFromLabel($('.state',_.form)),
    									message:_.getValFromLabel($('.message',_.form)),
    									owner_email:_.ownerEmail,
    									stripHTML:_.stripHTML
    								},
    								success: function(){
    									_.showFu()
    								}
    							})			
    					},
    					showFu:function(){
    						_.success.slideDown(function(){
    							setTimeout(function(){
    								_.success.slideUp()
    								_.form.trigger('reset')
    							},_.successShow)
    						})
    					},
    					controlsFu:function(){
    						$(_.controls,_.form).each(function(){
    							var th=$(this)
    							th
    								.bind('click',function(){
    									_.form.trigger(th.data('type'))
    									return false
    								})
    						})
    					},
    					showErrorFu:function(label){
    						label.find('.'+_.errorCl).slideDown()
    					},
    					hideErrorFu:function(label){
    						label.find('.'+_.errorCl).slideUp()
    					},
    					showEmptyFu:function(label){
    						label.find('.'+_.emptyCl).slideDown()
    						_.hideErrorFu(label)
    					},
    					hideEmptyFu:function(label){
    						label.find('.'+_.emptyCl).slideUp()
    					},
    					init:function(){
    						_.form=_.me						
    						_.labels=$('label',_.form)
    
    						_.preFu()
    						
    						_.controlsFu()
    														
    						_.form
    							.bind('submit',function(){
    								if(_.validate)
    									_.submitFu()
    								else
    									_.form[0].submit()
    								return false
    							})
    							.bind('reset',function(){
    								_.labels.removeClass(_.invalidCl)									
    								_.labels.each(function(){
    									var th=$(this)
    									_.hideErrorFu(th)
    									_.hideEmptyFu(th)
    								})
    							})
    						_.form.trigger('reset')
    					}
    				}
    			_.me||_.init(_.me=th.data({forms:_}))
    			typeof o=='object'
    				&&$.extend(_,o)
    		})
    	}
    })(jQuery)
    $(window).load(function(){
    	$('#contact-form').forms({
    		ownerEmail:'#'
    	})
    })

  9. #9
    Join Date
    Jul 2008
    Posts
    134
    Thanks
    13
    Thanked 1 Time in 1 Post

    Default

    MailHandler.php (this is where I'm only getting the mail to the default email address)
    PHP Code:
    <?php session_start(); 
    echo 
    $_SESSION['user']; echo "$user"

        
    // redirect back to contact form if accessed directly 
        
    if ($_SERVER['REQUEST_METHOD'] != 'POST'){  
        
    header("Location: /index.php?page=contact"); 
        die;  
        } 
        
    $headers "From: "$_POST["name"] . " <" $_POST["email"] . ">"
        
    $subject 'A message from your site visitor ' $_POST["name"]; 
        
    $messageBody ""

        if(
    $_POST['name']!='nope'){ 
            
    $messageBody .= '<p>Visitor: ' $_POST["name"] . '</p>' "\n"
            
    $messageBody .= '<br>' "\n"
        } 
        if(
    $_POST['email']!='nope'){ 
            
    $messageBody .= '<p>Email Address: ' $_POST['email'] . '</p>' "\n"
            
    $messageBody .= '<br>' "\n"
        }else{ 
            
    $headers ''
        } 
        if(
    $_POST['state']!='nope'){         
            
    $messageBody .= '<p>State: ' $_POST['state'] . '</p>' "\n"
            
    $messageBody .= '<br>' "\n"
        } 
        if(
    $_POST['fax']!='nope'){         
            
    $messageBody .= '<p>Fax Number: ' $_POST['fax'] . '</p>' "\n"
            
    $messageBody .= '<br>' "\n"
        } 
        if(
    $_POST['message']!='nope'){ 
            
    $messageBody .= '<p>Message: ' $_POST['message'] . '</p>' "\n"
        } 

        if(
    $_POST["stripHTML"] == 'true'){ 
            
    $messageBody strip_tags($messageBody); 
        } 

    switch (
    $_SESSION['user']) { 
    case 
    "User+One"
    $owner_email "user_one@domain.com"
    break; 

    case 
    "User+Two"
    $owner_email "user_two@domain.com"
    break; 

    default: 
    $owner_email "default@domain.com"//... this can be info@ or whatever general email address 
    break; 

    ##################################################  ############################## 
        
    try{ 
            if(!
    mail($owner_email$subject$messageBody$headers)){ 
                throw new 
    Exception('mail failed'); 
            }else{ 
                echo 
    'mail sent'
            } 
        }catch(
    Exception $e){ 
            echo 
    $e->getMessage() ."\n"
        } 
    ?>

  10. #10
    Join Date
    Mar 2005
    Location
    SE PA USA
    Posts
    28,951
    Thanks
    43
    Thanked 3,194 Times in 3,157 Posts
    Blog Entries
    12

    Default

    Unless you setup the form like a normal form, with names for each of the fields that reflect POST data you want from them, you cannot serialize. I would recommend rethinking the form so that it could do that. But working from what you do have:

    Code:
    $.ajax({
    	type: "POST",
    	url:_.mailHandlerURL,
    	data:{
    		name:_.getValFromLabel($('.name',_.form)),
    		email:_.getValFromLabel($('.email',_.form)),
    		//phone:_.getValFromLabel($('.phone',_.form)),
    		fax:_.getValFromLabel($('.fax',_.form)),
    		state:_.getValFromLabel($('.state',_.form)),
    		message:_.getValFromLabel($('.message',_.form)),
    		owner_email:_.ownerEmail,
    		stripHTML:_.stripHTML
    	},
    	success: function(){
    		_.showFu()
    	}
    })
    You can add the user field so it will be the same as it would be submitting normally (I also added cache: false, to prevent the MailHandler from getting cached):

    Code:
    $.ajax({
    	type: "POST",
    	url:_.mailHandlerURL,
    	cache: false,
    	data:{
    		name:_.getValFromLabel($('.name',_.form)),
    		email:_.getValFromLabel($('.email',_.form)),
    		//phone:_.getValFromLabel($('.phone',_.form)),
    		fax:_.getValFromLabel($('.fax',_.form)),
    		state:_.getValFromLabel($('.state',_.form)),
    		message:_.getValFromLabel($('.message',_.form)),
    		user:$('[name="user"]',_.form).val(),
    		owner_email:_.ownerEmail,
    		stripHTML:_.stripHTML
    	},
    	success: function(){
    		_.showFu()
    	}
    })
    OK, once we add user to the data to send via $.ajax() POST, we no longer need to set or get $_SESSION['user'] anywhere, rather we are able to retrieve $_POST['user'] in the normal way, here:

    PHP Code:
    switch ($_SESSION['user']) { 
    case 
    "User+One"
    $owner_email "user_one@domain.com"
    break; 

    case 
    "User+Two"
    $owner_email "user_two@domain.com"
    break; 

    default: 
    $owner_email "default@domain.com"//... this can be info@ or whatever general email address 
    break; 

    Like so:

    PHP Code:
    $user = isset($_POST['user'])? $_POST['user'] : '';
    switch (
    $user) { 
    case 
    "User One"
    $owner_email "user_one@domain.com"
    break; 

    case 
    "User Two"
    $owner_email "user_two@domain.com"
    break; 

    default: 
    $owner_email "default@domain.com"//... this can be info@ or whatever general email address 
    break; 

    echo 
    $owner_email//this line for diagnostics, should be removed for production 
    The browser cache may need to be cleared and/or the page refreshed to see changes.

    Demo: user.zip

    Notes:

    As I don't believe you specified which jQuery version you are using, I picked 1.8.3 - results may vary with other versions. Probably not with most other recent versions at least.

    In the demo (user.zip) and above code I've added diagnostics, such that the mail to address ($owner_email) will appear in the browser console if it has a console. Any PHP error message from the MailHandler.php will appear there as well:

    Code:
    $.ajax({
    	type: "POST",
    	url:_.mailHandlerURL,
    	cache: false,
    	data:{
    		name:_.getValFromLabel($('.name',_.form)),
    		email:_.getValFromLabel($('.email',_.form)),
    		//phone:_.getValFromLabel($('.phone',_.form)),
    		fax:_.getValFromLabel($('.fax',_.form)),
    		state:_.getValFromLabel($('.state',_.form)),
    		message:_.getValFromLabel($('.message',_.form)),
    		user:$('[name="user"]',_.form).val(),
    		owner_email:_.ownerEmail,
    		stripHTML:_.stripHTML
    	},
    	success: function(data){
    		window.console && console.log(data); //this line for diagnostics, should be removed in production
    		_.showFu();
    	}
    });
    You can remove or comment out the window.console && console.log(data); line to prevent diagnostics appearing for visitors in their browser's consoles once everything is working to your satisfaction.

    On index.php (the form in your post) I replaced:

    PHP Code:
    <?php  
    session_start
    ();  
    $_SESSION['user'] = (isset($_GET['user']) ? $_GET['user'] : '');  
    $user $_GET['user'];?>      
                <?php if (isset($user)) { echo "Get In Touch With $user"; } else { echo "Get In Touch"; } ?></h2>  
                    <form id="contact-form">  
                    <input type="hidden" name="user" value="<? echo "$user"?>">  
                        <div class="success">Contact form submitted!<br>  
                            <strong>We will be in touch soon.</strong>  
                        </div>
    with:

    PHP Code:
    <?php  
    $user 
    = isset($_GET['user'])? $_GET['user'] : null;?>      
                <h2>Get In Touch<?php echo $user" With $user"";?></h2>  
                    <form id="contact-form">  
                    <input type="hidden" name="user" value="<?php echo "$user"?>">  
                        <div class="success">Contact form submitted<?php echo $user" to $user"";?>!<br>  
                            <strong>We will be in touch soon.</strong>  
                        </div>
    On MailHandler.php, I got rid of:

    PHP Code:
    session_start(); 
    echo 
    $_SESSION['user']; echo "$user"
    and made the not POST path back to index.php relative so it could work in a sub folder:

    Code:
        // redirect back to contact form if accessed directly 
        if ($_SERVER['REQUEST_METHOD'] != 'POST'){  
        header("Location: ../index.php?page=contact"); 
        die;  
        }
    That will work fine even if the index file is in the root, as long as the MailHandler.php file is where indicated in the javascript code (bat/MailHandler). But you can change it back (remove the two red dots) if you like.

    There are three typos in the javascript as pasted into your post (these may or may not be in the script you're actually using):

    Code:
    &&(inp.val(''),_.hideEmptyFu(label),label.removeClas  s(_.invalidCl))
    and:

    Code:
    label.find('.'+_.errorCl+',.'+_.emptyCl).css({disp  lay:'block'}).hide()
    and:

    Code:
    return (tmp=el.find(_.targets).val())==''||tmp==el.data('  defVal')
    In all three cases the gaps should be removed (and I did so in my demo attached above):

    Code:
    &&(inp.val(''),_.hideEmptyFu(label),label.removeClass(_.invalidCl))
    and:

    Code:
    label.find('.'+_.errorCl+',.'+_.emptyCl).css({display:'block'}).hide()
    and:

    Code:
    return (tmp=el.find(_.targets).val())==''||tmp==el.data('defVal')
    Again:

    The browser cache may need to be cleared and/or the page refreshed to see changes.
    Last edited by jscheuer1; 08-05-2013 at 05:40 AM. Reason: tested and it worked, add demo (user.zip) and details
    - John
    ________________________

    Show Additional Thanks: International Rescue Committee - Donate or: The Ocean Conservancy - Donate or: PayPal - Donate

  11. The Following User Says Thank You to jscheuer1 For This Useful Post:

    ?foru (08-08-2013)

Similar Threads

  1. CSS Contact form-help need
    By bogdancornel in forum CSS
    Replies: 0
    Last Post: 06-22-2010, 03:17 PM
  2. Need Contact form...
    By baldrn in forum JavaScript
    Replies: 2
    Last Post: 04-14-2009, 03:26 PM
  3. Open Source Form Processor ?
    By chrbar in forum Looking for such a script or service
    Replies: 4
    Last Post: 04-02-2008, 05:57 AM
  4. Form Processor
    By Chevvy in forum PHP
    Replies: 1
    Last Post: 01-03-2007, 07:07 PM
  5. Contact Form
    By Johnnymushio in forum HTML
    Replies: 2
    Last Post: 08-25-2006, 05:20 PM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •