Importing pages with API

Topics: Troubleshooting
May 2, 2011 at 11:27 AM

Hello,

I am creating a script to import content from an old CMS to Composite C1, using the code I fount on the website.
I added the possibility of adding more placeholders to the script. Further all incoming data in debug mode looks alright, but somehow the pages created in Composite do have some strange issues.

When I trie to add test-data it worked fine but with the data from the old CMS the content-placeholder doesn't get filled at all and when I have a second placeholder it mostly get filled. This last added data mostly has some issues too. It happens to have HTML-tags twice, same goes for the <head>- and <body>-tags.

Some examples of what I try to add is below and also the output in Composite administration is shown

In debug mode for left column:

 

<h1>Accountancy</h1><p>De basis van onze dienstverlening is het voeren, het samenstellen en het controleren van:</p>
<ul type="circle">
    <li>administraties</li>
    <li>financi&euml;le rapportages en prognoses</li>
    <li>jaarrekeningen</li>
</ul>
<p>Het doel daarvan is inzicht te geven in de financi&euml;le positie en de bedrijfseconomische mogelijkheden van uw bedrijf. Door ons werk vakkundig te doen, geven we u en alle belanghebbenden het vertrouwen dat de bedrijfseconomische verantwoordingen het juiste inzicht geven.</p>

<p>Onze relatiebeheerders zijn ervaren, afgestudeerde accountants. Daarmee zijn zij&nbsp; waardevolle gesprekspartners die het klappen van de zweep aardig kennen. Maar belangrijker nog: zij kennen u en zij kennen uw onderneming. En juist door hun betrokkenheid bij uw bedrijf bewijzen ze hun meerwaarde.</p><p><strong>Samenstellen jaarrekeningen<br />
</strong>Het document krijgt waarde als u weet wat u met het inzicht kunt doen. Ons werk houdt niet op bij het opleveren van een goede jaarrekening. Daarom zijn onze gesprekspartners jarenlang nauw betrokken bij uw onderneming. Zij hebben een omvangrijke bagage van kennis en ervaring en kunnen zich goed inleven. Dat merkt u aan de manier waarop wij het financi&euml;le reilen en zeilen van uw onderneming met u bespreken. Als u mogelijkheden aan ons voorlegt, dan krijgt u een gedegen financi&euml;le onderbouwing, die altijd exact is toegesneden op uw bedrijf en uw toekomstplannen. En als wij signaleren dat uw administratief proces of uw bedrijfsvoering beter kan, dan zullen we u dat zeker vertellen.</p><p><strong>Controleren jaarrekeningen</strong></p>
<p>Met een accountantsverklaring geven wij een waardeoordeel over de jaarrekening die door de directie van een onderneming is opgesteld. Dit oordeel is een waarborg in het maatschappelijke verkeer. Het geeft het vertrouwen aan anderen over de rapportage die de directie heeft verstrekt. De meerwaarde voor u zijn onze bevindingen tijdens het controleproces. Wij bekijken de bedrijfsvoering, doen verbeteringsvoorstellen voor het optimaliseren van bedrijfsprocessen en geven financi&euml;le onderbouwingen bij te maken keuzes. Dat kunnen we, omdat we begrijpen hoe uw bedrijf in elkaar steekt.</p>
<p>Bij <strong>wettelijke controles</strong> mogen de accountantsverklaringen alleen door een externe accountant worden ondertekend. Deze accountants zijn ingeschreven bij de Autoriteit Financi&euml;le Markten. De externe accountant voldoet aan hoge eisen van vakbekwaamheid, onafhankelijkheid, objectiviteit en integriteit. Klik hier voor het overzicht van&nbsp;<a href="/cms/publish/content/downloaddocument.asp?document_id=125">externe accountants</a> die namens DRV zo&rsquo;n verklaring mogen afgeven.</p><p>&nbsp;
<p><strong>Waardebepalingen en due diligence onderzoeken</strong></p>
<p>Voor een nauwkeurig inzicht in de waarde van een bedrijf(sonderdeel) verrichten wij waardebepalingen en due diligence onderzoeken (&lsquo;boekenonderzoeken&rsquo;). Daarvoor analyseren en controleren we de financi&euml;le, commerci&euml;le, operationele en strategische informatie.</p>
<p>De onderzoeken worden meestal uitgevoerd voor een aanstaande koop of verkoop van een bedrijf(sonderdeel). De rapportages bieden partijen inzicht en zekerheid.</p>
</p>

 

In Composite administration for left column:

 

<html xmlns="http://www.w3.org/1999/xhtml">
  <head></head>
  <body></body>
</html>

 

In debug mode for right column:

 

<p>Een goede voorbereiding bepaalt het succes van de verkoop. De verkoper kent de re&euml;le waarde en kan in onderhandeling gaan met een potenti&euml;le verkoper. Of de verkoper het onderste uit de kan haalt, hangt af van zijn relatie tot de koper. Die relatie bepaalt ook de sfeer van de onderhandelingen.</p><p>Een goede voorbereiding bepaalt het succes van de verkoop. De verkoper kent de re&euml;le waarde en kan in onderhandeling gaan met een potenti&euml;le verkoper. Of de verkoper het onderste uit de kan haalt, hangt af van zijn relatie tot de koper. Die relatie bepaalt ook de sfeer van de onderhandelingen.</p>
<ul type="disc">
    <li>Overdracht binnen de familie. De voorbereiding begint lang voor het feitelijke overdrachtsmoment. De koper moet bewijzen over voldoende capaciteiten te beschikken om het familiebedrijf te kunnen leiden. De onderhandelingen over de prijs worden be&iuml;nvloed door familieverhoudingen. Denk aan het niet financieel willen benadelen van broers en zussen. </li>
    <li>Verkoop aan een strategische partij. Uitgangspunt is welke waarde een mogelijke koper kan toevoegen aan de onderneming. Potenti&euml;le kopers worden vooraf geanalyseerd, om tijdens de onderhandelingen het beste resultaat te behalen. De onderhandelingen zijn zakelijk. </li>
    <li>Overdracht aan het zittende management. Dat gebeurt vooral als het zittende management een belangrijke bijdrage heeft geleverd aan de ontwikkeling van de onderneming. Vaak wordt niet de maximale verkoopopbrengst gerealiseerd. De onderhandelingen worden gekenmerkt door de goede relatie tussen partijen. Echter als het om prijs en voorwaarden gaat, mag de emotionele band tussen partijen niet de boventoon te voeren. </li>
    <li>Overdracht door een management buy-in. Belangrijk is dat een kandidaat wordt gevonden die past bij de onderneming en die product- en marktkennis heeft . Ook management capaciteiten zijn van cruciaal belang. In de onderhandelingen ligt de nadruk op de wijze van betaling van de overdrachtsprijs en de overdrachtsperiode na de verkoop.</li>
</ul>
<p>Een externe adviseur zoekt en toetst potenti&euml;le kopers op hun waarde voor de onderneming. Hij zorgt er ook voor dat de onderhandelingen zakelijk en in een goede sfeer verlopen. </p>
<p>Want uiteindelijk gaat het erom dat u de verkoop zakelijk &eacute;n emotioneel goed afrondt. In de column &lsquo;Bedrijfsoverdracht; de uiteindelijke overdracht&rsquo; staat die afronding centraal.</p>

<p>Marco du Pr&eacute;</p>

In Composite administration for right column:

 

<html xmlns="http://www.w3.org/1999/xhtml">
  <head></head>
  <body>
    <html>
      <head></head>
      <body>
        <p>Een goede voorbereiding bepaalt het succes van de verkoop. De verkoper kent de re&euml;le waarde en kan in onderhandeling gaan met een potenti&euml;le verkoper. Of de verkoper het onderste uit de kan haalt, hangt af van zijn relatie tot de koper. Die relatie bepaalt ook de sfeer van de onderhandelingen.</p>
        <p>Een goede voorbereiding bepaalt het succes van de verkoop. De verkoper kent de re&euml;le waarde en kan in onderhandeling gaan met een potenti&euml;le verkoper. Of de verkoper het onderste uit de kan haalt, hangt af van zijn relatie tot de koper. Die relatie bepaalt ook de sfeer van de onderhandelingen.</p>
        <ul type="disc">
          <li>Overdracht binnen de familie. De voorbereiding begint lang voor het feitelijke overdrachtsmoment. De koper moet bewijzen over voldoende capaciteiten te beschikken om het familiebedrijf te kunnen leiden. De onderhandelingen over de prijs worden be&iuml;nvloed door familieverhoudingen. Denk aan het niet financieel willen benadelen van broers en zussen.</li>
          <li>Verkoop aan een strategische partij. Uitgangspunt is welke waarde een mogelijke koper kan toevoegen aan de onderneming. Potenti&euml;le kopers worden vooraf geanalyseerd, om tijdens de onderhandelingen het beste resultaat te behalen. De onderhandelingen zijn zakelijk.</li>
          <li>Overdracht aan het zittende management. Dat gebeurt vooral als het zittende management een belangrijke bijdrage heeft geleverd aan de ontwikkeling van de onderneming. Vaak wordt niet de maximale verkoopopbrengst gerealiseerd. De onderhandelingen worden gekenmerkt door de goede relatie tussen partijen. Echter als het om prijs en voorwaarden gaat, mag de emotionele band tussen partijen niet de boventoon te voeren.</li>
          <li>Overdracht door een management buy-in. Belangrijk is dat een kandidaat wordt gevonden die past bij de onderneming en die product- en marktkennis heeft . Ook management capaciteiten zijn van cruciaal belang. In de onderhandelingen ligt de nadruk op de wijze van betaling van de overdrachtsprijs en de overdrachtsperiode na de verkoop.</li>
        </ul>
        <p>Een externe adviseur zoekt en toetst potenti&euml;le kopers op hun waarde voor de onderneming. Hij zorgt er ook voor dat de onderhandelingen zakelijk en in een goede sfeer verlopen.</p>
        <p>Want uiteindelijk gaat het erom dat u de verkoop zakelijk &eacute;n emotioneel goed afrondt. In de column &lsquo;Bedrijfsoverdracht; de uiteindelijke overdracht&rsquo; staat die afronding centraal.</p>
        <p>Marco du Pr&eacute;</p>
      </body>
    </html>
  </body>
</html>

When I used a test script with a simple html text it works fine:

 

 

string content = "<h1>This is content</h1><p>Hello world!</p>";
string content2 = "<h1>This is content for column nummero 2</h1><p>Test test test.</p>";

 

The adjustment to the original code:

 

	public static class PageCreation
	{
		/// <summary>
		/// Adds a new page to the system and publishes it. This sample expects that 
		/// a the Layout Template used has a &lt;rendering:placeholder /&gt; with id="contentplaceholder" 
		/// </summary>
		/// <param name="parentId">ID of the parent page for structural placement. Use Guid.Empty for top-level page.</param>
		/// <param name="templateId">ID of a template to use</param>
		/// <param name="pageTypeId">ID of a page type to use</param>
		/// <param name="title">Page title</param>
		/// <param name="pageDescription">Page description</param>
		/// <param name="pageCulture">Language (culture) of the page</param>
		/// <param name="menuTitle">String to use in menues. Use empry string to keep this page out of navigations.</param>
		/// <param name="urlTitle">A single folde name to use in URLs</param>
		/// <param name="PageColumns">Content of the columns of a page.</param>
		/// <returns></returns>
		public static Guid CreateNewPage(
			Guid parentId,
			Guid pageTypeId,
			Guid templateId,
			string title,
			string pageDescription,
			CultureInfo pageCulture,
			string menuTitle,
			string urlTitle,
			List<ColumnModel> PageColumns)
		{
			using (DataConnection connection = new DataConnection())
			{
				////// *** PAGE *** //////

				IPage page = DataConnection.New<IPage>();

				page.Id = Guid.NewGuid();
				page.PageTypeId = pageTypeId;
				page.TemplateId = templateId;
				page.Title = title;
				page.Description = pageDescription;
				page.CultureName = pageCulture.Name;
				page.MenuTitle = menuTitle;
				page.UrlTitle = urlTitle;
				page = page.AddPageAtBottom(parentId);

				////// *** PLACEHOLDER *** //////

				List<IPagePlaceholderContent> PageContents = new List<IPagePlaceholderContent>();

				for (int i = 0; i < PageColumns.Count; i++)
				{
					IPagePlaceholderContent content = DataConnection.New<IPagePlaceholderContent>();

					content.Content = PageColumns[i].Content;
					content.PlaceHolderId = i == 0 ? "content" : "aside";
					content.PageId = page.Id;
					content.PublicationStatus = "published";

					PageContents.Add(content);
				}

				using (DataScope dataScope = new DataScope(DataScopeIdentifier.Administrated))
				{
					page = connection.Add<IPage>(page);
					

					page.PublicationStatus = "published";
					

					connection.Update<IPage>(page);

					foreach (IPagePlaceholderContent PageContent in PageContents)
					{
						IPagePlaceholderContent content = connection.Add<IPagePlaceholderContent>(PageContent);
						connection.Update<IPagePlaceholderContent>(content);
					}
				}

				return page.Id;
			}
		}
	}

I hope someone can help me figure out what could go wrong.

 

Thanks,
Rob

 

 

 

                    string content = "<h1>This is content</h1><p>Hello world!</p>"; // test markup
                    string content2 = "<h1>This is content voor pagina nummer 2</h1><p>Bier willen wij graag</p>"; // test markup
May 2, 2011 at 4:06 PM
Edited May 2, 2011 at 4:16 PM

Hi,

I am a fellow user with just a couple thoughts and notes. Composite C1 doesn't use XHTML snippets internally, only full XHTML documents.

This allows Composite C1 to work the final rendering magic delivering a page to a browser dynamically created from many different sources of information, and allows developers to expect well formed xml to work with.

So, the placeholder Content property expects and will return a full HTML document--there should be a tutorial page describing this, and I don't know how much Composite C1 may be trying to do for you in this regard or may be expecting you to do yourself.

When you check a value in preview while editing a function, you will see this full document, as it is the unit used internally.
But when the page is rendered, the contents of the body will have been placed in their place in the final page, and any contents of the head will have been placed in the head of the final page.

It looks like you are pretty close; the nested <html> you see suggests an extra nesting, but is otherwise how you might expect something to look caught during the flow. How do things look on a final page, assuming one will display?

Coordinator
May 2, 2011 at 7:17 PM

Hi Rob

My best guess is that the content example you have is somehow parsed as "illegal xml" and thefore not shown.

I would recommend do check data  (xml files/sql table dependin on what you're using) to see whether the content is present in database.

After that, it would be nice to know where exactly it failed, most likely there some exceptions logged, please check the log file so we will probably be able to tell what's wrong.

 

// Dmitry

May 9, 2011 at 12:32 PM

Thanks,

It took some time but finally I found the bug. Your tips helped me a bit but weren't the big problem. I added the tags to make it a complete HTML document and searched for the XML files.
The files were alright, but I noticed that I get errors when I tried to preview a page in the C1 console.
After lot of trying I found some other bugs in my export script and while fixing those I noticed some issue with htmlencoding.
When I changed this the pages were imported the way they should and are showing the way I wanted.

Thanks again!

Rob