HtmlReport

Background

The HtmlReport functionality takes an XHTML string, processes it adding data from a viewmodel and outputs the resulting XHTML.

XHTML is a strict version of HTML that is XML compatible. Most important is that it always have one, and only one, root node. Read more here https://en.wikipedia.org/wiki/XHTML

All the functionality of the HtmlReport functionality also applies to XML if you need that.

The HTML generating functions share most of it's code with the OpenDocument functionality. The OpenDocument format uses XML for storing the document content.

Usage

  • Viewmodel that defines data to insert
  • Template to insert data into

You create a viewmodel that extracts the data you need from your model. Each attribute in this viewmodel can replace one or more "tags" in the source template. Note that the viewmodel also defines where the template can be found.

Example of a viewmodel that extracts two attributes to be used, "String" and "Text".

ReportingTemplate.png

Ways to retrieve the template

The template is accessed in several different ways;

  • From an String attribute in a modeled class
  • From a BLOB attribute in a modeled class (base64 encoded)
  • From an URL
  • From the local filesystem
Attribute name Attribute should evaluate to Value type and content
TemplateHtml A string that contains Html Not encoded in any special way
TemplateUrl The URL or local filename String with for example http://www.mdriven.net/templates/report.odt or for prototyping c:\\temp\\mytemplate.odt
TemplateBlob A class attribute containing the template Blob with an uploaded document template, value is expected to be Base64 encoded
ReportFileName A string with a filename Not used by XHtmlReportAsString but needed for opendocumentreportasblob

Methods

Depending on your input format, you can use either of these two functions;

ResultHtmlAsString := self.XHtmlReportAsString(ReportRoot.ViewModels.ReportingViewmodel)
ResultHtmlAsBlob := self.opendocumentreportasblob(ReportRoot.ViewModels.ReportingViewmodel)
  • self here will become the root object of the reporting viewmodel.
  • ReportRoot is the class that has the reporting viewmodel
  • Viewmodels is a method that retrieves all the viewmodels of the class. See ViewModels
  • ReportingViewmodel is the name of the reporting viewmodel used in this example

XHtml

Because a Html document might not be loadable into a DOM tree like XHtml or XML you need to provide a single document root node.

This is an easy mistake to do and several html editor usually don't respect this and create Html, not XHtml.

XHtmlReportAsString will try to compensate and add a <html> tag around the content if it's missing. For example, this input, which has no single root node, only two <p> tags

<p>Hello %String%</p>
<p>You need to do this....</p>

will create this output

<html>
  <p>Hello John</p>
  <p>You need to do this....</p>
</html>

The <html> tag was added because there where no <root>, <body> or <html> tags in the input document.

Information about available tags (meta data)

When creating template documents, consider using the value %meta% in your document to get the exact tag list for your document.

In Html, provide a tag to hold the meta value, like this

<meta>%meta%</meta>

Will for the example viewmodel create;

<html>
    <meta>%TemplateHtml%, %TemplateBlob%, %ReportFileName%, %String%, %Text%, </meta>
</html>

Copy the tag name including the percent signs from the generated meta tag information. The %meta% must be first string in element in order to be recognized.

XML documents

XML is just the more generic case of html. They are treated by the same logic.

 <SomeXml attrib='%SomeVMColumnAsAttributeresult%'>
     %SomeOtherVMColumnAsXMLTextresult%
   <Items>
     <Item>%%+TheVMNestingColumn%
       <ContentInItem someattrib='%VMColInNesting%'>
          %StuffFromViewModelNesting%
       </ContentInItem>
     </Item>
   </Items>
 </SomeXml> 
This page was edited 40 days ago on 03/26/2024. What links here