Мы пытаемся реализовать универсальный c многоразовый платный доступ в качестве ContentPart в Orchard 1.10. Цель состоит в том, чтобы скрыть определенный контент от неоплачиваемых пользователей, сохраняя при этом его страницу сведений доступной в качестве тизера.
Первоначальной идеей было использование ShapeTableProvider
для проверки каждой формы «Контента» и изменения ее типа отображения. в соответствии с разрешениями пользователя. Тогда можно будет настроить то, что мы хотим показывать при размещении на основе контента. Например, отображать Layout_Summary вместо полного Layout, только если пользователи не имеют доступа к новостной статье.
Что-то вроде этого:
builder.Describe("Content").OnDisplaying(displaying => {
if(displaying.Shape.Metadata.DisplayType == "Detail" && !_authorizer.Authorize(ViewPaidContent) {
displaying.Shape.Metadata.DisplayType == "DetailPaywall";
}
});
-
<Placement>
<Match DisplayType="DetailPaywall">
<Place Parts_Layout="-"/>
...
</Match>
</Placement>
Однако оказывается, что OnDisplaying
происходит слишком поздно, размещение уже определено, и запускаются ContentDrivers. OnCreated
происходит слишком рано и будет снова отменено. Я полагаю, что соответствующий код, вызывающий их, - это метод BuildDisplay
в Orchard.ContentManagement.DefaultContentDisplay
. Какой бы параметр displayType
не был передан здесь, тот, который в конечном итоге будет использован.
Есть ли какой-либо способ повлиять на тип отображения в коде, основанный на каком-либо условии, или другой подход, который мы можем использовать для достижения аналогичной функциональности?