(:title Page specific variables:) (:description Documentation for "variables" that are associated with pages. :) (:Summary: variables that are associated with pages:) (:Audience: authors (intermediate) :) [[#desc]]This page describes the "variables" that are associated with pages. Page variables have the form @@{$''variable''}@@, and can be used in page markup or in certain formatting strings in PmWiki. For example, the markup "[@{$Group}@]" renders in this page as "{$Group}". Note: Do not confuse these variables (set and used only in PmWiki pages) with [[PmWiki/Variables|PHP variables]]. Page variables can be read in PHP with the [[Cookbook:Functions#PageVar|PageVar()]] function. Note that these variables do not necessarily exist in the PHP code, because they have to be determined for a specific page. (However, they are usable in [[FmtPageName]] strings.) There is also the form @@{''pagename''$''variable''}@@, which returns the value of the variable for another page. For example, "[@{MarkupMasterIndex$Title}@]" displays as "{MarkupMasterIndex$Title}". [[#specialreferences]] !! Special references Special referenced variables are used to specify the context of the [[variable(s)]] when: * the variable is [[PmWiki/IncludeOtherPages|included]] into a destination (target) page * the variable is used in a sidebar, header, or footer Prefixing the variable name with an asterisk (*) means the variable's value is related to the target page or main (body) page. * @@{'''[@*$@]'''PageVariablename}@@ - prefixed by an asterisk (*) - value reflects target page context Without the asterisk the variable's value is that in the page from which it originates, eg source page of include, sidebar, or header or footer. * @@{'''[@$@]'''PageVariablename}@@ - retains value in source page context -< See also $EnableRelativePageVars. -< Special references are also used in [[page text variables(#specialreferences)]] and [[page list templates(#specialreferences)]]. For example you can test to see if the page is part of another page (:markup:) (:if ! name {$FullName}:) %comment% name of this page is not the same as the page this text was sourced from ->[[{$FullName}#anchor | more ...]] (:ifend:) (:markupend:) or refer to the main page in a sidebar, footer, or header (:markup class=horiz:) This page is [[{*$FullName}]] (:markupend:) [[#specialreferencesend]] !! Default page variables The page variables defined for PmWiki are: ->[@{$Action}@] - page's url action argument, as in "{$Action}" ->[@{$BaseName}@] - page's "base" form (stripping any prefixes or suffixes defined via @@$BaseNamePatterns@@) as in "`{$BaseName}" ->[@{$DefaultGroup}@] - default group name, as in "{$DefaultGroup}" ->[@{$DefaultName}@] - name of default page, as in "`{$DefaultName}" ->[@{$Description}@] - page's description from the [@(:description:)@] markup, as in "{$Description}" ->[@{$FullName}@] - page's full name, as in "`{$FullName}" ->[@{$Group}@] - page's group name, as in "`{$Group}" ->[@{$Groupspaced}@] - spaced group name, as in "{$Groupspaced}" ->[@{$LastModified}@] - date page was edited, as in "{$LastModified}" ->[@{$LastModifiedBy}@] - page's last editor, as in "{$LastModifiedBy}" ->[@{$LastModifiedHost}@] - IP of page's last editor, as in "{$LastModifiedHost}" ->[@{$LastModifiedSummary}@] - Summary from last edit, as in "{$LastModifiedSummary}" ->[@{$LastModifiedTime}@] - time page was edited in unix-style timestamp, as in "{$LastModifiedTime}" -->This can be used (preceded by '@') in [[PmWiki.MarkupExpressions#ftime|[@{(ftime)}@]]] and other date/time markups. ->[@{$Name}@] - page name, as in "`{$Name}" ->[@{$Namespaced}@] - spaced page name, as in "{$Namespaced}" ->[@{$PageUrl}@] - page's url, as in "{$PageUrl}" ->[@{$PasswdRead}@] - "read" permissions for the page e.g. "{$PasswdRead}" ->[@{$PasswdEdit}@] - "edit" permissions for the page e.g. "{$PasswdEdit}" ->[@{$PasswdAttr}@] - "attr" permissions for the page e.g. "{$PasswdAttr}" ->[@{$RequestedPage}@] - page requested in URL, used on [[Site.PageNotFound]]. e.g. "{$RequestedPage}" ->[@{$SiteGroup}@] - default group name for e.g. RecentChanges, as in "{$SiteGroup}" ->[@{$Title}@] - page title (may differ from Name), as in "{$Title}" ->[@{$Titlespaced}@] - either the page title (if defined), or the spaced page name, as in "{$Titlespaced}" In addition to the above, there are some page-invariant variables available through this markup: ->[@{$Author}@] - the name of the person currently interacting with the site, as in "{$Author}" ->[@{$AuthId}@] - current authenticated id, as in "{$AuthId}" %red%note the lower case 'd'.%% ->[@{$Version}@] - PmWiki version, as in "{$Version}" ->[@{$VersionNum}@] - The internal version number, as in "{$VersionNum}" ->[@{$ScriptUrl}@] - The url to the pmwiki script, as in "{$ScriptUrl}" [[#security]] !! Page variable security ($authpage) The form @@{''pagename''$''variable''}@@ or some [[PageLists]], can display the values for other pages, regardless of the password protections. If the other pages are protected and the visitor has no read permissions, PageVariables, unlike [[PageTextVariables]], normally display the values. While most variables do not contain sensitive information, some of them could do: $Title, $Description and those starting with $LastModified. Administrators and module developers can redefine the sensitive page variables to respect authentications, by using the "$authpage" variable instead of "$page" in the definition. The following snippet can be added in local/config.php -- it will rewrite the default possibly sensitive definitions to the secure ones. [@ foreach($FmtPV as $k=>$v) { if(preg_match('/^\\$(Title(spaced)?|LastModified(By|Host|Summary|Time)?|Description)$/', $k)) $FmtPV[$k] = str_replace('$page', '$authpage', $v); } @] [[#custompv]] !! Custom page variables You may add custom page variables as a local customization. In a local configuration file or a recipe script, use the variable $FmtPV: ->[@ $FmtPV['$VarName'] = "'variable definition'"; $FmtPV['$CurrentSkin'] = '$GLOBALS["Skin"]'; $FmtPV['$WikiTitle'] = '$GLOBALS["WikiTitle"]'; @] Defines new Page Variable of name $CurrentSkin, which can be used in the page with [@{$CurrentSkin}@] (also for [[Conditional markup]]). It's necessary to use the single quotes nested inside double-quotes as shown above (preferred) or a double-quoted string nested inside single-quotes like ''[@'"this"'@]''. If you want to have a Page Variable that returns the currently used password (more precisely, the last password entered), you can use ->[@ $FmtPV['$AuthPw'] = 'reset(array_keys((array)@$_SESSION["authpw"]))'; @] !! See also * [[Cookbook:More custom page variables]] * [[PmWiki.Variables]] — about variables internal to PmWiki. * [[PmWiki.MarkupMasterIndex]] — complete list of PmWiki markups. * [[PmWiki/PageTextVariables]] — page variables automatically made available through natural page markup or explicit page markup within the wiki text of the page. * [[PmWiki.Markup Expressions]] — markup expressions can manipulate page variables >>faq<< [[#faq]] Q:Is there a variable like $LastModified, but which shows me the creation time? A:No, but you can create one in config.php. For instance: ->[@# add page variable {$PageCreationDate} in format yyyy-mm-dd $FmtPV['$PageCreationDate'] = 'strftime("%Y-%m-%d", $page["ctime"])';@] If you like the same format that you define in config.php with $TimeFmt use [@ $FmtPV['$Created'] = "strftime(\$GLOBALS['TimeFmt'], \$page['ctime'])"; @] Q: How can I test if a variable is set and/or not empty? A: Use @@ [=(:if ! equal "{$Variable}" "":) $Variable is not empty. (:ifend:)=]@@. Note that undefined/inexistent variables appear as empty ones.