我最近一直在将内容和代码库从旧的Sitecore CMS 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中引入的更改(可能出于安全原因)。
任何人都可以对此有所了解吗?我是否需要创建自己的字段类型以允许所需的行为,或者我是否可以通过“开箱即用”字段类型执行此操作?
答案 0 :(得分:10)
我从Sitecore 6.5和7中检查了GetTextFieldValue处理器类,看起来不同
这是来自Sitecore 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");
}
这个来自Sitecore 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);
}
您可以在Sitecore 7上的Process方法的最后一行代码中看到结果已编码。 您可以为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 Update 3上更新,您可以在release history上看到:
页面编辑器在6.6 Update-3中,管道已被修改 在渲染单行文本字段时对HTML进行编码 (参见编号327905)。这在页面编辑器中无法正常工作 它显示了编码值。如果用户保存了页面,那么 已编码的值将再次进行HTML编码。 (384997)
我希望它有所帮助。
答案 1 :(得分:5)
似乎很多人都对此帖感到困惑,并开始越来越多地要求上述修复。
FieldRenderer中似乎存在一个阻止呈现HTML标记的错误 Sitecore CMS不进行HTML编码
在版本6.6 rev之前呈现单行文本字段和链接字段时,Sitecore CMS没有对字段值进行HTML编码。 131111(6.6 Update-3)。由于此问题,从单行文本和链接字段输出值的页面未通过W3C标记验证。
根据Sitecore CMS发行说明,自Sitecore CMS 6.6 rev以来,此问题已得到解决。 131111(又名Update-3)
然后,自Sitecore CMS 6.6.0 rev以来,它已得到改进。 130404(又名Update-5)
自CMS 6.6.0 rev。 130529(又名Service Pack-1)
从版本6.6 rev开始。 131111(6.6 Update-3)和更高版本的Sitecore CMS HTML使用HttpUtility.HtmlEncode方法对单行文本字段和链接字段的值进行编码。
更改已在 GetTextValue 处理器以及 Sitecore.Xml.Xsl.LinkRenderer 类中引入。
<renderField>
...
<processor type="Sitecore.Pipelines.RenderField.GetTextFieldValue, Sitecore.Kernel" />
...
</renderField>
您可以与支持人员联系,他们了解问题和 有一个修复程序可用。你应该要求Sitecore.Support.381846.dll
Sitecore.Support.381846程序集修改了 GetTextFieldValue 处理程序,其中遗漏了以下代码行。
args.Result.FirstPart = HttpUtility.HtmlEncode(args.Result.FirstPart);
此“修复”只会为单行文字字段带来旧行为。换句话说,它引用了旧的问题,参考编号为#327905(详见上文)。
为什么在升级到Sitecore CMS 6.6 Update-3及更高版本后,我的Sitecore解决方案中的所有内容都被破坏了?因为您错误地使用单行文本字段。此字段类型不会存储HTML或JavaScript。这是用于存储内容值的内容字段类型。如果您在内容字段中存储HTML标记和JavaScript,则表示您不遵循Sitecore最佳实践。
我希望这有助于说清楚。
祝福, Oleg Burov
Sitecore CMS和DMS 7.2 rev。 141226(又名7.2 Update-3)在Rendering.HtmlEncodedFieldTypes
文件中引入了Web.config
设置,该文件指定了由<renderField>
呈现时应由HTML编码的以管道分隔的字段类型列表管道
<!-- 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编码。
答案 2 :(得分:3)
从Sitecore 6.5升级到7.0时,我们遇到了同样的问题。 FieldRenderer中似乎存在一个错误,导致无法呈现HTML标记。您可以与支持人员联系,他们了解问题并提供修复服务。
你应该要求Sitecore.Support.381846.dll,它需要像这样集成:
在web.config中替换此行
<processor type="Sitecore.Pipelines.RenderField.GetTextFieldValue, Sitecore.Kernel" />
有了这个
<processor type="Sitecore.Support.Pipelines.RenderField.GetTextFieldValue, Sitecore.Support.381846" />
希望这有帮助。
答案 3 :(得分:0)
我们遇到了这个问题并发现了这篇文章。我们选择通过直接访问数据库并使用nbsp和amp更新单个文本字段来处理它,这些是我们的主要问题区域,可以为您正在处理的每个编码字符重复这些步骤。我们选择手动处理链接字段。
通过在Master和Web中运行替换,您可以省略重新发布的字段。
此致 扬
SELECT TOP 18000 * FROM [uat_Sitecore_master_new]。[dbo]。[VersionedFields] where(Value like'%&amp;%;%') 和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本') - 和FieldId in(选择ItemId FROM SharedFields,其中Value就像'General Link')
/ *找到所有具有NBSP的单行文本字段 / SELECT替换(值,'',''), FROM [uat_Sitecore_master_new]。[dbo]。[VersionedFields] where(Value like'%%') 和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')
/ *在单行文本字段中替换NBSP * / UPDATE [uat_Sitecore_master_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,'','')where(Value like'%%') 和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')
UPDATE [uat_Sitecore_web_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,'','')where(Value like'%%') 和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')
/ *查找所有具有AMP /
的单行文本字段
SELECT替换(值,'&amp;','&amp;'), FROM [uat_Sitecore_master_new]。[dbo]。[VersionedFields] where(Value like'%&amp;%')
和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')
/ *替换单行文本中的放大器字段* /
UPDATE [uat_Sitecore_master_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,'&amp;','&amp;')where(Value like'%&amp;%')
和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')
UPDATE [uat_Sitecore_web_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,'&amp;','&amp;')where(Value like'%&amp;%') 和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')
/ *找到所有单行文本字段,其中包含'' /
SELECT替换(值,''',''''), FROM [uat_Sitecore_master_new]。[dbo]。[VersionedFields] where(Value like'%'%')
和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')
/ *替换''单行文本FIELDS * / UPDATE [uat_Sitecore_master_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,''','''')where(Value like'%'%') 和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')
UPDATE [uat_Sitecore_web_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,''','''')where(Value like'%'%') 和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')
/ *查找具有“” /
的所有单行文本字段
SELECT替换(值,'“','”'), FROM [uat_Sitecore_master_new]。[dbo]。[VersionedFields] where(Value like'%“%')
和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')
/ * REPLACE“”单行文字字段* /
UPDATE [uat_Sitecore_master_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,'“','”')where(Value like'%“%')
和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')
UPDATE [uat_Sitecore_web_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,'“','”')where(Value like'%“%') 和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')