在 Episerver CMS 中,如何创建 属性 来显示上传图片或 PDF 资源的来源 URL(在 Episerver 编辑器界面中)?
In Episerver CMS, how to create a property to display the source URL of an uploaded image or PDF asset (in the Episerver editor interface)?
令人讨厌的是,Episerver 中的 MediaData class 没有任何基本属性,如源 URL、替代文本等。我正在尝试实现一个 class 来继承来自 MediaData 并为特定类型的媒体资产(本例中为 PDF)提供特定属性。
我已经尝试手动设置 属性 值并覆盖 SetDefaultValues 事件,但无济于事。虽然,根据我用于 "SrcUrl" 的类型,我确实看到了一个文本框或一个 URL 选择器,但是它是空白的并且从不填充上传的 PDF 的 URL.
[ContentType(
DisplayName = "PDF File",
GUID = "xxxxxxx-xxxx-xxxxxx-xxxx-xxxxxxxxxxx")]
[MediaDescriptor(ExtensionString = "pdf")]
public class PdfFile : MediaData
{
[UIHint(UIHint.MediaFile)]
[Display(Name = "PDF URL",
Description = "Link to view or reference PDF",
GroupName = SystemTabNames.Content,
Order = 10)]
public virtual string SrcUrl
{
get { return UrlResolver.Current.GetUrl(this.ContentLink); }
set { value = UrlResolver.Current.GetUrl(this.ContentLink); }
}
// Sets the default property values
public override void SetDefaultValues(ContentType contentType)
{
base.SetDefaultValues(contentType);
this.SrcUrl = UrlResolver.Current.GetUrl(this.ContentLink) ?? "Default";
}
}
****免责声明:我是 Episerver CMS 的新手,可能遗漏了一些非常简单的东西(如果合适的话,可以被羞辱)。*
我不确定您需要完成什么,但可能应该注意,在编辑 MediaData
内容时,其 URL 可通过单击 发布 按钮(注意 下载此文件 link):
编辑: 另一个建议是为 MediaFile
UI 提示创建自定义编辑器 dijit(使用 Dojo)。这将允许您显示 URL 而无需添加额外的 属性.
我能够在 Epi 支持的帮助下解决这个问题,本质上 我需要创建一个可初始化模块 - 这样我就可以挂钩所需的生命周期事件内容创作。
[InitializableModule]
[ModuleDependency(typeof(InitializationModule))]
public class ModelDefaultValuesInitialization : IInitializableModule
{
public void Initialize(InitializationEngine context)
{
var contentEvents = ServiceLocator.Current.GetInstance<IContentEvents>();
contentEvents.CreatedContent += MediaBlocksDefaultValues;
}
private void MediaBlocksDefaultValues(object sender, ContentEventArgs e)
{
PopulateAssetURL(e);
}
/// <summary>
/// Get the URL path of the uploaded asset and set it to the SrcUrl field which is easily visible to editors
/// </summary>
/// <param name="e"></param>
private void PopulateAssetURL(ContentEventArgs e)
{
var mediaTypeBlock = e.Content as PdfFile;
if (mediaTypeBlock != null)
{
string result = ServiceLocator.Current.GetInstance<UrlResolver>().GetUrl(mediaTypeBlock.ContentLink);
if (!string.IsNullOrEmpty(result))
{
var srvcLoc = ServiceLocator.Current.GetInstance<IContentRepository>();
var contentClone = mediaTypeBlock.CreateWritableClone() as PdfFile;
contentClone.SrcUrl = result;
srvcLoc.Save(contentClone, SaveAction.Publish, EPiServer.Security.AccessLevel.Administer);
}
}
}
public void Uninitialize(InitializationEngine context)
{
var contentEvents = ServiceLocator.Current.GetInstance<IContentEvents>();
contentEvents.CreatedContent -= MediaBlocksDefaultValues;
}
}
- 注意:我发布上面的内容是为了保持一致,但实际上我重构了代码以在名为 BaseMediaData 的 class 上设置 SrcUrl 属性,它继承自 MediaData class.这样,所有文件类型(powerpoints、pdf 等)都可以有这个 属性,因为它与所有文件都相关。图像继承自不同的基 class (ImageData),因此我还必须创建一个名为 ImageFile 的新 class,它继承自 ImageData 并应用相同的 属性。我很懒惰,但使用一个接口来标准化两个 classes 中的此实现可能是个好主意。
令人讨厌的是,Episerver 中的 MediaData class 没有任何基本属性,如源 URL、替代文本等。我正在尝试实现一个 class 来继承来自 MediaData 并为特定类型的媒体资产(本例中为 PDF)提供特定属性。
我已经尝试手动设置 属性 值并覆盖 SetDefaultValues 事件,但无济于事。虽然,根据我用于 "SrcUrl" 的类型,我确实看到了一个文本框或一个 URL 选择器,但是它是空白的并且从不填充上传的 PDF 的 URL.
[ContentType(
DisplayName = "PDF File",
GUID = "xxxxxxx-xxxx-xxxxxx-xxxx-xxxxxxxxxxx")]
[MediaDescriptor(ExtensionString = "pdf")]
public class PdfFile : MediaData
{
[UIHint(UIHint.MediaFile)]
[Display(Name = "PDF URL",
Description = "Link to view or reference PDF",
GroupName = SystemTabNames.Content,
Order = 10)]
public virtual string SrcUrl
{
get { return UrlResolver.Current.GetUrl(this.ContentLink); }
set { value = UrlResolver.Current.GetUrl(this.ContentLink); }
}
// Sets the default property values
public override void SetDefaultValues(ContentType contentType)
{
base.SetDefaultValues(contentType);
this.SrcUrl = UrlResolver.Current.GetUrl(this.ContentLink) ?? "Default";
}
}
****免责声明:我是 Episerver CMS 的新手,可能遗漏了一些非常简单的东西(如果合适的话,可以被羞辱)。*
我不确定您需要完成什么,但可能应该注意,在编辑 MediaData
内容时,其 URL 可通过单击 发布 按钮(注意 下载此文件 link):
编辑: 另一个建议是为 MediaFile
UI 提示创建自定义编辑器 dijit(使用 Dojo)。这将允许您显示 URL 而无需添加额外的 属性.
我能够在 Epi 支持的帮助下解决这个问题,本质上 我需要创建一个可初始化模块 - 这样我就可以挂钩所需的生命周期事件内容创作。
[InitializableModule]
[ModuleDependency(typeof(InitializationModule))]
public class ModelDefaultValuesInitialization : IInitializableModule
{
public void Initialize(InitializationEngine context)
{
var contentEvents = ServiceLocator.Current.GetInstance<IContentEvents>();
contentEvents.CreatedContent += MediaBlocksDefaultValues;
}
private void MediaBlocksDefaultValues(object sender, ContentEventArgs e)
{
PopulateAssetURL(e);
}
/// <summary>
/// Get the URL path of the uploaded asset and set it to the SrcUrl field which is easily visible to editors
/// </summary>
/// <param name="e"></param>
private void PopulateAssetURL(ContentEventArgs e)
{
var mediaTypeBlock = e.Content as PdfFile;
if (mediaTypeBlock != null)
{
string result = ServiceLocator.Current.GetInstance<UrlResolver>().GetUrl(mediaTypeBlock.ContentLink);
if (!string.IsNullOrEmpty(result))
{
var srvcLoc = ServiceLocator.Current.GetInstance<IContentRepository>();
var contentClone = mediaTypeBlock.CreateWritableClone() as PdfFile;
contentClone.SrcUrl = result;
srvcLoc.Save(contentClone, SaveAction.Publish, EPiServer.Security.AccessLevel.Administer);
}
}
}
public void Uninitialize(InitializationEngine context)
{
var contentEvents = ServiceLocator.Current.GetInstance<IContentEvents>();
contentEvents.CreatedContent -= MediaBlocksDefaultValues;
}
}
- 注意:我发布上面的内容是为了保持一致,但实际上我重构了代码以在名为 BaseMediaData 的 class 上设置 SrcUrl 属性,它继承自 MediaData class.这样,所有文件类型(powerpoints、pdf 等)都可以有这个 属性,因为它与所有文件都相关。图像继承自不同的基 class (ImageData),因此我还必须创建一个名为 ImageFile 的新 class,它继承自 ImageData 并应用相同的 属性。我很懒惰,但使用一个接口来标准化两个 classes 中的此实现可能是个好主意。