2013-03-06 3 views
5

Возможно ли извлечь информацию на странице SDL Tridion, включая содержимое, связанное с ней в формате XML.SDL Tridion: логическая структура страницы в формате XML

Я ожидал что-то похожее на это:

стек
<page name="mypagename"> 
    <page id="xxxxx"/> 
    <template name="abc" id="123"> 
     <container name="xyz"> 
      <content name="asd" id="123"> 
      <Path="" \> 
      </content> 
     </container> 
    </template> 
    </page> 

технологии является Tridion 2011 и Java.

Я новичок в Tridion, поэтому маленький подробный ответ был бы очень полезен.

+0

Пожалуйста, добавьте версию SDL Tridion, которую вы используете, и какие технологии/языки вы хотите использовать. –

ответ

6

В зависимости, что вы на самом деле нужны, есть НАМНОГО простые способы сделать это, но я использую следующий TBB класс, написанный на C# создать страницу XML, разделенный на содержание регионов, основанную на шаблон компонент метаданных

class GetPageXML : TemplateBase 
    { 
     public override void Transform(Engine engine, Package package) 
     { 
      Initialize(engine, package); 
      Logger.Debug("This will get the full page XML"); 
      Item pageItem = m_Package.GetByType(ContentType.Page); 

      Page currentPage = GetPage(); 

      m_Engine.PublishingContext.RenderContext.ContextVariables.Add("CURRENT_PAGE", currentPage); 


      XmlDocument pageXml = pageItem.GetAsXmlDocument(); 
      foreach (XmlNode cpNode in pageXml.SelectNodes("/tcm:Page/tcm:Data/tcm:ComponentPresentations/tcm:ComponentPresentation", NSManager)) 
      { 
       TcmUri componentURI = new TcmUri(cpNode.SelectSingleNode("tcm:Component/@xlink:href", NSManager).Value); 
       TcmUri componentTemplateURI = new TcmUri(cpNode.SelectSingleNode("tcm:ComponentTemplate/@xlink:href", NSManager).Value); 

       //Render the componentPresentation 
       XmlNode cpRenderElement = pageXml.CreateElement("tcm", "RenderedComponentPresentation", "http://www.tridion.com/ContentManager/5.0"); 
       XmlAttribute attNamespace = pageXml.CreateAttribute("xmlns:tcdl"); 
       attNamespace.Value = "http://www.tridion.com/ContentDelivery/5.3/TCDL"; 
       cpRenderElement.Attributes.Append(attNamespace); 


       if (m_Engine.PublishingContext.RenderContext.ContextVariables.Contains("ORDINAL_POSITION")) 
       { 
        int ordinalPosition = ((int)m_Engine.PublishingContext.RenderContext.ContextVariables["ORDINAL_POSITION"]) + 1; 
        m_Engine.PublishingContext.RenderContext.ContextVariables["ORDINAL_POSITION"] = ordinalPosition; 
       // m_Engine.PublishingContext.RenderContext.ContextVariables["ORDINAL_POSITION"] = 0; 
       } 
       else 
       { 
        m_Engine.PublishingContext.RenderContext.ContextVariables.Add("ORDINAL_POSITION", 0); 
       } 


       //Get the metadata from the CT 
       ComponentTemplate componentTemplate = (ComponentTemplate)m_Engine.GetObject(componentTemplateURI); 
       String metadataXmlString = ""; 
       String cpRegionName = ""; 
       if (componentTemplate.Metadata != null) 
       { 
        metadataXmlString = componentTemplate.Metadata.OuterXml; 
        XmlNode cpRegionNode = componentTemplate.Metadata.SelectSingleNode("//*[local-name()='region']"); 
        if (cpRegionNode != null) 
        { 
         cpRegionName = "_" + cpRegionNode.InnerText; 
        } 
       } 
       cpNode.SelectSingleNode("tcm:ComponentTemplate", NSManager).InnerXml = metadataXmlString; 



       String REGIONAL_POSITION = "REGIONAL_POSITION" + cpRegionName; 
       if (m_Engine.PublishingContext.RenderContext.ContextVariables.Contains(REGIONAL_POSITION)) 
       { 
        int regionalPosition = ((int)m_Engine.PublishingContext.RenderContext.ContextVariables[REGIONAL_POSITION]) + 1; 
        m_Engine.PublishingContext.RenderContext.ContextVariables[REGIONAL_POSITION] = regionalPosition; 
        // m_Engine.PublishingContext.RenderContext.ContextVariables["ORDINAL_POSITION"] = 0; 
       } 
       else 
       { 
        m_Engine.PublishingContext.RenderContext.ContextVariables.Add(REGIONAL_POSITION, 0); 
       } 



       DateTime cpRenderStart = DateTime.Now; 
       string contentCP = m_Engine.RenderComponentPresentation(componentURI, componentTemplateURI); 

       DateTime cpRenderEnd = DateTime.Now; 
       TimeSpan cpRenderTime = cpRenderEnd.Subtract(cpRenderStart); 

       XmlAttribute attCPRenderTime = pageXml.CreateAttribute("RenderTime"); 
       attCPRenderTime.Value = String.Format("{0:0000}", cpRenderTime.TotalMilliseconds) + " milliseconds"; 
       cpNode.Attributes.Append(attCPRenderTime); 


       if (m_Engine.RenderMode != RenderMode.Publish) 
       { 
        //Remove the '&' symbols created for linking in previewmode 
        contentCP = contentCP.Replace("&", ""); 

       } 

       try 
       { 
        cpRenderElement.InnerXml = contentCP; 
       } 
       catch (Exception e) 
       { 
        cpRenderElement.InnerXml = "Malformed XML in the output:" + e.Message;// +"<!--" + contentCP + "-->"; 
       } 
       cpNode.AppendChild(cpRenderElement); 



       Component component = (Component)m_Engine.GetObject(componentURI); 
       XmlAttribute attComponentRevisionDate = pageXml.CreateAttribute("ModifiedOn"); 
       attComponentRevisionDate.Value = component.RevisionDate.ToString("yyyy-MM-dd HH:mm:ss tt"); 
       cpNode.Attributes.Append(attComponentRevisionDate); 



       //Get the metadata from the Component 

       metadataXmlString = ""; 
       if (component.Metadata != null) 
       { 
        metadataXmlString = component.Metadata.OuterXml; 
       } 

       cpNode.SelectSingleNode("tcm:Component", NSManager).InnerXml = metadataXmlString; 
      } 



      //Add the rendered/published time 
      XmlAttribute attRenderTime = pageXml.CreateAttribute("RenderedAt"); 
      attRenderTime.Value = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss tt"); 
      pageXml.DocumentElement.Attributes.Append(attRenderTime); 

      //Add PublishInfo 
      //Get the PublishTransaction 

      PublishTransaction pubTrans = GetPublishTransaction(engine); 

      if (pubTrans != null) 
      { 
       XmlElement nodePublisher = pageXml.CreateElement("Publisher"); 
       XmlElement nodePublisherName = pageXml.CreateElement("name"); 
       XmlElement nodePublisherId = pageXml.CreateElement("id"); 
       XmlElement nodePublisherDescription = pageXml.CreateElement("description"); 

       nodePublisherName.InnerText = pubTrans.Creator.Title; 
       nodePublisher.AppendChild(nodePublisherName); 

       nodePublisherId.InnerText = pubTrans.Creator.Id.ToString(); 
       nodePublisher.AppendChild(nodePublisherId); 

       nodePublisherDescription.InnerText = pubTrans.Creator.Description; 
       nodePublisher.AppendChild(nodePublisherDescription); 

       pageXml.DocumentElement.AppendChild(nodePublisher); 
      } 

      //Add the target info 
      if (engine.PublishingContext.PublicationTarget != null) 
      { 
       XmlElement nodePublicationTarget = engine.PublishingContext.PublicationTarget.ToXml(); 
       XmlNode nodePubs = nodePublicationTarget.SelectSingleNode("/tcm:PublicationTarget/tcm:Data/tcm:Publications", NSManager); 
       nodePubs.ParentNode.RemoveChild(nodePubs); 


       pageXml.DocumentElement.AppendChild(pageXml.ImportNode(nodePublicationTarget, true)); 
      } 





      //Add the Page Modified time 
      ModificationInfo modInfo = GetNewestModificationDateFromPageXml(pageXml); 

      XmlAttribute attContentModifiedTime = pageXml.CreateAttribute("ContentLastModifiedOn"); 
      attContentModifiedTime.Value = modInfo.ModificationDate.ToString("yyyy-MM-dd HH:mm:ss tt"); 
      pageXml.DocumentElement.Attributes.Append(attContentModifiedTime); 

      XmlAttribute attLastModifiedItem = pageXml.CreateAttribute("LastModifiedItemURI"); 
      attLastModifiedItem.Value = modInfo.ItemURI.ToString(); 
      pageXml.DocumentElement.Attributes.Append(attLastModifiedItem); 

      XmlAttribute attLastModifiedTitle = pageXml.CreateAttribute("LastModifiedItemTitle"); 
      attLastModifiedTitle.Value = modInfo.ItemTitle; 
      pageXml.DocumentElement.Attributes.Append(attLastModifiedTitle); 




      //Add PageTemplate Properties 
      XmlNode nodePageTemplate = pageXml.SelectSingleNode("/tcm:Page/tcm:Data/tcm:PageTemplate", NSManager); 
      TcmUri uriPageTemplate = new TcmUri(nodePageTemplate.Attributes["href", "http://www.w3.org/1999/xlink"].Value); 
      XmlElement pageTemplateXml = engine.GetObject(uriPageTemplate).ToXml(XmlSections.Data); 
      nodePageTemplate.ParentNode.ReplaceChild(pageXml.ImportNode(pageTemplateXml, true), nodePageTemplate); 

      //Add the publication properties 
      XmlNode nodePublication = pageXml.SelectSingleNode("/tcm:Page/tcm:Context/tcm:Publication", NSManager); 
      TcmUri uriPublication = new TcmUri(nodePublication.Attributes["href", "http://www.w3.org/1999/xlink"].Value); 
      XmlElement publicationXml = engine.GetObject(uriPublication).ToXml(XmlSections.Data); 
      nodePublication.ParentNode.ReplaceChild(pageXml.ImportNode(publicationXml,true), nodePublication); 
      m_Package.PushItem("UrbanCherryPageFrameWork", m_Package.CreateXmlDocumentItem(ContentType.Xml,pageXml)); 
     } 

Вы можете остановиться на линии XmlDocument pageXml = pageItem.GetAsXmlDocument(); и просто нажать это значение в пакет и вызвать его Вывод.

В качестве альтернативы можно посмотреть шаблоны DD4T, так как они также выводят стандартную структуру XML для страниц.

+0

Есть ли выборка, которую вы можете предоставить? Я не парень из C#. Спасибо за ваше время и подробный ответ. – lpk

+0

Какую технологию вы хотите использовать. Это может быть возможным сделать с почти 100% XSLT, но вам понадобится хотя бы немного C# где-нибудь в вашем решении. –

+0

Я планирую решение на базе Java. – lpk

4

Вы на самом деле просите довольно трудную задачу ответить из-за гибкой модели данных Tridion.

Там несколько вещей, которые известны наверняка:

  • Есть Страницы
    • Страницы имеют свойства, такие как название, ID, URL, Id публикации, версия, дата создания, Дата публикации, и т.д.
  • Pagès может иметь компонентов Презентации
    • компонентов Презентации есть содержание в них

Содержание компонента (или набор компонентов), скорее всего, то, что вы ищете, так как это данные, которые вы хотите отобразить на своем сайте. Компоненты хранятся как XML в Tridion Content Manager и преобразуются шаблоном при публикации. XML-схема, используемая компонентом, определяется разработчиком (поэтому все реализации, вероятно, используют разные схемы), и шаблон, который преобразует этот компонент, также определяется разработчиком, и, следовательно, все реализации, вероятно, будут иметь разные результаты.

Итак, если вы хотите использовать TRIDION XML для создания веб-сайта на напорном уровне, вам нужно:

  1. Определение схемы для вашего контента в соответствии с вашими требованиями сайта
  2. Определить шаблон которые будут публиковать содержимое в XML для доставки ярусе

(я упрощающий здесь много - не стоит недооценивать работу, необходимую при определении правильной модели контента для любой конкретной организации)

Крис дает вам хороший пример того, как подтолкнуть XML к уровню доставки. Такие рамки, как DD4T, дают вам этот шаблон «бесплатно» - но вам все равно нужно самостоятельно разработать схемы.

+0

Страницы имеют компонентные презентации и компоненты, в свою очередь, имеют сопоставленное с ним содержимое. Таким образом, связь между страницей и контентом осуществляется через компонент. Поэтому мое требование: если я опубликую страницу; он должен создать XML в вышеуказанной структуре, содержащей детали компонента, такие как используемые стили, контент, сопоставленный с ним и т. д. Является ли это достижимым? Спасибо за ваше драгоценное время и ответ .. – lpk

+0

Шаблон, предоставленный Крисом, достигнет этого. Спросите кого-нибудь, кто имеет опыт работы с Tridion (возможно, от вашего клиента?), Чтобы поместить его в шаблон Tridion. –

+0

Я хочу знать, достижимо ли это, прежде чем говорить с Клиентами, Надеюсь, вы понимаете ситуацию. – lpk