Как вставлять фрагменты через ссылку на компонент из полей с форматированным текстом в шаблонах Tridion Razor

Мои исследования пока не увенчались успехом, но я ищу способ, чтобы редактор содержимого поля форматированного текста в Tridion мог вызывать компонент содержимого из поля форматированного текста. Я использую шаблоны Razor.

Возможно, я проясню, что я имею в виду на примере какого-то содержания. Если бы ниже был форматированный текст, я бы хотел, чтобы текст «tcm: mytcm» был идентифицирован и обработан как команда во время публикации, чтобы отображать этот компонент изнутри другого компонента, в котором находится это поле форматированного текста, вместо того, чтобы обрабатывать его. как текст. Я выделил его с помощью {, чтобы проиллюстрировать, что какой-то синтаксис будет подходящим.

Форматированный текст: это форматированный текст, и это компонент, на который я хочу ссылаться изнутри {tcm: mytcm}. И это еще более насыщенный текст, который идет после.

По сути, основная цель этого заключалась бы в том, чтобы предоставить способ вставки «фрагментов» более сложного HTML-кода, встроенного в форматированный текст. Примером того, что нужно вставить, может быть гиперссылка с различными параметрами или вызов переменной веб-службы и т. Д. Разметка / код для этого фрагмента будет сгенерирована шаблоном компонента для tcm: mytcm и обработана во время публикации вместо запись с форматированным текстом, которая его вызывала.

Если эта общая методология - неправильное направление, я открыт для любых идей, как сделать эту вставку. Любые советы или указания будут оценены. Я пока не вижу ничего в документации или каких-либо других онлайн-обсуждениях, посвященных этой проблеме, но, возможно, мои условия поиска не самые лучшие.


person user1408652    schedule 21.05.2012    source источник
comment
Укажите вашу версию SDL Tridion   -  person Chris Summers    schedule 21.05.2012


Ответы (4)


Некоторое время назад я сделал нечто похожее со ссылками на «глоссарий», где редактор мог создать ссылку на компонент, содержащий расширенное определение термина (текст ссылки), и мы должны были во время публикации получить это расширенное определение и включить его в Javascript (чтобы текст отображался в виде крошечного пузыря, если посетитель наведет на него курсор).

Он состоял из следующих этапов:

  1. Разобрать поле RTF с помощью XML
  2. Найдите все якоря в RTF, которые указывают на URI tcm
  3. Определите, был ли целевой компонент основан на схеме глоссария
  4. Если да, прочтите «текст глоссария» целевого компонента в отдельный атрибут привязки и измените какое-нибудь другое значение.

Я думаю, что сделать это в шаблоне Razor будет намного сложнее, чем сделать это в качестве этапа постобработки в вашем шаблоне.

person Nuno Linhares    schedule 21.05.2012
comment
Когда вы предлагаете проанализировать поле форматированного текста с помощью XML, вы делаете это с помощью C # TBB или XSLT TBB? В этом случае у меня нет доступа к TBB C #, потому что решение Tridion связано с другими функциями, поэтому в настоящее время у меня есть доступ только к DWT, XSLT и Razor TBB. Для этой инициативы в настоящее время я могу использовать только TBB C #, которые уже были созданы ранее. Даже если это более сложный или не лучший способ сделать это, возможно ли выполнить эту обработку с доступом только для редактирования / создания файлов DWT, XSLT или Razor TBB? Если да, то как я могу подойти к этому? - person user1408652; 22.05.2012
comment
Да, используя C #. У вас может быть несколько решений в Tridion, и вы можете писать свой код во фрагментах C # вместо скомпилированной сборки, хотя это имеет последствия. Я не думаю, что это можно сделать с помощью Razor, поскольку это LAYOUT TBB, а не код TBB. - person Nuno Linhares; 22.05.2012

Я мало знаю о Razor Mediator, но это обычная проблема с C #, XSLT и шаблонами Dreamweaver. Я думаю, что лучше всего предварительно обработать Компонент с помощью XSLT или C # и заменить понравившийся TCMURI на XML другого компонента или других данных, и они продолжают использовать традиционные документированные методы для доступа к данным из пакета.

person Chris Summers    schedule 21.05.2012
comment
Я использую Tridion 2011. Эта версия требуется посреднику Razor. - person user1408652; 22.05.2012

Просто чтобы добавить (надеюсь, полезный) образец кода для поддержки ответа Криса и Нуно о его постобработке на C #. Это частично псевдокод. Я очень плохо разбираюсь в RegEx, так что вам нужно разобраться в этом. Также в методе ReplaceUrls () вам нужно добавить все, что вы хотите, на основе определенного кода между {}:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using Tridion.ContentManager.Templating;
using Tridion.ContentManager.Templating.Assembly;
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.ContentManagement.Fields;

namespace TBB.Templates
{
    public class ReplaceString : TemplateBase
    {
        private static readonly Regex tcmReference = new Regex(@"{tcm:mytcm})", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.Compiled);
        private string _outputContent;

        public override void Transform(Engine engine, Package package)
        {
            this.Initialize(engine, package);
            Page page = this.GetPage();

            this._outputContent = package.GetByType(new ContentType("text/html")).GetAsString();

            ReplaceUrls();

            package.GetByType(new ContentType("text/html")).SetAsString(this._outputContent);
        }

        private void ReplaceUrls()
        {
            string[] textContainer = new string[] { this._outputContent };
            foreach (Match match in TemplateUtilities.GetRegexMatches(textContainer, tcmReference))
            {
                Group group = match.Groups["url"];
                if (group.Value.Contains("specific"))
                {
                    this._outputContent = this._outputContent.Replace("specificParam", "SnippetCode");
                }
            }
        }
    }
}
person Hendrik Beenker    schedule 22.05.2012

То, что сказали Крис и Нуно, и есть ответ:

Нуно описывает логику фактической обработки связанных компонентов.

Крис подчеркивает, что это лучше всего делать в качестве этапа предварительной обработки, прежде чем вы достигнете Razor TBB. Вы можете изменить XML в пакете.

person Community    schedule 22.05.2012