Расширение поля визуализации.Getfieldvalue processor-обрабатываются не все элементы, связанные со страницей

У меня есть поле форматированного текста, которое имеет определенные маркеры ( {{alt}}и {{title}}) для встроенных изображений в HTML. Я расширил Sitecore.Pipelines.RenderField.GetFieldValueпроцессор, чтобы при отображении страницы на передней панели процессор заменял эти маркеры значениями полей alt и title из элемента мультимедиа. К сожалению, мой пользовательский процессор обрабатывает только определенный набор элементов (в частности, поля WFFM), он не обрабатывает мое Bodyполе, которое имеет маркеры, хотя я знаю, что страница, которую я просматриваю, представляет это поле (код, выполняемый на макете@Html.Sitecore().Field("Body"), означает, что он должен обрабатываться конвейером, правильно?)

Я также попробовал GetTextFieldValueи GetMemoFieldValueпроцессоры, но те же элементы были обработаны. Поиск некоторых указаний относительно конкретных полей, которые должны обрабатываться этим конвейером.

Вот моя функция Process() :

    public void Process(RenderFieldArgs args)
    {
        Assert.ArgumentNotNull(args, "args");
        Assert.ArgumentNotNull(args.Item, "args.Item");
        Assert.ArgumentNotNull(args.GetField(), "args.GetField()");

        if (args.Item.Database == Database.GetDatabase("web"))
        {
            if (args.GetField().Value.Contains("{{alt}}"))
            {
                args.GetField().Value = ReplaceAltToken(args.GetField().Value);
            }

            if (args.GetField().Value.Contains("{{title}}"))
            {
                args.GetField().Value = ReplaceTitleToken(args.GetField().Value);
            }

            if (args.GetField().Name == "Body")
            {
                // Since we're rendering the body field differently we need to expand dynamic links
                args.Item.Editing.BeginEdit();
                args.GetField().Value = Sitecore.Links.LinkManager.ExpandDynamicLinks(args.GetField().Value);
                args.Item.Editing.EndEdit();
            }
        }
    }

Мой конфигурационный файл:

<configuration >
<sitecore>
    <pipelines>
        <renderField>
            <processor
                type="[Redacted].Processor.RenderField.GetFieldValueExtended, [Redacted].Processor"
                patch_after="processor[@type='Sitecore.Pipelines.RenderField.GetFieldValue, Sitecore.Kernel']" />
        </renderField>
    </pipelines>
</sitecore>

1 ответ

  1. Было несколько шагов для решения этой проблемы. Снятие Cacheableограничений на все рендеринги было важным первым шагом. Остальные проблемы, с которыми я столкнулся, были, скорее всего, специфичны для моего решения (не хорошо спроектированы и будут пересмотрены в ближайшее время).

    На моем локальном сайте не было самых современных файлов. Когда я обновил файлы, я все еще столкнулся с Attempt to retrieve context object of type 'Sitecore.Mvc.Presentation.PageContext' from empty stackошибкой, которую я смог обойти, вызвав Sitecore.Web.UI.WebControls.FieldRenderer.Render(item, "Body")в модели простую функцию GetBody() вместо Html.Sitecore().Field("Body"). Тогда в представлении я попросту выражаюсь @Html.Raw(Model.Body).

    Я думаю.Field(), что помощник не работал, потому что элемент, связанный с запрашиваемым полем, был неизвестен, поэтому используется еще один обходной Html.Sitecore().Field("Body", item)путь, который указывает элемент непосредственно в параметрах.