Image selector and Rich Text editor on custom backend page?
I am working on a custom backend page that selects a single custom module item. I need to need able to pick an image from the image library and also edit content (Rich Text) on the page. My custom module has two images to select and one Rich Text field.
Most custom module & widget examples show plain text. How can I do this with more complex data types such as the image and rich text?
Hi Steve,
Thank you for contacting us.
Unfortunately it is not very clear for me what you are actually trying to achieve. First of all are you using a custom module built using code or the Module Builder tool? If you are using the Module Builder you could just create a new backend page, drop the custom module widget on the page and your data will be displayed.
After your module is created using the module builder you can create content items and for them select images from your libraries.
Here you can find documentation for the Module Builder.
Please provide more details about your problems so that we can help. Feel free contacting us if you need further assistance.
Regards,
Stoimen Stoimenov
the Telerik team
I already have a widget based on a UserControl. What I need to know is how to add an image selector and rich text content editor to the widget.
Hi Steve. I am also confused on what you are trying to do but I'll attempt to answer based on what I think you are trying to do. I think you have an "intra-site" module that you are trying to add a image selector and a rich content control to. If this is not the case, you can stop reading.
I struggled with this for weeks because I could not figure out how all the examples in the forums and blog posts related to what I was trying to do. All of the examples I found were widgets that were used when clicking the edit button of a control. On a module backend, there isn't an edit button to do a widget so the example didn't seem to apply. Here is the code for the Add/Edit view page of my module that included a Image Selector, Page Selector and Rich Text Editor.
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="FeaturedMessagesAddEditView.ascx.cs" Inherits="InstalledWebComponents.Modules.FeaturedMessages.Admin.FeaturedMessagesAddEditView" %>
<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI.Fields" TagPrefix="sf" %>
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>
<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI" TagPrefix="sitefinity" %>
<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI.Fields" TagPrefix="sfFields" %>
<%@ Register Assembly="Telerik.Sitefinity" TagPrefix="designers" Namespace="Telerik.Sitefinity.Web.UI.ControlDesign" %>
<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Modules.Libraries.Web.UI.Designers" TagPrefix="sf1" %>
<
telerik:RadScriptManager
ID
=
"manager"
runat
=
"server"
></
telerik:RadScriptManager
>
<!-- This is needed for the Page Selector to work -->
<
sitefinity:UserPreferences
ID
=
"userPreferences"
runat
=
"server"
/>
<
h1
class
=
"sfBreadCrumb"
>Sample Control</
h1
>
<
div
class
=
"sfMain sfClearfix"
>
<
div
class
=
"sfContent"
>
<
div
class
=
"rgTopOffset sfWorkArea"
>
<
fieldset
class
=
"sfNewContentForm"
>
<
div
class
=
"sfFormIn"
>
<
ul
>
<
li
>
<
asp:Label
ID
=
"lblBlurb"
runat
=
"server"
Text
=
"Blurb"
CssClass
=
"sfTxtLbl"
/>
<!-- Rich Text Editor -->
<
telerik:RadEditor
ID
=
"radblurb"
runat
=
"server"
></
telerik:RadEditor
>
</
li
>
<
li
>
<!-- Media Content Selector -->
<
sf1:MediaContentSelectorView
ID
=
"selectorView"
runat
=
"server"
ContentType
=
"Telerik.Sitefinity.Libraries.Model.Image"
ParentType
=
"Telerik.Sitefinity.Libraries.Model.Album"
LibraryBinderServiceUrl
=
"~/Sitefinity/Services/Content/AlbumService.svc/"
MediaContentBinderServiceUrl
=
"~/Sitefinity/Services/Content/ImageService.svc/"
MediaContentItemsListDescriptionTemplate
=
"Telerik.Sitefinity.Resources.Templates.Designers.Libraries.Images.ImageItemDescriptionTemplate.htm"
DisplayResizingOptionsControl
=
"false"
ShowOpenOriginalSizeCheckBox
=
"false"
>
</
sf1:MediaContentSelectorView
>
</
li
>
<
li
>
<
asp:Label
ID
=
"lblRelatedLink"
runat
=
"server"
Text
=
"RelatedLink"
CssClass
=
"sfTxtLbl"
/>
<!-- Page Selector -->
<
sitefinity:GenericPageSelector
id
=
"GenericPageSelector1"
runat
=
"server"
RootNodeID
=
"F669D9A7-009D-4d83-DDAA-000000000002"
WebServiceUrl
=
"~/Sitefinity/Services/Pages/PagesService.svc/"
ShowOnlySelectedAsGridOnLoad
=
"true"
MarkItemsWithoutTranslation
=
"false"
AllowMultipleSelection
=
"false"
/>
</
li
>
<
asp:HiddenField
ID
=
"imageId"
runat
=
"server"
ClientIDMode
=
"Static"
/>
<
asp:HiddenField
ID
=
"pageId"
runat
=
"server"
ClientIDMode
=
"Static"
/>
</
ul
>
<
p
><
asp:Button
ID
=
"btnSave"
runat
=
"server"
Text
=
"Save Sample"
OnClick
=
"btnSave_Click"
/>
or <
a
href
=
"<%= ResolveUrl("
~/Sitefinity/Content/Sample") %>">Cancel and
go back to Featured Messages</
a
></
p
>
</
div
>
</
fieldset
>
</
div
>
</
div
>
</
div
>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Telerik.Sitefinity;
using Telerik.Sitefinity.Data;
using Telerik.Sitefinity.Model;
using Telerik.Sitefinity.Modules;
using Telerik.Sitefinity.Libraries;
using Telerik.Sitefinity.Libraries.Model;
using Telerik.Sitefinity.Modules.Libraries;
using Telerik.Sitefinity.Modules.Libraries.Images;
using Telerik.Sitefinity.Modules.Pages;
using Telerik.Sitefinity.Modules.Pages.Web.UI;
using Telerik.Sitefinity.Taxonomies;
using Telerik.Sitefinity.Taxonomies.Model;
using Telerik.Sitefinity.Web;
using Telerik.Sitefinity.Web.UI.ControlDesign;
using Telerik.Sitefinity.Web.UI.Fields;
using Telerik.Sitefinity.Resources;
using Telerik.Web.UI;
namespace SampleControl
//Ned to implement the IScriptControl interface so the User Control can use Widgets
public partial class SampleControlAddEditView : System.Web.UI.UserControl, IScriptControl
private const string UrlNameCharsToReplace = @"[^\w\-\!\$\'\(\)\=\@\d_]+";
private const string UrlNameReplaceString = "-";
SampleControlcontext = SampleControlContext.Get();
private ScriptManager sm;
#region Check Mode
public enum AdminControlMode
Create,
Edit
/// <
summary
>
/// Gets or sets the mode in which to render the control.
/// </
summary
>
/// <
value
>
/// The mode.
/// </
value
>
public AdminControlMode Mode get return _mode; set _mode = value;
private AdminControlMode _mode;
private Guid SampleControlID = Guid.Empty;
/// <
summary
>
/// Gets the SampleControl ID to load in Edit Mode.
/// </
summary
>
protected Guid SampleControlID
get
if (SampleControlID == Guid.Empty)
// ensure parameter is valid
var param = Request.RequestContext.RouteData.Values["Params"] as string[];
if (param == null) return Guid.Empty;
// grab id from url
Guid id;
if (!Guid.TryParse(param[0], out id)) return Guid.Empty;
// retrieve SampleControl
var SampleControl= context.SampleControl.FirstOrDefault(t => t.Id == id);
SampleControlID = (SampleControl == null) ? Guid.Empty : SampleControl.Id;
return SampleControlID;
#endregion
/// <
summary
>
/// Handles the Load event of the Page control.
/// </
summary
>
/// <
param
name
=
"sender"
>The source of the event.</
param
>
/// <
param
name
=
"e"
>The <
see
cref
=
"System.EventArgs"
/> instance containing the event data.</
param
>
protected void Page_Load(object sender, EventArgs e)
if (!IsPostBack && Mode == AdminControlMode.Edit)
var SampleControl= context.SampleControl.Where(t => t.Id == SampleControl).FirstOrDefault();
if SampleControl== null) return;
Telerik.Sitefinity.Libraries.Model.Image image = App.WorkWith().Images().Where(i => i.Id == SampleControl.ImageId).Get().SingleOrDefault();
Telerik.Sitefinity.Pages.Model.PageNode page = App.WorkWith().Pages().Where(p => p.Id == SampleControl.RelatedLink).Get().SingleOrDefault();
radblurb.Content = SampleControl.Blurb;
pageId.Value = SampleControl.RelatedLink.ToString();
imageId.Value = SampleControl.ImageId.ToString();
protected override void OnPreRender(EventArgs e)
if (!this.DesignMode)
// Test for ScriptManager and register if it exists
sm = RadScriptManager.GetCurrent(this.Page);
if (sm == null)
throw new HttpException("A ScriptManager control must exist on the current page.");
sm.RegisterScriptControl(this);
base.OnPreRender(e);
protected override void Render(HtmlTextWriter writer)
if (!this.DesignMode)
sm.RegisterScriptDescriptors(this);
base.Render(writer);
protected virtual IEnumerable<
ScriptReference
> GetScriptReferences()
ScriptReference imageReference = new ScriptReference();
//Path to the client script required for the media content selector
imageReference.Path = "~/Modules/SampleControl/Admin/JavaScript/SampleControlAddEditView.js";
return new ScriptReference[] imageReference ;
protected virtual IEnumerable<
ScriptDescriptor
> GetScriptDescriptors()
ScriptControlDescriptor imageDescriptor = new ScriptControlDescriptor("InstalledWebComponents.Modules.SampleControl.Admin.SampleControlAddEditView", this.ClientID);
//Send the MediaContentSelectorView clientside object to the page.
imageDescriptor.AddComponentProperty("selectorView", selectorView.ClientID);
//Send the GenericPageSelector clientside object to the page.
imageDescriptor.AddComponentProperty("pageSelectorView", GenericPageSelector1.ClientID);
//Send the Save Button clientside object to the page.
imageDescriptor.AddElementProperty("saveLink", btnSave.ClientID);
return new ScriptDescriptor[] imageDescriptor ;
IEnumerable<
ScriptReference
> IScriptControl.GetScriptReferences()
return GetScriptReferences();
IEnumerable<
ScriptDescriptor
> IScriptControl.GetScriptDescriptors()
return GetScriptDescriptors();
/// <
summary
>
/// Handles the Click event of the btnSave control.
/// </
summary
>
/// <
param
name
=
"sender"
>The source of the event.</
param
>
/// <
param
name
=
"e"
>The <
see
cref
=
"System.EventArgs"
/> instance containing the event data.</
param
>
protected void btnSave_Click(object sender, EventArgs e)
this.Page.Validate();
if (this.Page.IsValid)
Telerik.Sitefinity.Project.Configuration.ProjectConfig config = new Telerik.Sitefinity.Project.Configuration.ProjectConfig();
Telerik.Sitefinity.Project.Web.Services.ProjectInfo projectInfo = new Telerik.Sitefinity.Project.Web.Services.ProjectInfo(config);
switch (Mode)
case AdminControlMode.Edit:
// update existing SampleControl
var SampleControl= context.SampleControl.Where(t => t.Id == SampleControlID).FirstOrDefault();
if (SampleControl == null) return; // default 404 response
// mark route handled/found
RouteHelper.SetUrlParametersResolved();
//Code to save object.
break;
case AdminControlMode.Create:
//code to save object
break;
// save and return to main view
context.SaveChanges();
Response.Redirect(ResolveUrl(SiteMapBase.GetActualCurrentNode().ParentNode.Url));
protected override void OnUnload(EventArgs e)
base.OnUnload(e);
if (context != null)
context.Dispose();
Type.registerNamespace("SampleNamespace");
SampleNamespace.SampleControlAddEditView = function (element)
SampleNamespace.SampleControlAddEditView.initializeBase(this, [element]);
this._imageId = $("#imageId").val();
this._pageId = $("#pageId").val();
SampleNamespace.SampleControlAddEditView.prototype =
initialize: function ()
SampleNamespace.SampleControlAddEditView.callBaseMethod(this, 'initialize');
this._itemSelectDelegate = Function.createDelegate(this, this._itemSelect);
this._selectorView.add_onItemSelectCommand(this._itemSelectDelegate);
//Used to capture save button click
this._saveLinkClickDelegate = Function.createDelegate(this, this._saveLinkClicked);
if (this._saveLink)
$addHandler(this._saveLink, "click", this._saveLinkClickDelegate);
// Used to determine which image needs to be highlighted on page load.
this._mediaContentBinderItemDataBoundDelegate = Function.createDelegate(this, this._mediaContentBinderItemDataBound);
this._onLoadDelegate = Function.createDelegate(this, this._onLoad);
Sys.Application.add_load(this._onLoadDelegate);
,
_onLoad: function (sender, args)
this._selectorView.get_mediaContentBinder().add_onItemDataBound(this._mediaContentBinderItemDataBoundDelegate);
this._pageSelectorView.set_selectedItemId(this._pageId);
,
dispose: function ()
SampleNamespace.SampleControlAddEditView.callBaseMethod(this, 'dispose');
if (this._selectorView)
this._selectorView.add_onItemSelectCommand(this._itemSelectDelegate);
if (this._selectLinkClickDelegate)
delete this._saveLinkClickDelegate;
,
//This method determines which image should be highlighted
_mediaContentBinderItemDataBound: function (sender, args)
var dataItem = args.get_dataItem();
var id = dataItem.Id;
if (id == this._imageId)
sender._selectedItems.push(dataItem);
this._highlightSelectedImage(args.get_itemElement());
,
get_selectorView: function ()
return this._selectorView;
,
set_selectorView: function (value)
this._selectorView = value;
,
get_pageSelectorView: function ()
return this._pageSelectorView;
,
set_pageSelectorView: function (value)
this._pageSelectorView = value;
,
get_saveLink: function ()
return this._saveLink;
,
set_saveLink: function (value)
this._saveLink = value;
,
//This method determines which item to select
_itemSelect: function (sender, args)
this._imageId = args.get_dataItem().Id;
$("#imageId").val(this._imageId);
var selectedElement = args.get_itemElement();
this._highlightSelectedImage(selectedElement);
,
//This method set the selected value of the media content selector
_itemSet: function (sender, args)
var d = this.get_controlData();
d.SelectedItemValue = this._imageId;
,
//This method adds the style so the selected item appears highlighted
_highlightSelectedImage: function (selectedElement)
if (this.selectedImageElement)
if (this.selectedImageElement != selectedElement)
$(this.selectedImageElement).find(".imgSelect").removeClass("sfSelImgBorder");
$(this.selectedImageElement).removeClass("sfSel");
else
$(this.selectedImageElement).addClass("sfSel");
if (selectedElement)
this.selectedImageElement = selectedElement;
$(selectedElement).addClass("sfSel");
$(selectedElement).find(".imgSelect").addClass("sfSelImgBorder");
,
//The save button client click event.
_saveLinkClicked: function (sender, args)
var selectedValue = this.get_pageSelectorView().get_selectedItem();
if (!selectedValue || selectedValue === "")
alert("No page selected.");
else
$("#pageId").val(selectedValue.Id);
,
add_onItemSelectCommand: function (delegate)
this.get_events().addHandler('onItemSelectCommand', delegate);
SampleNamespace.SampleControlAddEditView.registerClass('SampleNamespace.SampleControlAddEditView', Sys.Component);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();