Orchardcms 在Orchard中,如何基于当前用户的内容选择器字段进行查询?
我用一个内容选择器字段扩展了内置的用户ContentType,该字段可用于选择多个视频内容项。这在每个用户的编辑页面上为我提供了一个视频多选择器控件 我喜欢Orchard CMS如何使设置如此优雅简单 现在我可以将多个视频与一个用户关联,我想创建一个查询,只显示当前登录用户已被授予访问权限的视频 我希望能够使用投影仪模块设置一个查询,我认为这是显而易见的方式,见下文,但这不会返回任何结果 这是我如何配置第二个过滤器的: 单击编辑查询屏幕上的+添加新过滤器链接 从“用户内容字段”部分选择“视频:ID”,如下所示: 按如下方式配置新筛选器: 我做错了什么,或者诊断这个问题的最简单方法是什么 以下是内容选择器字段的定义方式:Orchardcms 在Orchard中,如何基于当前用户的内容选择器字段进行查询?,orchardcms,Orchardcms,我用一个内容选择器字段扩展了内置的用户ContentType,该字段可用于选择多个视频内容项。这在每个用户的编辑页面上为我提供了一个视频多选择器控件 我喜欢Orchard CMS如何使设置如此优雅简单 现在我可以将多个视频与一个用户关联,我想创建一个查询,只显示当前登录用户已被授予访问权限的视频 我希望能够使用投影仪模块设置一个查询,我认为这是显而易见的方式,见下文,但这不会返回任何结果 这是我如何配置第二个过滤器的: 单击编辑查询屏幕上的+添加新过滤器链接 从“用户内容字段”部分选择“视频:I
我发现了我的错误——这是因为我没有正确理解过滤器的工作原理。正如我假设的那样,用户内容字段部分中的Videos:Ids过滤器不允许访问当前用户的视频列表。相反,它提供了要在过滤器中使用的字段,如果我编写一个查询来生成能够访问特定视频的用户列表,这将非常有用 这是一厢情愿的想法,它的工作方式我想要的,但它是显而易见的回顾如何实际工作 更新:希望对其他人有用,以下是我开发的自定义过滤器:
public interface IFilterProvider : IEventHandler
{
void Describe(dynamic describe);
}
public class CurrentUserVideosFilter : IFilterProvider
{
private readonly IWorkContextAccessor _workContextAccessor;
public CurrentUserVideosFilter(IWorkContextAccessor workContextAccessor)
{
_workContextAccessor = workContextAccessor;
T = NullLocalizer.Instance;
}
public Localizer T { get; set; }
public void Describe(dynamic describe)
{
describe.For("My Filter Category", T("My Filter Category"), T("My Filter Category"))
.Element("Current User's Videos", T("Current User's Videos"), T("Current User's Videos"),
(Action<dynamic>)ApplyFilter,
(Func<dynamic, LocalizedString>)DisplayFilter,
null
);
}
public void ApplyFilter(dynamic context)
{
var query = (IHqlQuery)context.Query;
context.Query = query.ForType("Video")
.Where(x => x.ContentPartRecord<IdentityPartRecord>(), x => x.InG("Id", GetVideoIdsForCurrentUser()));
}
private IList<int> GetVideoIdsForCurrentUser()
{
var currentUser = _workContextAccessor.GetContext().CurrentUser;
if (currentUser == null) return new int[0];
dynamic item = currentUser.ContentItem;
var videoContentItems = (IEnumerable<ContentItem>)item.User.Videos.ContentItems;
return videoContentItems.Select(i => i.Id).ToList();
}
public LocalizedString DisplayFilter(dynamic context)
{
return T("Videos that have been assigned to the currently logged in user");
}
}
我在一个新的Orchard模块中创建了这个类,该模块包含我正在构建的站点的所有自定义项。安装模块后,过滤器立即可用。我假设Orchard使用反射来查找实现IFilterProvider接口的所有类型
以下是过滤器在添加过滤器屏幕上的显示方式:
单击过滤器显示此屏幕:
保存过滤器后,查询将按照我的要求进行-它将显示分配给当前登录用户的所有视频。能否解释第二个过滤器是什么以及您是如何配置的?非常感谢@BertrandLeRoy的回复。我已将请求的信息添加到问题中,您可能需要编写自己的筛选器。以现有的为例。正如您所建议的,我遵循了其他示例之一,现在我有了一个可行的解决方案,请参见上文。感谢您的帮助@Bertrandleroy搜索NogginBox.owner查询GitHub或Orchard Gallery。这将为内容所有者创建一个过滤器,为页面主文档的作者拥有的当前内容的作者提供选项,最适合小部件,指定用户由指定用户拥有,登录用户由登录用户拥有。这是非常通用的,避免了为您需要的每个实例创建自定义模块的需要。我知道@Wheelie对您有特殊要求。虽然您将需求包装在一个过滤器视频+用户中,但模块需要两个过滤器。嗯。