添加对 @mentions 的支持,用户可以将用户的注意力引导到平台的内容中。
能够提及内容可以让用户轻松访问您的内容。请记住,您应该能够提供唯一的标题,否则用户可能很难找到您的内容。
添加对 @mentions 的支持是通过实现 IMentionableContentType 接口来完成的,该接口在 Limyee.Core.dll 的 Limyee.Extensibility.Content.Version1 命名空间中定义。
请务必注意,可以在同一 IContentType 类中实现一个或多个核心服务。
提及由三部分组成,首先返回与搜索词匹配的项目列表。
public IEnumerable<IContent> GetMentionables(int userId, string queryText, IMentionableFilter filter)
{
var links = new List<IContent>();
var results = LinksData.ListLinks()
.Where(r => r.Name.ToLowerInvariant().Contains(queryText.ToLowerInvariant()))
.ToList<IContent>();
foreach (var result in results)
{
var content = LinksData.GetLink(result.ContentId);
if (content != null)
{
links.Add(content);
}
}
return links;
}
接下来,为您的项目添加预览。此示例返回文本字符串,但如果已实现 ITranslatablePlugin,请使用 ITranslatablePluginController 翻译结果。
public string GetMentionPreviewHtml(int userId, Guid contentId)
{
try
{
var content = LinksData.GetLink(contentId);
if (content != null)
{
return String.Format("{0} (Link)", content.HtmlName("Web"));
}
return "(deleted link)";
}
catch (Exception)
{
return "(inaccessible link)";
}
}
最后,您必须为提及创建完整的 HTML 视图。在这里创建了一个链接,将用户重定向到您的内容,请确保在锚点标记中添加 internal-link view-application 类。
public string GetMentionViewHtml(int userId, Guid contentId)
{
try
{
var content = LinksData.GetLink(contentId);
if (content != null)
{
if (!string.IsNullOrEmpty(content.Url))
{
return string.Concat("<a href=\"",
Apis.Get<IHtml>().Encode(content.Url),
"\" class=\"internal-link view-application links\" data-linkid=\"",
content.ContentId, "\">", content.Name, "</a>");
}
return content.Name;
}
return "(deleted link)";
}
catch (Exception)
{
return "(inaccessible link)";
}
}
下面是完整示例。
using System;
using System.Collections.Generic;
using System.Linq;
using Limyee.Extensibility;
using Limyee.Extensibility.Api.Version1;
using Limyee.Extensibility.Content.Version1;
using IContent = Limyee.Extensibility.Content.Version1.IContent;
namespace Samples.Links
{
public class LinkItemContentType : IContentType, IMentionableContentType
{
IContentStateChanges _contentState = null;
#region IPlugin Members
public string Description
{
get { return "Items in a Links collection"; }
}
public void Initialize()
{
}
public string Name
{
get { return "Link Items"; }
}
#endregion
#region IContentType Members
public Guid[] ApplicationTypes
{
get { return new Guid[] { ContentTypes.LinksApplicationId }; }
}
public void AttachChangeEvents(IContentStateChanges stateChanges)
{
_contentState = stateChanges;
}
public Guid ContentTypeId
{
get { return ContentTypes.LinksItemId; }
}
public string ContentTypeName
{
get { return "Links Item"; }
}
public IContent Get(Guid contentId)
{
return LinksData.GetLink(contentId);
}
#endregion
#region IMentionableContentType
public IEnumerable<IContent> GetMentionables(int userId, string queryText, IMentionableFilter filter)
{
var links = new List<IContent>();
var results = LinksData.ListLinks()
.Where(r => r.Name.ToLowerInvariant().Contains(queryText.ToLowerInvariant()))
.ToList<IContent>();
foreach (var result in results)
{
var content = LinksData.GetLink(result.ContentId);
if (content != null)
{
links.Add(content);
}
}
return links;
}
public string GetMentionPreviewHtml(int userId, Guid contentId)
{
try
{
var content = LinksData.GetLink(contentId);
if (content != null)
{
return String.Format("{0} (Link)", content.HtmlName("Web"));
}
return "(deleted link)";
}
catch (Exception)
{
return "(inaccessible link)";
}
}
public string GetMentionViewHtml(int userId, Guid contentId)
{
try
{
var content = LinksData.GetLink(contentId);
if (content != null)
{
if (!string.IsNullOrEmpty(content.Url))
{
return string.Concat("<a href=\"",
Apis.Get<IHtml>().Encode(content.Url),
"\" class=\"internal-link view-application links\" data-linkid=\"",
content.ContentId, "\">", content.Name, "</a>");
}
return content.Name;
}
return "(deleted link)";
}
catch (Exception)
{
return "(inaccessible link)";
}
}
#endregion
}
}
下面是 @mention 界面的示例。