Skip to main content

Web Forms For Marketers - Custom Unique ID Field Type

I recently had a request from the business to implement a unique 8-digit (auto-incrementing) Reference number for one of their Forms. Doing a quick scan in the available Field types, I found that there wasn't any type available that fits my requirement. 
I had two options to consider:

  1. Override the Save to DB action: by overriding the Execute method and replacing the AdaptedResultList with my own which queries the WFM DB and looks for the Max Reference value and returns the incremented value at that instance; this worked well but I quickly ran into an issue wherein other Save Actions (like Send Email) were still using the original AdaptedResultList and thus the experience was inconsistent. If I were to go this route, I would have to override every possible Save action which is not very good. So I concentrated with my next option:  
  2. Create my own Custom Field Type: I created my own type, did the necessary changes in the WFFM module settings like (add a new Field Type referencing my new custom class). The key here is to override the ControlResult property of the SingleLineText field class so that instead of taking whatever was passed from the UI, it will instead get the value from the custom method, in my case to get the 8-digit Max Value from the Reference Field in the WFFM DB. See sample code below: You may notice that I used ADO and specifically looking for a Numeric 8-digit value starting with the number 1. e.g. 10000000.



[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))]
    public class ReferenceNumberText : SingleLineText
    {
        public override ControlResult Result
        {
            get
            {
                return CreateNewControlResultWithValue(Title, GetMaxValue());
            }
        }
        private static ControlResult CreateNewControlResultWithValue(string name, string value)
        {
            return new ControlResult(name, value,"");
        }
        /// <summary>
        /// Note: FieldName should always have the term "Reference Number" appended
        /// </summary>
        /// <returns></returns>
        private static string GetMaxValue()
        {
            var builder = new StringBuilder();
            using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["wfm"].ConnectionString))
            {
                connection.Open();
                using (var command = connection.CreateCommand())
                {
                    command.Connection = connection;
                    builder.Append(
                        "SELECT MAX(CAST(Value AS INT)) FROM [Field] WHERE FieldName LIKE '%Reference Number' AND Value LIKE '1[0-9][0-9][0-9][0-9][0-9][0-9][0-9]' AND ISNUMERIC(Value) = 1");
                 
                    command.CommandText = builder.ToString();
                    command.CommandType = CommandType.Text;
                    var value = command.ExecuteScalar();
                    return DBNull.Value == value ? "10000000" : ((int)value + 1).ToString(CultureInfo.InvariantCulture);
                }
            }
        }
    }

Comments

Popular posts from this blog

Add Export to File Functionality in Sitecore's Search Options

One of our business users was requesting for a listing of items they've already added and have it available in a format that can be opened in a spreadsheet (Excel). My initial thought was to create a blank aspx page and write all the logic to get the data in the code-behind, run it and save the resulting file to a csv then I'm done.
But then it got me to think, it might be a better idea to have this functionality plugged in to Sitecore and made available for everyone to use.  Sitecore Bucket's Search Options fly-out seemed a good candidate for this feature (See image below). So doing some quick readings I got myself in to the "zone" and started implementing this quick and dirty PoC.

Just to explain what it actually does.

User will basically do a search, (Note that all search options require some filters or search keyword before any of the options can be used) clicks the Export to File, it pops up a dialog to confirm the action and executes, after which a browser-…

Rich Text Editor (RTE) Stripping Script tags

Ran across an issue today wherein one of our Content Editors was complaining that their page was not working, i.e. some page scripts where not firing.
Upon closer inspection, we found out that their content inside their RTE was missing.
We added them back but, it just kept getting stripped-off when we close the editor.
This did not happen to us before when we were using SC6.5, so this basically smells more like an upgrade issue.
I scanned all of the config changes (I kept a log) and found one curious setting:

<setting name="HtmlEditor.RemoveScripts" value="true" />

This setting was by default removing any embedded scripts inside the RTE.
Just turn it off in your CM and keep it on in your CD.

SVG Files and Sitecore

Sitecore by default does not support the SVG image types. You'd have to incorporate the following in your web.config to be able to make SC serve the SVG as an image instead of a file for download.

       <mediaType name="SVG image" extensions="svg">
          <mimeType>image/svg+xml</mimeType>
          <forceDownload>false</forceDownload>
          <sharedTemplate>system/media/unversioned/image</sharedTemplate>
          <versionedTemplate>system/media/versioned/image</versionedTemplate>
          <mediaValidator type="Sitecore.Resources.Media.ImageValidator"/>
          <thumbnails>
            <generator type="Sitecore.Resources.Media.ImageThumbnailGenerator, Sitecore.Kernel">
              <extension>png</extension>
            </generator>
            <width>150</width>
            <height>150</height>
            <backgr…