添加对 @mentions 的支持,用户可以将用户的注意力引导到平台的内容中。
我为什么要使我的内容支持提及?
能够提及内容可以让用户轻松访问您的内容。请记住,您应该能够提供唯一的标题,否则用户可能很难找到您的内容。
创建一个 IMentionableContentType 插件
添加对 @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 界面的示例。