美好的一天!
在我的Orchard中,我有几种内容类型都附有我的自定义部分。此部分定义了此内容可用的用户。对于每个记录的用户,都有外部服务,该服务定义用户可以访问或不能访问的内容。现在我需要访问限制以应用于果园显示内容列表的所有位置,这包括来自标签云的特定标记的结果,或者来自分类术语列出的结果。我似乎找不到任何好办法,除了修改TaxonomyServices代码以及TagCloud服务,加入我的部分并按它过滤。这确实是实现它的唯一方法还是有其他解决方案?如果可能的话,我想避免对内置模块进行更改,但无法找到其他方法。
提前致谢。
答案 0 :(得分:0)
我目前正面临着同样的问题。我目前关注的一种方式是挂钩内容管理器。
[OrchardSuppressDependency("Orchard.ContentManagement.DefaultContentManager")]
public class ModContentManager : DefaultContentManager, IContentManager
{
//private readonly Lazy<IShapeFactory> _shapeFactory;
private readonly IModAuthContext _modAuthContext;
public ModContentManager(IComponentContext context,
IRepository<ContentTypeRecord> contentTypeRepository,
IRepository<ContentItemRecord> contentItemRepository,
IRepository<ContentItemVersionRecord> contentItemVersionRepository,
IContentDefinitionManager contentDefinitionManager,
ICacheManager cacheManager,
Func<IContentManagerSession> contentManagerSession,
Lazy<IContentDisplay> contentDisplay,
Lazy<ISessionLocator> sessionLocator,
Lazy<IEnumerable<IContentHandler>> handlers,
Lazy<IEnumerable<IIdentityResolverSelector>> identityResolverSelectors,
Lazy<IEnumerable<ISqlStatementProvider>> sqlStatementProviders,
ShellSettings shellSettings,
ISignals signals,
//Lazy<IShapeFactory> shapeFactory,
IModAuthContext modAuthContext)
: base(context,
contentTypeRepository,
contentItemRepository,
contentItemVersionRepository,
contentDefinitionManager,
cacheManager,
contentManagerSession,
contentDisplay,
sessionLocator,
handlers,
identityResolverSelectors,
sqlStatementProviders,
shellSettings,
signals) {
//_shapeFactory = shapeFactory;
_modAuthContext = modAuthContext;
}
public new dynamic BuildDisplay(IContent content, string displayType = "", string groupId = "") {
// So you could do something like...
// var myPart = content.As<MyAuthoPart>();
// if(!myPart.IsUserAuthorized)...
// then display something else or display nothing (I think returning null works for this but
//don't quote me on that. Can always return a random empty shape)
// else return base.BuildDisplay(content, displayType, groupId);
// ever want to display a shape based on the name...
//dynamic shapes = _shapeFactory.Value;
}
}
}
还可以挂钩到IAuthorizationServiceEventHandler,它在主ItemController之前被激活并检查你是否正在渲染一个投影或分类列表设置一个值来告诉你的内容管理员执行检查,否则就让他们通过。可能有帮助:)