More in this section

Forums / Developing with Sitefinity / PageSelector & PagesService

PageSelector & PagesService

4 posts, 0 answered
  1. Markus
    Markus avatar
    2 posts
    Registered:
    30 Oct 2012
    16 Nov 2012
    Link to this post
    Hello,

    I am using Sitefinity 5.1 and have problems with a widget. Besides an image and some text tThe widget provides a page selector.
    The website is multilingual. Now it seems that the page selector always shows the page tree of the default language (set unter 'Administration - Languages -> choose default language'). If the default language is english, the english page tree will be displayed. If it is german, the german page tree will be displayed. This is independent from the choosen language in which you edit a page.
    Thus editing the widget on an english page will show the german tree if the default  language is set to german.
    From the ajax request I saw that the service (PagesService.svc) returns only two values for each tree node. One has an empty key which is like a default value I guess and one key is the default (as set under "Administration") culture (e.g. "en" or "de-DE").

    In the javascript part of the Designer of the widget I initialize the page selector with the page culture:

    var my_href = window.location.href;
    var propertyValueCulturePosition = my_href.search(/propertyValueCulture/i);
    var pageCulture = my_href.slice(propertyValueCulturePosition + 21, propertyValueCulturePosition + 23);
    this.get_PageSelector().set_uiCulture(pageCulture);
    this.get_PageSelector().set_culture(pageCulture);

    So I can set the culture of this element to "en" for example. But if the default culture is "de-DE" the the service only returns the german names of the nodes. Thus I guess the page selector falls back to the default values which is the same like the values for "de-DE".

    After all I guess I have to enable multilanguage support for the url service. Or send a parameter for the desired language (of the pages (tree nodes)) with every request.
    I set the service URL and the UICulture for the Elements in the ascx.cs file of the Designer:

    protected override void InitializeControls(Telerik.Sitefinity.Web.UI.GenericContainer container)
    {
       ...
       this.PageSelector.WebServiceUrl = "~/Sitefinity/Services/Pages/PagesService.svc/";
       this.PageSelector.RootNodeID = Telerik.Sitefinity.Abstractions.SiteInitializer.FrontendRootNodeId;
       this.PageSelector.DisplayMode = FieldDisplayMode.Write;
       ...
       
      string culture = this.Page.Request.Params["propertyValueCulture"];
       if (culture == null) culture = CultureInfo.CurrentUICulture.ToString();
       this.HtmlContent.UICulture = culture;
       ...      
    }

    Is there a way to add a parameter there to the web service URL? Where I can configure the web service that it either returns always all existing languages of the pages or that it returns a specified language?

    Regards
    Markus
  2. Daniel Plomp
    Daniel Plomp avatar
    952 posts
    Registered:
    18 Feb 2004
    16 Nov 2012
    Link to this post
    Hey Markus,

    I'm not sure how you build up your page selector, without seeing any code.

    You could try to use this code in your designer.cs
    if (this.PropertyEditor != null)
    {
       var uiCulture = this.PropertyEditor.PropertyValuesCulture;
       this.PageSelectorPageId.UICulture = uiCulture;
    }

    It should be inserted on the InitializeControls() method.

    Regards,
    Daniel
  3. Markus
    Markus avatar
    2 posts
    Registered:
    30 Oct 2012
    19 Nov 2012 in reply to Daniel Plomp
    Link to this post
    Helo Daniel,

    thank you for your reply. I tried to insert your code but this.PageSelectorPageId can't be resolved. How can I get an instance of this object?
    Here is the complete code of the Designer:
    using System.Collections.Generic;
    using System.Linq;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using FPWidgets.Base.Widgets;
    using Telerik.Sitefinity.Web.UI.ControlDesign;
    using Telerik.Sitefinity.Web.UI.Fields;
    using Telerik.Sitefinity.Web.UI.Fields.Enums;
    using Telerik.Web.UI;
    using SitefinityFields = Telerik.Sitefinity.Web.UI.Fields;
    using System;
    using Telerik.Sitefinity.Pages.Model;
    using FPWidgets.Common;
    using System.Globalization;

    namespace FPWidgets.CommonWidgets.Designers
    {
    public partial class ToggleContentLinkDesigner : ControlDesignerBase
    { protected Literal litTitle { get { return base.Container.GetControl<Literal>("litTitle", true); } }
    protected Literal litLinkTitle { get { return base.Container.GetControl<Literal>("litLinkTitle", true); } }
    protected SitefinityFields.ChoiceField ShowMode { get { return Container.GetControl<SitefinityFields.ChoiceField>("ShowMode", true); } }
    protected HtmlField HtmlContent { get { return base.Container.GetControl<HtmlField>("HtmlContent", true); } }

    protected Literal litExternalInternal { get { return base.Container.GetControl<Literal>("litExternalInternal", true); } }
    protected PlaceHolder plhLinkType { get { return base.Container.GetControl<PlaceHolder>("plhLinkType", true); } }
    protected PageField PageSelector { get { return base.Container.GetControl<PageField>("PageSelector", true); } }
    protected Literal litExternal { get { return base.Container.GetControl<Literal>("litExternal", true); } }
    protected TextBox txtExternalUrl { get { return base.Container.GetControl<TextBox>("txtExternalUrl", true); } }


    protected override void InitializeControls(Telerik.Sitefinity.Web.UI.GenericContainer container)
    {
    this.DesignerMode = ControlDesignerModes.Advanced;
    // this.PropertyEditor.HideAdvancedMode = true;
    this.PropertyEditor.Width = new Unit(600, UnitType.Pixel); this.litTitle.Text = Helpers.GetResourceString("General.Title.Text");

    var showMode = (from p in this.PropertyEditor.ControlData.Properties where p.Name == "ShowMode" select p).FirstOrDefault();
    string show = showMode != null ? showMode.Value : ShowModes.show;

    this.ShowMode.Title = Helpers.GetResourceString("ToggleContentDesigner.ShowMode.Text"); 
    this.ShowMode.RenderChoicesAs = RenderChoicesAs.RadioButtons;
    this.ShowMode.Choices.Add(new ChoiceItem() { Text = Helpers.GetResourceString("ToggleContentDesigner.ShowModeInActive.Text"), Enabled = true, Selected = show == ShowModes.hide, Value = ShowModes.hide });
    this.ShowMode.Choices.Add(new ChoiceItem() { Text = Helpers.GetResourceString("ToggleContentDesigner.ShowModeActive.Text"), Enabled = true, Selected = show == ShowModes.show, Value = ShowModes.show });
    this.ShowMode.DisplayMode = FieldDisplayMode.Write;
    this.ShowMode.Value = show;

    // Sets the properties of our HtmlField control
    this.HtmlContent.Title = Helpers.GetResourceString("General.Teaser.HtmlContent.Text");
    this.HtmlContent.DisplayMode = FieldDisplayMode.Write;
    this.HtmlContent.FixCursorIssue = true;
    this.HtmlContent.EditorContentFilters = EditorFilters.DefaultFilters;

    //Retrieve the current culture information
    string cult = this.Page.Request.Params["propertyValueCulture"];

    if (cult == null)
    cult = CultureInfo.CurrentUICulture.ToString();
    // this.HtmlContent.UICulture = this.Page.UICulture;
    this.HtmlContent.UICulture = cult;


                if (this.PropertyEditor != null)
                {
                    var uiCulture = this.PropertyEditor.PropertyValuesCulture;
                    this.PageSelectorPageId.UICulture = uiCulture;

                    //this.PageSelectorControl.UICulture = uiCulture;
                    Telerik.Microsoft.Practices.EnterpriseLibrary.Logging.Logger.Writer.Write("uiCulture=" + uiCulture);
                }

    this.HtmlContent.EditorStripFormattingOptions = EditorStripFormattingOptions.MSWord
    & EditorStripFormattingOptions.Css
    & EditorStripFormattingOptions.Font
    & EditorStripFormattingOptions.Span
    & EditorStripFormattingOptions.ConvertWordLists;

    this.litExternalInternal.Text = Helpers.GetResourceString("General.Designer.Link.Text");
    var targetPageId = (from p in this.PropertyEditor.ControlData.Properties where p.Name == "TargetPageId" select p).FirstOrDefault();
    var targetUrl = (from p in this.PropertyEditor.ControlData.Properties where p.Name == "TargetUrl" select p).FirstOrDefault();
    if (targetUrl != null)
    this.txtExternalUrl.Text = targetUrl.Value;

    string linkType = "";

    linkType = (targetUrl != null && !String.IsNullOrEmpty(targetUrl.Value)) ? "external" : linkType;
    linkType = targetPageId != null ? "internal" : linkType;

    this.plhLinkType.Controls.Add(new RadioButton() { ID = "rbNoLink", Text = Helpers.GetResourceString("General.Designer.NoLink.Text"), GroupName = "LinkType", Checked = (linkType == "") });
    this.plhLinkType.Controls.Add(new RadioButton() { ID = "rbInternal", Text = Helpers.GetResourceString("General.Designer.InternalLink.Text"), GroupName = "LinkType", Checked = (linkType == "internal") });
    this.plhLinkType.Controls.Add(new RadioButton() { ID = "rbExternal", Text = Helpers.GetResourceString("General.Designer.ExternalLink.Text"), GroupName = "LinkType", Checked = (linkType == "external") });

    this.PageSelector.WebServiceUrl = "~/Sitefinity/Services/Pages/PagesService.svc/";
                //this.PageSelector.RootNodeID = this.CurrentFrontendRootNodeId;
    this.PageSelector.RootNodeID = Telerik.Sitefinity.Abstractions.SiteInitializer.FrontendRootNodeId;
    this.PageSelector.DisplayMode = FieldDisplayMode.Write;


    this.litExternal.Text = Helpers.GetResourceString("General.Designer.ExternalLink.Text");
    this.litLinkTitle.Text = Helpers.GetResourceString("General.LinkTitle.Text");
    }

    protected override string LayoutTemplateName
    {
    get { return "FPWidgets.CommonWidgets.Designers.ToggleContentLinkDesigner.ascx"; }
    }

    public override IEnumerable<ScriptReference> GetScriptReferences()
    {
    var res = new List<ScriptReference>(base.GetScriptReferences());
    var assemblyName = this.GetType().Assembly.GetName().ToString();
    res.Add(new ScriptReference("FPWidgets.Scripts.ToggleContentLinkDesigner.js", assemblyName));
    return res.ToArray();
    }

    public override IEnumerable<ScriptDescriptor> GetScriptDescriptors()
    {
    var scriptDescriptors = new List<ScriptDescriptor>(base.GetScriptDescriptors());
    var desc = (ScriptControlDescriptor)scriptDescriptors.Last();

    desc.AddComponentProperty("ShowMode", this.ShowMode.ClientID);
    desc.AddComponentProperty("HtmlContent", this.HtmlContent.ClientID);
    desc.AddComponentProperty("PageSelector", this.PageSelector.ClientID);

    desc.AddElementProperty("noLink", this.plhLinkType.FindControl("rbNoLink").ClientID);
    desc.AddElementProperty("internalLink", this.plhLinkType.FindControl("rbInternal").ClientID);
    desc.AddElementProperty("externalLink", this.plhLinkType.FindControl("rbExternal").ClientID);
    desc.AddElementProperty("txtExternalUrl", this.txtExternalUrl.ClientID);

    return new[] { desc };
    }
    }
    }

    Many thanks in advance Markus


  4. Brett Whittington
    Brett Whittington avatar
    89 posts
    Registered:
    10 Aug 2012
    19 Nov 2012 in reply to Markus
    Link to this post
    I have also experienced this problem but with the built in HtmlField control provided by Sitefinity.  When I created a support ticket asking for this information.

    My Ticket:
    I have a designer for a custom control. The designer is using an HTMLField. However, when using the HTMLField and I try to add a link using the Sitefinity Pages, all of the pages are grey out making them unselectable. I found that if I removed all of my extra languages and just my default English language, the pages were selectable with no issues. Is this a bug or do I need to add a setting to my HTML field so the pages are selectable. I've attached the code that I am using.

    Sitefinity Response:
    Hi,Thank you for using our services.

    Actually, this is a bug on our side, which we will make sure to fix as quickly as possible. Please excuse us for the inconvenience.  There is not a workaround for this issue. I am checking with the developers as to when this may be resolved.

    I apologize for the inconvenience this causes you.


    Whether or not there is a solution is up in the air.  I've been able to work around other issues even though they said it couldn't be done.  I just didn't have time to research at the time.
4 posts, 0 answered