Orchardcms 在Orchard中,如何基于当前用户的内容选择器字段进行查询?

Orchardcms 在Orchard中,如何基于当前用户的内容选择器字段进行查询?,orchardcms,Orchardcms,我用一个内容选择器字段扩展了内置的用户ContentType,该字段可用于选择多个视频内容项。这在每个用户的编辑页面上为我提供了一个视频多选择器控件 我喜欢Orchard CMS如何使设置如此优雅简单 现在我可以将多个视频与一个用户关联,我想创建一个查询,只显示当前登录用户已被授予访问权限的视频 我希望能够使用投影仪模块设置一个查询,我认为这是显而易见的方式,见下文,但这不会返回任何结果 这是我如何配置第二个过滤器的: 单击编辑查询屏幕上的+添加新过滤器链接 从“用户内容字段”部分选择“视频:I

我用一个内容选择器字段扩展了内置的用户ContentType,该字段可用于选择多个视频内容项。这在每个用户的编辑页面上为我提供了一个视频多选择器控件

我喜欢Orchard CMS如何使设置如此优雅简单

现在我可以将多个视频与一个用户关联,我想创建一个查询,只显示当前登录用户已被授予访问权限的视频

我希望能够使用投影仪模块设置一个查询,我认为这是显而易见的方式,见下文,但这不会返回任何结果

这是我如何配置第二个过滤器的:

单击编辑查询屏幕上的+添加新过滤器链接 从“用户内容字段”部分选择“视频:ID”,如下所示:

按如下方式配置新筛选器:

我做错了什么,或者诊断这个问题的最简单方法是什么

以下是内容选择器字段的定义方式:


我发现了我的错误——这是因为我没有正确理解过滤器的工作原理。正如我假设的那样,用户内容字段部分中的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对您有特殊要求。虽然您将需求包装在一个过滤器视频+用户中,但模块需要两个过滤器。嗯。