ConditionalMarkupSamples
(:if key arguments:)
samples and definitions
PmWiki comes with a number of default conditions already defined. See Conditional Markup and also below. Other conditions can be added
by defining them in local/config.php
or another local customisation file.
Conditionals not defined in PmWiki
To use any of the following conditionals you need to add the definition to your config.php
or another local configuration file.
if action Defined in PmWiki from version 2.3.34
(:if equal "{$Action}" "browse":) Current action is "browse". (:else:) Current action is not "browse", it is "{$Action}". (:ifend:) | Current action is "browse". |
Create a 'action
' conditional, e.g. used to display following text only if a given action is in progress.
- Markup:
(:if action ACTION:)
(to check if ?action=ACTION is happening) - Definition:
$Conditions['action'] = '$GLOBALS["action"]==$condparm';
- Example: Add a 'View' item to Site.PageActions that only displays when we aren't currently performing that action.
(:if ( ! action browse ) :) * %item class=browse accesskey='$[ak_view]'%[[{$FullName} | $[View] ]] (:ifend:)
Note: you can use core condition (:if action browse,edit:)
instead of defining this one.
if attachexists Not defined in older versions; from PmWiki 2.2.77 use (:if attachments filename pagename:)
Displays following text only if the given file exists as an attachment. The single argument can be in the form "filename.ext", "directory/filename.ext" or "directory/pagename/filename.ext".
- Markup:
(:if attachexists filename.jpg:)
- upload files in Group/ subfolders:
(:if attachexists Group/myfile.doc:)
- upload files in Group/PageName subfolders:
(:if attachexists Group/PageName/myfile.doc:)
$Conditions['attachexists'] = 'UploadFileExist($pagename, $condparm)'; function UploadFileExist($pagename, $attachname) { global $UploadDir, $UploadPrefixFmt; $fname = explode("/", $attachname); $filename = end($fname); if(count($fname)==2) $pagename = MakePageName($pagename, $fname[0]); if(count($fname)==3) $pagename = MakePageName($pagename, $fname[0].".".$fname[1]); $uploaddir = FmtPageName("$UploadDir$UploadPrefixFmt", $pagename); $dirp = @opendir($uploaddir); if (!$dirp) return ''; $filelist = array(); while (($file=readdir($dirp)) !== false) { if ($file{0} == '.') continue; $filelist[$file] = $file; } closedir($dirp); return in_array($filename, $filelist); }
Alternative implementation
Displays following text only if the given file exists as an attachment. The single argument can be in the form "filename.ext
", "Group/filename.ext
" or "Group.Page/filename.ext
".
The difference between this and the above is that it's independent of your uploads folder structure, as the part of the argument before the "/
" is taken as a page name; if the attachment you're looking for would be found if you wrote Attach:filename.ext
on that page, it'll exist with this function as well. The default is to use the current page.
(:if attachexists filename.jpg:)
or (:if attachexists Page/filename.jpg:)
.Definition:
$Conditions['attachexists'] = "AttachFileExists(\$pagename,\$condparm)"; function AttachFileExists( $pagename, $path ) { global $UploadFileFmt; if (preg_match('!^(.*)/([^/]+)$!', $path, $match)) { $pagename = MakePageName($pagename, $match[1]); $path = $match[2]; } $upname = MakeUploadName($pagename,$path); $filepath = FmtPageName("$UploadFileFmt/$upname", $pagename); return file_exists($filepath); }
Alternative Wildcard implementation
Wildcards have been built in to the core's ConditionalMarkup since version 2.2.77, but the following code example may be helpful for those who want to write their own code involving wildcards: Wildcard attach exists.
if fileexists Not defined in PmWiki
- Markup:
(:if fileexists /path/to/file.jpg :)
to check if/path/to/file.jpg
exists on the file system. - Definition:
$Conditions['action'] = '$GLOBALS["action"]==$condparm';
$Conditions['fileexists'] = "CondFileExists(\$pagename, \$condparm)"; function CondFileExists($pagename, $condparm) { return count(glob($condparm)); }
- The path can be absolute -- starting with
/
or withC:/
-- or relative toindex.php
, e.g.uploads/{*$Group}/cover_pic.jpg
. - Page variables are processed earlier, so in the above example
{*$Group}
will be replaced with the current group name. - The path can include global patterns, where
*
means any character,?
means exactly one character, e.g.uploads/Main/*.jpg
(however for uploads, you can use the core conditional "if attachments"). - The path can point to any filesystem object, regular files, symbolic links, directories, hidden files, it it exists, the markup following the directive is processed.
if author Not defined in PmWiki
a) Displays following text only if author = specified authorname.
- Markup:
(:if author AUTHORNAME:)
- Definition:
$Conditions['author'] = "\$GLOBALS['Author']==\$condparm";
b) Displays following text only, if author within specified list of authors.
- Markup:
(:if author AUTHORNAME:)
(for a single author) - Markup:
(:if author AUTHORNAME,AUTHORNAME,...:)
(for an authorlist) - Definition:
$Conditions['author'] = 'preg_match("/".$GLOBALS["Author"]."/",$condparm)';
This will only work if Author is "logged on" or has already put his name into the author-field while editing a page, i.e. the global variable $Author
must be set. You can use only one of this author-condition-definition
if authgroup Not defined in PmWiki
Displays following text only if the viewer is currently authenticated in the given group. (ie. logged in, and a member of the given authorization group) via optional AuthUser authentication scheme.
- Markup:
(:if authgroup @groupname:)
or even(if authgroup id:sally)
- Definition:
$Conditions['authgroup'] = '$GLOBALS["AuthList"][$condparm] > 0';
if authuser Not defined in PmWiki
Displays following text only if the viewer is currently logged in with username 'NAME' via the optional AuthUser authentication module. Do not confuse this with PmWiki's (:if authid:)
, which returns true if user is logged in, but does not check the user name!
- Markup:
(:if authuser NAME:)
- Definition:
$Conditions['authuser'] = '$GLOBALS["AuthId"]==$condparm';
if existswc Not defined in PmWiki
Displays following text only if a given wildcard matches at least one existing pagename.
- Markup:
(:if existswc name_with_wildcard:)
- Definition:
$Conditions['existswc'] = "(boolean)ListPages(FixGlob(\$condparm, '$1*.$2'))";
Note, recent PmWiki versions support wildcards in the exists
conditional.
if fullname Not defined in PmWiki
Displays following text only if current fullname = specified fullname (GROUP.NAME).
- Markup:
(:if fullname GROUPNAME.PAGENAME:)
- Definition:
$Conditions['fullname'] =
"FmtPageName('\$Group.\$Name',\$pagename)==\$condparm";
You can also use (:if equal "{*$FullName}" "GROUPNAME.PAGENAME":)
if handler Not defined in PmWiki
Displays following text only if a given action is defined. This differs from (:if action ACTION:)
which only includes the text if the action is currently being executed. Note that this doesn't work for the diag
and phpinfo
actions, as they don't use the HandleActions dispatcher. Test for them with (:if enable EnableDiag:)
instead.
- Markup:
(:if handler ACTION:)
(to check if ACTION is a known action) - Definition:
$Conditions['handler'] = '(boolean)@$GLOBALS["HandleActions"][$condparm]';
- Example: Add a 'Del' item to Site.PageActions that only displays if the DeleteAction recipe is loaded.
(:if handler delete:) * %rel=nofollow% [[{$Name}?action=delete| $[Del] ]] (:ifend:)
if intext Not defined in PmWiki
Displays following text only if a given string exists in the page text. It does not look in markup directives of form (:...:)
. The optional second argument can be a page name, to check for presence of 'string' in that page, instead of the current page. Enclose any string which contain spaces in quotes: 'string with spaces'.
- Markup:
(:if intext 'string':)
or(:if intext 'string' Group.PageName:)
# add (:if intext 'string':) conditional $Conditions['intext'] = 'StringInText( $pagename, $condparm )'; function StringInText( $pn, $arg ) { $arg = ParseArgs($arg); if($arg[''][1]) $pn = MakePageName($pn, $arg[''][1]); $page = RetrieveAuthPage($pn, 'read', true); $text = preg_replace('/\\(:(.*?):\\)/' ,"", $page['text']); if( strpos($text, $arg[''][0])!==false ) return true; }
if link (or if category) Not defined in PmWiki
Displays following text only if a given link exists on the current page (i.e. if it is a "target link" on the current page). Useful to test whether the current page is in a specific category or not (use "Category.CategoryName" to test for [[!CategoryName]]
markup).
- Markup:
(:if link Group.PageName:)
# add (:if link 'Group.Pagename':) conditional $Conditions['link'] = 'IsTarget( $pagename, $condparm )'; function IsTarget( $pn, $arg ) { $arg = ParseArgs($arg); $pn2 = MakePageName($pn, $arg[''][0]); $page = RetrieveAuthPage($pn, 'read', true); if (in_array($pn2, (explode(',',@$page['targets'])))) return true; }
if matchstring Not defined in PmWiki
Displays following text only if a given string (best: in a pagetextvar) matches the given regular expression. Useful display sections e.g. in a pagelist-template according to some pagetextvar contents) KAL.
- Markup:
(:if matchstring '/regex/[modifier]' '$:pagetextvar':)
# add (:if matchstring '/regex/' '$:pagetextvar':) conditional $Conditions['matchstring'] = 'RegexCompareArgs($condparm) == 1'; function RegexCompareArgs($arg) { $arg = ParseArgs($arg); return preg_match(@$arg[''][0], @$arg[''][1]); }
In a pagelist-template you can use:
(:if matchstring '/(test|cest|rest)/' 'test':)if matchstring '/(test|cest|rest)/' 'test' is TRUE (:if matchstring '/(test|cest|rest)/' 'cest':)if matchstring '/(test|cest|rest)/' 'cest' is TRUE (:if matchstring '/(test|cest|rest)/' 'rest':)if matchstring '/(test|cest|rest)/' 'rest' is TRUE (:if matchstring '/(test|cest|rest)/' 'xest':)if matchstring '/(test|cest|rest)/' 'xest' should not be TRUE ! (:if matchstring '/(test|cest|rest)/i' 'REST':)if matchstring '/(test|cest|rest)/i' 'REST' is TRUE
if nopasswd Not defined in PmWiki
Displays following text only if the specified action for the specified page does not require users to be authorized.
- Markup:
(:if nopasswd ACTION [PAGENAME]:)
- Examples:
(:if nopasswd read:) This page is world-visible. (:ifend:)
(:if nopasswd edit Main.HomePage:) Main.HomePage can be edited by anyone. (:ifend:)
- Definition:
$Conditions['nopasswd'] = 'NoCache(CondNoPasswd($pagename, $condparm))'; function CondNoPasswd($pagename, $condparm) { global $HandleAuth; @list($level, $pn) = explode(' ', $condparm, 2); $pn = ($pn > '') ? MakePageName($pagename, $pn) : $pagename; if (@$HandleAuth[$level]>'') $level = $HandleAuth[$level]; $page = RetrieveAuthPage($pn, $level, false, READPAGE_CURRENT); if (!$page || empty($page['=passwd'])) return FALSE; $ra = $page['=passwd']['read']; return (empty($ra) || ((count($ra) == 1) && (reset($ra) == '@nopass'))); }
if recipe-loaded Not defined in PmWiki
Displays following text only if a given cookbook recipe is in use. The argument should be the name the recipe uses of itself, not its filename. This is most probably the same as its page name on pmwiki.org, but may also be found in the file itself: look for a row of text near the beginning that looks like $RecipeInfo['RECIPENAME']['Version'] = 'xxxx';
- Markup:
(:if recipe-loaded name:)
- Definition:
$Conditions['recipe-loaded'] = "isset(\$GLOBALS['RecipeInfo'][\$condparm])";
if time 0600..1800 Not defined in PmWiki
This condition enables parts of the page to be displayed if the current time is in the selected range. To install it, add to config.php
this code:
$Conditions['time'] = "CondTime(\$pagename, \$condparm)"; function CondTime($pagename, $condparm){ list($start, $end) = explode('..', $condparm); if(!$start) $start = '0000'; if(!$end) $end = '2400'; $now = strftime("%H%M"); if($now>=$start && $now <= $end) return 1; return 0; }In a wiki page, you can use:
(:if time 0600..1159:) it is between 6 AM and noon (:if time 1300..:) it is later than 1 PM (:if time ..1900:) it is earlier than 7 PM
if numcomp Not defined in PmWiki
This condition allows you to do numeric comparisons. (See ConditionalExtensions for another approach.) (Note that some of these are already possible within pmwiki.)
(:if numcomp $:val > 1:)$:val is greater than 1 (:if numcomp $:val >= 1:)$:val is greater than or equal to 1 (:if numcomp $:val < 1:)$:val is less than 1 (:if numcomp $:val <= 1:)$:val is less than or equal to 1 (:if numcomp $:val = 1:)$:val is equal to 1 (== is a synonym) (:if numcomp $:val != 1:)$:val is not equal to 1
$Conditions['numcomp'] = 'NumericCompareArgs($condparm) == 0'; function NumericCompareArgs($arg) { $arg = ParseArgs($arg); switch (@$arg[''][1]) { case '>': case '>': return !(@$arg[''][0] > @$arg[''][2]); break; case '>=': case '>=': return !(@$arg[''][0] >= @$arg[''][2]); break; case '<': case '<': return !(@$arg[''][0] < @$arg[''][2]); break; case '<=': case '<=': return !(@$arg[''][0] <= @$arg[''][2]); break; #case '>': case '!=': return !(@$arg[''][0] != @$arg[''][2]); break; #case '>': case '==': case '=': return !(@$arg[''][0] == @$arg[''][2]); break; default: echo "NumericCompare: ERROR: Unknown operator ".@$arg[''][1]."<br>\n"; return !(@$arg[''][0] == @$arg[''][2]); } }
Conditionals already defined in PmWiki
if attachments Defined in PmWiki
Displays following text only if current page/group has any attachments.
- Markup:
(:if attachments:)
- Definition:
$Conditions['attachments'] = "AttachExist(\$pagename)";
if auth Defined in PmWiki
Displays following text only if user has authenticated during the current browser session
- Markup:
(:if auth ACTION:)
(:if auth read:)
(:if auth edit:)
(:if auth attr:)
(:if auth admin:)
- Definition:
$Conditions['auth'] =
'@$GLOBALS["PCache"][$GLOBALS["pagename"]]["=auth"][trim($condparm)]';
if authid Defined in PmWiki
Displays following text only if user is authenticated, i.e. logged in with a valid user name and password via optional AuthUser authentication scheme. It does not check particular user names!
- Markup:
(:if authid:)
- Definition:
$Conditions['authid'] = '@$GLOBALS["AuthId"] > ""';
if date Defined in PmWiki
Displays following text only if current date matches date given or matches range given. Date or range given as 8 number datestring in form of yyyy-mm-dd or yyyymmdd. Range includes first and last date given.
- Markup:
(:if date DATE:)
or(:if date DATE1..DATE2:)
- Definition:
$Conditions['date'] = "CondDate(\$condparm)";
defined as special function in scripts/stdmarkup.php
.
if enabled Defined in PmWiki from pmwiki 2.1 beta1
Displays following text only, if VARIABLE is defined in config.php
, or a skin's php script is set to 1 or some string value. If set to zero (0), or not set, the condition is not true and the following text will not display.
- Markup:
(:if enabled VARIABLE:)
- Definition:
$Conditions['enabled'] = '(boolean)@$GLOBALS[$condparm]';
One use for skins: in order for a skin to display something, which will be hidden in other
skins, a variable can be set in the skin.php
file to 1, and the 'if enabled' markup checks if the variable is set.
if equal Defined in PmWiki from version 2.1.beta15
Displays following text only if string1 equals string2
- Markup:
(:if equal STRING1 STRING2:)
- Definition:
$Conditions['equal'] = 'CompareArgs($condparm) == 0';
function CompareArgs($arg) { $arg = ParseArgs($arg); return strcmp(@$arg[''][0], @$arg[''][1]); }
if exists Defined in PmWiki
Displays following text only if SomeGroup.SomeName exists.
- Markup:
(:if exists SomeGroup.SomeName:)
- Definition:
$Conditions['exists'] = 'CondExists($condparm)';
- You can use wildcards in the name argument, like
if exists Main.*
This conditional is case-insensitive by default, e.g. if only the page "WikiSandbox" exists, it will return true if questioned for "Wikisandbox" or "WikiSandBox". If you need a case-sensitive conditional, you can either modify the existing one, or create a new one, in config.php
:
# Either make "if exists" case-sensitve: $Conditions['exists'] = 'CondExists($condparm, false)'; # Or add "if csexists" case-sensitve exists: $Conditions['csexists'] = 'CondExists($condparm, false)';
if false Defined in PmWiki
This condition is always false, following text including markup will not be displayed.
- Markup:
(:if false:)
- Definition:
$Conditions['false'] = 'false';
if group Defined in PmWiki
Displays following text only if current group = specified groupname.
- Markup:
(:if group GROUPNAME:)
- Definition:
$Conditions['group'] =
"FmtPageName('\$Group',\$pagename)==\$condparm";
if match Defined in PmWiki
Displays following text only if current page matches the regular expression.
- Markup:
(:if match REG_EXPRESSION:)
- Definition:
$Conditions['match'] =
'preg_match("!$condparm!",$pagename)';
if name Defined in PmWiki
Displays following text only if current name = specified pagename.
- Markup:
(:if name PAGENAME:)
- Definition:
$Conditions['name'] = "FmtPageName('\$Name',\$pagename)==\$condparm";
if ontrail Defined in PmWiki
Displays following text only if PAGENAME is on TRAILNAME page specified, see WikiTrails. PAGENAME is optional: if missing, it defaults to the current page.
- Markup:
(:if ontrail TRAILNAME PAGENAME:)
- Example:
(:if ontrail Main.Trips 2010.Italy:)
(defined in scripts/trails.php
)
if true Defined in PmWiki
This condition is always true, following text including markup will always be displayed.
- Markup:
(:if true:)
- Definition:
$Conditions['true'] = 'true';
Note
Do not use conditional markup to hide security sensitive content. Although portions of a page can be suppressed, they cannot be protected. You will need to protect the entire page instead.
-- Instead, consider creating the security-sensitive content in a separate page and including it, while security that other page. BenWilson January 20, 2006, at 11:52 AM
If someone has read permission to the page and uses ?action=source, they'll see the entire source including the conditional markups.
- So, then set the 'source' permissions to the 'edit' level. This will mean that source is only viewable to those who can edit the page, and read-only permissions are insufficient to view source. BenWilson April 12, 2007, at 08:37 AM
Please read http://thread.gmane.org/gmane.comp.web.wiki.pmwiki.user/30109/focus=30122 if you have problems with (:if action...:)
Luigi 13 September 2006
See also
- Cookbook:MultiLanguage Display content in different languages on a page by user's choice
- Conditional Markup The if directive allows portions of a page to be included or excluded from rendering
- More custom page variables Additional custom page variables for use in pages, forms, includes and conditional markup.
- PITS.00707 - Add conditional markup to detect if text is included
- PITS.01087 - Extend Conditional Markup
(:if attachments:)
to specify file names - Conditional Extensions - A Conditional Markup extension for PmWiki 2.x
Contributors
Comments
See discussion at ConditionalMarkupSamples-Talk
User notes? : If you use, used or reviewed this recipe, you can add your name. These statistics appear in the Cookbook listings and will help newcomers browsing through the wiki.