<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>nnsoft - PHP</title>
    <link>http://nnsoft.supersized.org/</link>
    <description>Next generatioN software</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.3-alpha1 - http://www.s9y.org/</generator>
    <managingEditor>chnghia@gmail.com</managingEditor>
<webMaster>chnghia@gmail.com</webMaster>

    <image>
        <url>http://nnsoft.supersized.org/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: nnsoft - PHP - Next generatioN software</title>
        <link>http://nnsoft.supersized.org/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>CMS using WACT</title>
    <link>http://nnsoft.supersized.org/archives/35-CMS-using-WACT.html</link>
            <category>PHP</category>
    
    <comments>http://nnsoft.supersized.org/archives/35-CMS-using-WACT.html#comments</comments>
    <wfw:comment>http://nnsoft.supersized.org/wfwcomment.php?cid=35</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://nnsoft.supersized.org/rss.php?version=2.0&amp;type=comments&amp;cid=35</wfw:commentRss>
    

    <author>nospam@example.com (chnghia)</author>
    <content:encoded>
    &lt;p&gt;by Harry Fuecks&lt;/p&gt;&lt;p&gt;Pavel Chtchevaev recently dropped a message into Sitepoint&#039;s Advanced PHP forum, annoucing LIMB, a PHP CMS that uses WACT&#039;s template engine.&lt;/p&gt;&lt;p&gt;WACT is still in evolutionary stage so significant customization was required by LIMBs developers but it&#039;s great to see someone taking advantage of WACT already and turning the results into Open Source. That it&#039;s possible to use some of WACT while ignoring the rest is part of WACT&#039;s design &amp;quot;philosophy&amp;quot;, as collection of components as opposed to a rigid framework.&lt;/p&gt;&lt;p&gt;It&#039;s also interesting to look at some of the template source in LIMBs demo (you need to download the source from SF right now if you want to examine the templates although they were available online until today).&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;(sitepoint.com)&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Thu, 12 Jan 2006 15:23:28 +0100</pubDate>
    <guid isPermaLink="false">http://nnsoft.supersized.org/archives/35-guid.html</guid>
    
</item>
<item>
    <title>LIMB: File path resolving</title>
    <link>http://nnsoft.supersized.org/archives/34-LIMB-File-path-resolving.html</link>
            <category>PHP</category>
    
    <comments>http://nnsoft.supersized.org/archives/34-LIMB-File-path-resolving.html#comments</comments>
    <wfw:comment>http://nnsoft.supersized.org/wfwcomment.php?cid=34</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://nnsoft.supersized.org/rss.php?version=2.0&amp;type=comments&amp;cid=34</wfw:commentRss>
    

    <author>nospam@example.com (chnghia)</author>
    <content:encoded>
    &lt;p&gt;From the very beginning Limb has been developed in mind to manage several projects being a shared instance. Sometimes projects require a bit different behavior the default one. That&#039;s why Limb uses special file path resolving technique.&lt;/p&gt;&lt;p&gt;&lt;i&gt;(limb-project.com)&lt;/i&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 12 Jan 2006 15:10:51 +0100</pubDate>
    <guid isPermaLink="false">http://nnsoft.supersized.org/archives/34-guid.html</guid>
    
</item>
<item>
    <title>LIMB - The basic LIMB principles</title>
    <link>http://nnsoft.supersized.org/archives/29-LIMB-The-basic-LIMB-principles.html</link>
            <category>PHP</category>
    
    <comments>http://nnsoft.supersized.org/archives/29-LIMB-The-basic-LIMB-principles.html#comments</comments>
    <wfw:comment>http://nnsoft.supersized.org/wfwcomment.php?cid=29</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://nnsoft.supersized.org/rss.php?version=2.0&amp;type=comments&amp;cid=29</wfw:commentRss>
    

    <author>nospam@example.com (chnghia)</author>
    <content:encoded>
    
&lt;p&gt;What is site objects?&lt;/p&gt;&lt;p&gt;The central architectural unit of Limb is a &lt;b&gt;site object&lt;/b&gt;. Every single piece of Limb CMS data is a site object, be it a workflow document or just a guest book reply.&lt;/p&gt;&lt;p&gt;All site objects are hierarchicaly organized in the objects tree. You can find it at /root/admin/site_structure page.&lt;/p&gt;&lt;p&gt;The site object is defined with set of different attributes. The most important are:&lt;/p&gt;&lt;p&gt;* node_id: integer, specifies the note in the object tree to which the site object is attached&lt;/p&gt;&lt;p&gt;* id: integer, specifies unique id of the site object&lt;/p&gt;&lt;p&gt;* identifier: string, allow to build a human-readable path to the object in the object tree&lt;/p&gt;&lt;p&gt;* title: string, allow the name every object&lt;/p&gt;&lt;p&gt;Why having &#039;node_id&#039; and &#039;id&#039;? In future this feature will help aliasing site objects. Currently it&#039;s not implemented though and &#039;node_id&#039; is mostly used.&lt;/p&gt;&lt;p&gt;Actually there&#039;re 2 ways of fetching the specific the site object:&lt;/p&gt;&lt;p&gt;* by the full tree path which comprises site objects indentifiers delimetered with /, e.g. /root/catalog/TDD/refactoring&lt;/p&gt;&lt;p&gt;* by the node id, e.g. /root?node_id=92&lt;/p&gt;&lt;p&gt;What is content objects?&lt;/p&gt;&lt;p&gt;There&#039;re two types of site objects:&lt;/p&gt;&lt;p&gt;* simple site object.&lt;/p&gt;&lt;p&gt;* content object.&lt;/p&gt;&lt;p&gt;The main difference of the later is its being under very simple Limb version control, every modification results in a new version. This way we resolve concurrent editing. The basic implementation of the content object ties it with a database record. Most of the content object never require any complex O-R mapping and if any the developer is required to resolve mapping manually.&lt;/p&gt;&lt;p&gt;Here goes the example of the content object:&lt;/p&gt;&lt;pre class=&quot;code php&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kw1&quot;&gt;require_once&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;LIMB_DIR . &lt;span class=&quot;st0&quot;&gt;&#039;core/model/site_objects/content_object.class.php&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt; article extends content_object&lt;br /&gt;&lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;kw2&quot;&gt;function&lt;/span&gt; _define_attributes_definition&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; complex_array :: array_merge&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;    parent :: _define_attributes_definition&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;    array&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;st0&quot;&gt;&#039;content&#039;&lt;/span&gt; =&amp;gt; array&lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;search&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;st0&quot;&gt;&#039;search_weight&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;     &lt;span class=&quot;st0&quot;&gt;&#039;annotation&#039;&lt;/span&gt; =&amp;gt; array&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;search&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;st0&quot;&gt;&#039;search_weight&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;nu0&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;     &lt;span class=&quot;st0&quot;&gt;&#039;author&#039;&lt;/span&gt; =&amp;gt; array&lt;span class=&quot;br0&quot;&gt;&lt;/span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;search&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;st0&quot;&gt;&#039;search_weight&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;nu0&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;     &lt;span class=&quot;st0&quot;&gt;&#039;source&#039;&lt;/span&gt; =&amp;gt; array&lt;span class=&quot;br0&quot;&gt;&lt;/span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;search&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;st0&quot;&gt;&#039;search_weight&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;nu0&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;    &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span class=&quot;kw2&quot;&gt;function&lt;/span&gt; _define_class_properties&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; array&lt;span class=&quot;br0&quot;&gt;&lt;/span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;st0&quot;&gt;&#039;class_ordr&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;,&lt;br /&gt;   &lt;span class=&quot;st0&quot;&gt;&#039;can_be_parent&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;,&lt;br /&gt;   &lt;span class=&quot;st0&quot;&gt;&#039;icon&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/shared/generic.gif&#039;&lt;/span&gt;,&lt;br /&gt;  &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kw2&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p /&gt;&lt;p&gt;What is site object controller?&lt;/p&gt;&lt;p&gt;Every site object linked with some controller, it defines what kind of actions the site object has. Since Limb 2.3+ it&#039;s possible to assign different controllers to site objects of some class.&lt;/p&gt;&lt;p&gt;Here is the example of site object controller:&lt;/p&gt;&lt;p /&gt;&lt;pre class=&quot;code php&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kw1&quot;&gt;require_once&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;LIMB_DIR . &lt;span class=&quot;st0&quot;&gt;&#039;core/controllers/site_object_controller.class.php&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;span class=&quot;kw1&quot;&gt;require_once&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;LIMB_DIR . &lt;span class=&quot;st0&quot;&gt;&#039;core/lib/locale/strings.class.php&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;&lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt; article_controller extends site_object_controller&lt;br /&gt;&lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;kw2&quot;&gt;function&lt;/span&gt; _define_actions&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; array&lt;span class=&quot;br0&quot;&gt;&lt;/span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;st0&quot;&gt;&#039;display&#039;&lt;/span&gt; =&amp;gt; array&lt;span class=&quot;br0&quot;&gt;&lt;/span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;br0&quot;&gt;&lt;/span&gt;&lt;span class=&quot;kw3&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;template_path&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/article/display.html&#039;&lt;/span&gt;,&lt;br /&gt;    &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;    &lt;span class=&quot;st0&quot;&gt;&#039;admin_detail&#039;&lt;/span&gt; =&amp;gt; array&lt;span class=&quot;br0&quot;&gt;&lt;/span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;br0&quot;&gt;&lt;/span&gt;&lt;span class=&quot;kw3&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;template_path&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/admin/object_detail_info.html&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;popup&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;JIP&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;img_src&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/shared/images/admin_detail.gif&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;action_name&#039;&lt;/span&gt; =&amp;gt; strings :: &lt;span class=&quot;me2&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;detail_info&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;    &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;    &lt;span class=&quot;st0&quot;&gt;&#039;print_version&#039;&lt;/span&gt; =&amp;gt; array&lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;template_path&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/article/print_version.html&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;action_name&#039;&lt;/span&gt; =&amp;gt; strings :: &lt;span class=&quot;me2&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;print_version_action&#039;&lt;/span&gt;, &lt;span class=&quot;st0&quot;&gt;&#039;document&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;display_in_breadcrumbs&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;false&lt;/span&gt;,&lt;br /&gt;    &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;    &lt;span class=&quot;st0&quot;&gt;&#039;edit&#039;&lt;/span&gt; =&amp;gt; array&lt;span class=&quot;br0&quot;&gt;&lt;/span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;popup&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;JIP&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;action_name&#039;&lt;/span&gt; =&amp;gt; strings :: &lt;span class=&quot;me2&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;edit_article&#039;&lt;/span&gt;, &lt;span class=&quot;st0&quot;&gt;&#039;article&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;action_path&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/article/edit_article_action&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;template_path&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/article/edit.html&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;img_src&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/shared/images/edit.gif&#039;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;    &lt;span class=&quot;st0&quot;&gt;&#039;publish&#039;&lt;/span&gt; =&amp;gt; array&lt;span class=&quot;br0&quot;&gt;&lt;/span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;popup&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;JIP&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;action_name&#039;&lt;/span&gt; =&amp;gt; strings :: &lt;span class=&quot;me2&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;publish&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;action_path&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/doc_flow_object/set_publish_status_action&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;img_src&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/shared/images/publish.gif&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;can_have_access_template&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;,&lt;br /&gt;    &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;    &lt;span class=&quot;st0&quot;&gt;&#039;unpublish&#039;&lt;/span&gt; =&amp;gt; array&lt;span class=&quot;br0&quot;&gt;&lt;/span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;popup&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;JIP&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;action_name&#039;&lt;/span&gt; =&amp;gt; strings :: &lt;span class=&quot;me2&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;unpublish&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;action_path&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/doc_flow_object/set_publish_status_action&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;img_src&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/shared/images/unpublish.gif&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;can_have_access_template&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;,&lt;br /&gt;    &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;    &lt;span class=&quot;st0&quot;&gt;&#039;delete&#039;&lt;/span&gt; =&amp;gt; array&lt;span class=&quot;br0&quot;&gt;&lt;/span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;JIP&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;popup&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;action_name&#039;&lt;/span&gt; =&amp;gt; strings :: &lt;span class=&quot;me2&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;delete_article&#039;&lt;/span&gt;, &lt;span class=&quot;st0&quot;&gt;&#039;article&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;action_path&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/article/delete_article_action&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;template_path&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/site_object/delete.html&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;img_src&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/shared/images/rem.gif&#039;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;  &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kw2&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;What is action?&lt;/p&gt;&lt;p&gt;The action is ... action can be whatever you want! There&#039;re few base actions that ease the developers life though.&lt;/p&gt;&lt;p&gt;The action is transferred via &#039;action&#039; attribute of the $_REQUEST, so&lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;http://somedomain.com/root?&amp;amp;action=edit&amp;amp;node_id=83&lt;/pre&gt;&lt;p /&gt;&lt;p /&gt;&lt;p&gt;will require the site object with node id 83 to perform &#039;edit&#039; action&lt;/p&gt;&lt;p&gt;&lt;i&gt;If we had the object with node id 83 placed in /root/documents and it had &#039;article1&#039; identifier, the request below would mean the same:&lt;/i&gt;&lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;http://somedomain.com/root/documents/article1?action=edit&lt;/pre&gt;&lt;p /&gt;&lt;p /&gt;&lt;p&gt;Let&#039;s examine the &#039;edit&#039; section of the article controller. Well first of all we have &#039;action_path&#039; set to /article/edit_article_action&#039;, the controller is going to fire &#039;edit_article_action&#039; (the path to the class is found with file path resolving technique)&lt;/p&gt;&lt;pre class=&quot;code php&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kw1&quot;&gt;require_once&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;LIMB_DIR . &lt;span class=&quot;st0&quot;&gt;&#039;core/actions/form_edit_site_object_action.class.php&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt; edit_article_action extends form_edit_site_object_action&lt;br /&gt;&lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;kw2&quot;&gt;function&lt;/span&gt; _define_site_object_class_name&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&#039;article&#039;&lt;/span&gt;;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span class=&quot;kw2&quot;&gt;function&lt;/span&gt; _define_dataspace_name&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&#039;article_form&#039;&lt;/span&gt;;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span class=&quot;kw2&quot;&gt;function&lt;/span&gt; _define_datamap&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; complex_array :: array_merge&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;    parent :: _define_datamap&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;     array&lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;article_content&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;content&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;annotation&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;annotation&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;author&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;author&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;source&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;source&#039;&lt;/span&gt;,&lt;br /&gt;      &lt;span class=&quot;st0&quot;&gt;&#039;uri&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;uri&#039;&lt;/span&gt;,&lt;br /&gt;     &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span class=&quot;kw2&quot;&gt;function&lt;/span&gt; _init_validator&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  parent :: _init_validator&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;  &lt;span class=&quot;re0&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class=&quot;me1&quot;&gt;validator&lt;/span&gt;-&amp;gt;&lt;span class=&quot;me1&quot;&gt;add_rule&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; required_rule&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;title&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;  &lt;span class=&quot;re0&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class=&quot;me1&quot;&gt;validator&lt;/span&gt;-&amp;gt;&lt;span class=&quot;me1&quot;&gt;add_rule&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; required_rule&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;author&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;  &lt;span class=&quot;re0&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class=&quot;me1&quot;&gt;validator&lt;/span&gt;-&amp;gt;&lt;span class=&quot;me1&quot;&gt;add_rule&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; required_rule&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;article_content&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt; &lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;p /&gt;&lt;p&gt;Simple, isn&#039;t it?&lt;/p&gt;&lt;p&gt;What about action template?&lt;/p&gt;&lt;p&gt;Also in the &#039;edit&#039; action of the article controller we have optional attribute &#039;template_path&#039; set to &#039;/article/edit.html&#039;, the controller is going to initialize WACT template and pass it to action. This template might look as follows:&lt;/p&gt;&lt;pre class=&quot;code xml&quot;&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;core&lt;/span&gt;:WRAP &lt;span class=&quot;re0&quot;&gt;file&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;popup.html&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;placeholder&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;form&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;method&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;post&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;article_form&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;article_form&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;table&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;width&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;100&lt;/span&gt;% &lt;span class=&quot;re0&quot;&gt;border&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;cellspacing&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;cellpadding&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;height&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;100&lt;/span&gt;%&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;colspan&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=table-title&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;locale&lt;/span&gt;:STRING &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;article_edition&#039;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;file&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;article&#039;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;  &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;h3&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &amp;quot;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;fetch&lt;/span&gt;:MAPPED&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;{$title}&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/fetch&lt;/span&gt;:MAPPED&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&amp;quot; &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/h3&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;colspan&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;height&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;100&lt;/span&gt;% &lt;span class=&quot;re0&quot;&gt;valign&lt;/span&gt;=top &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=com4&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;table&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;width&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;100%&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;border&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;cellspacing&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;cellpadding&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;re0&quot;&gt;style&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;padding:5px 10px 1px 5px;&#039;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;id&lt;/span&gt;=param_req_content&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;col&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;align&lt;/span&gt;=right &lt;span class=&quot;re0&quot;&gt;width&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;200&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=labels&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;          &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;label&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;for&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;identifier&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;req&#039;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;*&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/span&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&lt;br /&gt;          &amp;lt;locale&lt;/span&gt;:STRING &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;identifier&#039;&lt;/span&gt; &lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/label&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;identifier&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;identifier&amp;quot;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;re0&quot;&gt;label&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;Identifier&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;input&#039;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;label&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;for&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;req&#039;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;*&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/span&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&lt;br /&gt;          &amp;lt;locale&lt;/span&gt;:STRING &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;title&#039;&lt;/span&gt; &lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/label&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;title&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;title&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;&lt;br /&gt;          label&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;Title&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;input&#039;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;size&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;40&#039;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;label&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;for&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;annotation&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;locale&lt;/span&gt;:STRING &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;annotation&#039;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/label&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;textarea&#039;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;annotation&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;annotation&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;&lt;br /&gt;               label&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;Annotation&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;cols&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;40&#039;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;rows&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;5&#039;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/textarea&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;label&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;for&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;author&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=req&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;*&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/span&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&lt;br /&gt;          &amp;lt;locale&lt;/span&gt;:STRING &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;author&#039;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;file&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;article&#039;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/label&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;author&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;author&amp;quot;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;re0&quot;&gt;label&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;Author&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;size&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;60&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;input&#039;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;label&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;for&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;source&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;locale&lt;/span&gt;:STRING&lt;br /&gt;          &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;source&#039;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;file&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;article&#039;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/label&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;source&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;source&amp;quot;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;re0&quot;&gt;label&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;Source&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;size&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;60&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;input&#039;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;label&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;for&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;uri&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;locale&lt;/span&gt;:STRING &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;uri&#039;&lt;/span&gt; &lt;br /&gt;          &lt;span class=&quot;re0&quot;&gt;file&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;article&#039;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/label&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;uri&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;uri&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;label&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;URL&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;&lt;br /&gt;          size&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;60&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;input&#039;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/table&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;td&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;colspan&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;align&lt;/span&gt;=center &lt;span class=&quot;re0&quot;&gt;height&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;action&lt;/span&gt;_button &lt;span class=&quot;re0&quot;&gt;action&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;edit&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;update&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;submit&amp;quot;&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;re0&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;update&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;update&amp;quot;&lt;/span&gt; reload_&lt;span class=&quot;re0&quot;&gt;parent&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;sc1&quot;&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;cancel&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;cancel&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;close&amp;quot;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;re0&quot;&gt;onclick&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&#039;window.close();&#039;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/td&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/tr&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/table&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/form&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p /&gt;&lt;p&gt;Every action has its View in the $_view attribute (rarely used though, our templates have active behaviour).&lt;/p&gt;&lt;p&gt;Extra stuff&lt;/p&gt;&lt;p&gt;Site objects passed around as arrays in the Limb, turning into objects only when it&#039;s needed. This allows to decrease unnecessary overhead greatly. Furthermore, they&#039;ve transfered to WACT templates as array datasets which allows to use all the nice features of WACT.&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;(limb-project.com)&lt;/i&gt;&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Fri, 23 Dec 2005 10:55:27 +0100</pubDate>
    <guid isPermaLink="false">http://nnsoft.supersized.org/archives/29-guid.html</guid>
    
</item>
<item>
    <title>Design Patterns in PHP - Factory Method and Abstract Factory</title>
    <link>http://nnsoft.supersized.org/archives/26-Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory.html</link>
            <category>PHP</category>
    
    <comments>http://nnsoft.supersized.org/archives/26-Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory.html#comments</comments>
    <wfw:comment>http://nnsoft.supersized.org/wfwcomment.php?cid=26</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://nnsoft.supersized.org/rss.php?version=2.0&amp;type=comments&amp;cid=26</wfw:commentRss>
    

    <author>nospam@example.com (chnghia)</author>
    <content:encoded>
    
&lt;p&gt;by David Fells&lt;/p&gt;&lt;p&gt;Normally, in object oriented programming, object creation is not difficult. But what if your object needs to be created based on different conditions or other matters of context? Then you will spend hours in debugging and updating --unless you know about design patterns. David Fells explains how they work, and uses the creation of a maze to illustrate his points.&lt;/p&gt;&lt;p&gt;Overview&lt;/p&gt;&lt;p&gt;In object oriented programming, object creation - also known as instantiation - is an implied requirement. Object must at some point be created for use. Obviously, creating objects is not difficult task and most languages, PHP included, have simple and intuitive syntax for doing so.&lt;/p&gt;&lt;p&gt;When developing larger, more complex systems though, object creation can become difficult. There are situations where different objects may need to be created based on different conditions or based on the context of the object creating it. Creating objects of concrete type explicitly in code can make these situations a nightmare when it comes time to make revisions and additions. When a new class is introduced, you get to follow a trail of code and commence the hours of debugging that will inevitably follow such an endeavor. This is where design patterns come in.&lt;/p&gt;&lt;p&gt;This article will discuss the usage of Factory Method [DP107] and Abstract Factory [DP87] as they pertain to developing applications in PHP using object oriented programming techniques.&lt;/p&gt;&lt;p&gt;The first pattern used to simplify object instantiation is the Factory Method pattern. The Factory Method pattern defines an interface for object creation but defers the actual instantiation to subclasses. Take, for example, an application that processes Electronic Funds Transfers (ETFs). There are numerously type of ETFs including virtual check, credit card, wire transfer and so on. Using a non-pattern based approach, the application code requesting an ETF object would need to know precisely what subclass of ETF is needed, and it would need to know the context in which that type of ETF is requested. We would end up with code looking something like this:&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;txt&quot;&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;switch ($etfType) {&lt;br /&gt;  case ETF_VIRTUALCHECK : &lt;br /&gt;    $etf = new VirtualCheck(); &lt;br /&gt;  $etf-&amp;gt;processCheck();&lt;br /&gt;  break;&lt;br /&gt;  case ETF_CREDITCARD :&lt;br /&gt;    $etf = new CreditCard();&lt;br /&gt;  $etf-&amp;gt;chargeCard();&lt;br /&gt;  break;&lt;br /&gt;  case ETF_WIRETRANSFER :&lt;br /&gt;    $etf = new WireTransfer();&lt;br /&gt;  $etf-&amp;gt;chargeCard();&lt;br /&gt;  break;&lt;br /&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Any time we want to add another ETF, we would have to manually update this switch statement anywhere it appeared. We would also have to update any other conditional code that appears. The CreditCard class hinted at above offers the same problem as the ETF itself in that each credit card type (VISA, MasterCard, AMEX) has its own validation scheme and many types have different numerical formats. We would see a similar switch statement to determine what type of credit card we were dealing with either in the CreditCard class constructor or in the switch statement above creates the CreditCard object.&lt;/p&gt;&lt;p&gt;By implementing the Factory Method, we code our application so it only expects a class that conforms to an interface - that is, it has certain methods and properties that can be uses to submit an ETF and check whether it failed or succeeded. This promote loose coupling in the application because you are not binding a concrete subclass to application code. The result is a great increase in flexibility and maintainablility. It is easy to add new ETF subclasses and implement them because you are not hard coding the application to expect a specific subclass, just a class with a specific interface. Look at this example.&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;txt&quot;&gt;&lt;blockquote dir=&quot;ltr&quot; style=&quot;margin-right: 0px;&quot;&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class ETF {&lt;br /&gt;  var $data;&lt;br /&gt;  function ETF($data) {&lt;br /&gt;    $this-&amp;gt;data = $data;&lt;br /&gt;  }&lt;br /&gt;  function process() {}&lt;br /&gt;  function getResult() {}&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class VirtualCheck extends ETF {}&lt;br /&gt;class WireTransfer extends ETF {}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class ETFFactory {&lt;br /&gt;  function createETF($data) {&lt;br /&gt;      switch ($data[&#039;etfType&#039;]) {&lt;br /&gt;      case ETF_VIRTUALCHECK : &lt;br /&gt;        return new VirtualCheck($data);;&lt;br /&gt;      case ETF_WIRETRANSFER :&lt;br /&gt;        return new WireTransfer($data);&lt;br /&gt;      default :&lt;br /&gt;        return new ETF($data);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;$data = $_POST;&lt;br /&gt;$etf = ETFFactory::createETF($data);&lt;br /&gt;$etf-&amp;gt;process();&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This is a crude implementation but the intent should be clear. Assume the contents of $_POST represent everything you need for the type of ETF that is happening, including a &#039;etfType&#039; that says what sort of ETF you are using. This would come from the user making a selection in a form and filling out the correct information. This implementation provides numerous advantages over the first.&lt;/p&gt;&lt;p&gt;1. Data validation can be left entirely to the subclasses and occur without interaction from calling code.&lt;/p&gt;&lt;p&gt;2. Calling code only needs to know of one way to get an ETF object.&lt;/p&gt;&lt;p&gt;3. Creation logic is encapsulated - the ETFFactory decides what concrete class to create based on the contents of $data[&#039;etfType&#039;]. Calling application code knows nothing of concrete subclasses of ETF.&lt;/p&gt;&lt;p&gt;4. If special measures need to be taken, such as creating a specific type of credit card object, this can take place in one location without the calling application code being involved.&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;txt&quot;&gt;Using this approach consolidates creation logic in a
single class - ETFFactory. This eliminates duplication in code when an
object is created in multiple locations. With the first method, if a
class name is changed or a new ETF class is added, we have to modify
the ETF creation code everywhere it appears in our application. With
the Factory Method implementation, this is not the case. Our calling
application code knows of only ETFFactory and ETF. Subclasses of ETF
provide the required specialized behaviors to process themselves in the
appropriate way but the calling code needs only to use the process()
method.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;txt&quot;&gt;&lt;p&gt;The Abstract Factory pattern provides an &lt;a class=&quot;iAs&quot; style=&quot;border-bottom: 0.075em solid blue; text-decoration: underline; color: blue; padding-bottom: 1px; background-color: transparent;&quot; href=&quot;http://www.devshed.com/#&quot; target=&quot;_blank&quot;&gt;&lt;/a&gt;interface for creating families of related or dependent objects without
specifying their concrete classes [DP87]. This pattern takes the
abstraction displayed in the example above to the next level by
providing a common factory interface for a given family of objects. The
code that actually uses the factory to create objects only expects an object
that conforms to the interface of the abstract factory and does not
know any details about concrete factory classes.&lt;/p&gt;&lt;p&gt;Using the
example from Design Patterns, consider a game that creates a maze. We
have a method that knows what to do to create a maze and it will
instantiate all the objects we need to construct the maze - components
such as rooms, doors and walls. The example below defines the classes
involved - method code is left out deliberately since it is not
important to this discussion.&lt;/p&gt;&lt;blockquote style=&quot;margin-right: 0px;&quot; dir=&quot;ltr&quot;&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class MapSite {&lt;br /&gt;  function enter() {}&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;define(&#039;North&#039;, 0);&lt;br /&gt;define(&#039;East&#039;, 1);&lt;br /&gt;define(&#039;South&#039;, 2);&lt;br /&gt;define(&#039;West&#039;, 3);&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class Room extends MapSite { &lt;br /&gt;  var $mapSite = array&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;/span&gt;&lt;a class=&quot;iAs&quot; style=&quot;border-bottom: 0.075em solid blue; text-decoration: underline; color: blue; padding-bottom: 1px; background-color: transparent;&quot; href=&quot;http://www.devshed.com/#&quot; target=&quot;_blank&quot;&gt;&lt;/a&gt;();&lt;br /&gt;  var $roomNumber;&lt;br /&gt;  &lt;br /&gt;  function Room($roomNumber) {}&lt;br /&gt;  function getSide($direction) {}&lt;br /&gt;  function setSide($direction, $mapSite) {}&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class Wall extends MapSite {&lt;br /&gt;  function Wall() {}&lt;br /&gt;  function enter() {}&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class Door extends MapSite {&lt;br /&gt;  var $room1;&lt;br /&gt;  var $room2;&lt;br /&gt;  var $isOpen;&lt;br /&gt;  &lt;br /&gt;  function Door() {}&lt;br /&gt;  function enter() {}&lt;br /&gt;  function otherSideFrom($room);&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class Maze {&lt;br /&gt;  function Maze() {}&lt;br /&gt;  function addRoom($room) {}&lt;br /&gt;  // Etc&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class MazeGame {&lt;br /&gt;  function createMaze() {&lt;br /&gt;    $aMaze = new Maze();&lt;br /&gt;    $room1 = new Room(1);&lt;br /&gt;    $room2 = new Room(2);&lt;br /&gt;    $aDoor = new Door($room1, $room2);&lt;br /&gt;    &lt;br /&gt;    $room1-&amp;gt;setSide(North, new Wall());&lt;br /&gt;    $room1-&amp;gt;setSide(East, $aDoor);&lt;br /&gt;    $room1-&amp;gt;setSide(South, new Wall());&lt;br /&gt;    $room1-&amp;gt;setSide(West, new Wall());            &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;    $room2-&amp;gt;setSide(North, new Wall());&lt;br /&gt;    $room2-&amp;gt;setSide(East, new Wall());&lt;br /&gt;    $room2-&amp;gt;setSide(South, new Wall());&lt;br /&gt;    $room2-&amp;gt;setSide(West, $aDoor);                &lt;br /&gt;    &lt;br /&gt;    $aMaze-&amp;gt;addRoom($room1);&lt;br /&gt;    $aMaze-&amp;gt;addRoom($room2);&lt;br /&gt;  }&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;In
this example, we define a MapSite class that will act as a base class
for anything that could apear in a maze, such as a door, a room, or a
wall. We then define the constants North, East, South, and West to be
used for tracking the sides or orientation of these MapSite objects.
Following the constant definitions are the definitions for the Wall,
Room and Door classes. These objects should be obvious in intent. &lt;/p&gt;&lt;p&gt;The
setSide() method of the Room class expects the direction of the side
and the object to be placed there - any object derived of the class
MapSite. This would typically be a Wall or a Door, but it could support
more objects easily. The constructor of the Door class expects two Room
objects - the door must be aware of the rooms it is connecting. Next we
define the Maze class, which is used to represent our actual maze
object in code. We use the addRoom() method to attach rooms to the
maze. &lt;/p&gt;&lt;p&gt;Finally, we look at the MazeGame class and its
createMaze() method. The createMaze() method creates a maze object, two
rooms and a door, then defines what objects occupy the sides of the two
rooms and attaches them to our Maze object. At this point, we have
successfully created a Maze and put some rooms into it.&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;txt&quot;&gt;&lt;p&gt;Now that you understand the example case, we need
to talk about the drawbacks with the implementation used in this
example. The main roadblock with using this implementation is that the
MazeGame object is hard coded to create specific classes of objects -
that is, it creates Maze, Wall, Door and Room directly without use of
any factory methods. We can improve this design by refactoring our
createMaze method to use a MazeFactory object for object instantiation.
Here is an example.&lt;/p&gt;&lt;blockquote dir=&quot;ltr&quot; style=&quot;margin-right: 0px;&quot;&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class MazeFactory {&lt;br /&gt;  function MazeFactory() {}&lt;br /&gt;  function createMaze() { return new Maze(); }&lt;br /&gt;  function createRoom($roomNumber) { return new Room($roomNumber); }&lt;br /&gt;  function createDoor($room1, $room2) { return new Door($room1, $room2); }&lt;br /&gt;  function createWall() { return new Wall(); }&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class MazeGame {&lt;br /&gt;  function createMaze() {&lt;br /&gt;    $factory = new MazeFactory();&lt;br /&gt;    $aMaze = $factory-&amp;gt;makeMaze();&lt;br /&gt;    $room1 = $factory-&amp;gt;makeRoom(1);&lt;br /&gt;    $room2 = $factory-&amp;gt;makeRoom(2);&lt;br /&gt;    $aDoor = $factory-&amp;gt;makeDoor($room1, $room2);&lt;br /&gt;    &lt;br /&gt;    $room1-&amp;gt;setSide(North, $factory-&amp;gt;makeWall());&lt;br /&gt;    $room1-&amp;gt;setSide(East, $aDoor);&lt;br /&gt;    $room1-&amp;gt;setSide(South, $factory-&amp;gt;makeWall());&lt;br /&gt;    $room1-&amp;gt;setSide(West, $factory-&amp;gt;makeWall());            &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;    $room2-&amp;gt;setSide(North, $factory-&amp;gt;makeWall());&lt;br /&gt;    $room2-&amp;gt;setSide(East, $factory-&amp;gt;makeWall());&lt;br /&gt;    $room2-&amp;gt;setSide(South, $factory-&amp;gt;makeWall());&lt;br /&gt;    $room2-&amp;gt;setSide(West, $aDoor);                          &lt;br /&gt;    &lt;br /&gt;    $aMaze-&amp;gt;addRoom($room1);&lt;br /&gt;    $aMaze-&amp;gt;addRoom($room2);&lt;br /&gt;  }&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This
method is significantly better because it moves creational knowledge
out of the createMaze() method and into the MazeFactory class. This
will work fine if we only want to use one family of Maze objects, but
what if we want to create subclasses of Wall, Door and Room to allow
different behaviors? The examples given in Design Patterns use
enchanted rooms and rooms with bombs as examples. &lt;/p&gt;&lt;p&gt;An enchanted
room could have special behaviors, such as requiring conditions to be
met before a door could be opened or closed. A room with a bomb would
know what conditions caused a bomb to detonate and would track whether
or not the bomb had gone off. If the bomb had gone off, it would keep
up with damage to walls from the bomb. If we wanted to use these
classes, we would have to parameterize our factory object to check some
sort of input condition to know which family of objects to create.&lt;/p&gt;&lt;p&gt;This
is where the Abstract Factory pattern comes in. This pattern uses the
Factory Method pattern to handle actual object instantiation, but the
value of the Abstract Factory pattern comes at a higher level. We code &lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;/span&gt;our calling code not only to use factory methods for object creation but to expect a factory object that conforms to a certain interface.
This means that we can use different factories - all based on a single
abstract factory interface - to create different families of objects.
Calling code would only need to expect a class that derives from the
original MazeFactory class.&lt;/p&gt;&lt;p&gt;For brevity&#039;s sake we will not type
out the code to define the subclasses of Room, Wall, and Door, but we
will define the subclasses of the MazeFactory object that are used to
create enchanted mazes and mazes with bombs in them.&lt;/p&gt;&lt;blockquote dir=&quot;ltr&quot; style=&quot;margin-right: 0px;&quot;&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class EnchantedMazeFactory extends MazeFactory {&lt;br /&gt;  function makeRoom($roomNumber) { return new EnchantedRoom($roomNumber); }&lt;br /&gt;  function makeDoor($room1, $room2) { return new EnchantedDoor($room1, $room2); }&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class BombedMazeFactory extends MazeFactory {&lt;br /&gt;  function makeRoom($roomNumber) { return new RoomWithABomb($roomNumber); }&lt;br /&gt;  function makeWall() { return new BombedWall(); }&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;We
can now use different concrete factory classes to create different
families of products - in this case, different types of Doors, Walls,
and Rooms. We are now left with one last problem - createMaze(), at
last glance, is hard coded to create a MazeFactory object. Since
createMaze() only needs to create the objects themselves through a
standard factory interface, there is no need for the method to ever
actually create the factory. We should pass the factory in as an
argument to createMaze() and then let the method do its work.&lt;/p&gt;&lt;blockquote dir=&quot;ltr&quot; style=&quot;margin-right: 0px;&quot;&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;class MazeGame {&lt;br /&gt;  function createMaze($factory) {&lt;br /&gt;    $aMaze = $factory-&amp;gt;makeMaze();&lt;br /&gt;    $room1 = $factory-&amp;gt;makeRoom(1);&lt;br /&gt;    $room2 = $factory-&amp;gt;makeRoom(2);&lt;br /&gt;    $aDoor = $factory-&amp;gt;makeDoor($room1, $room2);&lt;br /&gt;    &lt;br /&gt;    $room1-&amp;gt;setSide(North, $factory-&amp;gt;makeWall());&lt;br /&gt;    $room1-&amp;gt;setSide(East, $aDoor);&lt;br /&gt;    $room1-&amp;gt;setSide(South, $factory-&amp;gt;makeWall());&lt;br /&gt;    $room1-&amp;gt;setSide(West, $factory-&amp;gt;makeWall());            &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;    $room2-&amp;gt;setSide(North, $factory-&amp;gt;makeWall());&lt;br /&gt;    $room2-&amp;gt;setSide(East, $factory-&amp;gt;makeWall());&lt;br /&gt;    $room2-&amp;gt;setSide(South, $factory-&amp;gt;makeWall());&lt;br /&gt;    $room2-&amp;gt;setSide(West, $aDoor);                &lt;br /&gt;    &lt;br /&gt;    $aMaze-&amp;gt;addRoom($room1);&lt;br /&gt;    $aMaze-&amp;gt;addRoom($room2);&lt;br /&gt;  }&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Now
in our createMaze() method, no assumptions are made about the type of
factory we need. Some other code that is responsible for figuring out
what type of factory to create would actually instantiate the
MazeFactory and pass it to createMaze(), as in the following example.&lt;/p&gt;&lt;blockquote dir=&quot;ltr&quot; style=&quot;margin-right: 0px;&quot;&gt;&lt;p&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;$game = new MazeGame();&lt;br /&gt;$game-&amp;gt;createMaze(new EnchantedMazeFactory());&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;After
all is said and done, we have created (with a little help from Design
Patterns) a very flexible set of classes for producing mazes. It should
be noted that in an actual implementation, createMaze() would be using data
of some kind to determine what components are required in the maze and
the method calls on the various MapSite objects would not be hard coded
as they are in the example.&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;txt&quot;&gt;&lt;p&gt;The Factory Method and Abstract Factory patterns
allow us to build a great deal of flexibility into our applications by
abstracting the process of object instantiation and by helping
consolidate creational knowledge in the appropriate classes. The
Factory Method pattern teaches us how to use methods for object
creation rather than directly instantiating objects through client
code. This lets the factory method itself do any work it needs to do in
creating the object - work that could involve contextual considerations
or initializing certain resources in the object. The Abstract Factory
class teaches us how to create groups of related objects with a common
interface, creating client code that expects neither a specific type of
object nor a specific type of factory.&lt;/p&gt;&lt;p&gt;One of the most important
concepts in good object oriented design is &amp;quot;design to an interface, not
an implementation.&amp;quot; What this means is that you should code your
application to expect standard sets of object behaviors but not to
expect specific object types. This results in a system of objects that
know as little as possible about one another and, so long as the
interfaces to these classes do not change, the internals of the classes
can vary without adversely affecting other classes in the system.&lt;/p&gt;&lt;p&gt;In
the final createMaze() example above, we see this in action on two
levels. First, we pass any MazeFactory type object to the method, which
is used to instantiate various MapSite objects and load them into a
Maze. Second we are working with the Maze and MapSite objects without
worrying about their specific class, just their interface - we know a
Room needs a room number when we create it and we know we can enter a
room. It does not matter to the client code that the room may be an
EnchantedRoom or a RoomWithABomb - all it needs to know is how to
create it and how to use it. This is the very definition of programming
to an interface. The opposite case is true with the first maze example
where createMaze() directly creates specific Room, Door, and Wall
objects.&lt;/p&gt;&lt;p&gt;The use of these two patterns is a good starting point
for programmers just beginning to learn about patterns and good object
oriented design. This is the first in what will be a series of articles
on design patterns with PHP examples and is intended for developers who
are somewhat new to design patterns. Thanks for reading and please
don&#039;t forget to leave some feedback in the comments section!&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;txt&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;txt&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p /&gt;&lt;p&gt;&lt;span class=&quot;txt&quot;&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;txt&quot;&gt;&lt;font face=&quot;courier new, courier, mono&quot;&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;(www.devshed.com)&lt;/i&gt;&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Thu, 22 Dec 2005 10:22:51 +0100</pubDate>
    <guid isPermaLink="false">http://nnsoft.supersized.org/archives/26-guid.html</guid>
    
</item>
<item>
    <title>LIMB - Access policy basics</title>
    <link>http://nnsoft.supersized.org/archives/22-LIMB-Access-policy-basics.html</link>
            <category>PHP</category>
    
    <comments>http://nnsoft.supersized.org/archives/22-LIMB-Access-policy-basics.html#comments</comments>
    <wfw:comment>http://nnsoft.supersized.org/wfwcomment.php?cid=22</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://nnsoft.supersized.org/rss.php?version=2.0&amp;type=comments&amp;cid=22</wfw:commentRss>
    

    <author>nospam@example.com (chnghia)</author>
    <content:encoded>
    
&lt;p&gt;Limb 2.x has 2 tier permission system&lt;/p&gt;&lt;p&gt;Object access: The access system determines the user&#039;s permissions for the requested object: read, write or both.&lt;/p&gt;&lt;p&gt;Actions access: The access system determines whether the user is allowed to perform the requested action over the object.&lt;/p&gt;&lt;p&gt;These steps are sequent and tightly connected. An action requires a set of ObjectPermission to be accessible by user. So it&#039;s not enough for a user to have an ActionAccess only - the user must have specify permissions for the requested object too. Sounds a bit complicated, a good example should make everything clear hopefully.&lt;/p&gt;&lt;p&gt;Limb uses only resolving (postive) access records. So user accumulates permissions from all the groups he participates in with his own permissions. Currently there is no way to restrict any user to have access to some object if any group that user participates in has access to that object.&lt;/p&gt;&lt;p&gt;Object access&lt;/p&gt;&lt;p&gt;In Limb 2.3 we have simplified our access policy a log. We have removed read and write permissions separation. Now user can just have access to an object or not. If user doesn&#039;t have permission to get access to an object then in most cases the user is not aware of the object existence at all. The only possible way to see such objects is to directly use site_object::fetch() method.&lt;/p&gt;&lt;p&gt;You can browse and set user permissions (group based) for objects at with Limb GUI using /root/admin/objects_access page.&lt;/p&gt;&lt;p&gt;Actions access&lt;/p&gt;&lt;p&gt;Action is a set of some operations. Defined in the site object controller actions may apply to the site or ... perform whatever you need. To perform an action the user must have a permission to execute it.&lt;/p&gt;&lt;p&gt;Limb provides a GUI to control action access at /root/admin/controllers (/root/admin/classes in Limb 2.2.x) page. The administrator sets what actions are accessible by user groups. As mentioned above Limb doesn&#039;t has a GUI to set actions permissions for individual users. We have not faced any case that required such functionality in our practice so far, yet it&#039;s not a problem to implement one.&lt;/p&gt;&lt;p&gt;Each action requires the certain set of object access permissions described in the site object controller. Lets look into one small example to make everything clear:&lt;/p&gt;&lt;p&gt;Small example&lt;/p&gt; &lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
 Suppose we have some article_controller. It supports only 2 actions: display and delete:
&lt;/p&gt;
&lt;pre class=&quot;code php&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt; article_controller extends site_object_controller&lt;br /&gt;&lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kw2&quot;&gt;function&lt;/span&gt; _define_actions&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt;  &lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;st0&quot;&gt;&#039;display&#039;&lt;/span&gt; =&amp;gt; &lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;           &lt;span class=&quot;br0&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;[&lt;/span&gt;...&lt;span class=&quot;br0&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;]&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;          &lt;span class=&quot;st0&quot;&gt;&#039;delete&#039;&lt;/span&gt; =&amp;gt; &lt;a target=&quot;_blank&quot; href=&quot;http://www.php.net/array&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;           &lt;span class=&quot;br0&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;[&lt;/span&gt;...&lt;span class=&quot;br0&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;]&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;        &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;        &lt;br /&gt;        parent :: &lt;span class=&quot;me2&quot;&gt;site_object_controller&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;    &lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
Ok, lets imagine we have 3 article objects in out system: article1, article2 and article3. 
&lt;/p&gt;

&lt;p&gt;
Our user is a member of 2 groups: visitors and admins.
&lt;/p&gt;

&lt;p&gt;
Objects permissions that user groups have for objects are:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;            article1   article2   article3&lt;br /&gt;visitors               ok         ok &lt;br /&gt;admins      ok         ok          &lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;
And user groups actions access as follows:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;            display        delete&lt;br /&gt;visitors    true           false&lt;br /&gt;admins      true           true&lt;/pre&gt;

&lt;p&gt;
It means that our user is allowed to display all articles (since the
user is a member of visitors and admin groups), can delete all
articles. &lt;/p&gt;

&lt;/div&gt;&lt;div class=&quot;level3&quot;&gt;&lt;i&gt;(limb-project.com)&lt;/i&gt;&lt;/div&gt; 
    </content:encoded>

    <pubDate>Wed, 21 Dec 2005 11:26:19 +0100</pubDate>
    <guid isPermaLink="false">http://nnsoft.supersized.org/archives/22-guid.html</guid>
    
</item>
<item>
    <title>LIMB - Access templates</title>
    <link>http://nnsoft.supersized.org/archives/21-LIMB-Access-templates.html</link>
            <category>PHP</category>
    
    <comments>http://nnsoft.supersized.org/archives/21-LIMB-Access-templates.html#comments</comments>
    <wfw:comment>http://nnsoft.supersized.org/wfwcomment.php?cid=21</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://nnsoft.supersized.org/rss.php?version=2.0&amp;type=comments&amp;cid=21</wfw:commentRss>
    

    <author>nospam@example.com (chnghia)</author>
    <content:encoded>
    In some cases we need to set a predefined set of object permissions.
For example new article, created by the content manager needs to be
verified by the editor in chief before it is published for public view.
Hence we need the new article to be created with no access permissions
for ordinary user and with full access rights to the editorial staff.
Meet access templates!


&lt;p&gt;Access templates is a matrix of the object permissions applied to
the object. This a common instrument for the document flow control in
Limb.
&lt;/p&gt;

&lt;p&gt;
Weve faced 2 cases of using access templates so far:
&lt;/p&gt;
&lt;ul&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; applying acces template from parent to child&lt;/div&gt;
&lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; applying access template for object itself&lt;/div&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
 Limb provides a &lt;acronym title=&quot;Graphical User Interface&quot;&gt;GUI&lt;/acronym&gt; for setting access templates at /root/admin/controllers/. See Set access templates action.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;access_policy&lt;/strong&gt; class resolves all issues, connected with getting or saving access policy for the particular object.
&lt;/p&gt;
&lt;pre class=&quot;code php&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt; articles_folder_controller extends site_object_controller&lt;br /&gt;&lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kw2&quot;&gt;function&lt;/span&gt; articles_folder_controller&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;re0&quot;&gt;$this&lt;/span&gt;-&amp;gt;_actions = &lt;a href=&quot;http://www.php.net/array&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;                &lt;span class=&quot;st0&quot;&gt;&#039;create_article&#039;&lt;/span&gt; =&amp;gt; &lt;a href=&quot;http://www.php.net/array&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;                        &lt;span class=&quot;st0&quot;&gt;&#039;action_path&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/article/create_article_action&#039;&lt;/span&gt;,&lt;br /&gt;                        &lt;span class=&quot;st0&quot;&gt;&#039;action_name&#039;&lt;/span&gt; =&amp;gt; strings :: &lt;span class=&quot;me2&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;create_article&#039;&lt;/span&gt;, &lt;span class=&quot;st0&quot;&gt;&#039;article&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;                        &lt;span class=&quot;st0&quot;&gt;&#039;can_have_access_template&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;co1&quot;&gt;//note this attribute!&lt;/span&gt;&lt;br /&gt;                &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;                &lt;span class=&quot;st0&quot;&gt;&#039;publish&#039;&lt;/span&gt; =&amp;gt; &lt;a href=&quot;http://www.php.net/array&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;br /&gt;                        &lt;span class=&quot;st0&quot;&gt;&#039;can_have_access_template&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;co1&quot;&gt;//note this attribute!&lt;/span&gt;&lt;br /&gt;                        &lt;span class=&quot;st0&quot;&gt;&#039;action_name&#039;&lt;/span&gt; =&amp;gt; strings :: &lt;span class=&quot;me2&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;publish&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;                        &lt;span class=&quot;st0&quot;&gt;&#039;action_path&#039;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;st0&quot;&gt;&#039;/doc_flow_object/set_publish_status_action&#039;&lt;/span&gt;,&lt;br /&gt;                &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;,&lt;br /&gt;        &lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;        parent :: &lt;span class=&quot;me2&quot;&gt;site_object_controller&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;    &lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;For example, in case of creating a new article create_article
appropriate action tries to create an article_object and to apply
access permissions as defined in the access template. If there is no
access template for this action (e.g. its empty) then access
permissions are copied from the parent object. When publishing an
object access permissions are applied to the object itself(access
template IS mandatory in this case).
&lt;/p&gt;&lt;p&gt;&lt;i&gt;(limb-project.com)&lt;/i&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 21 Dec 2005 11:11:13 +0100</pubDate>
    <guid isPermaLink="false">http://nnsoft.supersized.org/archives/21-guid.html</guid>
    
</item>
<item>
    <title>LIMB CMF features</title>
    <link>http://nnsoft.supersized.org/archives/17-LIMB-CMF-features.html</link>
            <category>PHP</category>
    
    <comments>http://nnsoft.supersized.org/archives/17-LIMB-CMF-features.html#comments</comments>
    <wfw:comment>http://nnsoft.supersized.org/wfwcomment.php?cid=17</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://nnsoft.supersized.org/rss.php?version=2.0&amp;type=comments&amp;cid=17</wfw:commentRss>
    

    <author>nospam@example.com (chnghia)</author>
    <content:encoded>
    
&lt;p&gt;&lt;b&gt;Features&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Website structure management&lt;/p&gt;&lt;p&gt;Multilanguage support&lt;/p&gt;&lt;p&gt;Users management&lt;/p&gt;&lt;p&gt;Audit trails&lt;/p&gt;&lt;p&gt;Permissions management system&lt;/p&gt;&lt;p&gt;Statistics system&lt;/p&gt;&lt;p&gt;Integrated search engine&lt;/p&gt;&lt;p&gt;Content version control&lt;/p&gt;&lt;p&gt;Navigation management&lt;/p&gt;&lt;p&gt;Multimedia repository&lt;/p&gt;&lt;p&gt;Richtext editor&lt;/p&gt;&lt;p&gt;JIP(just in place) edition&lt;/p&gt;&lt;p&gt;&lt;b&gt;Background Features&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Strong OOP development&lt;/p&gt;&lt;p&gt;The WEB in now built mainly on scripting technologies, messing script codes with html. We refused this way of web development from the very beginning. OOP development allows programmers to take full advantage of design patterns, reuse existing code, and create new modules quickly.&lt;/p&gt;&lt;p&gt;Test driven development&lt;/p&gt;&lt;p&gt;The biggest problem in software development is to produce stable and quality products. When programmer makes changes in one module he has to be sure that will not break any other module or the whole system. We extensively use unit testing to make sure all LIMB functionality is stable enough.&lt;/p&gt;&lt;p&gt;MVC pattern design&lt;/p&gt;&lt;p&gt;The &amp;quot;worst smell&amp;quot; in the web development is missing scripting codes and HTML. The best decision is to separate business and presentation logic. Programmers can reuse their source codes in different projects and designers should only care about HTML and happily use their favoriate HTML editors. This all is possible through MVC architecture, where View is represented with excellent WACT templates.&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;(limb-project.com)&lt;/i&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 20 Dec 2005 14:41:08 +0100</pubDate>
    <guid isPermaLink="false">http://nnsoft.supersized.org/archives/17-guid.html</guid>
    
</item>
<item>
    <title>LIMB - CMF</title>
    <link>http://nnsoft.supersized.org/archives/16-LIMB-CMF.html</link>
            <category>PHP</category>
    
    <comments>http://nnsoft.supersized.org/archives/16-LIMB-CMF.html#comments</comments>
    <wfw:comment>http://nnsoft.supersized.org/wfwcomment.php?cid=16</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://nnsoft.supersized.org/rss.php?version=2.0&amp;type=comments&amp;cid=16</wfw:commentRss>
    

    <author>nospam@example.com (chnghia)</author>
    <content:encoded>
    
&lt;p&gt;LIMB is the first WACT based CMF. LIMB is built with LAMP technologies and utilizes the whole great experience of Open Source software development.&lt;/p&gt;&lt;p&gt;The main aim of LIMB is build scalable, extensible and easy-to-update Content Management System (CMS).&lt;/p&gt;&lt;p&gt;LIMB uses its own unique way to organize website&#039;s content with flexible object metaphor: &amp;quot;&lt;font color=&quot;#3300ff&quot;&gt;Every piece of information is an object&lt;/font&gt;&amp;quot;.&lt;/p&gt;&lt;p&gt;LIMB introduces JIP (just in place) managing feature. JIP creat/edit/delete modes allow dramatically decrease time of learning the CMS and simplify the administration rountine.&lt;/p&gt;&lt;p&gt;(www.limb-project.com)&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Tue, 20 Dec 2005 13:38:49 +0100</pubDate>
    <guid isPermaLink="false">http://nnsoft.supersized.org/archives/16-guid.html</guid>
    
</item>

</channel>
</rss>