Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Andreas Kristensen 20 posts 79 karma points
    Jul 18, 2012 @ 21:48
    Andreas Kristensen
    0

    Dynamic subject in contact mail from Querystring

    I am working on a simple contact system where i need to display a value from a querystring in the subject field of the sent email.

    Today has been a slow descent into madness as this has failed to work in every way i have tried.

    I am using Umbraco 4.7.2 with Ubootstrap (bootstrap by twitter) and modifying the contact form found within. Below is the cshtml of my contact form macro

    @using System.Text
    @using System.Collections.Generic;
    @using Bootstrap.Logic.Utils
    @using umbraco.MacroEngines
    @inherits DynamicNodeContext
    @{
        dynamic form Context.Request.Form.ToDynamic();
        if (IsPost)
        {
            if (!Context.IsValidAntiForgery()ModelState.AddFormError(@Dictionary.InvalidPost)}
            if (MainHelper.IsEmpty(form.Name)ModelState.AddError("name"@Dictionary.FormNameValidation)}
            if (!MainHelper.IsEmail(form.Email)ModelState.AddError("email"@Dictionary.FormEmailValidation)}
            if (MainHelper.IsEmpty(form.Enquiry)ModelState.AddError("enquiry"@Dictionary.FormCommentValidation)}
        }
        if (!IsPost |!ModelState.IsValid)
        {
        @Html.Raw(library.RemoveFirstParagraphTag(Model.FormText.ToString()))
        <form method="post" action="@Model.Url">
            <fieldset>
                <legend>@Parameter.subject </legend>
                <div class="clearfix @Library.If(!ModelState.IsValidField("name"), "error")">
                @Html.Label(@Dictionary.FormName"name")
                <div class="input">@Html.TextBox("name"form.Namenew @class "xlarge" })
                @if (!ModelState.IsValidField("name"))
                <span class="help-inline">@string.Join(". "@ModelState["name"].Errors)</span}
                </div>
                </div>
                <div class="clearfix">
                @Html.Label(@Dictionary.AddressName"address1")
                <div class="input">@Html.TextBox("address1"form.Address1new @class "xlarge" })</div>
                </div>
                <div class="clearfix">
                @Html.Label("Add 2""address2"new @class "hide" })
                <div class="input">@Html.TextBox("address2"form.Address2new @class "xlarge" })</div>
                </div>
                <div class="clearfix @Library.If(!ModelState.IsValidField("email"), "error")">
                @Html.Label(@Dictionary.FormEmail"email")
                <div class="input">@Html.TextBox("email"form.Emailnew @type "email"@class "xlarge" })
                @if (!ModelState.IsValidField("email"))
                <span class="help-inline">@string.Join(". "@ModelState["email"].Errors)</span}
                </div>
                </div>
                <div class="clearfix @Library.If(!ModelState.IsValidField("name"), "error")">
                @Html.Label(@Dictionary.FormComment"enquiry")
                <div class="input">@Html.TextArea("enquiry"form.Enquirynew @rows 5@cols 25@class "xlarge" })
                @if (!ModelState.IsValidField("enquiry"))
                <span class="help-inline">@string.Join(". "@ModelState["enquiry"].Errors)</span}
                </div>
                </div>
                @Context.GetAntiForgeryHtml()
            </fieldset>
            <div class="actions">
                <button id="SubmitForm" type="submit" class="btn">@Dictionary.Send</button>  
            </div>
        </form>
        @Html.ValidationSummary(@Dictionary.FormValidationSummarynew @class "alert-message block-message error" })
        }
        else
        {
            var ok SendForm(form@Parameter.subject);
            if (!ok)
            {
                <div id="errorMailSettings">
                    @Model.ErrorMessage
                </div>
            }
            else
            {
                // Set Thankyou text from our contact node
                <div id="thankYou">
                    <h2>@Model.ThankYouHeaderText</h2>
                    @Model.ThankYouMessageText
            @Parameter.subject
                </div>
            }
        }
    }
    @functions 
    {
        public bool SendForm(dynamic formstring queryParam)
        {
            // Get the variables from the form and set them in strings
            string strName Library.StripHtml(form.Name).ToString();
            string strAddressLine1 Library.StripHtml(form.Address1).ToString();
            string strAddressLine2 Library.StripHtml(form.Address2).ToString();
            string strEmailFrom Library.StripHtml(form.Email).ToString();
            string strMessage Library.StripHtml(form.Enquiry).ToString();
            // Lets set the values passed in from the Macro
            string strEmailTo Model.EmailTo.ToString();
            string strEmailSubject queryParam.ToString();
             
            var now DateTime.Now;
            var strTime String.Format("{0:HH:mm:ss}"now);
            var strDate String.Format("{0:dd/MM/yyyy}"now);
            
            // Let's Replace the placeholders in the email message body
            var strEmailBody = new StringBuilder(Model.EmailBody.ToString());
            strEmailBody.Replace("[Name]", strName); // Find and Replace [Name]
            strEmailBody.Replace("[AddressLine1]", strAddressLine1); // Find and Replace [AddressLine1]
            strEmailBody.Replace("[AddressLine2]", strAddressLine2); // Find and Replace [AddressLine2]
            strEmailBody.Replace("[Email]", strEmailFrom); // Find and Replace [Email]
            strEmailBody.Replace("[Message]", strMessage); // Find and Replace [Message]
            strEmailBody.Replace("[Time]", strTime); // Find and Replace [Time]
            strEmailBody.Replace("[Date]", strDate); // Find and Replace [Date]
            // Now the email is sent out to the owner, lets send out an email
            // to let the user know we have recieved their email & will respond shortly
            string strEmailReplySubject = Model.EmailReplySubject.ToString();
            var strEmailReplyBody = new StringBuilder(Model.EmailReplyBody.ToString());
            strEmailReplyBody.Replace("[Name]", strName); // Find and Replace [Name]
            
            return MainHelper.TrySendMail(strEmailTo, strEmailSubject, strEmailBody.ToString()) && MainHelper.TrySendMail(strEmailFrom, strEmailReplySubject, strEmailReplyBody.ToString());
        }
    }

    the macro code:

    <umbraco:Macro subject="[@subject]" Alias="ContactForm" runat="server"></umbraco:Macro> 

    I can verify that @Parameter.subject works in the part of the macro that defines the legend field for the form, as the value i pass to the macro from the querystring subject is displayed here.

    the part of the code that sends the mail (the sendform function) refuses my every attempt to tell it what the querystring is. The parameter is supposed to be used as the subject of the mail sent, but it is invariably empty.

    i started out trying to pull the querystring with request, that failed, tried with httpcontext, failed, now im trying with a macro parameter and it works in one part...

    please help, i cant stop trying to fix it :D

     

     

  • Andreas Kristensen 20 posts 79 karma points
    Jul 20, 2012 @ 16:55
    Andreas Kristensen
    0

    Fixed it by placing @Parameter.subject in a hidden textfield and then using striphtml to put it in an argument on the function...

Please Sign in or register to post replies

Write your reply to:

Draft