[interchange-cvs] interchange - heins modified lib/Vend/Menu.pm

interchange-core@icdevgroup.org interchange-core@icdevgroup.org
Sun Dec 8 01:13:01 2002


User:      heins
Date:      2002-12-08 06:12:59 GMT
Modified:  lib/Vend Menu.pm
Log:
A number of refinements to Menu module.

* Passing timed=1 to [menu ...] tag prevents putting session ID and
  count in URL, allowing timed-build to work well.

* first_line and last_line transforms allow you to specify a field
  to set to trigger the first line or the last line of the menu.
  This allows the current IC menu structures to work well with
  menus separated by space.

* logical_page feature allows a tab "up" indication in another
  menu, based on the page of the entry. This allows multi-level
  tabs to have an "up" indication on different menus.

* expand_values_form allows setting of ITL tag values even
  on multiple form values.  Honors [cgi ..], [value ..], and [var ..].

Revision  Changes    Path
2.20      +124 -8    interchange/lib/Vend/Menu.pm


rev 2.20, prev_rev 2.19
Index: Menu.pm
===================================================================
RCS file: /var/cvs/interchange/lib/Vend/Menu.pm,v
retrieving revision 2.19
retrieving revision 2.20
diff -u -r2.19 -r2.20
--- Menu.pm	8 Dec 2002 05:20:24 -0000	2.19
+++ Menu.pm	8 Dec 2002 06:12:59 -0000	2.20
@@ -1,6 +1,6 @@
 # Vend::Menu - Interchange payment processing routines
 #
-# $Id: Menu.pm,v 2.19 2002/12/08 05:20:24 mheins Exp $
+# $Id: Menu.pm,v 2.20 2002/12/08 06:12:59 mheins Exp $
 #
 # Copyright (C) 2002 Mike Heins, <mike@perusion.net>
 #
@@ -21,12 +21,16 @@
 
 package Vend::Menu;
 
-$VERSION = substr(q$Revision: 2.19 $, 10);
+$VERSION = substr(q$Revision: 2.20 $, 10);
 
 use Vend::Util;
 use strict;
 
 my $indicated;
+my $last_line;
+my $first_line;
+my $logical_field;
+
 my %transform = (
 	nbsp => sub {
 		my ($row, $fields) = @_;
@@ -52,6 +56,57 @@
 		}
 		return 1;
 	},
+	first_line => sub {
+		my ($row, $fields) = @_;
+		return undef if ref($fields) ne 'ARRAY';
+		return 1 if $first_line;
+		my $status;
+		for(@$fields) {
+			if(s/^!\s*//) {
+				$status = $status && ! $row->{$_};
+			}
+			else {
+				$status = $status && $row->{$_};
+			}
+		}
+		return $first_line = $status;
+	},
+	last_line => sub {
+		my ($row, $fields) = @_;
+#::logDebug("last_line transform, last_line=$last_line");
+		return 1 if ref($fields) ne 'ARRAY';
+		return 0 if $last_line;
+		my $status;
+		for(@$fields) {
+#::logDebug("last_line transform checking field $_=$row->{$_}");
+			if(s/^!\s*//) {
+				$status = ! $row->{$_};
+			}
+			else {
+				$status = $row->{$_};
+			}
+#::logDebug("last_line transform checked field $_=$row->{$_}, status=$status");
+			last if $status;
+		}
+#::logDebug("last_line transform returning last_line=$status");
+		$last_line = $status;
+#::logDebug("last_line transform returning status=" . ! $status);
+		return ! $status;
+	},
+	first_line => sub {
+		my ($row, $fields) = @_;
+		return 1 if ref($fields) ne 'ARRAY';
+		my $status = 1;
+		for(@$fields) {
+			if(s/^!\s*//) {
+				$status = $status && ! $row->{$_};
+			}
+			else {
+				$status = $status && $row->{$_};
+			}
+		}
+		return $status;
+	},
 	inactive => sub {
 		my ($row, $fields) = @_;
 		return 1 if ref($fields) ne 'ARRAY';
@@ -209,8 +264,22 @@
 		my ($row, $fields) = @_;
 		return 1 if ref($fields) ne 'ARRAY';
 		for(@$fields) {
+			if ($::Scratch->{mv_logical_page} eq $row->{$_}) {
+				unless(
+						$::Scratch->{mv_logical_page_used}
+						and $::Scratch->{mv_logical_page_used}
+							  ne
+							$row->{$logical_field}
+						)
+				{
+					$row->{indicated} = 1;
+					$::Scratch->{mv_logical_page_used} = $row->{$logical_field};
+					last;
+				}
+			}
 			($row->{indicated} = 1, last)
-				if $Global::Variable->{MV_PAGE} eq $row->{$_};
+				if  $Global::Variable->{MV_PAGE} eq $row->{$_}
+				and ! defined $row->{indicated};
 		}
 		return 1;
 	},
@@ -235,10 +304,32 @@
 			if($rev xor $status) {
 				$row->{indicated} = 1;
 			}
+			else {
+				$row->{indicated} = '';
+			}
 			last if $last;
 		}
 		return 1;
 	},
+	expand_values_form => sub {
+		my ($row, $fields) = @_;
+		return 1 if ref($fields) ne 'ARRAY';
+		for(@$fields) {
+			next unless $row->{$_} =~ /\%5b|\[/i;
+			my @parms = split $Global::UrlSplittor, $row->{$_};
+			my @out;
+			for my $p (@parms) {
+				my ($parm, $val) = split /=/, $p;
+				$val = unhexify($val);
+				$val =~ s/\[cgi\s+([^\[]+)\]/$CGI::values{$1}/g;
+				$val =~ s/\[var\s+([^\[]+)\]/$::Variable->{$1}/g;
+				$val =~ s/\[value\s+([^\[]+)\]/$::Values->{$1}/g;
+				push @out, join('=', $parm, hexify($val));
+			}
+			$row->{$_} = join $Global::UrlJoiner, @out;
+		}
+		return 1;
+	},
 	expand_values => sub {
 		my ($row, $fields) = @_;
 		return 1 if ref($fields) ne 'ARRAY';
@@ -252,6 +343,17 @@
 	},
 );
 
+sub reset_transforms {
+#::logDebug("resetting transforms");
+	my $opt = shift;
+	if($opt) {
+		$logical_field = $opt->{logical_page_field} || 'name';
+	}
+	undef $last_line;
+	undef $first_line;
+	undef $indicated;
+}
+
 sub old_tree {
 	my ($name, $opt, $template) = @_;
 	my @out;
@@ -342,6 +444,7 @@
 		$opt->{iterator} = \&transforms_only;
 		delete $opt->{_transforms};
 		Vend::Tags->loop(undef,$opt,'');
+		reset_transforms();
 		my $list = $opt->{object}{mv_results};
 		$main = '';
 		for(@$list) {
@@ -350,7 +453,7 @@
 	}
 
 	# Prevent possibility of memory leak
-	undef $indicated;
+	reset_transforms();
 
 	my $header;
 	$header = ::interpolate_html($opt->{header_template})
@@ -422,6 +525,7 @@
 			js_prefix	=> $vpf,
 			sort        => $opt->{sort} || 'code',
 			full        => '1',
+			timed		=> $opt->{timed},
 			spacing     => '4',
 			_transform   => $opt->{_transform},
 		);
@@ -440,6 +544,7 @@
 	else {
 		$o{iterator} = \&transforms_only;
 		Vend::Tags->tree(\%o);
+		reset_transforms();
 		delete $o{_transform};
 		my @o;
 		for(@{$o{object}{mv_results}}) {
@@ -450,8 +555,8 @@
 		$rows = \@o;
 	}
 
-	# Prevent possibility of memory leak
-	undef $indicated;
+	# Prevent possibility of memory leak, reset last_line/first_line
+	reset_transforms();
 
 	push @out, $main;
 
@@ -769,6 +874,7 @@
 			sort        => $opt->{sort} || 'code',
 			js_prefix	=> $vpf,
 			full        => '1',
+			timed		=> $opt->{timed},
 			spacing     => '4',
 			_transform   => $opt->{_transform},
 		);
@@ -787,6 +893,7 @@
 	else {
 		$o{iterator} = \&transforms_only;
 		Vend::Tags->tree(\%o);
+		reset_transforms();
 		delete $o{_transform};
 		my @o;
 		for(@{$o{object}{mv_results}}) {
@@ -1122,7 +1229,13 @@
 			$form = join "\n", split $Global::UrlSplittor, $form;
 		}
 
-		$row->{page} = Vend::Tags->area( { href => $row->{page}, form => $form });
+		$row->{page} = Vend::Tags->area({
+								href => $row->{page},
+								form => $form,
+								no_count => $opt->{timed},
+								no_session_id => $opt->{timed}
+							});
+
 		if($row->{page} =~ m{\?.+=}) {
 			$row->{page} .= $Global::UrlJoiner . 'open=';
 		}
@@ -1205,6 +1318,9 @@
 sub menu {
 	my ($name, $opt, $template) = @_;
 	
+	Vend::Tags->tmp('mv_logical_page_used', $::Scratch->{mv_logical_page_used});
+	reset_transforms($opt);
+
 	if(! $name and ! $opt->{list}) {
 		# Auto menu for pages
 		if($::Scratch->{mv_menu}) {
@@ -1278,7 +1394,7 @@
 	}
 
 	my @transform;
-	my @ordered_transform = qw/full_interpolate page_class indicator_class localize entities nbsp/;
+	my @ordered_transform = qw/full_interpolate page_class indicator_class indicator_page localize entities nbsp/;
 	my %ordered;
 	@ordered{@ordered_transform} = @ordered_transform;