====== Actionlink Plugin ====== ---- plugin ---- description: This plugin lets you use actionlinks in your wiki syntax. It's based on the DokuWiki's core function tpl_actionlink(). author : nowotny email : nowotnypl@gmail.com type : syntax lastupdate : 2018-02-04 compatible : Anteater, Rincewind, Angua, Adora Belle, Weatherwax, Binky, Ponder Stibbons, Hrun, Detritus, Elenor of Tsort, Frusterick Manners depends : conflicts : similar : tags : links, actions downloadurl: https://github.com/chang-zhao/actionlink/archive/master.zip bugtracker : https://github.com/chang-zhao/actionlink/issues sourcerepo : https://github.com/chang-zhao/actionlink donationurl: ---- ---- | **Not compatible with PHP 8.1** \\ Error message: \\ 2023-03-24 06:34:37dokuwiki\Exception\FatalException: Array and string offset access syntax with curly braces is no longer supported \\ /.../lib/plugins/actionlink/syntax.php(179) \\ **Workaround:** Use [[:tips:links-to-dokuwiki-commands|Links to DokuWiki commands]] instead. | ---- :!: When building actionlinks for 'admin', 'login' etc. don't forget %%~~NOCACHE~~%% ===== Syntax ===== Basic syntax: {{actionlink>[action]|[title]}} Where **action** can be one of this (after ''inc/template.php''): * edit - edit/create/show * history - old revisions * recent - recent changes * :recent, /recent - recent changes from the root namespace * login - login/logout - if ACL enabled * index - the index * admin - admin page - if enough rights * top - a 'back to top' link * back - a 'back to parent' link - if available * backlink - list of backlinks * search - focus on the search field * purge * subscribe * addtobook * cite * infomail * export_odt * export_pdf (Of course, for these last commands to work, those plugins should be installed.) The **title** element is optional. It lets you specify a custom string to be used instead of the default 'Edit this page', 'Old revisions', 'Recent changes', etc. ==== Examples ==== For example, syntax like this: You can easily {{actionlink>edit|customise}} this page. Will produce an output like this: 'You can easily customise this page', where 'customise' is a link to the 'Edit page' page.\\ \\ Syntax like this: {{actionlink>edit}} Will simply create a 'Edit this page' link. ===== Installation ===== Search and install the plugin using the [[plugin:extension|Extension Manager]]. Refer to [[:Plugins]] on how to install plugins manually. Sources: [[http://mbot.ovh.org/plugin-actionlink-2005-05-26.tar.gz|plugin-actionlink-2005-05-26.tar.gz(2kb)]] | [[http://mbot.ovh.org/plugin-actionlink-2005-05-26.zip|plugin-actionlink-2005-05-26.zip(2kb)]] https://github.com/chang-zhao/actionlink To install manually: create a folder ''actionlink'' in ''lib/plugins'' and put the code below in ''syntax.php''. The last version see here: https://github.com/chang-zhao/actionlink/blob/master/syntax.php * @author Matthias Grimm * @author nowotny */ if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); require_once(DOKU_PLUGIN.'syntax.php'); class syntax_plugin_actionlink extends DokuWiki_Syntax_Plugin { function getInfo(){ return array( 'author' => 'nowotny', 'email' => 'nowotnypl@gmail.com', 'date' => '2006-05-26', 'name' => 'Actionlink plugin', 'desc' => 'Actionlink plugin lets you use action links in your wiki syntax. Basic syntax: {{actionlink>action|title}}', 'url' => 'http://www.dokuwiki.org/plugin:actionlink', ); } function getType(){ return 'substition'; } function getSort(){ return 306; } function connectTo($mode) { $this->Lexer->addSpecialPattern('\{\{actionlink>.+?\}\}',$mode,'plugin_actionlink'); } function handle($match, $state, $pos, &$handler){ $match = substr($match,13, -2); $matches=explode('|', $match, 2); return array('action'=>hsc($matches[0]),'title'=>hsc($matches[1])); } function render($mode, &$renderer, $data){ if($mode == 'xhtml'){ if(!empty($data['action'])) $action=$data['action']; else $action=''; if(!empty($data['title'])) $title=$data['title']; global $ID; global $INFO; global $REV; global $ACT; global $conf; global $lang; global $auth; switch($action){ case 'edit': #most complicated type - we need to decide on current action if($ACT == 'show' || $ACT == 'search'){ if($INFO['writable']){ if($INFO['exists']){ if(!isset($title)) $title=$lang['btn_edit']; $renderer->doc .=$this->tpll_link(wl($ID,'do=edit&rev='.$REV), $title, 'class="action edit" accesskey="e" rel="nofollow"'); }else{ if(!isset($title)) $title=$lang['btn_create']; $renderer->doc .=$this->tpll_link(wl($ID,'do=edit&rev='.$REV), $title, 'class="action create" accesskey="e" rel="nofollow"'); } }else{ if(!isset($title)) $title=$lang['btn_source']; $renderer->doc .=$this->tpll_link(wl($ID,'do=edit&rev='.$REV), $title, 'class="action source" accesskey="v" rel="nofollow"'); } }else{ if(!isset($title)) $title=$lang['btn_show']; $renderer->doc .=$this->tpll_link(wl($ID,'do=show'), $title, 'class="action show" accesskey="v" rel="nofollow"'); } return true; case 'history': if(!isset($title)) $title=$lang['btn_revs']; $renderer->doc .=$this->tpll_link(wl($ID,'do=revisions'),$title,'class="action revisions" accesskey="o"'); return true; case 'recent': if(!isset($title)) $title=$lang['btn_recent']; $renderer->doc .=$this->tpll_link(wl($ID,'do=recent'),$title,'class="action recent" accesskey="r"'); return true; case 'index': if(!isset($title)) $title=$lang['btn_index']; $renderer->doc .=$this->tpll_link(wl($ID,'do=index'),$title,'class="action index" accesskey="x"'); return true; case 'top': if(!isset($title)) $title=$lang['btn_top']; $renderer->doc .= ''.$title.''; return true; case 'back': if ($ID = tpl_getparent($ID)) { if(!isset($title)) $title=$lang['btn_back']; $renderer->doc .=$this->tpll_link(wl($ID,'do=show'),$title,'class="action back" accesskey="b"'); return true; } return false; case 'login': if($conf['useacl']){ if($_SERVER['REMOTE_USER']){ if(!isset($title)) $title=$lang['btn_logout']; $renderer->doc .=$this->tpll_link(wl($ID,'do=logout'),$title,'class="action logout"'); }else{ if(!isset($title)) $title=$lang['btn_login']; $renderer->doc .=$this->tpll_link(wl($ID,'do=login'),$title,'class="action logout"'); } return true; } return false; case 'admin': if($INFO['perm'] == AUTH_ADMIN){ if(!isset($title)) $title=$lang['btn_admin']; $renderer->doc .=$this->tpll_link(wl($ID,'do=admin'),$title,'class="action admin"'); return true; } return false; case 'backlink': if(!isset($title)) $title=$lang['btn_backlink']; $renderer->doc .=$this->tpll_link(wl($ID,'do=backlink'),$title, 'class="action backlink"'); return true; default: if(!isset($title)) $title=''; $renderer->doc .= $title; return true; } } return false; } function tpll_link($url,$name,$more=''){ $link=' extended version with some plugins: * @author Matthias Grimm * @author nowotny */ if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); require_once(DOKU_PLUGIN.'syntax.php'); require_once(DOKU_INC.'inc/template.php'); //mod class syntax_plugin_actionlink extends DokuWiki_Syntax_Plugin { function getInfo(){ return array( 'author' => 'nowotny', 'email' => 'nowotnypl@gmail.com', 'date' => '2006-05-26', 'name' => 'Actionlink plugin', 'desc' => 'Actionlink plugin lets you use action links in your wiki syntax. Basic syntax: {{actionlink>action|title}}', 'url' => 'http://wiki.splitbrain.org/plugin:actionlink', ); } function getType(){ return 'substition'; } function getSort(){ return 306; } function connectTo($mode) { $this->Lexer->addSpecialPattern('\{\{actionlink>.+?\}\}',$mode,'plugin_actionlink'); } function handle($match, $state, $pos, &$handler){ $match = substr($match,13, -2); $matches=explode('|', $match, 2); return array('action'=>hsc($matches[0]),'title'=>hsc($matches[1])); } function render($mode, &$renderer, $data){ if($mode == 'xhtml'){ if(!empty($data['action'])) $action=$data['action']; else $action=''; if(!empty($data['title'])) $title=$data['title']; global $ID; global $INFO; global $REV; global $ACT; global $conf; global $lang; global $auth; switch($action){ case 'edit': #most complicated type - we need to decide on current action if($ACT == 'show' || $ACT == 'search'){ if($INFO['writable']){ if($INFO['exists']){ if(!isset($title)) $title=$lang['btn_edit']; $renderer->doc .=$this->tpll_link(wl($ID,'do=edit&rev='.$REV), $title, 'class="action edit" accesskey="e" rel="nofollow"'); }else{ if(!isset($title)) $title=$lang['btn_create']; $renderer->doc .=$this->tpll_link(wl($ID,'do=edit&rev='.$REV), $title, 'class="action create" accesskey="e" rel="nofollow"'); } }else{ if(!isset($title)) $title=$lang['btn_source']; $renderer->doc .=$this->tpll_link(wl($ID,'do=edit&rev='.$REV), $title, 'class="action source" accesskey="v" rel="nofollow"'); } }else{ if(!isset($title)) $title=$lang['btn_show']; $renderer->doc .=$this->tpll_link(wl($ID,'do=show'), $title, 'class="action show" accesskey="v" rel="nofollow"'); } return true; case 'history': if(!isset($title)) $title=$lang['btn_revs']; $renderer->doc .=$this->tpll_link(wl($ID,'do=revisions'),$title,'class="action revisions" accesskey="o"'); return true; case 'recent': if(!isset($title)) $title=$lang['btn_recent']; $renderer->doc .=$this->tpll_link(wl($ID,'do=recent'),$title,'class="action recent" accesskey="r"'); return true; case 'index': if(!isset($title)) $title=$lang['btn_index']; $renderer->doc .=$this->tpll_link(wl($ID,'do=index'),$title,'class="action index" accesskey="x"'); return true; case 'top': if(!isset($title)) $title=$lang['btn_top']; $renderer->doc .= ''.$title.''; return true; case 'back': if ($ID = tpl_getparent($ID)) { if(!isset($title)) $title=$lang['btn_back']; $renderer->doc .=$this->tpll_link(wl($ID,'do=show'),$title,'class="action back" accesskey="b"'); return true; } return false; case 'login': if($conf['useacl']){ if($_SERVER['REMOTE_USER']){ if(!isset($title)) $title=$lang['btn_logout']; $renderer->doc .=$this->tpll_link(wl($ID,'do=logout'),$title,'class="action logout"'); }else{ if(!isset($title)) $title=$lang['btn_login']; $renderer->doc .=$this->tpll_link(wl($ID,'do=login'),$title,'class="action logout"'); } return true; } return false; case 'admin': if($INFO['perm'] == AUTH_ADMIN){ if(!isset($title)) $title=$lang['btn_admin']; $renderer->doc .=$this->tpll_link(wl($ID,'do=admin'),$title,'class="action admin"'); return true; } return false; case 'backlink': if(!isset($title)) $title=$lang['btn_backlink']; $renderer->doc .=$this->tpll_link(wl($ID,'do=backlink'),$title, 'class="action backlink"'); return true; case 'purge': // {{actionlink>purge|Purge}} if(!isset($title)) $title=$lang['btn_purge']; $renderer->doc .=$this->tpll_link(wl($ID,'purge=true'),$title, 'class="action purge"'); return true; case 'subscribe': //mod if(!isset($title)) $title=$lang['btn_subscribe']; $renderer->doc .=$this->tpll_link(wl($ID, array("do"=>"subscribe"), false, "&"),$title,'class="action subscribe"'); return true; case 'addtobook': //mod if(!isset($title)) $title=$lang['btn_addtobook']; $renderer->doc .=$this->tpll_link(wl($ID, array("do"=>"addtobook"), false, "&"),$title,'class="action addtobook"'); return true; case 'cite': //mod if(!isset($title)) $title=$lang['btn_cite']; $renderer->doc .=$this->tpll_link(wl($ID, array("do"=>"cite"), false, "&"),$title,'class="action cite"'); return true; case 'infomail': //mod if(!isset($title)) $title=$lang['btn_infomail']; $renderer->doc .=$this->tpll_link(wl($ID, array("do"=>"infomail"), false, "&"),$title,'class="action infomail"'); return true; case 'export_odt': //mod if(!isset($title)) $title=$lang['btn_export_odt']; $renderer->doc .=$this->tpll_link(wl($ID, array("do"=>"export_odt"), false, "&"),$title,'class="action export_odt"'); return true; case 'export_pdf': //mod if(!isset($title)) $title=$lang['btn_export_pdf']; $renderer->doc .=$this->tpll_link(wl($ID, array("do"=>"export_pdf"), false, "&"),$title,'class="action export_pdf"'); return true; default: if(!isset($title)) $title=''; $renderer->doc .= $title; return true; } } return false; } function tpll_link($url,$name,$more=''){ $link=' ====== Discussion ====== This is my first DokuWiki plugin ever, so please, be gentle ;-) --- //[[nowotnypl@gmail.com|nowotny]] 2006-05-26// > Wouldn't it be easier to call tpl_actionlink and capture the output? \\ e.g. ob_start(); tpl_actionlink(...); $renderer->doc .= ob_get_clean(); --- //[[chris@jalakai.co.uk|Christopher Smith]] 2006-05-26 15:54// >>Probably... but you wouldn't be able to change the 'title'(caption...? whatever you call it... :-) ). --- //[[nowotnypl@gmail.com|nowotny]] 2006-05-26 19:17// >>> Fair enough. There are a couple of ways you could do it, but point taken. :-) --- //[[chris@jalakai.co.uk|Christopher Smith]] 2006-05-28 14:28// You can (now? or always possible?) set the linktext via the tpl_actionlink-function. Exchange the following code with the original render-function an you benefit to all changes in the tpl_actionlink function function render($mode, &$renderer, $data) { if($mode == 'xhtml') { if(!empty($data['title'])) $title=$data['title']; if(!empty($data['action'])) { $action=$data['action']; } else { if(!isset($title)) $title=''; $renderer->doc .= $title; return true; } if(isset($title)) { ob_start(); tpl_actionlink($action,'','',$title); $renderer->doc .= ob_get_clean(); } else { ob_start(); tpl_actionlink($action); $renderer->doc .= ob_get_clean(); } return true; } return false; } --- //[[Timo.Falk@gmx.de|Silbär]] 2008-05-06 15:34// >> I'm new to all this, but what would the syntax be when changing the tpl_actionlink function code? --- //[[techsyn@cablene.com|Randy]] 2008-12-14// > The feed.php page returns a missing function error unless inc/template.php is included at the top of the plugin code, otherwise, great little plugin. Thanks! require_once(DOKU_INC.'inc/template.php'); --- //[[sunny@poeticpublishing.com|sunny]] 2006-08-17// Not sure if this plugin is still maintained but is it possible to add a manual link to the search function in this plugin too? ===== Purge ===== to add purge, I put following in front of the "default:" fallback: case 'purge': if(!isset($title)) $title=$lang['btn_purge']; $renderer->doc .=$this->tpll_link(wl($ID,'purge=true'),$title, 'class="action purge"'); return true; --- //[[http://www.unixwitch.de|Hella]] 2006-10-26// ===== Problem with recent changes ===== > I got a small problem with actionlink>recent (with httaccess rewrite) : it keeps the current page in the URL, resulting in a partial recent changes (it is limited to the current namespace). E.g. on the page ''%%http://mydokuwiki.com/namespace/page%%'', ''%%{{actionlink>recent}}%%'' points to ''%%http://mydokuwiki.com/namespace/page?do=recent%%'', which show recent changes only for the ''%%namespace%%'' namespace. This also cause the actionlink>index to unwrap the current namespace, but this is less of a problem. >-- Fousage Will this become fixed? Dakkar > This situation happens to me as well. I don't want to change the code, but do you have any solution for this? Something like this would be great: ''%%{{actionlink>:recent|Recent Changes}}%%'' in this way, we could use the actions for the namespaces. -- Luis Nabais ===== subscribe-unsubscribe link ===== > Is there any way to implement subscription link with this plugin?. Thanks. > [[anestesiadorhvs@yahoo.es|Manuel Munoz]] Insert this code into the function "**render**" : case 'subscribe': if(!isset($title)) $title=$lang['btn_subscribe']; $renderer->doc .=$this->tpll_link(wl($ID, array("do"=>"subscribe"), false, "&"),$title,'class="action subscribe"'); return true; [[sandyanf@gmail.com|SandyANF]] ===== use NOCACHE ===== When building actionlinks for 'admin', 'login' etc. dont forget\\ \\ %%~~NOCACHE~~%%\\ \\ otherwise (ha!) the page will be cached with authentication infos of the last user editing the page. Maybe other actions depend on **not being cached** too...