ViewModes
Question
How can I add the capacity to use view modes in PmWiki?
Answer
Install views.phpΔ to the cookbook folder and add to config.php
include_once("$FarmD/cookbook/views.php");
The script adds several tools to PmWiki:
$View
global variable?setview=
viewname cookie switcher?view=
viewname switcher(:if view viewname :)
conditional markup{$View}
page variable(:if !enabled views:)
conditional markup
These tools can be used by skin authors and administrators to add view mode features, which will give a user the choice to select from various views, to give the best skin and control interface for their current needs.
- See more on ModesConcept
- See View Modes Test Group for a practical implementation of this script.
View switching can be disabled by setting $EnableViewSwitching = 0;
in config.php, prior to loading the script.
View names included are:
- standard, for visitors, readers
- author, for authors, editors
- admin, for site administrators
- display, for visitors and readers without showing any editing controls
Other view names may be added.
These names may change still, as this is a first experimental release.
Details on usage:
$View global variable: this can be used in config.php to set the default view, in a skin.php for various conditional settings, or in a skin's template, for instance to load a skin config page via
<!--wiki:Site.ActionLinks-$View Site.ActionLinks-->
with a set of ActionLinks-standard, ActionLinks-author etc pages to give view-specific skin configuration.
?setview= viewname cookie switcher: Create action links to switch the view mode, like [[{$Name}?setview=author| Author view]]
(:if view viewname :) conditional markup: Use to display certain links etc if the view is selected.
{$View} page variable: Display the current view name in the page (or top bar, side bar, footer)
(:if !enabled views:) shows content only if the script is not installed.
Use for multi-language sites
Note: although the following instructions are correct, ViewModes has been evolved into the new multi-language recipe MultiLanguageViews, which is more specialised and better equipped for the purpose. - HansB
Redefine the $ViewList array, before including the script in config.php, like this:
$ViewList = array( 'en' => 'en', 'de' => 'de', 'gr' => 'gr', 'it' => 'it', ); $View = 'en'; //set default include_once("$FarmD/cookbook/views.php");
Then use conditionals in the page content like this:
(:if view en:) english text (:if view de:) deutscher Text ... (:if:) common text
In the sidebar, or header, put links for setting the language view:
[[{*$FullName}?setview=en| english]] [[{*$FullName}?setview=de| deutsch]]
Or instead of text links use little flag images to click on:
[[{*$FullName}?setview=en| Attach:Site/Site/flag-en.gif"english"]] [[{*$FullName}?setview=de| Attach:Site/Site/flag-de.gif"deutsch"]]
That takes care for multi language content. For changing the wiki interface language according to the language view add to conflig.php something like this, after including the views.php script:
if ($_COOKIE['view'] == 'de') { XLPage('de','Site.XLDePageCookbook'); XLPage('de','Site.XLDeLocalPage'); XLPage('de','Site.XLDePage'); } etc.
The default for pmwiki is English, so no XL page need to be specified for English. The XL translation term pages get loaded according to the cookie setting. Make sure you got them in the right locations.
Updates
- 2006-10-28: Added $RecipeInfo
- 13 January 2006: Added
$CookiePrefix
to avoid possible cookie conflicts.$CookiePrefix
is set in config.php to give a site unique cookie names. Changed{$View}
to be a page variable. - 31 August 2005: Added possibility to use (:if !enabled views:) to show content if script is not loaded.
- 9 August 2005: Changed 'stealth' to 'display'. Added $EnableViewSwitching. HansB
Notes
- This recipe was last tested on PmWiki version: 2.1.beta21
- This recipe requires at least PmWiki version: 2.1.beta15
For versions 2.0 to 2.1.beta14 replace
## add {$View} page variable $FmtPV['$View'] = '$GLOBALS["View"]';
with
## {$View} markup 'variable' replacement Markup('{$View}', '>{$fmt}', '/{\\$View}/e', "\$GLOBALS['View']");
See Also
- The group ViewModes/ for how this works in a practical example
Comments
I found that when I set $View = 'author';
in config.php, that I could not switch views even though view switching was enabled. But, if I changed it to SDV($View,'author');
, view switching worked. Bronwyn
include_once("FarmD/cookbook/views.php");
. - If you load views.php from a skin.php then you need to add a bunch of global declarations. ~HansB
I had the include before the $View declaration. Swapping them fixed it. Thanks! Bronwyn
Would be nice if ?setview=admin would only be allowed if you are auth as admin.Is there a way to do this ? Marc Seibert August 18, 2005, at 03:46 PM
(:if auth admin:)....(:if:)
to display admin stuff when logged in as admin. But be careful since we can't nest conditions within each other. - I am trying to think of yet another way... ~HansB
Views work by making the links available, and then authorizing if required. You want to do it the other way round. Since we can't currently do both in one step, give this a try:
- Create a page that requires the admin password to read it, e.g. PmWikiAdmin.Login. (As far as I know, you can't require the admin password per se, but you can certainly set the page's read password to match it.)
- In your sidebar, skin, or whatever, make a discreet admin login link that links to said page, e.g.
[[PmWikiAdmin.Login | Admin Login]]
- On PmWikiAdmin.Login, have something like,
(:if !auth admin:) %red%Somehow, you are not logged in as admin, even though you are reading this page. Did you change the admin password without changing this page's read password to match?%% (:if auth admin:) >>green<< You're now logged in as admin. [[Switch to admin view -> {$Name}?setview=admin]] >><< (:ifend:)
I find it both frustrating and amusing that people want to turn the concept of views inside out, but so long as it's not the default or the stated purpose, I'll not mind. Bronwyn
Is there a good way to have a block of content show if views are disabled, but not show when views are enabled? I tried (:if !view:)
which didn't work.
Bronwyn
$Views = 1; $Conditions['views'] = "\$GLOBALS['Views']==\$condparm";
(:if !views 1:)Views are not installed (:if:)
(:if !enabled View:)This content shows only if $View is not defined(:if:)
(:if enabled VARIABLE:)
is:
$Conditions['enabled'] = "(boolean)\$GLOBALS[\$condparm]";
Great! Could one of these be added to the views script? I see it being useful for a lot of people. I'd also make a small refinement for ease of use:
$Views = TRUE; $Conditions['views'] = "\$GLOBALS['Views']==\$condparm";
That way, it's more obvious that (:if !views TRUE:)Views are not installed (:if:)
. Or would that just cause confusion when people tried to use (:if !views true:)Views are not installed (:if:)
and it mysteriously didn't work?
Bronwyn
# show content if views are not installed with (:if !enabled views:) $views = 1; $Conditions['enabled'] = "(boolean)\$GLOBALS[\$condparm]";
(:if !enabled views:)Views are not installed!(:ifend:)
(:if enabled ... :)
, since $View may be defined in config.php, even though the views.php script may not be loaded. ~HansB
I have view modes working, except for the display of the current view using the variable in curly brackets {$View}. I just end up with the code displaying in the page. Otherwise, I can switch between modes just fine. What should I be looking for to fix this? ~StaceyM?
{$View}
is defined now as a page variable. You can define it instead with this markup:
## {$View} markup 'variable' replacement Markup('{$View}', '>{$fmt}', '/{\\$View}/e', "\$GLOBALS['View']");
I had been using the latest stable release 2.0.13 so upgraded to the beta 2.1.22. This fixed the problem with the display of the current view, but seemed to introduce new problems with my use of AuthUser and RequireAuthor, showing warnings for lines 478 and 1112 in pmwiki.php. So I may end up reverting back and using the replacement markup. Thanks.~StaceyM?
Contributors
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.