DokuWiki

It's better when it's simple

User Tools

Site Tools


plugin:function

function Plugin

Compatible with DokuWiki

Angua, Binky, Hrun

plugin Run a php function from a set of configured functions

Last updated on
2013-06-08
Provides
Syntax
Repository
Source

This extension has not been updated in over 2 years. It may no longer be maintained or supported and may have compatibility issues.

Similar to phpinc

Tagged with php

This plugin will run a specified php function from a set of php functions configured for use with this plugin.

Installation

Search and install the plugin using the Extension Manager. Refer to Plugins on how to install plugins manually.

Examples/Usage

Two sample functions are included called /functions/helloWorld.php and /functions/anotherhelloWorld.php. To use add the following plugin syntax to a wiki page. No configuration changes are needed to run the sample.

<function=file2?0=That's&1=All&2=Folks!&num=3>
<function=file3>
<function=file2?0=That's&1=All&2=Folks!&num=3>

The example passes 4 parameters to the invoked function, invokes a different function with no parameters, and then calls the first function again.

Parameters are passed as array elements. The example shows how the invoked function typecasts the last parameter to be used as an integer.

Parameters are not required. The simplest usage is to invoke a function with no parameters.

Examples can be seen at Plugin Examples Site

Syntax

Basic syntax:

<function=name>
  • name — pick a name from the /conf/default.php file
  • ?parameter_name=value_1&parameter_name_x=value_x (optional parameters)

Use of <function=name> is all that is required. If your function requires parameters these can be supplied by using a “?” after the function name and providing the parameters as id=value. Parameters are separated by a “&” symbol.

Configuration and Settings

  1. Add a file containing the php function into the /functions folder. The main function must be called defined as
$thisfunction = function($params) {
                .....
            };
       
  1. Add a configuration parameter in /conf/default.php that contains a name to identify the function file and set it equal to the name of the file. No path information is required.
  2. You can add a function description in /lang/../settings.php. This will show up in the admin configuration panel for the plugin.

Development

Change Log

Known Bugs and Issues

None

ToDo/Wish List

None

FAQ

None

Discussion

An example would be useful. What is this plugin for? What can you do with it? What's the advantage of calling a named php function? Is this just a different way to make a syntax plug-in, for people who know php but don't want to learn the dokuwiki syntax? – Zioth

I often want to run php to query a database and output the result. These queries sometimes involve other functionality that would not be handled by the generic database plugins available. I would not want to write a plugin for each type of query I run. Also for security reasons I am reluctant to allow php to be executed on a wiki page. The phpinc plugin was close to providing this functionality but it appears to have some security issues and states that it is no longer supported. With this function plugin I can easily and I believe securely connect a php function to run on a wiki page. If the php functions are general in functionality they could be documented on the wiki for use by the users.

I provided a simplified example as the function I am running involves interfacing with a database with specific tables. If I create a function better suited as an example I will provide it. Best regards – tom_c

I noticed a problem when I was using two different functions on a single page. The run() declaration was already defined when it hit the second function call. I was able to solve this by using variable function declarations. Here is the updated render function in syntax.php and the function declaration in the example helloworld.php

    function render($mode, &$renderer, $indata) {
        global $conf;
        if($mode == 'xhtml'){
          list($state, $data) = $indata;
 
          switch ($state) {
            case DOKU_LEXER_SPECIAL :
              preg_match("#^<function=(.+)>$#", $data, $matches);
              $func = $matches[1];
              $a = explode('?', $func);
              $func = $a[0];
              if (!empty($a[1])) { parse_str($a[1], $params); }
              else { $params = ''; }
              if(preg_match("#^[a-z0-9\-_ \./]+$#i", $func)) {
                    $renderer->info['cache'] = FALSE;
                    $filename = DOKU_PLUGIN . 'function/functions/' . $this->getConf($func);
                    include ($filename);
                    $renderer->doc .= $thisfunction($params);
              }
              else
                    $renderer->doc .= $renderer->_xmlEntities($data);
              break;
 
          }
          return true;
        }
 
        // unsupported $mode
        return false;
    } 
$thisfunction = function($params) {
    // Create output data
    $dataout='<p class="cellGreen">Hello World!</p>';
 
    $num=(int)$params['num'];
    $dataout .= ' The '.($num+1).' parameters were the number '.$num .' preceded by <br />';
    foreach ($params AS $key=>$val){
        if ($val != $num) $dataout.=$val.'<br />';
    }
	return $dataout;
};

Using a variable to hold the function allows it to be overwritten for each function declaration. – millsdude

Millsdude, thanks for this update! It works real nice. I incorporated it into the release. – tom_c

It may be worth noting that, although DokuWiki itself requires only PHP version 5.2, the function plugin seems to require a more recent version. The plugin makes use of anonymous function variable assignment, a capability introduced in PHP version 5.3. – areeves

plugin/function.txt · Last modified: 2018-05-31 00:16 by Klap-in

Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Share Alike 4.0 International
CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki