У меня есть поле форматированного текста, которое имеет определенные маркеры ( {{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>
Было несколько шагов для решения этой проблемы. Снятие
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)
путь, который указывает элемент непосредственно в параметрах.