Hierchical selector for custom field

Posted by Community Admin on 05-Aug-2018 06:53

Hierchical selector for custom field

All Replies

Posted by Community Admin on 21-May-2013 00:00

Hi,
For the custom type of my custom module, I define a field of type Guid to rapresent the association with an album (library images). I need to realize an album selector and for that i follow this example but the ContentSelector used in this example does not have a hierarchical rappresentation.

Can you suggest me how to do it?
Thank you.

Posted by Community Admin on 22-May-2013 00:00

I replace ContentSelector with FolderField that is used also by Sitefinity designer controls. It shows image libraries but not sub libraries.

I m using Sitefinity 6.

I dont know why, there is any docs about SDK. Could someone help me please?

.ascx

<%@ Control Language="C#" AutoEventWireup="true" %>
<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI" TagPrefix="sf" %>
<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Modules.Libraries.Web.UI.Fields" TagPrefix="sfLib" %>
 
<asp:Label ID="titleLabel" runat="server" CssClass="sfTxtLbl" />
<ol class="sfRadioList">
    <li><asp:RadioButton ID="noParent" runat="server" GroupName="ParentLibrary" Text="None" /></li>
    <li>
        <asp:RadioButton ID="selectParent" runat="server" GroupName="ParentLibrary" Text="Selected album:" />
        <sfLib:FolderField
                    runat="server"
                    ID="parentLibrarySelector"
                    DisplayMode="Write"
                    WrapperTag="div"
                    />
    </li>
</ol>
<sf:SitefinityLabel id="descriptionLabel" runat="server" WrapperTagName="div" HideIfNoText="true" CssClass="sfDescription" />
<sf:SitefinityLabel id="exampleLabel" runat="server" WrapperTagName="div" HideIfNoText="true" CssClass="sfExample" />

.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Sitefinity.Web.UI;
using Telerik.Sitefinity.Web.UI.Fields;
using Telerik.Sitefinity.Modules.Libraries.Web.UI.Fields;
 
namespace Telerik.Sitefinity.Samples.FieldControls
    /// <summary>
    /// A simple field control used to select a thumbnail from a Sitefinity library.
    /// </summary>
    [FieldDefinitionElement(typeof(ImgLibraryElement))]
    public class ImgLibraryField : FieldControl
    
        #region Properties
        /// <summary>
        /// Gets the name of the layout template.
        /// </summary>
        /// <value>The name of the layout template.</value>
        protected override string LayoutTemplateName
        
            get
            
                return String.Empty;
            
        
 
        /// <summary>
        /// Gets or sets the layout template path.
        /// </summary>
        /// <value>The layout template path.</value>
        public override string LayoutTemplatePath
        
            get
            
                return layoutTemplatePath;
            
            set
            
                base.LayoutTemplatePath = value;
            
        
 
        /// <summary>
        /// Gets the title label.
        /// </summary>
        /// <value>The title label.</value>
        protected internal Label TitleLabel
        
            get
            
                return this.Container.GetControl<SitefinityLabel>("titleLabel", true);
            
        
 
        /// <summary>
        /// Gets the description label.
        /// </summary>
        /// <value>The description label.</value>
        protected internal Label DescriptionLabel
        
            get
            
                return this.Container.GetControl<SitefinityLabel>("descriptionLabel", true);
            
        
 
        /// <summary>
        /// Gets the example label.
        /// </summary>
        /// <value>The example label.</value>
        protected internal Label ExampleLabel
        
            get
            
                return this.Container.GetControl<SitefinityLabel>("exampleLabel", true);
            
        
 
        protected internal RadioButton NoParent
        
            get
            
                return base.Container.GetControl<RadioButton>("noParent", true);
            
        
 
        protected internal FolderField ParentLibrarySelector
        
            get
            
                return base.Container.GetControl<FolderField>("parentLibrarySelector", true);
            
        
 
        protected internal RadioButton SelectParent
        
            get
            
                return base.Container.GetControl<RadioButton>("selectParent", true);
            
        
 
        public string ProviderName get; set;
 
        #endregion
 
        #region Overridden Methods
 
        /// <summary>
        /// Gets the script references.
        /// </summary>
        /// <returns></returns>
        public override IEnumerable<ScriptReference> GetScriptReferences()
        
            var baseReferences = new List<ScriptReference>(base.GetScriptReferences());
            var componentRef = new ScriptReference(imageLibraryFieldScript, this.GetType().Assembly.FullName);
            baseReferences.Add(componentRef);
            return baseReferences;
        
 
        /// <summary>
        /// Gets the script descriptors.
        /// </summary>
        /// <returns></returns>
        public override IEnumerable<ScriptDescriptor> GetScriptDescriptors()
        
            ScriptControlDescriptor scriptControlDescriptor = (ScriptControlDescriptor)base.GetScriptDescriptors().Last<ScriptDescriptor>();
            scriptControlDescriptor.AddComponentProperty("parentLibrarySelector", this.ParentLibrarySelector.ClientID);
            scriptControlDescriptor.AddElementProperty("noParent", this.NoParent.ClientID);
            scriptControlDescriptor.AddElementProperty("selectParent", this.SelectParent.ClientID);
            ScriptControlDescriptor[] scriptControlDescriptorArray = new ScriptControlDescriptor[1];
            scriptControlDescriptorArray[0] = scriptControlDescriptor;
            return scriptControlDescriptorArray;
        
 
 
        protected override void InitializeControls(GenericContainer container)
        
            this.ParentLibrarySelector.WebServiceUrl = webServiceUrl;
            this.ParentLibrarySelector.ItemName = "Album";
            this.ParentLibrarySelector.LibraryTypeName = "Telerik.Sitefinity.Libraries.Model.Album";
        
 
        #endregion
 
        #region Private Fields
 
        private const string webServiceUrl = "~/Sitefinity/Services/Content/AlbumService.svc/";
        private const string imageLibraryFieldScript = "Telerik.Sitefinity.Samples.Resources.Scripts.ImgLibraryField.js";
        private const string layoutTemplatePath = "~/SfSamples/Telerik.Sitefinity.Samples.Resources.Views.ImgLibraryField.ascx";
        #endregion
 
    

.js
Type.registerNamespace("Telerik.Sitefinity.Samples.FieldControls");
 
Telerik.Sitefinity.Samples.FieldControls.ImgLibraryField = function (element)
 
    Telerik.Sitefinity.Samples.FieldControls.ImgLibraryField.initializeBase(this, [element]);
 
    this._element = element;
 
    this._noParent = null;
    this._selectParent = null;
    this._parentLibrarySelector = null;
 
    this._radioButtonsClickDelegate = null;
    this._providerName = null;
 
Telerik.Sitefinity.Samples.FieldControls.ImgLibraryField.prototype =
    initialize: function ()
        Telerik.Sitefinity.Samples.FieldControls.ImgLibraryField.callBaseMethod(this, "initialize");
 
        this._radioButtonsClickDelegate = Function.createDelegate(this, this._radioButtonsClick);
        $addHandler(this.get_noParent(), "click", this._radioButtonsClickDelegate);
        $addHandler(this.get_selectParent(), "click", this._radioButtonsClickDelegate);
    ,
 
    dispose: function ()
 
        if (!this._radioButtonsClickDelegate)
            if (this.get_noParent())
                $removeHandler(this.get_noParent(), "click", this._radioButtonsClickDelegate);
            
 
            if (this.get_selectParent())
                $removeHandler(this.get_selectParent(), "click", this._radioButtonsClickDelegate);
            
 
            delete this._radioButtonsClickDelegate;
        
 
        Telerik.Sitefinity.Samples.FieldControls.ImgLibraryField.callBaseMethod(this, "dispose");
    ,
 
    /* --------------------  public methods ----------- */
 
    reset: function ()
        this.set_value(null);
        this.get_parentLibrarySelector().reset();
        Telerik.Sitefinity.Samples.FieldControls.ImgLibraryField.callBaseMethod(this, "reset");
    ,
 
    add_hasParentChanged: function (delegate)
        this.get_events().addHandler('hasParentChanged', delegate);
    ,
    remove_hasParentChanged: function (delegate)
        this.get_events().removeHandler('hasParentChanged', delegate);
    ,
 
    /* -------------------- event handlers ------------ */
 
    /* -------------------- private methods ----------- */
 
    _radioButtonsClick: function ()
        this._updateVisibility();
        this._raiseHasParentChanged(this.get_selectParent().checked);
    ,
 
    _updateVisibility: function ()
        jQuery(this.get_parentLibrarySelector().get_element()).toggle(this.get_selectParent().checked);
    ,
 
    _raiseHasParentChanged: function (hasParent)
        var handler = this.get_events().getHandler("hasParentChanged");
        var eventArgs =
            get_hasParent: function ()
                return hasParent;
            
        ;
        if (handler) handler(this, eventArgs);
        return eventArgs;
    ,
 
    /* -------------------- properties ---------------- */
 
 
    get_noParent: function ()
        return this._noParent;
    ,
    set_noParent: function (value)
        this._noParent = value;
    ,
 
    get_selectParent: function ()
        return this._selectParent;
    ,
    set_selectParent: function (value)
        this._selectParent = value;
    ,
 
    get_parentLibrarySelector: function ()
        return this._parentLibrarySelector;
    ,
    set_parentLibrarySelector: function (value)
        this._parentLibrarySelector = value;
    ,
 
    get_value: function ()
        if ((this.get_selectParent()).checked)
            return this.get_parentLibrarySelector().get_value();
        
        else
            return "00000000-0000-0000-0000-000000000000";
        
    ,
    set_value: function (value)
        if (this.get_parentLibrarySelector())
            this.get_parentLibrarySelector().set_value(value);
            if (value == null || value == "" || value == "00000000-0000-0000-0000-000000000000")
                this.get_noParent().checked = true;
            
            else
                this.get_selectParent().checked = true;
            
            this._updateVisibility();
            this._raiseHasParentChanged(this.get_selectParent().checked);
        
 
        this._value = value;
    ,
    // Passes the provider to the control
    set_providerName: function (value)
        this._providerName = value;
 
        if (this.get_parentLibrarySelector())
            this.get_parentLibrarySelector().rebind(value);
        
    ,
 
    // Gets the provider from the control
    get_providerName: function ()
        return this._providerName;
    
;
 
Telerik.Sitefinity.Samples.FieldControls.ImgLibraryField.registerClass("Telerik.Sitefinity.Samples.FieldControls.ImgLibraryField", Telerik.Sitefinity.Web.UI.Fields.FieldControl);

Posted by Community Admin on 24-May-2013 00:00

Hi Stefano,

The FolderField needs some additional parameters set in order to work correctly. I think the problem in your case is that you need to set the WebserviceUrl. Please take a look at the following forum thread on detailed info about making it work (more specifically the answer by Marin Atanasov):
http://www.sitefinity.com/developer-network/forums/developing-with-sitefinity-/need-help-with-libraryselector-in-control-designer#pLY99tT1zE6VlPO64Qp5Bw

Regards,
Slavo
Telerik
Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

Posted by Community Admin on 25-May-2013 00:00

Hi Slavo,
I'm setting WebService url here:

protected override void InitializeControls(GenericContainer container)
 
     this.ParentLibrarySelector.WebServiceUrl = webServiceUrl;

with this value:
private const string webServiceUrl = "~/Sitefinity/Services/Content/AlbumService.svc/";

In fact, the control loads  the list of root libraries but not subfolders.

Regards,
Stefano
Codicezerouno

Posted by Community Admin on 25-May-2013 00:00

Ok, I solved!

I read carefully the post of Marin Atanasov and I see what is different on WebServiceUrl used by him.

My url: ~/Sitefinity/Services/Content/AlbumService.svc/
Marin Atanasov url: ~/Sitefinity/Services/Content/AlbumService.svc/folders/

So I reflected changes on my code and get it working as I espect.

Thank you. Hope this can be useful.

Regards,
Stefano

This thread is closed