最近,我一直在将内容和代码从一个旧的Sitecore 6.5安装(有相当多的定制)转移到一个干净的CMS 7.0安装。
在原始站点中,使用Single-line text
字段将任意Javascript呈现到页面中(用于跟踪)。这很好,Javascript被呈现到页面中,未编码并按预期执行。
然而,在新的安装中,我注意到内容现在是HTML编码的,这意味着它不会在我正在使用的Sitecore 7安装下执行。
在我的Sublayout中,我有这样一个FieldRenderer:
<sc:FieldRenderer ID="tracker" FieldName="Script" runat="server" />
我不确定是否有一个定制/配置,我还没有迁移过,或者这是一个改变,已经引入了Sitecore 7(可能是出于安全的原因)。
有人能解释一下这件事吗?我是否需要创建自己的字段类型以允许所需的行为,还是有一种方法可以通过“开箱即用”字段类型来实现?
发布于 2014-01-12 17:56:51
我检查了Sitecore 6.5和7中的GetTextFieldValue处理器类,看起来不一样
这是来自塞特科雷6.5 : Sitecore.Pipelines.RenderField.GetTextFieldValue的
public void Process(RenderFieldArgs args)
{
Assert.ArgumentNotNull((object) args, "args");
string fieldTypeKey = args.FieldTypeKey;
if (fieldTypeKey != "text" && fieldTypeKey != "single-line text")
return;
args.WebEditParameters.Add("prevent-line-break", "true");
}
这一张来自塞特科雷7: Sitecore.Pipelines.RenderField.GetTextFieldValue
public void Process(RenderFieldArgs args)
{
Assert.ArgumentNotNull((object) args, "args");
string fieldTypeKey = args.FieldTypeKey;
if (fieldTypeKey != "text" && fieldTypeKey != "single-line text")
return;
args.WebEditParameters.Add("prevent-line-break", "true");
args.Result.FirstPart = HttpUtility.HtmlEncode(args.Result.FirstPart);
}
您可以在最后一行代码上看到Process方法,从Sitecore 7结果被编码。您可以为GetTextField处理器创建自己的类,并将其添加到RenderField管道中,但我建议您将字段从单行文本更改为多行文本或备忘字段。
我检查了Sitecore 6.5和7上的Sitecore.Pipelines.RenderField.GetMemoFieldValue类,实现是相同的,结果没有编码:
namespace Sitecore.Pipelines.RenderField
{
/// <summary>
/// Implements the RenderField.
///
/// </summary>
public class GetMemoFieldValue
{
/// <summary>
/// Gets the field value.
///
/// </summary>
/// <param name="args">The arguments.</param>
public void Process(RenderFieldArgs args)
{
string fieldTypeKey = args.FieldTypeKey;
if (fieldTypeKey != "memo" && fieldTypeKey != "multi-line text")
return;
string linebreaks = args.RenderParameters["linebreaks"];
if (linebreaks == null)
return;
args.Result.FirstPart = GetMemoFieldValue.Replace(args.Result.FirstPart, linebreaks);
args.Result.LastPart = GetMemoFieldValue.Replace(args.Result.LastPart, linebreaks);
args.WebEditParameters.Add("linebreak", "br");
}
/// <summary>
/// Replaces the specified linebreaks.
///
/// </summary>
/// <param name="linebreaks">The linebreaks.</param><param name="output">The output.</param>
/// <returns>
/// The replace.
/// </returns>
private static string Replace(string output, string linebreaks)
{
output = output.Replace("\r\n", linebreaks);
output = output.Replace("\n\r", linebreaks);
output = output.Replace("\n", linebreaks);
output = output.Replace("\r", linebreaks);
return output;
}
}
}
GetTextField的代码是在Sitecore 6.6更新3上更新的,您可以在释放历史上看到:
页编辑器在6.6更新-3,管道被修改为HTML编码字段值时,呈现单行文本字段(参考。第327905号)。在显示编码值的“页编辑器”中,此操作不正确。如果用户保存了页面,那么已经编码的值将再次被HTML编码。(384997)
希望能帮上忙。
发布于 2014-05-06 23:24:42
似乎很多人对这篇文章感到困惑,并开始要求越来越多的人得到上面提到的修复。
在FieldRenderer中似乎存在一个错误,它阻止呈现HTML标记,而Sitecore没有HTML。
在版本6.6Rev.131111(6.6Update-3)之前,Sitecore在呈现单行文本字段和链接字段时没有对字段值进行HTML编码。由于此问题,从单行文本和链接字段输出值的页面不会通过W3C标记验证。
根据Sitecore的发行说明,这个问题已经在131111修订版(又名更新-3)之后得到了解决。
布局和渲染
然后,它得到了改进,自从Sitecore 6.6.0Rev.130404(又名更新-5)。
布局和渲染
自从CMS 6.6.0版本130529 (又名Service Pack-1)以来
页编辑器
从版本6.6Rev.131111(6.6Update-3)开始,使用HttpUtility.HtmlEncode方法对单行文本字段和链接字段的值进行编码。
这些更改已经在GetTextValue处理器以及Sitecore.Xml.Xsl.LinkRenderer类中引入。
<renderField>
...
<processor type="Sitecore.Pipelines.RenderField.GetTextFieldValue, Sitecore.Kernel" />
...
</renderField>
您可以联系支持,他们知道问题,并有一个修复可用。你应该向塞托雷求援。
381846程序集修改了GetTextFieldValue处理器,其中遗漏了以下代码行。
args.Result.FirstPart = HttpUtility.HtmlEncode(args.Result.FirstPart);
这个“修正”只带来了单行文本字段的旧行为。换句话说,它介绍了编号#327905的老问题(详见上文)。
为什么在升级到SECOREMS6.6更新-3及更高版本后,我的Sitecore解决方案中的所有内容都被破坏了?因为您不正确地使用单行文本字段。此字段类型不应该存储HTML或JavaScript。这是要存储内容值的内容字段类型。如果您将HTML和JavaScript存储在内容字段中,这意味着您没有遵循Sitecore最佳实践。
摘要:
我希望这有助于澄清这一点。
最良好的祝愿,奥列格·博罗夫
更新-1:
Sitecore和DMS7.2Rev.141226(又名7.2Update-3)在Web.config
文件中引入了Web.config
设置,该设置指定了由<renderField>
管道呈现时应该编码的字段类型的管道分隔列表。
<!-- RENDERING - HTML ENCODED FIELD TYPES
Specifies a pipe-separated list of field types that should be HTML encoded when rendered by the <renderField> pipeline.
Default value: text|single-line text
-->
<setting name="Rendering.HtmlEncodedFieldTypes" value="text|single-line text" />
现在,您可以控制哪些Sitecore字段类型应该是HTML编码的,或者不应该编码的。
发布于 2014-01-13 01:33:04
当我们从Sitecore 6.5升级到7.0时,我们也遇到了同样的问题。在FieldRenderer中似乎存在一个错误,它阻止了HTML的呈现。您可以联系支持,他们知道问题,并有一个修复可用。
您应该请求SArchore.Support.381846.dll,它需要像这样的集成:
在web.config中替换这一行
<processor type="Sitecore.Pipelines.RenderField.GetTextFieldValue, Sitecore.Kernel" />
有了这个
<processor type="Sitecore.Support.Pipelines.RenderField.GetTextFieldValue, Sitecore.Support.381846" />
希望这能有所帮助。
https://stackoverflow.com/questions/21048909
复制相似问题