为字段的下拉列表选项自定义 html 输出

Customize html output for a field's droplist options

我有一个名为图标的字段,它是一个来自内容树中文件夹的下拉列表。我希望该列表不仅显示文本值(如屏幕截图所示),而且还使用图标字体并显示实际图标的外观。基本上为该字段定制内容编辑器的下拉列表来自:

<option value="gears">gears</option>

<option value="gears">gears <span class="my-icon-font-gears"></span></option>

是否有任何文档说明如何修改下拉列表的输出 html,以及如何修改内容编辑器页面以加载另一个 link,在本例中为字体文件。

建议您使用 Droplink 字段类型而不是 Droplist,因为值是由 GUID 存储的,如果 link 项是改名或移动。在任何情况下,您都需要一个自定义字段,继承自 Sitecore.Shell.Applications.ContentEditor.LookupEx(DropLink 字段类型)并使用您需要的自定义标记覆盖 DoRender() 方法。

无法嵌入 span 标签,因为 option tag cannot contain other tags 无效 HTML。添加它会导致浏览器将其删除。但是,您可以在选项本身上设置 class 并为其设置样式。

`<option value="gears" style="my-icon-font-gears">gears</option>`

下面是一些实现该字段的示例代码。

using System;
using System.Web.UI;
using Sitecore;
using Sitecore.Data.Items;
using Sitecore.Diagnostics;
using Sitecore.Globalization;

namespace MyProject.CMS.Custom.Controls
{
    public class StyledLookupEx : Sitecore.Shell.Applications.ContentEditor.LookupEx
    {
        private string _styleClassField;
        private string StyleClassField
        {
            get
            {
                if (String.IsNullOrEmpty(_styleClassField))
                    _styleClassField = StringUtil.ExtractParameter("StyleClassField", this.Source).Trim();
                return _styleClassField;
            }
        }

        // This method is copied pasted from the base class apart from thhe single lined marked below
        protected override void DoRender(HtmlTextWriter output)
        {
            Assert.ArgumentNotNull(output, "output");
            Item[] items = this.GetItems(Sitecore.Context.ContentDatabase.GetItem(this.ItemID, Language.Parse(this.ItemLanguage)));
            output.Write("<select" + this.GetControlAttributes() + ">");
            output.Write("<option value=\"\"></option>");
            bool flag1 = false;
            foreach (Item obj in items)
            {
                string itemHeader = this.GetItemHeader(obj);
                bool flag2 = this.IsSelected(obj);
                if (flag2)
                    flag1 = true;
                /* Option markup modified with class added */
                output.Write("<option value=\"" + this.GetItemValue(obj) + "\"" + (flag2 ? " selected=\"selected\"" : string.Empty) + " class=\"" + obj[StyleClassField] + "\" >" + itemHeader + "</option>");
            }
            bool flag3 = !string.IsNullOrEmpty(this.Value) && !flag1;
            if (flag3)
            {
                output.Write("<optgroup label=\"" + Translate.Text("Value not in the selection list.") + "\">");
                output.Write("<option value=\"" + this.Value + "\" selected=\"selected\">" + this.Value + "</option>");
                output.Write("</optgroup>");
            }
            output.Write("</select>");
            if (!flag3)
                return;
            output.Write("<div style=\"color:#999999;padding:2px 0px 0px 0px\">{0}</div>", Translate.Text("The field contains a value that is not in the selection list."));
        }
    }
}

此字段添加自定义属性,允许您指定 linked 字段以用于样式 class。假设您在 linked 项上有另一个单行文本字段来指定 CSS class.

用法:按以下格式设置字段的来源属性:

Datasource={path-or-guid-to-options}&StyleClassField={fieldname}

例如Datasource=/sitecore/content/lookup/iconfonts&StyleClassField=IconClassName

要使用这个新字段,将上述代码编译到项目中,切换到核心数据库,然后创建一个新的字段类型——您可以复制位于 [=18= 中的现有 Droplink 字段].删除现有的 Control 字段,而是将 ASSEMBLY 和 CLASS 字段设置为指向您的实现。

您还需要将带有样式定义的自定义 CSS 样式表加载到内容编辑器中,您可以通过 following this blog post 实现。

我在市场上创建了一个执行类似操作的模块。你可以看看here。那里有一些文档解释了如何使用它。

代码也在Git如果你想要一个look