From: <de...@de...> - 2007-11-13 15:07:19
|
Author: MichaelDaum Date: 2007-11-13 09:07:20 -0600 (Tue, 13 Nov 2007) New Revision: 15574 Modified: twiki/branches/MAIN/twikiplugins/AutoViewTemplatePlugin/data/TWiki/AutoViewTemplatePlugin.txt twiki/branches/MAIN/twikiplugins/AutoViewTemplatePlugin/lib/TWiki/Plugins/AutoViewTemplatePlugin.pm Log: Item4904: * fixed use of uninitialized variable when reading the form name * fixed use of view tempaltes in sub webs * made detection of view template skin agnostic * some speed improvements * now computing an EDIT_TEMPLATE as well * clarified documentation hopefully Modified: twiki/branches/MAIN/twikiplugins/AutoViewTemplatePlugin/data/TWiki/AutoViewTemplatePlugin.txt =================================================================== --- twiki/branches/MAIN/twikiplugins/AutoViewTemplatePlugin/data/TWiki/AutoViewTemplatePlugin.txt 2007-11-13 12:54:01 UTC (rev 15573) +++ twiki/branches/MAIN/twikiplugins/AutoViewTemplatePlugin/data/TWiki/AutoViewTemplatePlugin.txt 2007-11-13 15:07:20 UTC (rev 15574) @@ -1,35 +1,61 @@ -%META:TOPICINFO{author="TWikiContributor" date="1111929255" format="1.0" version="$Rev: 11354 $"}% ----+ Auto View Template Plugin +%META:TOPICINFO{author="TWikiContributor" date="1194966209" format="1.1" reprev="1.2" version="$Rev$"}% +---+ <nop>AutoViewTemplatePlugin +%SHORTDESCRIPTION% -This Plugin sets the VIEW_TEMPLATE variable according to a corresponding form definition topic. +---++ Description +This plugin sets the VIEW_TEMPLATE and EDIT_TEMPLATE variables according to a +corresponding form definition. So when you attach a new form to a topic, this +plugin will enable the corresponding view/edit template automatically. This +comes in very handy for applications where users create new topics +without the help of a topic creator wizard, e.g. creating a new topic for a yet +non-existing <nop>TWikiWord. Together with the appropriate application +settings, this plugin will then assure that the data the user enters is handled +appropriately during view and edit. - * Mode "exist" (default): - * Topic =MyTopic= uses =MyForm=. - * When =MyTopic= gets rendered, this plugin looks for a =MyViewTemplate= and sets it as its view template. - * Mode "section": - * Topic =MyTopic= uses =MyForm=. - * =MyForm= contains a =viewtemplate= section whose only content is the name of a view template topic name - * When =MyTopic= gets rendered, that topic name is set as its view template. - -By default existing values for VIEW_TEMPLATE have priority. You can override this behaviour in =configure=. +There are two modes on how the name of the template is derived: + 1 =exist= (default) and + 1 =section=. ----++ Syntax Rules +---+++ Mode "exist" +A topic that has a =MyForm= <nop>TWikiForm attached to it, will be displayed +using the view template =MyViewTemplate= and editted using the =MyEditTempalte= +if they exist. The template name is derived by stripping off the suffix +=...Form= from the form name and appending =...View=. The TWiki engine will +then use the template name =MyView= to search for the correct template along +the template search path, for example using a topic =MyViewTemplate=. Remember +the engine appends yet another =...Template= to the name for templates stored +in topics. -(none) +---+++ Mode "section" +A topic with a =MyForm= will be displayed/editted using the template name +stored in the named section =viewtemplate/edittemplate= . For example given the +=MyForm= form definition topic contains a section =viewtemplate= whose only +content is =MyOtherView=, then this will be used to view the topic. Likewise, +the content of the =edittemplate= section in =MyForm= will read to find the +edit template. + +By default existing values for VIEW_TEMPLATE and EDIT_TEMPLATE have priority. +You can override this behaviour in =configure=. ---++ Plugin Installation Instructions * Just download the zip or tgz and unzip it into your twiki directory. * Plugin configuration is done via =configure=. +%$MANIFEST% ---++ Plugin Info - +<!-- + * Set SHORTDESCRIPTION = Automatically sets VIEW_TEMPLATE and EDIT_TEMPLATE +--> | Plugin Author: | TWiki:Main.OliverKrueger | | Copyright: | © 2007, !KontextWork, Germany | | License: | GPL ([[http://www.gnu.org/copyleft/gpl.html][GNU General Public License]]) | -| Plugin Version: | 04 Jun 2007 | +| Plugin Version: | 13 Nov 2007 | | Change History: | <!-- versions below in reverse order --> | +| 13 Nov 2007: | added EDIT_TEMPLATE, speed improvements, docu (MD) | +| 29 Oct 2007: | Item4904: made specification of view template skin agnostic, \ + fixed view templates in subwebs (MD) | | 04 Sep 2007: | Added build script and installer, minor doc changes | | 05 Jun 2007: | Initial version | | TWiki Dependency: | $TWiki::Plugins::VERSION 1.026 | @@ -40,6 +66,4 @@ | Feedback: | http://TWiki.org/cgi-bin/view/Plugins/%TOPIC%Dev | | Appraisal: | http://TWiki.org/cgi-bin/view/Plugins/%TOPIC%Appraisal | -__Related Topics:__ %TWIKIWEB%.TWikiPlugins - --- %TWIKIWEB%.TWikiContributor - 04 Jun 2007 +-- %TWIKIWEB%.TWikiContributor - 29 Oct 2007 Modified: twiki/branches/MAIN/twikiplugins/AutoViewTemplatePlugin/lib/TWiki/Plugins/AutoViewTemplatePlugin.pm =================================================================== --- twiki/branches/MAIN/twikiplugins/AutoViewTemplatePlugin/lib/TWiki/Plugins/AutoViewTemplatePlugin.pm 2007-11-13 12:54:01 UTC (rev 15573) +++ twiki/branches/MAIN/twikiplugins/AutoViewTemplatePlugin/lib/TWiki/Plugins/AutoViewTemplatePlugin.pm 2007-11-13 15:07:20 UTC (rev 15574) @@ -12,11 +12,13 @@ package TWiki::Plugins::AutoViewTemplatePlugin; use strict; -use vars qw( $VERSION $RELEASE $SHORTDESCRIPTION $debug $mode $override $pluginName $NO_PREFS_IN_TOPIC ); +use vars qw( $VERSION $RELEASE $SHORTDESCRIPTION + $debug $mode $override $isEditAction + $pluginName $NO_PREFS_IN_TOPIC ); $VERSION = '$Rev$'; $RELEASE = 'ipo'; -$SHORTDESCRIPTION = 'Sets VIEW_TEMPLATE according to the topic type'; +$SHORTDESCRIPTION = 'Automatically sets VIEW_TEMPLATE and EDIT_TEMPLATE'; $NO_PREFS_IN_TOPIC = 1; $pluginName = 'AutoViewTemplatePlugin'; @@ -24,7 +26,6 @@ sub initPlugin { my( $topic, $web, $user, $installWeb ) = @_; - my $viewTemplate = ""; # check for Plugins.pm versions if( $TWiki::Plugins::VERSION < 1.026 ) { @@ -33,68 +34,84 @@ } # get configuration - $debug = $TWiki::cfg{Plugins}{AutoViewTemplatePlugin}{Debug} || 0; - $mode = $TWiki::cfg{Plugins}{AutoViewTemplatePlugin}{Mode} || "exist"; + $debug = $TWiki::cfg{Plugins}{AutoViewTemplatePlugin}{Debug} || 0; + $mode = $TWiki::cfg{Plugins}{AutoViewTemplatePlugin}{Mode} || "exist"; $override = $TWiki::cfg{Plugins}{AutoViewTemplatePlugin}{Override} || 0; + + # is this an edit action? + $isEditAction = TWiki::Func::getContext()->{edit}; + my $templateVar = $isEditAction?'EDIT_TEMPLATE':'VIEW_TEMPLATE'; + + # back off if there is a view template already and we are not in override mode + my $currentTemplate = TWiki::Func::getPreferencesValue($templateVar); + return 1 if $currentTemplate && !$override; # get form-name my ( $meta, $text ) = TWiki::Func::readTopic( $web, $topic ); my $form = $meta->get("FORM"); - my $formname = $$form{"name"}; + my $formName = $form->{"name"} if $form; - if ( $formname ne "" ) { - TWiki::Func::writeDebug("- ${pluginName}: formfields detected ($formname)") if $debug; + # is it a structured topic? + return 1 unless $formName; + TWiki::Func::writeDebug("- ${pluginName}: formfields detected ($formName)") if $debug; - MODE: { - if ( $mode eq "section" ) { - $viewTemplate = _getTemplateFromSectionInclude( $formname, $topic, $web ); - last MODE; - } - if ( $mode eq "exist" ) { - $viewTemplate = _getTemplateFromTemplateExistence( $formname, $topic, $web ); - last MODE; - } + # get it + my $templateName = ""; + MODE: { + if ( $mode eq "section" ) { + $templateName = _getTemplateFromSectionInclude( $formName, $topic, $web ); + last MODE; } - - # only set the view_template if there is anything to set - if ( $viewTemplate ) { - my $currentTemplate = TWiki::Func::getPreferencesValue("VIEW_TEMPLATE"); - - if ( !$currentTemplate ) { - TWiki::Func::writeDebug("- ${pluginName}: VIEW_TEMPLATE set to: $viewTemplate") if $debug; - $TWiki::Plugins::SESSION->{prefs}->pushPreferenceValues( 'SESSION', { VIEW_TEMPLATE => $viewTemplate } ); - } else { - if ( $override ) { - TWiki::Func::writeDebug("- ${pluginName}: VIEW_TEMPLATE already set, overriding with: $viewTemplate") if $debug; - $TWiki::Plugins::SESSION->{prefs}->pushPreferenceValues( 'SESSION', { VIEW_TEMPLATE => $viewTemplate } ); - } else { - TWiki::Func::writeDebug("- ${pluginName}: VIEW_TEMPLATE not changed/set.") if $debug; - } - } + if ( $mode eq "exist" ) { + $templateName = _getTemplateFromTemplateExistence( $formName, $topic, $web ); + last MODE; } - } + } + + # only set the view template if there is anything to set + return 1 unless $templateName; + # in edit mode, try to read the template to check if it exists + if ($isEditAction && !TWiki::Func::readTemplate($templateName)) { + TWiki::Func::writeDebug("- ${pluginName}: edit tempalte not found") if $debug; + return 1; + } + + # do it + if ($debug) { + if ( $currentTemplate ) { + if ( $override ) { + TWiki::Func::writeDebug("- ${pluginName}: $templateVar already set, overriding with: $templateName"); + } else { + TWiki::Func::writeDebug("- ${pluginName}: $templateVar not changed/set."); + } + } else { + TWiki::Func::writeDebug("- ${pluginName}: $templateVar set to: $templateName"); + } + } + $TWiki::Plugins::SESSION->{prefs}->pushPreferenceValues( 'SESSION', { $templateVar => $templateName } ); + # Plugin correctly initialized return 1; } sub _getTemplateFromSectionInclude { - my $formname = $_[0]; + my $formName = $_[0]; my $topic = $_[1]; my $web = $_[2]; + + TWiki::Func::writeDebug("- ${pluginName}: called _getTemplateFromSectionInclude($formName, $topic, $web)") if $debug; - # add current webname, if formname is not fully qualified - if ( $formname !~ m/\./ ) { $formname = $web . "." . $formname; }; + my ($formweb, $formtopic) = TWiki::Func::normalizeWebTopicName($web, $formName); - my ($formweb, $formtopic) = TWiki::Func::normalizeWebTopicName("", $formname); - - # SMELL: This can be done must faster, if the formdefinition topic is read directly - my $viewTemplate = "%INCLUDE{ \"$formweb.$formtopic\" section=\"viewtemplate\"}%"; - $viewTemplate = TWiki::Func::expandCommonVariables( $viewTemplate, $topic, $web ); + # SMELL: This can be done much faster, if the formdefinition topic is read directly + my $sectionName = $isEditAction?'edittemplate':'viewtemplate'; + my $templateName = "%INCLUDE{ \"$formweb.$formtopic\" section=\"$sectionName\"}%"; + $templateName = TWiki::Func::expandCommonVariables( $templateName, $topic, $web ); # TODO: sanatize value - return $viewTemplate; + return $templateName; } @@ -104,16 +121,14 @@ my $topic = $_[1]; my $web = $_[2]; - # add current webname, if formname is not fully qualified - if ( $formName !~ m/\./ ) { $formName = $web . "." . $formName; }; - my ($templateWeb, $templateTopic) = TWiki::Func::normalizeWebTopicName("", $formName); + TWiki::Func::writeDebug("- ${pluginName}: called _getTemplateFromTemplateExistence($formName, $topic, $web)") if $debug; + my ($templateWeb, $templateTopic) = TWiki::Func::normalizeWebTopicName($web, $formName); my $templateName = $formName; - $templateName =~ s/Form$/ViewTemplate/; - - my $viewTemplate = TWiki::Func::topicExists( $templateWeb, $templateTopic ) ? $templateName : ""; - - return $viewTemplate; + $templateName =~ s/Form$//; + $templateName .= $isEditAction?'Edit':'View'; + + return $templateName; } 1; |