我使用c#和sitecore基本上在某些地方使用令牌(参见:how to create a custom token in sitecore)。我想我有一个解决方案,但我不确定为什么它不起作用,即使我没有错误。
Item tokenItem = Sitecore.Context.Database.Items["/sitecore/content/Site Content/Tokens"];
if (tokenItem.HasChildren)
{
var sValue = args.FieldValue.ToString();
foreach (Item child in tokenItem.Children)
{
if (child.Template.Name == "Token")
{
string home = child.Fields["Title"].Value;
string hContent = child.Fields["Content"].Value;
if (sValue.Contains(home))
{
home.Replace(home, hContent);
}
}
}
}
home和hContent拉出每个容器的正确值,但是当页面加载时,它仍然在内容区域输入“home”值(即:@@ sales)而不是新值,即存储在hContent中。 sValue包含所有内容(表格,div,文本),我试图挑出一个等于“home”的值,并用hContent替换“home”值。我错过了什么?
答案 0 :(得分:4)
你的代码并没有真正做任何事情。您似乎正在替换令牌项字段本身(child.Fields["Title"]
和child.Fields["Content"]
)上的令牌,而不是输出内容流上的令牌。
尝试以下操作,您需要将args设置为替换值,替换FirstPart
和LastPart
属性:Replace Tokens in Rich Text Fields Using the Sitecore ASP.NET CMS(链接到&#34中的代码;未经测试的原型"链接)。
我会重构您的代码以使其更容易:
public void Process(RenderFieldArgs args)
{
args.Result.FirstPart = this.Replace(args.Result.FirstPart);
args.Result.LastPart = this.Replace(args.Result.LastPart);
}
protected string Replace(string input)
{
Item tokenItem = Sitecore.Context.Database.Items["/sitecore/content/Site Content/Tokens"];
if (tokenItem.HasChildren)
{
foreach (Item child in tokenItem.Children)
{
if (child.Template.Name == "Token")
{
string home = child.Fields["Title"].Value;
string hContent = child.Fields["Content"].Value;
if (input.Contains(home))
{
return input.Replace(home, hContent);
}
}
}
}
return input;
}
这仍然不是最佳选择,但让你更接近。
答案 1 :(得分:4)
如果您的代码是作为RenderField管道的处理器实现的,则需要将工作结果放回到args中。尝试这样的事情:
Item tokenItem = Sitecore.Context.Database.Items["/sitecore/content/Site Content/Tokens"];
if (tokenItem.HasChildren)
{
var sValue = args.Result.FirstPart;
foreach (Item child in tokenItem.Children){
if (child.Template.Name == "Token") {
string home = child.Fields["Title"].Value;
string hContent = child.Fields["Content"].Value;
if (sValue.Contains(home)) {
sValue = sValue.Replace(home, hContent);
}
}
}
args.Result.FirstPart = sValue;
}
请注意,您需要确保在GetFieldValue处理器之后将此处理器修补到管道中。该处理器负责将字段值提取到args.Result.FirstPart
。
答案 2 :(得分:2)
嗯,你知道当你执行home.Replace(home, hContent);
时会发生什么,它会通过用hContent
中的内容替换来的内容来创建一个新的实例,所以你需要做的是,分配此实例为新变量或home
本身。因此,该片段将如下所示:
if (sValue.Contains(home))
{
home = home.Replace(home, hContent);
}
答案 3 :(得分:1)
你试过了吗?
home = home.Replace(home,hContent);