Есть ли способ изменить тип отображения формы содержимого Orchard до размещения и рендеринга? - PullRequest
0 голосов
/ 15 января 2020

Мы пытаемся реализовать универсальный 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 не был передан здесь, тот, который в конечном итоге будет использован.

Есть ли какой-либо способ повлиять на тип отображения в коде, основанный на каком-либо условии, или другой подход, который мы можем использовать для достижения аналогичной функциональности?

1 Ответ

1 голос
/ 16 января 2020

Тип дисплея обычно определяется драйвером для детали. Вместо этого вам, вероятно, следует ввести альтернативу:

builder.Describe("Content").OnDisplaying(displaying => {
    if(displaying.Shape.Metadata.DisplayType == "Detail"  && !_authorizer.Authorize(ViewPaidContent) {
        displaying.Shape.Metadata.Alternates.Add("Content__Paywall");      
    }
});

Затем вы можете добавить переопределение шаблона Content-Paywall.cshtml к своей теме, и все готово.

...