The generic form of the (:if:) directive is
(:if cond param:) body (:if:)
where "cond" names a condition to be tested from the $Conditions array, and "param" is a parameter or other argument held in $condparm in the test. For example, the following (in config.php) adds (:if group GroupName:) as a markup:
$Conditions['group'] = "FmtPageName('\$Group',\$pagename)==\$condparm";
One could then use the following markup:
(:if group PmWiki:) This text only appears in the group "[[PmWiki]]"(:if:)
The negated form of (:if:) is automatically handled as well, thus:
(:if ! group PmWiki:) This text appears everywhere *but* in group "[[PmWiki]]"(:if:)
Any (:if:) automatically terminates the previous one, thus markup can be easily cased:
(:if group PmWiki:) Do this in [[PmWiki]] group
(:if group Main:) Do something else for Main
(:if:) This happens in all groups
See also Cookbook:ExpandingMenus for an example to use this to create compact Sidebar menus.
All that remains now is to come up with a good set of $Conditions. Testing for group membership is a good one, we might also want to create something for generic pagename pattern matches
(:if match ^PmWiki\. :) Only appears in the [[PmWiki]] group
(:if match RecentChanges$ :) only on [[RecentChanges]] pages
(:if ! match ^(Main|PmWiki)\. :) All groups except Main and PmWiki
(:if:)again - all groups
There is an (:if auth ...:) conditional markup available for processing depending on the current authorizations in effect. For example, one can create a bullet list with
(:if auth read:)* [[View page -> {$Name}?action=browse]]
(:if auth edit:)* [[Edit page -> {$Name}?action=edit]]
(:if auth upload:)* [[Attachments -> {$Name}?action=upload]]
(:if auth attr:)* [[Page Attributes -> {$Name}?action=attr]]
(:if auth admin:)* You're logged in as admin
(:ifend:)
and only those items corresponding to the user's current authorizations will appear. This should be very useful in creating action buttons.
$Conditions could also be conditional on other items; e.g., date or time, day of week, etc.
The following are defined in pmwiki.php, so would not need to be defined in config.php:
$Conditions['false'] = 'false';
$Conditions['true'] = 'true';
$Conditions['group'] = "FmtPageName('\$Group',\$pagename)==\$condparm";
$Conditions['name'] = "FmtPageName('\$Name',\$pagename)==\$condparm";
$Conditions['match'] = 'preg_match("!$condparm!",$pagename)';
$Conditions['auth'] =
'@$GLOBALS["PCache"][$GLOBALS["pagename"]]["=auth"][trim($condparm)]';
$Conditions['authid'] = '@$GLOBALS["AuthId"] > ""';
$Conditions['attachments'] = "AttachExist(\$pagename)";
Suggested additional condition:
$Conditions['fullname'] = "FmtPageName('\$Group.\$Name',\$pagename)==\$condparm";
(This can be achieved with match, but it's not nearly as clean.)
$Conditions:(:if group GROUPNAME:) - display following text only, if group = specified groupname:
$Conditions['group'] = "FmtPageName('\$Group',\$pagename)==\$condparm";
(:if author AUTHORNAME:) - display following text only, if author = specified authorname:
$Conditions['author'] = "\$GLOBALS['Author']==\$condparm";
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.
(:if attachments:) - display following text only, if there any attachments to the actual page/group.
(:if enabled VARIABLE:) - display following text only, if VARIABLE 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:
$Conditions['enabled'] = "(boolean)\$GLOBALS[\$condparm]";
This is useful for instance to have a skin display something, which will be hidden in other skins, by setting a variable in the skin.php file to 1, and checking if the variable is set in the if condition.
what happens to these kind of things when someone looks at such a page and presses "Show Source"?
(:if ! auth admin:) code seen by other than admins (:if auth admin:) code seen by admins (:if:)
If someone views the HTML source in the browser, then the text isn't even there -- it's removed from the output entirely by the conditional markup.
However, if someone has read permission to the page and uses ?action=source, they'll see the entire source including the conditional markups. As per my earlier note, I think I'm going to take the position that PmWiki's smallest atom of security is the page, and not individual pieces of the page. In other words, (:if ...) is a useful way for suppressing parts of a page but not for protecting it. --Pm
See also: Cookbook:MultiLanguage
<< Special markups | PmWiki.Documentation Index | Markup master index >>