<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://atk-framework.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=36.68.89.237</id>
	<title>NusaATK - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://atk-framework.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=36.68.89.237"/>
	<link rel="alternate" type="text/html" href="https://atk-framework.com/Special:Contributions/36.68.89.237"/>
	<updated>2026-10-27T04:02:06Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://atk-framework.com/index.php?title=Custom_(record)_actions&amp;diff=19875</id>
		<title>Custom (record) actions</title>
		<link rel="alternate" type="text/html" href="https://atk-framework.com/index.php?title=Custom_(record)_actions&amp;diff=19875"/>
		<updated>2026-01-17T11:40:14Z</updated>

		<summary type="html">&lt;p&gt;36.68.89.237: /* Defining your own action */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Howto|Advanced|[[Boy Baukema]]}}&lt;br /&gt;
&lt;br /&gt;
== Defining your own action ==&lt;br /&gt;
&lt;br /&gt;
Defining your own action for your node is quite easy in ATK, you can do so simply by implementing a function called action_actionname.&amp;lt;br /&amp;gt;&lt;br /&gt;
Example where we also output our own &#039;Hello World&#039; page, just like a normal ATK action page:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  function action_showhelloworld()&lt;br /&gt;
  {&lt;br /&gt;
    $output = $this-&amp;gt;getUI()-&amp;gt;renderBox(array(&amp;quot;title&amp;quot;=&amp;gt;&amp;quot;My Hello World Page&amp;quot;,&lt;br /&gt;
                                              &amp;quot;content&amp;quot;=&amp;gt;&amp;quot;Hello World!&amp;quot;));&lt;br /&gt;
  &lt;br /&gt;
    $this-&amp;gt;addStyle(&amp;quot;style.css&amp;quot;);&lt;br /&gt;
    $this-&amp;gt;getPage()-&amp;gt;addContent($this-&amp;gt;renderActionPage(&amp;quot;showhelloworld&amp;quot;, $output));&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Don&#039;t forget to also register the node in your module.inc so you can assign rights and let &#039;normal&#039; users (I&#039;m not saying your users are normal, but you know what I mean :)) use your action as well, instead of only the administrator user.&amp;lt;br /&amp;gt;&lt;br /&gt;
In our example this would be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  function getNodes()&lt;br /&gt;
  {&lt;br /&gt;
    registerNode(&amp;quot;worlds.world&amp;quot;, array(&amp;quot;admin&amp;quot;, &amp;quot;add&amp;quot;, &amp;quot;edit&amp;quot;, &amp;quot;delete&amp;quot;,&amp;quot;showhelloworld&amp;quot;));&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Worlds being the module name and world the node name.&lt;br /&gt;
&lt;br /&gt;
== Your own record action ==&lt;br /&gt;
&lt;br /&gt;
Now say we wanna go a bit further and we want to perform our own action on a record. Say we have a node with data on worlds, and we wanna make a fun action that we could click that would say &amp;quot;Hello $worldname!&amp;quot;, so for earth it would be &amp;quot;Hello earth!&amp;quot;. We&#039;d have to define it as a recordaction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  function recordActions($record, &amp;amp;$actions, &amp;amp;$mraactions)&lt;br /&gt;
  {&lt;br /&gt;
    $actions[&amp;quot;showhelloworld&amp;quot;]= session_url(dispatch_url($this-&amp;gt;atknodetype(),&lt;br /&gt;
                                                         &amp;quot;showhelloworld&amp;quot;,&lt;br /&gt;
                                                         array(&amp;quot;worldname&amp;quot;=&amp;gt;$record[&amp;quot;worldname&amp;quot;])));&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And change:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  $output = $ui-&amp;gt;renderBox(array(&amp;quot;title&amp;quot;=&amp;gt;&#039;My Hello World Page&#039;,&lt;br /&gt;
                                 &amp;quot;content&amp;quot;=&amp;gt;&amp;quot;Hello World!&amp;quot;));&lt;br /&gt;
&amp;lt;?php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  $output = $ui-&amp;gt;renderBox(array(&amp;quot;title&amp;quot;=&amp;gt;&#039;My Hello World Page&#039;,&lt;br /&gt;
                                 &amp;quot;content&amp;quot;=&amp;gt;&amp;quot;Hello {$this-&amp;gt;m_postvars[&#039;worldname&#039;]}!&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we can say hello to all the worlds in our node!&lt;br /&gt;
&lt;br /&gt;
== Your own record action icon ==&lt;br /&gt;
&lt;br /&gt;
As a finishing touch we have an icon of a hand (hand.gif) we want to use for this action in the node.&amp;lt;br /&amp;gt;&lt;br /&gt;
To do this, we need to rename the icon to the actionname, making it showhelloworld.gif.&amp;lt;br /&amp;gt;&lt;br /&gt;
Now we need somewhere to put this icon where ATK will find it.&amp;lt;br /&amp;gt;&lt;br /&gt;
In the appropriate module directory (modules/worlds/) create a directory structure like the following:&amp;lt;br /&amp;gt;&lt;br /&gt;
modules/worlds/themes/default/icons/recordlist/&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we need to put the icon (showhelloworld.gif) in the directory structure we just created (modules/worlds/themes/default/icons/recordlist/).&amp;lt;br /&amp;gt;&lt;br /&gt;
And finally, all we need to do is throw away the theme cache (as user with appropriate rights or root user in the application root &#039;rm -vf atktmp/themes/*&#039;) and voila!&lt;br /&gt;
&lt;br /&gt;
== Overriding existing actions ==&lt;br /&gt;
&lt;br /&gt;
To override existing actions (for example, the edit action), do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function recordActions($record, &amp;amp;$actions, &amp;amp;$mraactions) {&lt;br /&gt;
&lt;br /&gt;
  $actions[&amp;quot;edit&amp;quot;] = dispatch_url(&lt;br /&gt;
    $this-&amp;gt;atknodetype(),&lt;br /&gt;
    &amp;quot;edit&amp;quot;,&lt;br /&gt;
    array(&lt;br /&gt;
      &amp;quot;foo&amp;quot; =&amp;gt; &amp;quot;bar&amp;quot;,&lt;br /&gt;
      &amp;quot;atkselector&amp;quot; =&amp;gt; &amp;quot;mytable.id = {$record[&amp;quot;id&amp;quot;]}&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function action_edit($handler) {&lt;br /&gt;
  $foo = $this-&amp;gt;m_postvars[&#039;foo&#039;]; // &amp;quot;bar&amp;quot;&lt;br /&gt;
  $handler-&amp;gt;action_edit();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you *must* define the atkselector key--if you don&#039;t, the edit link will (silently) produce an edit page of the first row in the associated table, which probably isn&#039;t what you want.  You also need to explicitly set the selector: setting it to &amp;quot;[pk]&amp;quot; doesn&#039;t work, because it gets encoded. &lt;br /&gt;
&lt;br /&gt;
== Returning to the record == &lt;br /&gt;
&lt;br /&gt;
If you have an action that updates your record, after doing the update you can go back to the edit screen by using this code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;redirect($record);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Your own multi record action ==&lt;br /&gt;
&lt;br /&gt;
Here is a simple example of creating a mra-action.&lt;br /&gt;
&lt;br /&gt;
First, add the NF_MRA flag to your node:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class foo extends atkMetaNode {&lt;br /&gt;
&lt;br /&gt;
  protected $flags = array(NF_MRA); &lt;br /&gt;
&lt;br /&gt;
  // ...&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding the flag will change the &amp;quot;admin&amp;quot; (list) display so that a checkbox is displayed next to each row, and add some text (&amp;quot;Select all&amp;quot;, etc.) beneath the table.&lt;br /&gt;
&lt;br /&gt;
Add the action to &amp;lt;code&amp;gt;$mraactions&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 function recordActions($record, &amp;amp;$actions, &amp;amp;$mraactions)&lt;br /&gt;
 {&lt;br /&gt;
   $mraactions[&#039;my_mra_action&#039;] = &amp;quot;my_mra_action&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Implement the &amp;lt;code&amp;gt;action_XXX&amp;lt;/code&amp;gt; function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 function action_my_mra_action()&lt;br /&gt;
 {&lt;br /&gt;
   atk_var_dump($this-&amp;gt;m_postvars[&amp;quot;atkselector&amp;quot;], &#039;selected records&#039;); &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
atkselector will contain the primary keys of all records that are selected. You can use this to retrieve the rows and perform the actual action on it. &lt;br /&gt;
&lt;br /&gt;
Add the action via the &amp;lt;code&amp;gt;registerNode&amp;lt;/code&amp;gt; function in &amp;lt;code&amp;gt;module.inc&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function getNodes() {&lt;br /&gt;
    registerNode(&#039;projects.foo&#039;, array(&#039;my_mra_action&#039;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(After calling registerNode(), go into the web interface and enable this action for the appropriate user.)&lt;br /&gt;
&lt;br /&gt;
Finally, if your action does not appear in the drop-down, ensure that the &amp;lt;code&amp;gt;allow&amp;lt;/code&amp;gt; function isn&#039;t inhibiting the display of your action.  (Hardcode &amp;lt;code&amp;gt;return true&amp;lt;/code&amp;gt; to make sure.)  For multi-record actions, the &amp;lt;code&amp;gt;allow()&amp;lt;/code&amp;gt; function is not passed a populated &amp;lt;code&amp;gt;$record&amp;lt;/code&amp;gt;--use &amp;lt;code&amp;gt;recordAction()&amp;lt;/code&amp;gt; to determine which actions can be performed on a per-record basis.&lt;br /&gt;
&lt;br /&gt;
If you want to, for example, update the status of multiple records, your code would look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 function action_my_mra_validate_action()&lt;br /&gt;
 {&lt;br /&gt;
   $this-&amp;gt;updateStatus(&#039;valid&#039;, $this-&amp;gt;m_postvars[&amp;quot;atkselector&amp;quot;]);&lt;br /&gt;
    &lt;br /&gt;
   return $this-&amp;gt;redirect();&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 function updateStatus($status, $primkeys)&lt;br /&gt;
 {&lt;br /&gt;
   foreach ($primkeys as $pk)&lt;br /&gt;
   {&lt;br /&gt;
     $record = array(&amp;quot;atkprimkey&amp;quot;=&amp;gt;$pk,&lt;br /&gt;
                     &amp;quot;status&amp;quot;=&amp;gt;$status);&lt;br /&gt;
     &lt;br /&gt;
     $this-&amp;gt;updateDb($record);&lt;br /&gt;
   }      &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Customizing MRA actions ===&lt;br /&gt;
Sometimes simply performing an action is not enough. For instance, you want the user to be able to select multiple records to set an attribute or perform an action with a parmeter on.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Like setting a population status (uninhabitable, unpopulated, populated) for several worlds at once.&lt;br /&gt;
&lt;br /&gt;
You can do this by creating a &#039;&#039;getCustomMraHtml&#039;&#039; method in your node. The recordlist will then use the output from this method and place it directly in between the list of actions and the action button.&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  public function recordActions($record, $actions, &amp;amp;$mraactions)&lt;br /&gt;
  {&lt;br /&gt;
    $mraactions[&#039;update_population&#039;] = &amp;quot;update_population&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public function getCustomMraHtml()&lt;br /&gt;
  {&lt;br /&gt;
     $list = $this-&amp;gt;getAttribute(&#039;population_status&#039;)-&amp;gt;edit();&lt;br /&gt;
     return $list;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public function action_update_population()&lt;br /&gt;
  {&lt;br /&gt;
     $status = $this-&amp;gt;getAttribute(&#039;population_status&#039;)-&amp;gt;fetchValue($this-&amp;gt;m_postvars);&lt;br /&gt;
     foreach ($this-&amp;gt;m_postvars[&#039;atkselector&#039;] as $pk)&lt;br /&gt;
     {&lt;br /&gt;
       $record = array(&amp;quot;atkprimkey&amp;quot;=&amp;gt;$pk,&lt;br /&gt;
                       &amp;quot;population_status&amp;quot;=&amp;gt;$status);&lt;br /&gt;
     &lt;br /&gt;
       $this-&amp;gt;updateDb($record);&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;NOTE:&#039;&#039; If you are playing around with NF_MRA you will inevitably notice NF_MRPA (Multi Record Priority Actions) which is a feature that SHOULD allow you to select the order in which records are processed by a multi record action. However this feature should be considered deprecated as no real world usage cases has ever been found beyond the initial one.&lt;br /&gt;
&lt;br /&gt;
== A custom form button ==&lt;br /&gt;
&lt;br /&gt;
Now say you want to have an extra button in your node &#039;Save and say hello!&#039; besides &#039;Save and close&#039; and &#039;Save&#039;. &amp;lt;br /&amp;gt;&lt;br /&gt;
This is useful in situations where you want to perform a special action on a record besides saving it.&amp;lt;br /&amp;gt;&lt;br /&gt;
You could add the following method to your node:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  function getFormButtons($mode, $record)&lt;br /&gt;
  {&lt;br /&gt;
    // Get the normal buttons&lt;br /&gt;
    $buttons = parent::getFormButtons($mode,$record);&lt;br /&gt;
    if ($mode===&#039;edit&#039;)&lt;br /&gt;
    {&lt;br /&gt;
      // If the user is editting, add a &#039;saveandsayhello&#039; button &lt;br /&gt;
      // (you should also add a translation to your language file for saveandsayhello)&lt;br /&gt;
      array_unshift($buttons, &#039;&amp;lt;input type=&amp;quot;submit&amp;quot; class=&amp;quot;btn_save&amp;quot; name=&amp;quot;saveandsayhello&amp;quot; value=&amp;quot;&#039;.&lt;br /&gt;
                                   atktext(&amp;quot;saveandsayhello&amp;quot;, &amp;quot;worlds&amp;quot;).&#039;&amp;quot;&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return $buttons;&lt;br /&gt;
  }&lt;br /&gt;
  function postUpdate($record)&lt;br /&gt;
  {&lt;br /&gt;
    if ($this-&amp;gt;m_postvars[&#039;saveandsayhello&#039;])&lt;br /&gt;
    {&lt;br /&gt;
      $this-&amp;gt;redirect(dispatch_url($this-&amp;gt;atknodetype(),&#039;showhelloworld&#039;));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  function action_update(&amp;amp;$handler)&lt;br /&gt;
  {&lt;br /&gt;
    // Trick the update handler into thinking that when we clicked&lt;br /&gt;
    // the saveandsayhello button, we also clicked the save and close button.&lt;br /&gt;
    // You could also use atknoclose if you just want to save&lt;br /&gt;
    if ($handler-&amp;gt;m_postvars[&#039;saveandsayhello&#039;]) $handler-&amp;gt;m_postvars[&#039;atksaveandclose&#039;]=1;&lt;br /&gt;
    return $handler-&amp;gt;action_update();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more documentation please see:&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.atk-framework.com/docs/atk/trunk/atk/atkNode.html#getFormButtons&lt;br /&gt;
&lt;br /&gt;
== Removing Actions ==&lt;br /&gt;
&lt;br /&gt;
=== Via &amp;lt;code&amp;gt;recordActions()&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
As shown above, a common way to add actions is via the &amp;lt;code&amp;gt;$actions&amp;lt;/code&amp;gt; array that is provided as an argument to, for example, the &amp;lt;code&amp;gt;recordActions()&amp;lt;/code&amp;gt;.  Actions can similarly be removed, by deleting values from this array.  For example, all actions can be removed from a node with the following &amp;lt;code&amp;gt;recordActions()&amp;lt;/code&amp;gt; method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function recordActions($record, &amp;amp;$actions, &amp;amp;$mraactions) {&lt;br /&gt;
    $actions = array();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Individual actions can also be removed by deleting the appropriate key:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function recordActions($record, &amp;amp;$actions, &amp;amp;$mraactions) {&lt;br /&gt;
    unset($actions[&#039;delete&#039;]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Via &amp;lt;code&amp;gt;allow()&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
= atkDataGrid Actions =&lt;br /&gt;
&lt;br /&gt;
== Adding actions ==&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$grid-&amp;gt;setDefaultActions(array(&lt;br /&gt;
  &amp;quot;view&amp;quot; =&amp;gt; dispatch_url(&amp;quot;projects.quote&amp;quot;, &amp;quot;view&amp;quot;, array(&amp;quot;atkselector&amp;quot; =&amp;gt; &amp;quot;[pk]&amp;quot;))&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These actions apply to all rows in the table; note that the &amp;quot;[pk]&amp;quot;, is essentially interpolated.  You may find an &amp;lt;code&amp;gt;atk_var_dump()&amp;lt;/code&amp;gt; of &amp;lt;code&amp;gt;$grid-&amp;gt;getDefaultActions()&amp;lt;/code&amp;gt;useful to see what actions are currently configured.&lt;br /&gt;
&lt;br /&gt;
== Removing actions ==&lt;br /&gt;
&lt;br /&gt;
Actions can be removed from an &amp;lt;code&amp;gt;[[atkDataGrid]]&amp;lt;/code&amp;gt; by using the &amp;lt;code&amp;gt;setDefaultActions()&amp;lt;/code&amp;gt; method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$grid-&amp;gt;setDefaultActions(array()); // remove all actions&lt;br /&gt;
$grid-&amp;gt;setDefaultActions(array_diff_key($grid-&amp;gt;getDefaultActions(),&lt;br /&gt;
                array(&amp;quot;delete&amp;quot; =&amp;gt; true))); // remove just the &amp;quot;delete&amp;quot; action&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>36.68.89.237</name></author>
	</entry>
	<entry>
		<id>https://atk-framework.com/index.php?title=Custom_(record)_actions&amp;diff=19874</id>
		<title>Custom (record) actions</title>
		<link rel="alternate" type="text/html" href="https://atk-framework.com/index.php?title=Custom_(record)_actions&amp;diff=19874"/>
		<updated>2026-01-17T11:39:24Z</updated>

		<summary type="html">&lt;p&gt;36.68.89.237: /* Defining your own action */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Howto|Advanced|[[Boy Baukema]]}}&lt;br /&gt;
&lt;br /&gt;
== Defining your own action ==&lt;br /&gt;
ok&lt;br /&gt;
Defining your own action for your node is quite easy in ATK, you can do so simply by implementing a function called action_actionname.&amp;lt;br /&amp;gt;&lt;br /&gt;
Example where we also output our own &#039;Hello World&#039; page, just like a normal ATK action page:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  function action_showhelloworld()&lt;br /&gt;
  {&lt;br /&gt;
    $output = $this-&amp;gt;getUI()-&amp;gt;renderBox(array(&amp;quot;title&amp;quot;=&amp;gt;&amp;quot;My Hello World Page&amp;quot;,&lt;br /&gt;
                                              &amp;quot;content&amp;quot;=&amp;gt;&amp;quot;Hello World!&amp;quot;));&lt;br /&gt;
  &lt;br /&gt;
    $this-&amp;gt;addStyle(&amp;quot;style.css&amp;quot;);&lt;br /&gt;
    $this-&amp;gt;getPage()-&amp;gt;addContent($this-&amp;gt;renderActionPage(&amp;quot;showhelloworld&amp;quot;, $output));&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Don&#039;t forget to also register the node in your module.inc so you can assign rights and let &#039;normal&#039; users (I&#039;m not saying your users are normal, but you know what I mean :)) use your action as well, instead of only the administrator user.&amp;lt;br /&amp;gt;&lt;br /&gt;
In our example this would be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  function getNodes()&lt;br /&gt;
  {&lt;br /&gt;
    registerNode(&amp;quot;worlds.world&amp;quot;, array(&amp;quot;admin&amp;quot;, &amp;quot;add&amp;quot;, &amp;quot;edit&amp;quot;, &amp;quot;delete&amp;quot;,&amp;quot;showhelloworld&amp;quot;));&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Worlds being the module name and world the node name.&lt;br /&gt;
&lt;br /&gt;
== Your own record action ==&lt;br /&gt;
&lt;br /&gt;
Now say we wanna go a bit further and we want to perform our own action on a record. Say we have a node with data on worlds, and we wanna make a fun action that we could click that would say &amp;quot;Hello $worldname!&amp;quot;, so for earth it would be &amp;quot;Hello earth!&amp;quot;. We&#039;d have to define it as a recordaction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  function recordActions($record, &amp;amp;$actions, &amp;amp;$mraactions)&lt;br /&gt;
  {&lt;br /&gt;
    $actions[&amp;quot;showhelloworld&amp;quot;]= session_url(dispatch_url($this-&amp;gt;atknodetype(),&lt;br /&gt;
                                                         &amp;quot;showhelloworld&amp;quot;,&lt;br /&gt;
                                                         array(&amp;quot;worldname&amp;quot;=&amp;gt;$record[&amp;quot;worldname&amp;quot;])));&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And change:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  $output = $ui-&amp;gt;renderBox(array(&amp;quot;title&amp;quot;=&amp;gt;&#039;My Hello World Page&#039;,&lt;br /&gt;
                                 &amp;quot;content&amp;quot;=&amp;gt;&amp;quot;Hello World!&amp;quot;));&lt;br /&gt;
&amp;lt;?php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  $output = $ui-&amp;gt;renderBox(array(&amp;quot;title&amp;quot;=&amp;gt;&#039;My Hello World Page&#039;,&lt;br /&gt;
                                 &amp;quot;content&amp;quot;=&amp;gt;&amp;quot;Hello {$this-&amp;gt;m_postvars[&#039;worldname&#039;]}!&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we can say hello to all the worlds in our node!&lt;br /&gt;
&lt;br /&gt;
== Your own record action icon ==&lt;br /&gt;
&lt;br /&gt;
As a finishing touch we have an icon of a hand (hand.gif) we want to use for this action in the node.&amp;lt;br /&amp;gt;&lt;br /&gt;
To do this, we need to rename the icon to the actionname, making it showhelloworld.gif.&amp;lt;br /&amp;gt;&lt;br /&gt;
Now we need somewhere to put this icon where ATK will find it.&amp;lt;br /&amp;gt;&lt;br /&gt;
In the appropriate module directory (modules/worlds/) create a directory structure like the following:&amp;lt;br /&amp;gt;&lt;br /&gt;
modules/worlds/themes/default/icons/recordlist/&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we need to put the icon (showhelloworld.gif) in the directory structure we just created (modules/worlds/themes/default/icons/recordlist/).&amp;lt;br /&amp;gt;&lt;br /&gt;
And finally, all we need to do is throw away the theme cache (as user with appropriate rights or root user in the application root &#039;rm -vf atktmp/themes/*&#039;) and voila!&lt;br /&gt;
&lt;br /&gt;
== Overriding existing actions ==&lt;br /&gt;
&lt;br /&gt;
To override existing actions (for example, the edit action), do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function recordActions($record, &amp;amp;$actions, &amp;amp;$mraactions) {&lt;br /&gt;
&lt;br /&gt;
  $actions[&amp;quot;edit&amp;quot;] = dispatch_url(&lt;br /&gt;
    $this-&amp;gt;atknodetype(),&lt;br /&gt;
    &amp;quot;edit&amp;quot;,&lt;br /&gt;
    array(&lt;br /&gt;
      &amp;quot;foo&amp;quot; =&amp;gt; &amp;quot;bar&amp;quot;,&lt;br /&gt;
      &amp;quot;atkselector&amp;quot; =&amp;gt; &amp;quot;mytable.id = {$record[&amp;quot;id&amp;quot;]}&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function action_edit($handler) {&lt;br /&gt;
  $foo = $this-&amp;gt;m_postvars[&#039;foo&#039;]; // &amp;quot;bar&amp;quot;&lt;br /&gt;
  $handler-&amp;gt;action_edit();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you *must* define the atkselector key--if you don&#039;t, the edit link will (silently) produce an edit page of the first row in the associated table, which probably isn&#039;t what you want.  You also need to explicitly set the selector: setting it to &amp;quot;[pk]&amp;quot; doesn&#039;t work, because it gets encoded. &lt;br /&gt;
&lt;br /&gt;
== Returning to the record == &lt;br /&gt;
&lt;br /&gt;
If you have an action that updates your record, after doing the update you can go back to the edit screen by using this code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;redirect($record);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Your own multi record action ==&lt;br /&gt;
&lt;br /&gt;
Here is a simple example of creating a mra-action.&lt;br /&gt;
&lt;br /&gt;
First, add the NF_MRA flag to your node:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class foo extends atkMetaNode {&lt;br /&gt;
&lt;br /&gt;
  protected $flags = array(NF_MRA); &lt;br /&gt;
&lt;br /&gt;
  // ...&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding the flag will change the &amp;quot;admin&amp;quot; (list) display so that a checkbox is displayed next to each row, and add some text (&amp;quot;Select all&amp;quot;, etc.) beneath the table.&lt;br /&gt;
&lt;br /&gt;
Add the action to &amp;lt;code&amp;gt;$mraactions&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 function recordActions($record, &amp;amp;$actions, &amp;amp;$mraactions)&lt;br /&gt;
 {&lt;br /&gt;
   $mraactions[&#039;my_mra_action&#039;] = &amp;quot;my_mra_action&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Implement the &amp;lt;code&amp;gt;action_XXX&amp;lt;/code&amp;gt; function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 function action_my_mra_action()&lt;br /&gt;
 {&lt;br /&gt;
   atk_var_dump($this-&amp;gt;m_postvars[&amp;quot;atkselector&amp;quot;], &#039;selected records&#039;); &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
atkselector will contain the primary keys of all records that are selected. You can use this to retrieve the rows and perform the actual action on it. &lt;br /&gt;
&lt;br /&gt;
Add the action via the &amp;lt;code&amp;gt;registerNode&amp;lt;/code&amp;gt; function in &amp;lt;code&amp;gt;module.inc&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function getNodes() {&lt;br /&gt;
    registerNode(&#039;projects.foo&#039;, array(&#039;my_mra_action&#039;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(After calling registerNode(), go into the web interface and enable this action for the appropriate user.)&lt;br /&gt;
&lt;br /&gt;
Finally, if your action does not appear in the drop-down, ensure that the &amp;lt;code&amp;gt;allow&amp;lt;/code&amp;gt; function isn&#039;t inhibiting the display of your action.  (Hardcode &amp;lt;code&amp;gt;return true&amp;lt;/code&amp;gt; to make sure.)  For multi-record actions, the &amp;lt;code&amp;gt;allow()&amp;lt;/code&amp;gt; function is not passed a populated &amp;lt;code&amp;gt;$record&amp;lt;/code&amp;gt;--use &amp;lt;code&amp;gt;recordAction()&amp;lt;/code&amp;gt; to determine which actions can be performed on a per-record basis.&lt;br /&gt;
&lt;br /&gt;
If you want to, for example, update the status of multiple records, your code would look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 function action_my_mra_validate_action()&lt;br /&gt;
 {&lt;br /&gt;
   $this-&amp;gt;updateStatus(&#039;valid&#039;, $this-&amp;gt;m_postvars[&amp;quot;atkselector&amp;quot;]);&lt;br /&gt;
    &lt;br /&gt;
   return $this-&amp;gt;redirect();&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 function updateStatus($status, $primkeys)&lt;br /&gt;
 {&lt;br /&gt;
   foreach ($primkeys as $pk)&lt;br /&gt;
   {&lt;br /&gt;
     $record = array(&amp;quot;atkprimkey&amp;quot;=&amp;gt;$pk,&lt;br /&gt;
                     &amp;quot;status&amp;quot;=&amp;gt;$status);&lt;br /&gt;
     &lt;br /&gt;
     $this-&amp;gt;updateDb($record);&lt;br /&gt;
   }      &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Customizing MRA actions ===&lt;br /&gt;
Sometimes simply performing an action is not enough. For instance, you want the user to be able to select multiple records to set an attribute or perform an action with a parmeter on.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Like setting a population status (uninhabitable, unpopulated, populated) for several worlds at once.&lt;br /&gt;
&lt;br /&gt;
You can do this by creating a &#039;&#039;getCustomMraHtml&#039;&#039; method in your node. The recordlist will then use the output from this method and place it directly in between the list of actions and the action button.&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  public function recordActions($record, $actions, &amp;amp;$mraactions)&lt;br /&gt;
  {&lt;br /&gt;
    $mraactions[&#039;update_population&#039;] = &amp;quot;update_population&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public function getCustomMraHtml()&lt;br /&gt;
  {&lt;br /&gt;
     $list = $this-&amp;gt;getAttribute(&#039;population_status&#039;)-&amp;gt;edit();&lt;br /&gt;
     return $list;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public function action_update_population()&lt;br /&gt;
  {&lt;br /&gt;
     $status = $this-&amp;gt;getAttribute(&#039;population_status&#039;)-&amp;gt;fetchValue($this-&amp;gt;m_postvars);&lt;br /&gt;
     foreach ($this-&amp;gt;m_postvars[&#039;atkselector&#039;] as $pk)&lt;br /&gt;
     {&lt;br /&gt;
       $record = array(&amp;quot;atkprimkey&amp;quot;=&amp;gt;$pk,&lt;br /&gt;
                       &amp;quot;population_status&amp;quot;=&amp;gt;$status);&lt;br /&gt;
     &lt;br /&gt;
       $this-&amp;gt;updateDb($record);&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;NOTE:&#039;&#039; If you are playing around with NF_MRA you will inevitably notice NF_MRPA (Multi Record Priority Actions) which is a feature that SHOULD allow you to select the order in which records are processed by a multi record action. However this feature should be considered deprecated as no real world usage cases has ever been found beyond the initial one.&lt;br /&gt;
&lt;br /&gt;
== A custom form button ==&lt;br /&gt;
&lt;br /&gt;
Now say you want to have an extra button in your node &#039;Save and say hello!&#039; besides &#039;Save and close&#039; and &#039;Save&#039;. &amp;lt;br /&amp;gt;&lt;br /&gt;
This is useful in situations where you want to perform a special action on a record besides saving it.&amp;lt;br /&amp;gt;&lt;br /&gt;
You could add the following method to your node:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  function getFormButtons($mode, $record)&lt;br /&gt;
  {&lt;br /&gt;
    // Get the normal buttons&lt;br /&gt;
    $buttons = parent::getFormButtons($mode,$record);&lt;br /&gt;
    if ($mode===&#039;edit&#039;)&lt;br /&gt;
    {&lt;br /&gt;
      // If the user is editting, add a &#039;saveandsayhello&#039; button &lt;br /&gt;
      // (you should also add a translation to your language file for saveandsayhello)&lt;br /&gt;
      array_unshift($buttons, &#039;&amp;lt;input type=&amp;quot;submit&amp;quot; class=&amp;quot;btn_save&amp;quot; name=&amp;quot;saveandsayhello&amp;quot; value=&amp;quot;&#039;.&lt;br /&gt;
                                   atktext(&amp;quot;saveandsayhello&amp;quot;, &amp;quot;worlds&amp;quot;).&#039;&amp;quot;&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return $buttons;&lt;br /&gt;
  }&lt;br /&gt;
  function postUpdate($record)&lt;br /&gt;
  {&lt;br /&gt;
    if ($this-&amp;gt;m_postvars[&#039;saveandsayhello&#039;])&lt;br /&gt;
    {&lt;br /&gt;
      $this-&amp;gt;redirect(dispatch_url($this-&amp;gt;atknodetype(),&#039;showhelloworld&#039;));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  function action_update(&amp;amp;$handler)&lt;br /&gt;
  {&lt;br /&gt;
    // Trick the update handler into thinking that when we clicked&lt;br /&gt;
    // the saveandsayhello button, we also clicked the save and close button.&lt;br /&gt;
    // You could also use atknoclose if you just want to save&lt;br /&gt;
    if ($handler-&amp;gt;m_postvars[&#039;saveandsayhello&#039;]) $handler-&amp;gt;m_postvars[&#039;atksaveandclose&#039;]=1;&lt;br /&gt;
    return $handler-&amp;gt;action_update();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more documentation please see:&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.atk-framework.com/docs/atk/trunk/atk/atkNode.html#getFormButtons&lt;br /&gt;
&lt;br /&gt;
== Removing Actions ==&lt;br /&gt;
&lt;br /&gt;
=== Via &amp;lt;code&amp;gt;recordActions()&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
As shown above, a common way to add actions is via the &amp;lt;code&amp;gt;$actions&amp;lt;/code&amp;gt; array that is provided as an argument to, for example, the &amp;lt;code&amp;gt;recordActions()&amp;lt;/code&amp;gt;.  Actions can similarly be removed, by deleting values from this array.  For example, all actions can be removed from a node with the following &amp;lt;code&amp;gt;recordActions()&amp;lt;/code&amp;gt; method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function recordActions($record, &amp;amp;$actions, &amp;amp;$mraactions) {&lt;br /&gt;
    $actions = array();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Individual actions can also be removed by deleting the appropriate key:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function recordActions($record, &amp;amp;$actions, &amp;amp;$mraactions) {&lt;br /&gt;
    unset($actions[&#039;delete&#039;]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Via &amp;lt;code&amp;gt;allow()&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
= atkDataGrid Actions =&lt;br /&gt;
&lt;br /&gt;
== Adding actions ==&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$grid-&amp;gt;setDefaultActions(array(&lt;br /&gt;
  &amp;quot;view&amp;quot; =&amp;gt; dispatch_url(&amp;quot;projects.quote&amp;quot;, &amp;quot;view&amp;quot;, array(&amp;quot;atkselector&amp;quot; =&amp;gt; &amp;quot;[pk]&amp;quot;))&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These actions apply to all rows in the table; note that the &amp;quot;[pk]&amp;quot;, is essentially interpolated.  You may find an &amp;lt;code&amp;gt;atk_var_dump()&amp;lt;/code&amp;gt; of &amp;lt;code&amp;gt;$grid-&amp;gt;getDefaultActions()&amp;lt;/code&amp;gt;useful to see what actions are currently configured.&lt;br /&gt;
&lt;br /&gt;
== Removing actions ==&lt;br /&gt;
&lt;br /&gt;
Actions can be removed from an &amp;lt;code&amp;gt;[[atkDataGrid]]&amp;lt;/code&amp;gt; by using the &amp;lt;code&amp;gt;setDefaultActions()&amp;lt;/code&amp;gt; method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$grid-&amp;gt;setDefaultActions(array()); // remove all actions&lt;br /&gt;
$grid-&amp;gt;setDefaultActions(array_diff_key($grid-&amp;gt;getDefaultActions(),&lt;br /&gt;
                array(&amp;quot;delete&amp;quot; =&amp;gt; true))); // remove just the &amp;quot;delete&amp;quot; action&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>36.68.89.237</name></author>
	</entry>
</feed>