Form Builder: Create a custom control for file upload

Posted by Community Admin on 04-Aug-2018 21:20

Form Builder: Create a custom control for file upload

All Replies

Posted by Community Admin on 02-Dec-2011 00:00
Hi,
I need to add a fileupload to a form, but I am struggling with how to create a control for form builder. The value (filename) is not saved into the database after I submit a form. Can anyone point out what I did wrong? Thanks a lot.
Stephen
FileUploader.ascx
<%@ Control Language="C#" %>
   
<asp:Label runat="server" ID="titleLabel" CssClass="sfTxtLbl" Text="title label"></asp:Label>
<asp:FileUpload ID="FileUpload1" runat="server" /><br />
<asp:Label runat="server" ID="exampleLabel" CssClass="sfExample" Text="example Label"></asp:Label><br />
<asp:Label runat="server" ID="descriptionLabel" CssClass="sfExample" Text="description Label"></asp:Label>

FileUploader.cs
// ----------------------------------------------------------------------------------------------------------
// <copyright file="FileUploader.cs" company="Telerik">
//      Authored by Falafel Software.
// </copyright>
// ----------------------------------------------------------------------------------------------------------
namespace CustomFormControls
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Telerik.Sitefinity.Data.Metadata;
    using Telerik.Sitefinity.Metadata.Model;
    using Telerik.Sitefinity.Model;
    using Telerik.Sitefinity.Modules.Forms;
    using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields;
    using Telerik.Sitefinity.Security;
    using Telerik.Sitefinity.Web.UI;
    using Telerik.Sitefinity.Web.UI.Fields;
    using Telerik.Sitefinity.Web.UI.Fields.Config;
    using Telerik.Sitefinity.Web.UI.Fields.Enums;
    using Telerik.Web.UI;
  
    /// <summary>
    /// Class used to create custom control for Form Builder
    /// </summary>
    [DatabaseMapping(UserFriendlyDataType.ShortText)]
    public class FileUploader : FieldControl, IFormFieldControl
    
        #region Fields
        /// <summary>
        /// Private field for metaField
        /// </summary>
        private IMetaField metaField = null;
        #endregion
  
        #region Constructor
        /// <summary>
        /// Initializes a new instance of the FileUploader class.
        /// </summary>
        public FileUploader()
        
        
        #endregion
  
        #region Public properties (will show up in dialog)
        /// <summary>
        /// Example string
        /// </summary>
        public override string Example get; set;
  
        /// <summary>
        /// Title string
        /// </summary>
        public override string Title get; set;
  
        /// <summary>
        /// Description string
        /// </summary>
        public override string Description get; set;
        #endregion
  
        #region IFormFieldControl members
        /// <summary>
        /// Gets or sets MetaField property to persist data from control to the DB when form is submitted
        /// </summary>
        [TypeConverter(typeof(ExpandableObjectConverter))]
        public IMetaField MetaField
        
            get
            
                if (this.metaField == null)
                
                    this.metaField = this.LoadDefaultMetaField();
  
                    // Add unique field name
                    this.metaField.FieldName = "FileUploader_" + this.ClientID;
                
  
                return this.metaField;
            
  
            set
            
                this.metaField = value;
            
        
        #endregion
  
        #region Value method
        /// <summary>
        /// Get and set the value of the field.
        /// </summary>
        public override object Value
        
            get
            
                return this.FileUpload1.FileName;
            
  
            set
            
                //this.TextBox1.Text = value.ToString();
            
        
        #endregion
  
        #region Labels on control template
        /// <summary>
        /// Gets reference to the TitleLabel
        /// </summary>
        protected internal virtual Label TitleLabel
        
            get
            
                return this.Container.GetControl<Label>("titleLabel", true);
            
        
  
        /// <summary>
        /// Gets reference to the DescriptionLabel
        /// </summary>
        protected internal virtual Label DescriptionLabel
        
            get
            
                return Container.GetControl<Label>("descriptionLabel", true);
            
        
  
        /// <summary>
        /// Gets reference to the ExampleLabel
        /// </summary>
        protected internal virtual Label ExampleLabel
        
            get
            
                return this.Container.GetControl<Label>("exampleLabel", this.DisplayMode == FieldDisplayMode.Write);
            
        
  
        #region Template
        /// <summary>
        /// Specify a template for the control
        /// </summary>
        protected override string LayoutTemplateName
        
            get return "CustomFormControls.Resources.FileUploader.ascx";
        
        #endregion
  
        /// <summary>
        /// Reference to the TitleControl
        /// </summary>
        protected override WebControl TitleControl
        
            get
            
                return this.TitleLabel;
            
        
  
        /// <summary>
        /// Reference to the DescriptionControl
        /// </summary>
        protected override WebControl DescriptionControl
        
            get
            
                return this.DescriptionLabel;
            
        
  
        /// <summary>
        /// Gets the reference to the control that represents the example of the field control.
        /// Return null if no such control exists in the template.
        /// </summary>
        /// <value></value>
        protected override WebControl ExampleControl
        
            get
            
                return this.ExampleLabel;
            
        
        #endregion
  
        #region Textbox on control
        /// <summary>
        /// Gets reference to the FileUpload1 control
        /// </summary>
        protected virtual FileUpload FileUpload1
        
            get
            
                return this.Container.GetControl<FileUpload>("FileUpload1", true);
            
        
        #endregion
  
        #region Script methods
        /// <summary>
        /// Get list of all scripts used by control
        /// </summary>
        /// <returns>List of all scripts used by control</returns>
        public override IEnumerable<ScriptDescriptor> GetScriptDescriptors()
        
            var descriptor = new ScriptControlDescriptor(this.GetType().FullName, this.ClientID);
            descriptor.AddComponentProperty("fileUpload", this.FileUpload1.ClientID);
            descriptor.AddProperty("displayMode", this.DisplayMode);    // Pass the display mode value
            // Pass the field name - this is VERY IMPORTANT - if this value isn't passed the backend publishing will not work
            descriptor.AddProperty("dataFieldName", this.MetaField.FieldName);
            return new[] descriptor ;
        
  
        /// <summary>
        /// Get reference to all scripts
        /// </summary>
        /// <returns>Reference to all scripts</returns>
        public override IEnumerable<System.Web.UI.ScriptReference> GetScriptReferences()
        
            var scripts = new List<ScriptReference>(base.GetScriptReferences())
                            
                                new ScriptReference("CustomFormControls.Resources.CustomFormControls.js", this.GetType().Assembly.FullName),
                                new ScriptReference("Telerik.Sitefinity.Web.UI.Fields.Scripts.FieldDisplayMode.js", "Telerik.Sitefinity"),
                            ;
            return scripts;
        
        #endregion
  
        #region InitializeControls method
        /// <summary>
        /// You have to implement the custom logic you want to have inside IntializeControls()
        /// </summary>
        /// <param name="container">Style cop won't shut up</param>
        protected override void InitializeControls(GenericContainer container)
        
            // Set the label values
            this.ExampleLabel.Text = this.Example;
            this.TitleLabel.Text = this.Title;
            this.DescriptionLabel.Text = this.Description;
  
            //this.FileUpload1.FileName = GetCurrentSitefinityUser();
        
        #endregion
  
        #region Get Current User
        /// <summary>
        /// Get the full name for the currently logged-in Sitefinity user.
        /// </summary>
        /// <returns>String with full name of current user, or empty string if user not logged in.</returns>
        private static string GetCurrentSitefinityUser()
        
            Telerik.Sitefinity.Security.Web.UI.ProfileView pv = new Telerik.Sitefinity.Security.Web.UI.ProfileView();
            Guid currentUserGuid = pv.CurrentUser.UserId;
  
            if (currentUserGuid != Guid.Empty)
            
                var userManager = UserManager.GetManager("Default");
                var user = userManager.GetUser(currentUserGuid);
                return user.FirstName + " " + user.LastName;
            
            else
            
                return String.Empty;
            
        
        #endregion
    

CustomFormControls.js
Type.registerNamespace("CustomFormControls");
  
CustomFormControls.FileUploader = function (element)
    this._fileUpload = null;
    CustomFormControls.FileUploader.initializeBase(this, [element]);
  
CustomFormControls.FileUploader.prototype =
    /* --------------------------------- set up and tear down --------------------------------- */
  
    /* --------------------------------- public methods ---------------------------------- */
  
    // Gets the value of the field control.
    get_value: function ()
        return this._fileUpload.get_value();
    ,
  
    // Sets the value of the text field control depending on DisplayMode.
    set_value: function (value)
        this._fileUpload.set_value(value);
  
    ,
  
    /* --------------------------------- event handlers ---------------------------------- */
  
    /* --------------------------------- private methods --------------------------------- */
  
    /* --------------------------------- properties -------------------------------------- */
  
    get_fileUpload: function ()
        return this._fileUpload;
    ,
  
    set_fileUpload: function (value)
        this._fileUpload = value;
    
  
CustomFormControls.FileUploader.registerClass('CustomFormControls.FileUploader', Telerik.Sitefinity.Web.UI.Fields.FieldControl);
Posted by Community Admin on 07-Dec-2011 00:00
Hi Stephen,

 As I've already said in your support ticket, this feature would come out of the box very soon in Sitefinity but currently it is not possible to upload files on form submission.

Greetings,
Svetoslav Petsov
the Telerik team
Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
Posted by Community Admin on 09-Feb-2012 00:00
Hi Svetoslav 

Is there an indicative time frame for when this control will be available?

Thanks
Posted by Community Admin on 10-Feb-2012 00:00
We too need an form control to upload a document. Any update on this would be great.

Thanks
Posted by Community Admin on 14-Feb-2012 00:00
Hi guys,

 This feature, together with some other small ones, has been rescheduled for the next release (after 5.0), as the time frame  turned out to be too small for them to be finished. You should be able to see this in one or two releases time.

Kind regards,
Svetoslav Petsov
the Telerik team
Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
Posted by Community Admin on 03-May-2012 00:00
Any news on this yet?

I am currently building a site on the latest SF (5.0.2500.0) and this functionality appears to not be present. 

Which release after the 5.0 will this be included in?..Or have I missed something?  This is a pretty essential control and to be honest writing my own is a bit of a pain. 

Thanks
Posted by Community Admin on 03-May-2012 00:00
Any news on this yet?

I am currently building a site on the latest SF (5.0.2500.0) and this functionality appears to not be present. 

Which release after the 5.0 will this be included in?..Or have I missed something?  This is a pretty essential control and to be honest writing my own is a bit of a pain. 

Thanks
Posted by Community Admin on 14-May-2012 00:00
Vote on it guys, PLEASE :)  Forms updates keep getting bumped.

Link to vote: http://www.telerik.com/support/pits.aspx#/public/sitefinity/11083
Posted by Community Admin on 10-Jul-2012 00:00
Is this "out-of-the-box" file upload available in any of the 5.X versions?
Posted by Community Admin on 20-Oct-2012 00:00
Hi Sitefinity Team,

This was a very good question, in fact someone only looking for direction in working out how to solve a problem, met with a very abrupt response.

Having had this need myself today, it would not only seem that Svetoslav was somewhat in accurate in his advice that this was coming out in the next version but in fact even today this is listed on PITS as not scheduled.  

This is no brainer stuff.  It is not uncommon for people to need to upload a file when filling in a form.  Please pay attention to some of this sort of basic stuff in addition to pushing forward with the new features.

This even exists in module builder.  I can create my own module and upload files easily!

Today this sits directly adjacent to an advert for V 5.2 release with the headline "Staying afloat while managing multiple websites and personalisation"

Maybe a headline to send back to Sitefinity would be "Staying afloat whilst trying to do the basics"

@Steve, good idea to put the link in to get some votes. Voted!

Darren
Posted by Community Admin on 01-Nov-2012 00:00
We have created a FormField that is an ASP file uploader... It's quite hacked together, but works... We've even continued the hacking so that the form response emailer we've created will add the file selected as an attachment.

If anyone is stuck on their code, just ask where and I'll try and help.

When this is Out of the Box functionality, that will be great.
Posted by Community Admin on 12-Nov-2012 00:00
@Stephen2 do you have any code samples you can share?
This thread is closed