2014-04-03 4 views
1

SiteCore에서 기본 태그 관리 솔루션을 구축하려고합니다.A SiteCore 템플릿 작성 JavaScript를 삽입하려면

템플릿 아래에 태그 관리이라는 폴더를 만들었습니다. 태그 관리 폴더에서 Google Analytics 템플릿을 만들었습니다. 이 태그에는 태그의 매개 변수로 사용되는 몇 가지 속성이 있습니다.

이 템플릿을 상속하는 컨텐트 항목을 만들면 속성 필드가 나타납니다.

내가 알아야 할 것은 스크립트 태그를 생성하는 코드를 작성하는 것이 가장 좋습니다. SiteCore 소스 프로젝트를 살펴본 결과 템플릿 코드의 폴더가 보이지 않습니다.


UPDATE :는 피드백이 URL을 기반으로 :

Settings.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); 
      } 
     } 
    } 
} 

WebControl : http://andyuzick.arke.com/2013/02/as-web-marketers-great-deal-of-our.html, 나는 다음과 같이 새로운 클래스 라이브러리를 구현 한 .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; 
     } 
    } 

} 

PipelineProcessor.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 전문가의 어떤 건설적인 의견을 보내 주셔서 감사합니다!

답변

2

저는 여러분이 올바른 방향으로 가고 있다고 생각합니다.

세 가지 방법으로 태그 내용을 렌더링 할 수 있습니다.

1) 뒤에 메인 레이아웃 코드에 추가 (그것은 당신의 코드))

2 mainlayout에 따라가 수 sublayout를 구축하고 그것을 추가 할 것입니다 정말 그 옵션처럼 그나마 가장 쉬운하지만입니다 귀하의 head 태그에 특정 자리 표시 자, 태그를 렌더링하는 책임을 sublayout 코드에 부여하십시오 (너무 좋지는 않음)

3) 작업을 수행하는 "renderLayout"파이프 라인에 프로세스를 생성하십시오 가장 좋은 옵션은 분리되어 있으며 설정 파일을 통해 쉽게 켜고 끌 수 있습니다.) * 경고, 태그는 runat 서버 여야합니다. ..

<configuration> 
    <sitecore> 
    <pipelines> 
     <renderLayout> 
     <processor type="YourNamespace.PrintTags, YourAssembly" /> 
     </renderLayout> 
    </pipelines> 
    </sitecore> 
</configuration> 

는 희망이 도움이

환호

을 :

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); 
      } 
     } 
    } 
} 

의 .config :

이 프로세스 같을 것이다 어떻게