Location: PHPKode > projects > Open Power Template > docs/Opt/guide.data-formats.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="pl">
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
	<meta name="robots" content="all" />

	<title>Data formats - Open Power Template</title>
	
	<link rel="stylesheet" type="text/css" href="design/generic.css" media="all"  />
	<link rel="stylesheet" type="text/css" href="design/print.css" media="print" />
	<!--[if lte IE 6]><link rel="stylesheet" href="design/ie.css" type="text/css" /><![endif]-->	
	<!--[if IE 7]><link rel="stylesheet" href="design/ie7.css" type="text/css" /><![endif]-->
</head>
<body>

<div id="wrap">
	<div id="header">
		<h1>Open Power Template 2.0</h1>
		<h2>Data formats</h2>
		<p class="generated">@ 02.09.2010</p>
		<p class="location"><a href="index.html"><strong>User manual</strong></a> &raquo; <a href="guide.html">Programmer's Guide</a> &raquo; <a href="guide.data-formats.html">Data formats</a></p>
	</div>
	
	<div id="content"><dl class="location"><dt><a href="guide.html">4. Programmer's Guide</a><br/>4.6. Data formats</dt><dd class="prev">4.5. Working with sections<br/><a href="guide.sections.html">&laquo; Previous</a></dd><dd class="next">4.6.1. Available data formats<br/><a href="guide.data-formats.available.html">Next &raquo;</a></dd></dl>	<h1>4.6. Data formats</h1><h4>Table of Contents</h4><ul class="toc"><li><a href="guide.data-formats.available.html">4.6.1. Available data formats</a></li><li><a href="guide.data-formats.expressions.html">4.6.2. Formats and expressions</a></li></ul><p>OPT introduces an unique feature called "data formats". Finally, you do not have to worry about the data structures while implementing a template. The idea is simple. In the template syntax we have a thing called <em>generic containers</em>: <code>$variable</code>, <code>$container.item</code> etc. We know, what they are supposed to do, but it is not said, what they are - arrays, objects or maybe something more. Before you start the template compilation, your script may choose the exact <em>format</em> for them. In other words, the script can tell that the container <code>$foo</code> is accessible like an object, and the code <code>$foo.bar</code> will be compiled as <code>$this-&gt;_data['foo']-&gt;bar</code>. The other container, <code>$goo</code>, may become an array, and then we will get <code>$this-&gt;_data['goo']['hoo']</code> for <code>$goo.hoo</code>. This gives us some benefits. Let's consider some real world scenarios.</p>

<ol>
<li><p>We have some people responsible for the templates in our team. They wish to start writing templates for the article module, but the project designer and the programmers have not worked on this module yet and some of the solutions are a big unknown. With other template engines and PHP itself, the template designers may risk and write those files, implementing some default structures, but if the programmers decide to change something, the templates must be corrected as well. Such problem does not occur in OPT. The template designers may use generic containers and let the programmers to choose the exact format in the script. They can even create the templates while the project designers are still working on the code structure project.</p></li>
<li><p>The template designers finished their job and completed the templates for the article module. However, the programmers work on another part of the website, and the customer wants to inspect the module layout and navigation. One of the programmers may write a demo version that fills the template with sample data put into the simple arrays. Once the module is written, the arrays may be replaced with the database calls, but still - the template source files remain the same, they just need to be recompiled.</p></li>
<li><p>The programmers are doing the code refactoring and they have noticed an inconsequence in the data generated by the script. In some places, it makes a database call, retrieves the data, puts it to the template engine, but part of the templates does not use them. The decide to retrieve the data on demand, so they write a class that implements the <code>Opt_Generator_Interface</code> and bind it to the template containers. The templates themselves still remain untouched. All they have to do is to recompile them, and OPT will do the rest.</p></li>
</ol>

<h2>Using data formats</h2>

<p>In order to demonstrate, how to use formats, we need a simple template:</p>

<pre class="xml"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>{$article.title}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>{$article.body}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;opt:if</span> <span style="color: #000066;">test</span>=<span style="color: #ff0000;">&quot;$user.read&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;userinfo&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>{$user.name}, you have already read this article<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;opt:else<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;userinfo&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>{$user.name}, you have not read this article yet. <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">parse:href</span>=<span style="color: #ff0000;">&quot;'rate.php?uid='~$user.id&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Rate it!<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/opt:else<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/opt:if<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre>

<p>This template has two generic containers: <code>$article</code> and <code>$user</code>. At this stage, we don't know, what they really are and in the script we can choose the exact format, depending on our needs:</p>

<pre class="php"><span style="color: #000000; font-weight: bold;">class</span> Article
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$title</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$body</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$title</span><span style="color: #339933;">,</span> <span style="color: #000088;">$body</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">title</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$title</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">body</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$body</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// end __construct(); </span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// end Article;</span>
&nbsp;
<span style="color: #000088;">$view</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Opt_View<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'article.tpl'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">article</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Article<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Some article'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Lorem ipsum dolor sit amet...'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">53</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Johnny'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'read'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// he has already read this article</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Now, we choose the format</span>
<span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFormat</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'article'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Objective'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$output</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$view</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre>

<p>If we do not specify any special format for a variable or container, the compiler assumes that they are PHP arrays. However, in our case the <code>$article</code> is neither an array nor it implements the <code>ArrayAccess</code> interface. Using the <a href="api.opt-view.set-format.html" title="7.2.28. Opt_View::setFormat()">Opt_View::setFormat()</a> we inform the compiler that <code>$article</code> is an object by choosing the <code>Objective</code> format for it.</p>

<h2>More complex containers</h2>

<p>OPT also provides the support for more complicated container calls, like <code>$foo.bar.joe</code>. <code>$foo</code> is an object, while <code>$bar</code> is an object that implements our own <code>Awesome_Access_Interface</code> (let's assume that we already have an OPT format implementation for it). To mark this fact, we may do the following thing:</p>

<pre class="php"><span style="color: #666666; font-style: italic;">// Access the 'foo' items as object calls</span>
<span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFormat</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Objective'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Access the 'foo.bar' items with our awesome access interface</span>
<span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFormat</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo.bar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'AwesomeAccess'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre>

<h2>Sections</h2>

<p>It can be said that sections are built on OPT data formats. We start from a sample template:</p>

<pre class="xml"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Our customers:<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ol<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;opt:section</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;customers&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;li<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>{$customers.firstName} {$customers.lastName}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/li<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/opt:section<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ol<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre>

<p>In case of sections, we can find two areas where the data formats may work:</p>

<ol>
<li>Section itself - how to iterate over the elements and how to access them. The format affects the <code>&lt;opt:section&gt;</code> and <code>&lt;/opt:section&gt;</code> tags.</li>
<li>Section elements - how to access the element variables, like <code>$customers.firstName</code> and <code>$customers.lastName</code>.</li>
</ol>

<p>OPT provides the control over both of the areas. If the section iterates over an object that implements the <code>Iterator</code> interface, but the elements are arrays:</p>

<pre class="php"><span style="color: #000000; font-weight: bold;">class</span> Customers_Rowset implements IteratorAggregate
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_customers</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span>0 <span style="color: #339933;">=&gt;</span>
        <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'firstName'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'John'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'lastName'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Sawyer'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'firstName'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Adam'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'lastName'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Brown'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'firstName'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Jennifer'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'lastName'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Wells'</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getIterator<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> ArrayIterator<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_customers<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// end getIterator();</span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// end Customers_Rowset;</span>
&nbsp;
<span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">customers</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Customers_Rowset<span style="color: #339933;">;</span></pre>

<p>OPT formats implement the decorator pattern and this feature is used in sections. We specify the format for the section and decorate it with the section element format:</p>

<pre class="php"><span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFormat</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'customers'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Objective/Generic'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre>

<blockquote class="information">
  <p>If both sections and their elements are of the same format, we can simply write <code>Objective</code> instead of <code>Objective/Objective</code>.</p>
</blockquote>

<p>Nested sections are supported by specifying the format for each of them separately:</p>

<pre class="xml"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;opt:section</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;categories&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;category&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h3<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>{$categories.title}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h3<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ol<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;opt:section</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;products&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;li<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>{$products.name}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/li<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/opt:section<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ol<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/opt:section<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre>

<p>The PHP code:</p>

<pre class="php"><span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFormat</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'categories'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Objective/SingleArray'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFormat</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'products'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Objective'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre>

<blockquote class="information">
  <p>The top section data are always taken from the variable buffer. Nested section data are treaded as one of the parent section elements, so the data for <code>products</code> will be retrieved using <code>SingleArray</code> format.</p>
</blockquote>

<p>Note that sections do not put any assumptions on the element indexes, data structure type or element order resolving. It is a data format issue and depends on the chosen one. For example, for <code>Array</code> and <code>SingleArray</code> the section elements require element indexes to start with 0 and grow continuously. On the other hand, <code>Objective</code> accepts any kind of element indexes. The details can be found in the data format descriptions. Your templates should never assume that a particular index type is available. For any special uses, consider writing your own data format, which is descriped later.</p>

<h2>Hiding the fact that a variable or section is actually global</h2>

<p>Normally, we use the <code>$global</code> container to access the global variables. However, sometimes we would like to hide this fact, especially when it comes to sections. Since OPT 2.0.1, we can use <code>Opt_View::setFormatGlobal()</code> here:</p>

<pre class="php"><span style="color: #666666; font-style: italic;">// Sets a format for '$global.foo' in all the templates</span>
Opt_View<span style="color: #339933;">::</span><span style="color: #004000;">setFormatGlobal</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Format'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Sets a format for '$foo' in all the templates</span>
Opt_View<span style="color: #339933;">::</span><span style="color: #004000;">setFormatGlobal</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Format'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre>

<h2>Supported feature issue</h2>

<p>Not all of the formats can be used everywhere. Each of them implements a particular set of features. For example, <code>RuntimeGenerator</code> works only with sections and cannot be used for section elements or generic containers.</p>
<dl class="location location-bottom"><dt>4.6. Data formats<br/><a href="guide.html">4. Programmer's Guide</a></dt><dd class="prev"><a href="guide.sections.html">&laquo; Previous</a><br/>4.5. Working with sections</dd><dd class="next"><a href="guide.data-formats.available.html">Next &raquo;</a><br/>4.6.1. Available data formats</dd></dl>		</div>
	
	<div id="footer">
		<p>Copyright &copy; <a href="http://www.invenzzia.org/">Invenzzia Group 2008-2009</a></p>
		<p>Available under the terms of license: <a href="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation License 1.2</a></p>
		<p>Generated by <strong>TypeFriendly 0.1.4</strong> by <a href="http://www.invenzzia.org/">Invenzzia</a></p>
	</div>
</div>

</body>
</html>
Return current item: Open Power Template