Custom Field in Module Builder
Hi there,
We are trying to build a custom module with dynamic drop down list of image libraries.
I followed the following thread:
www.sitefinity.com/.../extend_the_image_selector_for_content_items_with_filtering_by_album.aspx
from there I added a drop down list class, definition class and element class.
I went the Sitefinity backend and created a new module inside the module builder and I added a custom field with my control. When I tried to activate the module I get an error saying "There has been an error activating module!
".
The frontend of my drop down list control
<%@ Control Language="C#" AutoEventWireup="true" %><%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI" TagPrefix="sf" %><%@ Register Assembly="ThumbnailSelectorField" Namespace="Telerik.Sitefinity.Samples" TagPrefix="samples" %><div> <p><strong>Gallery:</strong></p> <sitefinity:ChoiceField runat="server" ID="GalleryChoiceField" DisplayMode="Write" RenderChoicesAs="DropDown" /></div>using Telerik.Sitefinity.Web.UI.Fields;using Telerik.Sitefinity.Web.UI.Fields.Contracts;using Telerik.Sitefinity.Web.UI;using Telerik.Sitefinity;using Telerik.Sitefinity.Web.UI.Fields.Enums;/// <summary>/// Summary description for DropDownList/// </summary>namespace Telerik.Sitefinity.Samples [FieldDefinitionElement(typeof(DropDownListElement))] public class DropDownList : ChoiceField protected override void InitializeControls(GenericContainer container) GalleryChoice.Choices.Add(new ChoiceItem Text = "Select A Gallery", Value = Guid.Empty.ToString() ); foreach (var gallery in App.WorkWith().Albums().Get().ToList()) GalleryChoice.Choices.Add(new ChoiceItem Text = gallery.Title, Value = gallery.Id.ToString() ); protected override string LayoutTemplateName get return string.Empty; #region PageControls protected ChoiceField GalleryChoice get return Container.GetControl<ChoiceField>("GalleryChoiceField", true); #endregion private string _layoutTemplatePath = "~/ThumbnailSelector/ThumbnailSelectorField.DropDownList.DropDownList.ascx"; private string _scriptReference = "ThumbnailSelectorField.DropDownList.DropDownList.js"; public override string LayoutTemplatePath get return _layoutTemplatePath; public override IEnumerable<ScriptReference> GetScriptReferences() var scripts = base.GetScriptReferences() as List<ScriptReference>; if (scripts == null) return base.GetScriptReferences(); scripts.Add(new ScriptReference(_scriptReference)); return scripts.ToArray(); public override IEnumerable<ScriptDescriptor> GetScriptDescriptors() var descriptors = new List<ScriptDescriptor>(base.GetScriptDescriptors()); var descriptor = (ScriptControlDescriptor)descriptors.Last(); descriptor.AddComponentProperty("GalleryChoice", this.GalleryChoice.ClientID); return descriptors; /// <reference name="MicrosoftAjax.js"/>/// <reference name="Telerik.Sitefinity.Resources.Scripts.jquery-1.4.2-vsdoc.js" assembly="Telerik.Sitefinity.Resources"/>(function () var getter_maker, setter_maker, make_getter_and_setter; Type.registerNamespace("Telerik.Sitefinity.Web.UI.Fields"); Type.registerNamespace("Telerik.Sitefinity.Samples"); this.DropDownList = function (element) DropDownList.initializeBase(this, [element]); this._GalleryChoice = null; ; getter_maker = function (key) return function () return this[key]; ; ; setter_maker = function (key) return function (value) return this[key] = value; ; ; make_getter_and_setter = function (obj, name) obj["get" + name] = getter_maker(name); obj["set" + name] = setter_maker(name); return obj; ; ProjectDisplayDesigner.prototype = initialize: function () ProjectDisplayDesigner.callBaseMethod(this, 'initialize'); , dispose: function () ProjectDisplayDesigner.callBaseMethod(this, 'dispose'); , refreshUI: function () var controlData = this._propertyEditor.get_control(); this.get_GalleryChoice().set_value(controlData.GalleryID); , applyChanges: function () var controlData = this._propertyEditor.get_control(); controlData.GalleryID = this.get_GalleryChoice().get_value(); , _resizeControlDesigner: function () return setTimeout('dialogBase.resizeToContent()', 100); ; make_getter_and_setter(ProjectDisplayDesigner.prototype, '_GalleryChoice'); Telerik.Sitefinity.Samples.DropDownList.registerClass('Telerik.Sitefinity.Samples.DropDownList', Telerik.Sitefinity.Web.UI.Fields.ChoiceField); Sys && Sys.Application.notifyScriptLoaded();).call(this);Hi Chris,
Can you tell me how exactly you registered your custom field control? Also, the best thing that you can do is test the Field Control in another module (one of Sitefinity's built-in, for example the News module) in order to see what exactly is the problem. If the control works in a regular module, then it will work in the Module Builder, as well. Here's another article with an example of adding custom fields to the Module Builder:
http://www.sitefinity.com/blogs/radoslavgeorgiev/posts/12-02-27/creating_one_to_many_relationships_in_dynamic_modules.aspx
Hi there,
I managed to get my custom field show up on News module. However, the css and the javascript on the Create News page are not working properly. Do you have any ideas what causing this problem?
The frontend of my drop down list control looks like this
<%@ Control Language="C#" AutoEventWireup="true" %><%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI" TagPrefix="sf" %><div> <asp:Label runat="server" ID="titleLabel" Text=""></asp:Label> <asp:Label ID="titleLabel_dropdown" runat="server"></asp:Label> <asp:DropDownList ID="dropDown" runat="server"> </asp:DropDownList> <asp:Label runat="server" ID="exampleLabel"></asp:Label><br /> <asp:Label runat="server" ID="descriptionLabel"></asp:Label></div>
My virtualpath:
VirtualPath: ~/CustomControlDropDownList/*using System;using System.Collections.Generic;using System.Linq;using System.Text;using Telerik.Sitefinity.Web.UI.Fields;using Telerik.Sitefinity.Data.Metadata;using Telerik.Sitefinity.Model;using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields;using Telerik.Sitefinity.Metadata.Model;using Telerik.Sitefinity.Web.UI;using Telerik.Sitefinity;using System.Web.UI;using System.Web.UI.WebControls;using Telerik.Sitefinity.Web.UI.Fields.Enums;using Telerik.Sitefinity.Modules.Libraries;using Telerik.Sitefinity.Libraries.Model;using Telerik.Web.UI;namespace CustomControlDropDownList [FieldDefinitionElement(typeof(GalleryDropDownElement))] public class GalleryDropDown : ChoiceField public GalleryDropDown() public override Telerik.Sitefinity.Web.UI.Fields.Enums.RenderChoicesAs RenderChoicesAs get return Telerik.Sitefinity.Web.UI.Fields.Enums.RenderChoicesAs.DropDown; set base.RenderChoicesAs = value; protected override void InitializeControls(GenericContainer container) this.ExampleLabel.Text = this.Example; this.TitleLabel.Text = this.Title; this.DescriptionLabel.Text = this.Description; this.DropDown.Items.Add(new ListItem Text = "Select A Gallery", Value = Guid.Empty.ToString() ); foreach (var gallery in App.WorkWith().Albums().Get().ToList()) this.DropDown.Items.Add(new ListItem Text = gallery.Title, Value = gallery.Id.ToString() ); #region Pubic properies public override string Example get; set; public override string Title get; set; public override string Description get; set; #endregion #region PageControls protected internal virtual Label titleLabel get return this.Container.GetControl<Label>("titleLabel", true); protected internal virtual Label descriptionLabel get return Container.GetControl<Label>("descriptionLabel", true); protected internal virtual Label exampleLabel get return this.Container.GetControl<Label>("exampleLabel", this.DisplayMode == FieldDisplayMode.Write); protected virtual DropDownList dropDown get return this.Container.GetControl<DropDownList>("dropDown", true); protected override System.Web.UI.WebControls.WebControl TitleControl get return this.titleLabel; protected override WebControl DescriptionControl get return this.descriptionLabel; protected override WebControl ExampleControl get return this.exampleLabel; #endregion protected override string LayoutTemplateName get return null; public override string LayoutTemplatePath get return "~/CustomControlDropDownList/CustomControlDropDownList.Resources.GalleryDropDown.ascx"; set base.LayoutTemplatePath = value; private string _scriptReference = "CustomControlDropDownList.Resources.GalleryDropDown.js"; public override IEnumerable<ScriptReference> GetScriptReferences() var scripts = base.GetScriptReferences() as List<ScriptReference>; if (scripts == null) return base.GetScriptReferences(); scripts.Add(new ScriptReference(_scriptReference)); return scripts.ToArray(); public override IEnumerable<ScriptDescriptor> GetScriptDescriptors() var descriptors = new List<ScriptDescriptor>(base.GetScriptDescriptors()); var descriptor = (ScriptControlDescriptor)descriptors.Last(); descriptor.AddComponentProperty("dropDown", this.dropDown.ClientID); return descriptors; Hello Chris,
From the picture that you provided, there seems to be a javascript error on the page (probably caused by your custom field control's javascript part). What you can do is inspect the page with Firebug and see what javascript error is thrown in the Console log. This can help you locate the problem inside your javascript and correct it.
Greetings,