Как получить все ключевые слова внутри определенной категории, используя C# TBB


5

У меня есть Tcm id категории в моем приложении .config. В моих C# TBB я пишу ниже кода, чтобы получить все ключевые слова, связанные с этой категорией

public class GetKeywords : ITemplate 
    { 
    public void Transform(Engine engine, Package package) 
     { 
     string categoryID =ConfigurationManager.AppSettings["catgoryTcmUri"]; 

     Category cat = (Category)engine.GetObject(categoryID); 

     XmlDocument keywordsXml = new XmlDocument(); 
     keywordsXml.LoadXml(cat.GetListKeywords().OuterXml); 
     Item output = package.CreateXmlDocumentItem(ContentType.Xml, keywordsXml); 
     package.PushItem("CategoryKeywords", output); 
    } 
    } 

Я получаю follwing ошибки в Template Builder:

Object reference not set to an instance of an object. 
at Tieto.Gadgets.Templating.GetKeywords.Transform(Engine engine, Package package) 
at Tridion.ContentManager.Templating.Assembly.AssemblyMediator.Transform(Engine engine, Template template, Package package) 
at Tridion.ContentManager.Templating.Assembly.CSharpSourceCodeMediator.RunTemplate(Engine engine, Package package, String templateUri, String className) 
at Tridion.Templating.CSharpTemplate.CSharpSourceTemplate.Transform(Engine __engine, Package __package) 
at Tridion.ContentManager.Templating.Assembly.CSharpSourceCodeMediator.Transform(Engine engine, Template template, Package package) 
at Tridion.ContentManager.Templating.Engine.ExecuteTemplate(Template template, Package package) 
at Tridion.ContentManager.Templating.Engine.InvokeTemplate(Package package, TemplateInvocation templateInvocation, Template template) 
at Tridion.ContentManager.Templating.Compound.CompoundTemplateMediator.Transform(Engine engine, Template templateToTransform, Package package) 
at Tridion.ContentManager.Templating.Engine.ExecuteTemplate(Template template, Package package) 
at Tridion.ContentManager.Templating.Engine.InvokeTemplate(Package package, TemplateInvocation templateInvocation, Template template) 
at Tridion.ContentManager.Templating.Engine.TransformItem(Template template, IdentifiableObject itemToRender) 
at Tridion.ContentManager.Templating.Debugging.DebuggingEngine.Run() 
at Tridion.ContentManager.Templating.Debugging.DebugSession.Run() 
  0

ли вы проверить это уже? http://stackoverflow.com/questions/12908803/how-to-get-the-keyword-from-category-name-in-c-sharp-tbb 17 дек. 152015-12-17 21:11:53

+3

Что это за app.config? это файл конфигурации вашего приложения, запущенного на стороне доставки контента, или это какая-то конфигурация приложения, которую вы пытаетесь включить, и использовать в самом C# TBB? 18 дек. 152015-12-18 04:55:22

5

Вот несколько вещей, которые вы должны перекрестно проверить, поскольку код выглядит хорошо.

  • Как уже подозревал Панкадж, вы можете использовать некоторую конфигурацию, которую ваш C# TBB не сможет прочитать/получить, сначала используйте идентификатор категории непосредственно в своем коде.
  • Вы можете отлаживать свой TBB, используя ведение журнала или присоединение к процессу создания шаблона TcmTemplateDebugHost.exe либо на локальном компьютере, либо посредством удаленной отладки.
  • Смотрите некоторые родственное вещество здесь: https://stackoverflow.com/questions/12210711/tridion-template-builder-and-visual-studio-debugging
  0

Я полагался на app.config, это мой конфигурационный файл приложения для шаблонов. И именно поэтому categoryID получает значение null. я удалил его из app.config и назначил его непосредственно в моем коде: string categoryID = "tcm: 2033-3222-512"; код теперь работает нормально, я получаю все ключевые слова в xml. Спасибо @PankajGaur за этот ключ - только один запрос сейчас, что, если я хочу добавить некоторую конфигурацию в мое решение для шаблонов, где мне нужно разместить мой app.config в tridion. 18 дек. 152015-12-18 08:27:15

+1

Храните его в каком-либо компоненте конфигурации, параметризуйте блок построения шаблона с помощью схемы параметров, создайте идентификатор в своем пакете с помощью строительного блока C#, сохраните его в файле XML в известном месте в файловой системе ... Вы выберите! 18 дек. 152015-12-18 09:22:02


4

Использование шаблона Builder для отладки вам кода добавив строки TemplatingLogger между вашими командами.

public class GetKeywords : ITemplate 
    { 

    TemplatingLogger log = TemplatingLogger.GetLogger(this.GetType()); 

    public void Transform(Engine engine, Package package) 
     { 
     string categoryID = ConfigurationManager.AppSettings["catgoryTcmUri"]; 

     log.Debug("categoryID: " + categoryID) 

     Category cat = (Category)engine.GetObject(categoryID); 

     XmlDocument keywordsXml = new XmlDocument(); 
     keywordsXml.LoadXml(cat.GetListKeywords().OuterXml); 
     Item output = package.CreateXmlDocumentItem(ContentType.Xml, keywordsXml); 
     package.PushItem("CategoryKeywords", output); 
    } 
    } 

При запуске компонентов шаблона или шаблон страницы, который имеет C# TBB ваш упоминаете вы можете точно локализовать линию, поднимая ошибку. Когда вы знаете эту линию, это 90% вашего решения.

PS. Я не могу быть уверен, но, вероятно, categoryID в вашем случае пустой