Jump to content

Including modifiers when extending nodes: Difference between revisions

From NusaATK
Juneih (talk | contribs)
No edit summary
Despam
 
(10 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Howto|easy|[[June Henriksen]] <juneih@linpro.no>}}
{{Howto|advanced|[[June Henriksen]] <juneih@linpro.no>}}


This howto explains how you can include modifiers when you extend a node.
== Intro ==


All modifiers added to a node will be run in the node's init function. Which modifiers that runs however, depends on the m_type of a node, which will be different for any node that extends it. In order to have the modifiers run, some changes has to be made in the extended nodes init node.  
ATK features a concept called '[[modifiers]]' that allows one to change functionality of a node without touching the original code of the node (See the '[[Using modifiers]]' howto).  


<p></p>
The way modifiers work however, prevents modifiers from being applied to classes that extend the node. This may be fixed in a later version of ATK. For now, you can use this howto which presents a workaround to this problem.
An example init_node:
 
<p></p>
== Adding modifiers to derived nodes ==
 
All modifiers added to a node run from the node's init function. Which modifiers that runs however, depends on the m_type of a node. When you extend a node, you get a new m_type if you set the atkNode in the constructor.


<span style="color: #000000; font-style: italic;">
<span style="color: #000000; font-style: italic;">
$this->atkNode("nodename");
</span>
In order to have the modifiers run, some changes has to be made in the extended node's init node.


<p></p>
The following is an example init_node for a node that extends the timereg.hours node:
<p></p>


function init()
<syntaxhighlight lang="php">
  function init()
   {
   {
     $ret = parent::init();
     $ret = parent::init();
     $oldtype = $this->m_type;
     $oldtype = $this->m_type;
Line 20: Line 29:
     $this->m_type='hours';
     $this->m_type='hours';
     $this->m_module='timereg';
     $this->m_module='timereg';
 
 
     global $g_modifiers;
     global $g_modifiers;
 
 
     if (isset($g_modifiers[$this->atknodetype()]))
     if (isset($g_modifiers[$this->atknodetype()]))
     {
     {
Line 33: Line 42:
     $this->m_module=$oldmodule;
     $this->m_module=$oldmodule;
     $this->m_type = $oldtype;
     $this->m_type = $oldtype;
 
 
     return $ret;
     return $ret;
   }
   }
</span>
</syntaxhighlight>
 
 
 
So when you display the full image:
<ul>
<li>All the fields (master-detail) are retrieved from DB</li>
</ul>
<ul>
<li>Master key is stored in a session variable</li>
</ul>
<ul>
<li>A dynamic javascript function is created and:</li>
<ul>
<li>Create a position <em>draggable</em> <strong>DIV</strong> for any of the fields over the image</li>
 
</ul>
<ul>
<li>Attach a function to <em>double-click</em> event of <strong>Stampa</strong> image</li>
</ul>
</ul>
<p></p>
When you <em>double-click</em> on <strong>post-it</strong> image :
 
<ul>
<li>A new field is created</li>
</ul>
<ul>
<li>You can drag it all over the image</li>
</ul>
<ul>
<li>The new field is not stored on DB</li>
</ul>
<p></p>
When you <em>double-click</em> on <strong>stamp</strong> image:
 
<ul>
<li>You loop on all the field (<em>attention you loop on javascript DIV not on DB</em>)</li>
</ul>
<ul>
<li>For any of fields you call a <em>Ajax</em> updater function that fires Action <strong>ajaxupdate</strong> with proper parameters</li>
</ul>
<ul>


<li>ATK information like ATKstack, ATKLevel, ATKPreviouslevel are passed to <strong>Dispatch.php</strong> <em>ATK PHP file</em></li>
As mentioned, this example is for running the modifiers added to the hours node, but this can of course be exchanged for any other node. In fact, the only thing that needs to be changed in this code is the nodename ('hours') and modulename ('timereg')! Remember, the function itself is put in the extending node.
</ul>
<ul>
<li><em>Ajax</em> <em>work-in-progress</em> image is displayed</li>
</ul>
<ul>
<li>When <em>Ajax</em> function called is completed <em>work-in-progress</em> image is hided</li>


</ul>
The result of including this is that you now will have access to all the attributes added by modifiers to the node that is extended.
<p></p>
Action <strong>ajaxupdate</strong> is called from <em>Ajax</em> and:
<ul>
<li>decodes field name, x position and y position (passed by GET parameters)</li>
</ul>
<ul>
<li>retrieves <strong>master-detail</strong> key <strong>id</strong> from <strong>reg_id</strong> <em>session variable</em></li>


</ul>
<ul>
<li>verify if detail record exists</li>
<ul>
<li>if yes call sql update to modify it</li>
</ul>
<ul>
<li>if no  call sql insert to create it</li>
</ul>
</ul>
<p></p>
<p></p>


--[[User:Saitta|Saitta]] 13:07, 10 November 2006 (CEST)
--[[User:juneih|juneih]] 16:29, 23 November 2006 (CEST)

Latest revision as of 06:57, 16 July 2007

ATK Howto: Including modifiers when extending nodes

Complexity: advanced
Author: June Henriksen <juneih@linpro.no>

List of other Howto's

Intro

ATK features a concept called 'modifiers' that allows one to change functionality of a node without touching the original code of the node (See the 'Using modifiers' howto).

The way modifiers work however, prevents modifiers from being applied to classes that extend the node. This may be fixed in a later version of ATK. For now, you can use this howto which presents a workaround to this problem.

Adding modifiers to derived nodes

All modifiers added to a node run from the node's init function. Which modifiers that runs however, depends on the m_type of a node. When you extend a node, you get a new m_type if you set the atkNode in the constructor.

$this->atkNode("nodename");

In order to have the modifiers run, some changes has to be made in the extended node's init node.

The following is an example init_node for a node that extends the timereg.hours node:

  function init()
  {
    $ret = parent::init();
    $oldtype = $this->m_type;
    $oldmodule= $this->m_module;
    $this->m_type='hours';
    $this->m_module='timereg';
  
    global $g_modifiers;
  
    if (isset($g_modifiers[$this->atknodetype()]))
    {
      foreach ($g_modifiers[$this->atknodetype()] as $modulename)
      {
        $module = &getModule($modulename);
        $module->modifier($this);
      }
    }
    $this->m_module=$oldmodule;
    $this->m_type = $oldtype;
  
    return $ret;
  }

As mentioned, this example is for running the modifiers added to the hours node, but this can of course be exchanged for any other node. In fact, the only thing that needs to be changed in this code is the nodename ('hours') and modulename ('timereg')! Remember, the function itself is put in the extending node.

The result of including this is that you now will have access to all the attributes added by modifiers to the node that is extended.


--juneih 16:29, 23 November 2006 (CEST)