构建 SiteCore 模板以插入 JavaScript
本文关键字:插入 JavaScript SiteCore 构建 | 更新日期: 2023-09-27 17:56:32
我正在尝试在 SiteCore 中构建一个基本的标签管理解决方案。
我在模板下创建了一个名为"标签管理"的文件夹。 在标签管理文件夹下,我创建了一个名为Google Analytics的模板。 此标记具有一些用作标记参数的属性。
如果我创建继承此模板的内容项,则会看到属性字段。
我需要知道的是,作为最佳实践,我将在哪里编写生成脚本标记的代码。 我查看了 SiteCore 源项目,但没有看到任何模板代码文件夹。
更新:根据反馈和此 Url:http://andyuzick.arke.com/2013/02/as-web-marketers-great-deal-of-our.html,我实现了一个新的类库,其中包含以下内容:
设置.cs
namespace TagManagement
{
public class Settings
{
public const string DEFAULT_GLOBAL_TAG_FOLDER = "/sitecore/content/Global/TagManagement";
public static string GlobalTagFolder
{
get
{
return Sitecore.Configuration.Settings.GetSetting("TagManagement.GlobalTagFolder", DEFAULT_GLOBAL_TAG_FOLDER);
}
}
}
}
网站控制.cs
using Sitecore.Data.Items;
using Sitecore.Diagnostics;
using System;
using System.Text;
using System.Web.UI;
namespace TagManagement
{
public class TagManagmentControl: Sitecore.Web.UI.WebControl
{
System.Web.UI.WebControls.Literal container;
public string TagItem { get; set; }
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
container = new System.Web.UI.WebControls.Literal();
}
protected override void CreateChildControls()
{
Assert.IsNotNullOrEmpty(TagItem, "tag item");
Item item = Sitecore.Context.Database.GetItem(TagItem);
StringBuilder tagToOutput = new StringBuilder();
string templateName = item.TemplateName;
switch (templateName)
{
case "Google Analytics":
tagToOutput.AppendLine("<script>");
tagToOutput.AppendLine(" (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){");
tagToOutput.AppendLine(" (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),");
tagToOutput.AppendLine(" m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)");
tagToOutput.AppendLine(" })(window,document,'script','//www.google-analytics.com/analytics.js','ga');");
tagToOutput.AppendLine(" ga('create', '" + item.Fields["Tracking ID"].Value + "', '" + item.Fields["Domain"].Value + "');");
if (item.Fields["Enable Demographics and Interest Reports"].Value == "1")
{
tagToOutput.AppendLine(" ga('require', 'displayfeatures');");
}
tagToOutput.AppendLine(" ga('send', 'pageview');");
tagToOutput.AppendLine("</script>");
tagToOutput.AppendLine();
break;
case "HTML Tracking Tag":
tagToOutput.AppendLine(item.Fields["Markup"].Value);
break;
}
container.Text = tagToOutput.ToString();
}
protected override void DoRender(HtmlTextWriter output)
{
EnsureChildControls();
container.RenderControl(output);
}
protected override string GetCachingID()
{
return this.GetType().FullName;
}
}
}
管道处理器.cs
using Sitecore.Data.Items;
using Sitecore.Diagnostics;
using Sitecore.Layouts;
using Sitecore.Pipelines.InsertRenderings;
namespace TagManagement
{
public class InsertTags
{
public void Process(InsertRenderingsArgs args)
{
Assert.ArgumentNotNull(args, "args");
if (Sitecore.Context.Site.Name == "shell")
{
return;
}
Item globalTagFolder = Sitecore.Context.Database.GetItem(Settings.GlobalTagFolder);
Profiler.StartOperation("Tag Management: Adding Tags...");
foreach (Item globalTagItem in globalTagFolder.Children)
{
TagManagement.TagManagmentControl control = new TagManagement.TagManagmentControl();
if (control != null)
{
control.TagItem = globalTagItem.ID.ToGuid().ToString();
control.Cacheable = true;
control.VaryByData = true;
RenderingReference reference = new RenderingReference(control);
reference.AddToFormIfUnused = true;
args.Renderings.Add(reference);
Tracer.Info(string.Concat("Tag Management: Added: '", globalTagItem.Name, "'"));
}
}
Profiler.EndOperation();
}
}
}
我希望从会议室中的 SiteCore 专家那里获得任何建设性的反馈!
我相信
你已经走对了方向。
我可以通过三种方式来呈现这些标签内容。
1)将其添加到后面的主布局代码中(这是最简单的,但我真的不喜欢那个选项,您的代码将依赖于主布局)
2)构建一个子布局并将其添加到head标签的特定占位符中,赋予子布局代码渲染标签的责任(也不太喜欢它)
3) 在"renderLayout"管道中创建一个为您完成工作的进程(最好的选择,它是解耦的,可以通过配置文件轻松打开和关闭)*警告,您的标签需要运行服务器。
您的流程如下所示:
namespace YourNamespace
{
public class PrintTags
{
public void Process(RenderLayoutArgs args)
{
//put here validation you may require
var head = WebUtil.FindControlOfType(Sitecore.Context.Page.Page, typeof(System.Web.UI.HtmlControls.HtmlHead));
if (head != null)
{
//add any content in the head
head.Controls.Add(new Literal(" CONTENT "));
}
else
{
//make sure to not break the app instead just log the error.
Sitecore.Diagnostics.Log.Error("Error - The HEAD element must be runat=server", this);
}
}
}
}
.配置:
<configuration>
<sitecore>
<pipelines>
<renderLayout>
<processor type="YourNamespace.PrintTags, YourAssembly" />
</renderLayout>
</pipelines>
</sitecore>
</configuration>
希望对您有所帮助。
干杯