共享项目时如何检测并显示给编辑?

How can I detect and display to editors when an item is shared?

我们有一个大型网站,在一些情况下会在 5 到 12 个页面上共享和重复使用一个基本内容项。该网站有超过 10 名编辑,其中至少有一半是不经常使用的,因此不记得这些项目是共享的是一个反复出现的问题。他们不断更改一页上的内容,添加一些细节,然后在一个或多个其他页面上看起来很奇怪、损坏或非常不合适。

我想做的是将一些代码添加到检测共享项目的视图,然后添加一个指示器。显然这将是完美的:

if(Content.IsSharedItem) {
  // add a nice blue, round 2sxc style button with a 
  <i class="fas fa-share-alt"></i>
}

我浏览了 API,但除了编写一些 LINQ(这可能是处理器密集型的)之外,我还没有发现任何实现类似 .IsSharedItem

的方法

有什么想法或建议吗?是否有一些我可能不知道或以我不想搜索的方式命名的内置内容?任何帮助将不胜感激。提前谢谢你。

DNN 9.03.02、2sxc 10.9.1、内容应用程序 3.03

居然有:)。 假设 shared 表示 "it's been manually assigned to a module"。在这种情况下,还有另一个实体引用了您感兴趣的实体。

基本上,如果您向任何项目询问 .Parents("2SexyContent-ContentGroup"),您应该获得所有引用它的内容组。

请记住,有些可能会被删除等,因此它不是 100% 可靠或需要更多工作。

我看不出如何从 .Parents() 到 TabID,所以我意识到,我们在模块中执行,所以只需执行 Dnn.Module.ModuleSettings["ToSIC_SexyContent_ContentGroupGuid"] 即可满足您的需求。然后 DNN 没有 API 方法来反转 ModuleSetting.SettingValue,例如没有 GetModulesByModuleSettingValue() 类型的东西。所以 SQL 开始有意义了,我改为这样做了...

如果有人有办法改进这一点,我将非常感兴趣。更好的查询?没有 SQL 的方法?重构或简化一些事情?例如,添加 TabName 是事后才想到的,可能应该在 SQL.

中完成

将此添加到任何内容项视图中,将其包装在 if(Edit.Enabled) 或其他内容中,以便仅 editors/admins 看到它。

@if(Edit.Enabled) {
  @RenderPage("_Shared__ContentGroup-Info.cshtml")
}

将此保存到文件名 _Shared__ContentGroup-Tabs.cshtml(上图)

@using System.Data
@using DotNetNuke.Data
@using DotNetNuke.Entities.Tabs

@*
    This sub template is intended to
    a) reveal whether or not the Content item is shared and
    b) show links to those pages

    Reminder the .Parents("2SexyContent-ContentGroup")..EntityGuid is what is stored in
    Dnn.Module.ModuleSettings["ToSIC_SexyContent_ContentGroupGuid"]
*@

@{
  string sql = @"
      SELECT DISTINCT TabID
      FROM TabModules
        INNER JOIN ModuleSettings ON TabModules.ModuleID = ModuleSettings.ModuleID
      WHERE ModuleSettings.SettingValue = '{0}'";
  sql = string.Format(sql, Dnn.Module.ModuleSettings["ToSIC_SexyContent_ContentGroupGuid"]);
  IList<int> tabs;
  using (IDataContext db = DataContext.Instance()) {
      tabs = db.ExecuteQuery<int>(CommandType.Text, sql).ToList();
  }
}
<pre>
This Content item is shared to @(tabs.Count - 1) other page(s)
@foreach(int tabId in tabs
  .Where(t => t != Dnn.Tab.TabID)
) {
<a href="/tabid/@tabId)">@TabController.Instance.GetTab(tabId, Dnn.Portal.PortalId).TabName</a>
}
</pre>

示例输出:

那么, 因为我们已经在页面上有 Bootstrap 4 和 Fancybox,所以我能够将实验变成一个工作 UI再玩大约 5 分钟: