【问题标题】:Tridion: Dreamweaver doesn't resolves the HTML code fieldTridion:Dreamweaver 不解析 HTML 代码字段
【发布时间】:2012-09-11 09:20:04
【问题描述】:

我们有一个复合 CT,它输出其中一个组件的代码字段。

CT的织梦部分如下:

<!-- TemplateBeginRepeat name="Component.HTMLCode" -->
    @@Component.HTMLCode@@
<!-- TemplateEndRepeat -->

但是,此 CT 在页面上显示代码字段,而不是转换为 HTML。

例如:如果代码字段的值为 -> &lt;div align="center" id="loginapp"&gt;&lt;/div&gt; 然后在页面上显示相同的值而不是解析。

在页面源中,我们得到的输出是“&lt ;div align=&quot ;center” id=&quot ;loginapp>&gt ;&lt ;/div&gt ;"

我知道如果我们使用 C# 可以解决这个问题。 但是有没有什么方法可以使用dreamweaver 来阻止特殊字符的转换呢?

【问题讨论】:

  • 您是否在 CT 中添加了“默认完成操作 TBB”,因为它会从 RTF 内容中去除 XHTML?
  • 你能指定你想输出什么样的字段吗?启用 RTF 还是纯文本?谢谢
  • Ram:我试过删除它,没有成功。 Chris:该字段是一个非 RTF 多行字段。该组件使用旧的 VBscript 模板正确呈现。我正在尝试使用复合模板来实现相同的功能。
  • 这可以通过 xslt TBB 轻松解决。

标签: dreamweaver tridion templating tridion-2011


【解决方案1】:

您应该使用 dwt 将代码发布到服务器,我的意思是为每个代码创建新的 dwt,然后将代码粘贴到 dwt 中。您可以将此 dwt 与 emply 组件或资源类型组件一起使用。

或者如果您想使用文本字段,请尝试遵循 tbb 代码。在模板末尾添加这个 tbb。

public override void Transform(Engine engine, Package package)
    {


        Regex objExp = new Regex(@"&#\d+;", RegexOptions.IgnoreCase);
        Regex objDecExp = new Regex(@"[^0-9]", RegexOptions.IgnoreCase);

        this.Initialize(engine, package);
        string strPackage = package.GetValue("Output");

        strPackage = unescapeHTML(strPackage);

        strPackage = objExp.Replace(strPackage, delegate (Match match)
        {

            string strInput = match.ToString();
            strInput = objDecExp.Replace(strInput, "");


            int intValue = Convert.ToInt32(strInput);
            char strChar = (char)intValue;

            return strChar.ToString();
        });



        strPackage = strPackage.Trim();

        Item objOutput = package.CreateStringItem(ContentType.Html, strPackage);
        package.PushItem("Output", objOutput);

    }

    private string unescapeHTML(string strInput)
    {
        StringBuilder strOutput = new StringBuilder(strInput);
        strOutput.Replace("&quot;", "&#34;");
        strOutput.Replace("&nbsp;", "&#32;");
        strOutput.Replace("&amp;", "&#38;");
        strOutput.Replace("&apos;", "&#39;");
        strOutput.Replace("&lt;", "&#60;");
        strOutput.Replace("&gt;", "&#62;");
        strOutput.Replace("&iexcl;", "&#161");
        strOutput.Replace("&cent;", "&#162");
        strOutput.Replace("&pound;", "&#163");
        strOutput.Replace("&curren;", "&#164");
        strOutput.Replace("&yen;", "&#165");
        strOutput.Replace("&brvbar;", "&#166");
        strOutput.Replace("&sect;", "&#167");
        strOutput.Replace("&uml;", "&#168");
        strOutput.Replace("&copy;", "&#169");
        strOutput.Replace("&ordf;", "&#170");
        strOutput.Replace("&not;", "&#172");
        strOutput.Replace("&shy;", "&#173");
        strOutput.Replace("&reg;", "&#174");
        strOutput.Replace("&macr;", "&#175");
        strOutput.Replace("&deg;", "&#176");
        return strOutput.ToString();    
    }


}

【讨论】:

    【解决方案2】:

    如果我没记错的话,这取决于您的字段类型,如果在您的架构中使用普通文本字段,则 HTML 会被转义,如果您使用富文本字段,则会被解析。

    一个选项可能是编写一个 Dreamweaver 自定义函数,该函数允许您取消转义字段(将其表示为 HTML 字段而不是文本字段)。正如您提到的,您也可以在 TBB 中执行此操作,但 Dreamweaver 自定义函数可直接从 DWT 模板调用。无论哪种方式,我认为您确实需要自己进行一些编码。

    【讨论】:

    • 好的,谢谢巴特。但我们使用的是多行非 RTF 文本字段。知道这样的功能吗?
    • 您将不得不编写自己的自定义函数或 C# TBB。在这样一个 TBB 的代码中,您可以使用 package.PushItem(package.CreateHtmlItem(((TextField)fields["HTMLCode"]).Value) 之类的构造将 HTML 片段推送到包中。
    【解决方案3】:

    RenderComponentField 有两个参数:bool htmlEncodeResult 和 bool resolveHtmlAsRTFContent。你在使用这个内置函数吗?

    【讨论】:

    • 不,我没有这个功能。
    • @Huston:查看此页面以获取所有内置函数的列表及其使用示例:code.google.com/p/tridion-practice/wiki/…
    • 谢谢弗兰克。我需要使用这个函数“RenderComponentField(string fieldExpression, int fieldIndex, bool htmlEncodeResult, bool resolveHtmlAsRTFContent)” 我不确定参数“string fieldExpression”代表什么?我尝试给出值字段名称,Component.Fields.,但它给出了错误。
    • 通常只要字段名就足够了。
    【解决方案4】:

    感谢您的帮助。在对dreamweaver 代码进行了大量试验后,我们决定使用C# TBB 代替,从而解决了这个问题。

    将多行字段作为文本字段读取也是我们犯的错误之一。这导致字段值显示在页面上,而不是作为代码呈现。

    我们终于用“MultilineTextField”解决了这个问题。

    【讨论】:

    • 您好 Vikas,感谢您的帮助。但我没有使用解决方法,因为我的目的是通过使用 C# 直接实现的。
    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多