sitecore以编程方式更改imagefield数据源

时间:2014-07-02 20:25:10

标签: sitecore

我需要更改产品项目的图像字段来源,具体取决于我在内容或页面编辑器中创建项目时创建产品项目的文件夹路径。

如果我在/home/bicycles下创建产品,我需要将产品图片字段自动更改为/sitecore/media library/Images/bicycles

如果我在/home/cars下创建产品,我需要将产品图片字段自动更改为/sitecore/media library/Images/cars

如果我在/home/scooters下创建产品,我需要将产品图片字段自动更改为/sitecore/media library/Images/scooters

datatemplate中该图像字段来源的默认设置为/sitecore/media library/Images/bicycles

我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

一个选项是创建扩展默认图像字段类型的自定义内容编辑器字段。

首先创建一个继承自Sitecore.Shell.Applications.ContentEditor.Image的类。然后覆盖OnPreRender方法,根据您的位置条件/要求确定并设置图片字段的Source属性。

有关详细信息,请参阅以下代码中的注释。

public class ContextAwareImageField : Sitecore.Shell.Applications.ContentEditor.Image
{
    /// <summary>
    /// The ItemID proprety is set by the Content Editor via reflection
    /// </summary> 
    public string ItemID { get; set; }

    /// <summary>
    /// Override the OnPreRender method. 
    /// The base OnPreRender method assigns a value to the Source viewstate property and we need to overwrite it.
    /// </summary>
    /// <param name="e"></param>
    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        Source = GetSource();
    }

    protected virtual string GetSource()
    {
        //retrieve and return the computed source value if it has already been set
        var contextSource = GetViewStateString("ContextSource");
        if (!string.IsNullOrWhiteSpace(contextSource))
            return contextSource;

        //retrieve the context item (the item containing the image field)
        var contextItem = Sitecore.Context.ContentDatabase.GetItem(ItemID);
        if (contextItem == null)
            return string.Empty;

        //determine the source to be used by the media browser
        //in this case we're just checking based on parent path, but any logic could be inserted
        contextSource = "/sitecore/media library/Images";
        switch (contextItem.Parent.Paths.FullPath.ToLowerInvariant())
        {
            case "/sitecore/content/home/bicycles":
                contextSource = "/sitecore/media library/Images/Bicycles";
                break;
            case "/sitecore/content/home/cars":
                contextSource = "/sitecore/media library/Images/Cars";
                break;
            case "/sitecore/content/home/scooters":
                contextSource = "/sitecore/media library/Images/Scooters";
                break;
        }

        //store the computed source value in view bag for later retrieval
        SetViewStateString("ContextSource", contextSource);

        //return the computed source value
        return contextSource;
    }
}

接下来,执行以下步骤:

  • 使用管理员权限登录Sitecore桌面,并使用右下角的数据库图标切换到 Core 数据库。

  • 核心数据库中,打开内容编辑器,然后导航至/sitecore/system/Field Types/Simple Types。在那里,您会找到一个代表图片字段类型的项目。

  • 复制图片字段类型项,并将重复项重命名为相关内容(例如上下文感知图像)。

  • 编辑重复的项目

    • 汇编字段中,提供包含自定义图片字段类的汇编文件的名称(例如MyClient.MySite.dll
    • 字段中,提供自定义图片字段类的名称,包括命名空间(例如MyClient.MySite.CustomFields.ContextAwareImageField
  • 删除控制字段

  • 中的值
  • 保存更改

  • 切换回 Master 数据库。

  • 打开内容编辑器,然后导航到应包含新图片字段的模板。

  • 在模板中创建新字段,然后在类型下拉列表中选择新的自定义字段类型。或者,更改现有图片字段的类型

  • 保存模板更改。

  • 在内容树中,根据上面的模板导航到某个项目,然后单击所包含图像字段的浏览按钮。媒体浏览器对话框应默认为自定义字段中逻辑指定的源位置。

    • 注意:如果您使用的是包含基于SPEAK的媒体浏览器对话框的Sitecore版本,则必须在对话框中切换到树视图(图标在右上角),以查看自定义字段指定的源位置。