0.12_29 commit r0_12_29
authorTony Cook <tony@develop-help.com>
Thu, 17 Apr 2003 04:48:30 +0000 (04:48 +0000)
committertony <tony@45cb6cf1-00bc-42d2-bb5a-07f51df49f94>
Thu, 17 Apr 2003 04:48:30 +0000 (04:48 +0000)
19 files changed:
MANIFEST
Makefile
site/cgi-bin/admin/makeIndex.pl
site/cgi-bin/admin/shopadmin.pl
site/cgi-bin/admin/subs.pl
site/cgi-bin/bse.cfg
site/cgi-bin/modules/BSE/Edit/Article.pm
site/cgi-bin/modules/BSE/Permissions.pm
site/cgi-bin/modules/BSE/Shop/Util.pm
site/cgi-bin/modules/DevHelp/Report.pm
site/cgi-bin/shop.pl
site/docs/bse.pod
site/templates/admin/article_img.tmpl
site/templates/admin/edit_1.tmpl
site/templates/admin/edit_2.tmpl
site/templates/admin/edit_catalog.tmpl
site/templates/admin/edit_product.tmpl
site/templates/admin/filelist.tmpl
t/t00smoke.t

index 1d33269..2a3a16c 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -202,10 +202,10 @@ site/templates/admin/catalog.tmpl  # embedded in the shopadmin catalog/product d
 site/templates/admin/catalog_custom.tmpl
 site/templates/admin/edit_0.tmpl
 site/templates/admin/edit_1.tmpl
-site/templates/admin/edit_2.tmpl
-site/templates/admin/edit_3.tmpl
-site/templates/admin/edit_4.tmpl
-site/templates/admin/edit_5.tmpl
+site/templates/admin/edit_2.tmpl
+site/templates/admin/edit_3.tmpl
+site/templates/admin/edit_4.tmpl
+site/templates/admin/edit_5.tmpl
 site/templates/admin/edit_catalog.tmpl
 site/templates/admin/edit_product.tmpl
 site/templates/admin/edit_steps.tmpl
index 4066791..f180ea8 100755 (executable)
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-VERSION=0.12_28
+VERSION=0.12_29
 DISTNAME=bse-$(VERSION)
 DISTBUILD=$(DISTNAME)
 DISTTAR=../$(DISTNAME).tar
index 418bb58..800427b 100755 (executable)
@@ -82,7 +82,7 @@ for my $key (sort keys %index) {
 }
 
 if ($in_cgi) {
-  refresh_to("$urlbase/admin/");
+  refresh_to("$urlbase/cgi-bin/admin/menu.pl");
 }
 
 sub makeIndex {
@@ -91,13 +91,15 @@ sub makeIndex {
   my %do_search;
   @dont_search{@SEARCH_EXCLUDE} = @SEARCH_EXCLUDE;
   @do_search{@SEARCH_INCLUDE} = @SEARCH_INCLUDE;
-  until ($articles->EOF) {
+  INDEX: until ($articles->EOF) {
     # find the section
     my $article = $articles->getNext;
     next unless ($article->{listed} || $article->{flags} =~ /I/);
+    next if $article->{flags} =~ /[CN]/;
     my $section = $article;
     while ($section->{parentid} >= 1) {
       $section = $articles->getByPkey($section->{parentid});
+      next INDEX if $section->{flags} =~ /C/;
     }
     my $id = $article->{id};
     my $indexas = $article->{level} > $max_level ? $article->{parentid} : $id;
index 527c5f2..c97d54d 100755 (executable)
@@ -170,21 +170,26 @@ sub embedded_catalog {
      sub { $list[$list_index]{listed} == 0 ? "Hidden" : "&nbsp;" },
      move =>
      sub {
+       my ($arg, $acts, $funcname, $templater) = @_;
+
        $req->user_can(edit_reorder_children => $catalog)
         or return '';
+       my ($img_prefix, $urladd) = DevHelp::Tags->get_parms($arg, $acts, $templater);
+       defined $img_prefix or $img_prefix = '';
+       defined $urladd or $urladd = '';
        @list > 1 or return '';
        # links to move products up/down
        my $html = '';
-       my $refreshto = CGI::escape($ENV{SCRIPT_NAME}."#cat".$catalog->{id});
+       my $refreshto = CGI::escape($ENV{SCRIPT_NAME}."$urladd#cat".$catalog->{id});
        if ($list_index < $#list) {
         if ($session->{showstepkids}) {
           $html .= <<HTML;
-<a href="$CGI_URI/admin/move.pl?stepparent=$catalog->{id}&d=swap&id=$list[$list_index]{id}&other=$list[$list_index+1]{id}&refreshto=$refreshto"><img src="$IMAGES_URI/admin/move_down.gif" width="17" height="13" border="0" alt="Move Down" align="absbottom"></a>
+<a href="$CGI_URI/admin/move.pl?stepparent=$catalog->{id}&d=swap&id=$list[$list_index]{id}&other=$list[$list_index+1]{id}&refreshto=$refreshto"><img src="$IMAGES_URI/admin/${img_prefix}move_down.gif" width="17" height="13" border="0" alt="Move Down" align="absbottom"></a>
 HTML
         }
         else {
           $html .= <<HTML;
-<a href="$CGI_URI/admin/move.pl?id=$list[$list_index]{id}&d=swap&other=$list[$list_index+1]{id}&refreshto=$refreshto&all=1"><img src="$IMAGES_URI/admin/move_down.gif" width="17" height="13" border="0" alt="Move Down" align="absbottom"></a>
+<a href="$CGI_URI/admin/move.pl?id=$list[$list_index]{id}&d=swap&other=$list[$list_index+1]{id}&refreshto=$refreshto&all=1"><img src="$IMAGES_URI/admin/${img_prefix}move_down.gif" width="17" height="13" border="0" alt="Move Down" align="absbottom"></a>
 HTML
         }
        }
@@ -194,12 +199,12 @@ HTML
        if ($list_index > 0) {
         if ($session->{showstepkids}) {
           $html .= <<HTML;
-<a href="$CGI_URI/admin/move.pl?stepparent=$catalog->{id}&d=swap&id=$list[$list_index]{id}&other=$list[$list_index-1]{id}&refreshto=$refreshto"><img src="$IMAGES_URI/admin/move_up.gif" width="17" height="13" border="0" alt="Move Up" align="absbottom"></a>
+<a href="$CGI_URI/admin/move.pl?stepparent=$catalog->{id}&d=swap&id=$list[$list_index]{id}&other=$list[$list_index-1]{id}&refreshto=$refreshto"><img src="$IMAGES_URI/admin/${img_prefix}move_up.gif" width="17" height="13" border="0" alt="Move Up" align="absbottom"></a>
 HTML
         }
         else {
           $html .= <<HTML;
-<a href="$CGI_URI/admin/move.pl?id=$list[$list_index]{id}&d=swap&other=$list[$list_index-1]{id}&refreshto=$refreshto&all=1"><img src="$IMAGES_URI/admin/move_up.gif" width="17" height="13" border="0" alt="Move Up" align="absbottom"></a>
+<a href="$CGI_URI/admin/move.pl?id=$list[$list_index]{id}&d=swap&other=$list[$list_index-1]{id}&refreshto=$refreshto&all=1"><img src="$IMAGES_URI/admin/${img_prefix}move_up.gif" width="17" height="13" border="0" alt="Move Up" align="absbottom"></a>
 HTML
         }
        }
@@ -218,15 +223,20 @@ HTML
      },
      movecat =>
      sub {
+       my ($arg, $acts, $funcname, $templater) = @_;
+
        $req->user_can(edit_reorder_children => $catalog)
         or return '';
        @subcats > 1 or return '';
        # links to move catalogs up/down
        my $html = '';
-       my $refreshto = CGI::escape($ENV{SCRIPT_NAME});
+       my ($img_prefix, $urladd) = DevHelp::Tags->get_parms($arg, $acts, $templater);
+       defined $img_prefix or $img_prefix = '';
+       defined $urladd or $urladd = '';
+       my $refreshto = CGI::escape($ENV{SCRIPT_NAME}.$urladd);
        if ($subcat_index < $#subcats) {
         $html .= <<HTML;
-<a href="$CGI_URI/admin/move.pl?id=$subcats[$subcat_index]{id}&d=swap&other=$subcats[$subcat_index+1]{id}&refreshto=$refreshto&all=1"><img src="$IMAGES_URI/admin/move_down.gif" width="17" height="13" border="0" alt="Move Down" align="absbottom"></a>
+<a href="$CGI_URI/admin/move.pl?id=$subcats[$subcat_index]{id}&d=swap&other=$subcats[$subcat_index+1]{id}&refreshto=$refreshto&all=1"><img src="$IMAGES_URI/admin/${img_prefix}move_down.gif" width="17" height="13" border="0" alt="Move Down" align="absbottom"></a>
 HTML
        }
        else {
@@ -234,7 +244,7 @@ HTML
        }
        if ($subcat_index > 0) {
         $html .= <<HTML;
-<a href="$CGI_URI/admin/move.pl?id=$subcats[$subcat_index]{id}&d=swap&other=$subcats[$subcat_index-1]{id}&refreshto=$refreshto&all=1"><img src="$IMAGES_URI/admin/move_up.gif" width="17" height="13" border="0" alt="Move Up" align="absbottom"></a>
+<a href="$CGI_URI/admin/move.pl?id=$subcats[$subcat_index]{id}&d=swap&other=$subcats[$subcat_index-1]{id}&refreshto=$refreshto&all=1"><img src="$IMAGES_URI/admin/${img_prefix}move_up.gif" width="17" height="13" border="0" alt="Move Up" align="absbottom"></a>
 HTML
        }
        else {
@@ -859,7 +869,7 @@ sub nice_options {
 }
 
 sub order_detail {
-  my ($req) = @_;
+  my ($req, $message) = @_;
 
   $req->user_can('shop_order_detail')
     or return product_list($req, "You don't have access to order details");
@@ -868,6 +878,7 @@ sub order_detail {
   my $id = $cgi->param('id');
   if ($id and
       my $order = Orders->getByPkey($id)) {
+    $message ||= $cgi->param('message') || '';
     my @lines = OrderItems->getBy('orderId', $id);
     my @products = map { Products->getByPkey($_->{productId}) } @lines;
     my $line_index = -1;
@@ -914,6 +925,7 @@ sub order_detail {
        option => sub { CGI::escapeHTML($options[$option_index]{$_[0]}) },
        ifOptions => sub { @options },
        options => sub { nice_options(@options) },
+       message => sub { $message },
       );
     page('order_detail', \%acts);
   }
index e070fdb..83998b8 100755 (executable)
@@ -184,7 +184,7 @@ sub validate {
   for my $field (@needed) {
     my $value = $q->param($field);
     defined $value and length $value
-      or push(@$errors, [ $field, "$field must be entered" ]);
+      or push(@$errors, [ $field, "\u$field must be entered" ]);
   }
   for my $field (qw(html_template text_template article_template)) {
     my $value = $q->param($field);
@@ -236,7 +236,7 @@ sub addsave {
     $subs{lastSent} = '0000-00-00 00:00';
     my $sub = BSE::SubscriptionTypes->add(@subs{@fields});
     
-    _refresh_list($cfg);  
+    _refresh_list($cfg, "Subscription created");  
   }
   else {
     sub_form($q, $req, $cfg, 'admin/subs/edit', undef, 1, \@errors);
index 8a35327..6508196 100644 (file)
@@ -116,6 +116,14 @@ template=catalog.tmpl
 [products]
 template=shopitem.tmpl
 
+[templates]
+admin/edit_2=admin/edit_1
+admin/edit_3=admin/edit_1
+admin/edit_4=admin/edit_1
+admin/edit_5=admin/edit_1
+admin/edit_img=admin/article_img
+admin/edit_file=admin/filelist
+
 [Global permissions]
 change_body = 8
 change_body_no_shop = 9
@@ -212,6 +220,8 @@ descendants=1
 
 [article flags]
 I=Index even if hidden
+N=Don't index even if listed
+C=Don't index this article or it's descendants
 
 [article 1]
 extra_templates=index.tmpl
index e6419e3..93e2f72 100644 (file)
@@ -734,12 +734,20 @@ sub tag_movechild {
 
   my $cgi_uri = $self->{cfg}->entry('uri', 'cgi', '/cgi-bin');
   my $images_uri = $self->{cfg}->entry('uri', 'images', '/images');
+  my $urlbase = $req->cfg->entryVar('site', 'url');
+  my $url = "$urlbase$ENV{SCRIPT_NAME}?id=$article->{id}";
+  my $t = $req->cgi->param('_t');
+  if ($t && $t =~ /^\w+$/) {
+    $url .= "&_t=$t";
+  }
+  $url .= $urladd;
+  $url = CGI::escape($url);
   my $html = '';
   my $nomove = '<img src="/images/trans_pixel.gif" width="17" height="13" border="0" alt="" align="absbottom">';
   my $id = $kids->[$$rindex]{id};
   if ($$rindex < $#$kids) {
     $html .= <<HTML;
-<a href="$cgi_uri/admin/move.pl?id=$id&d=down&edit=1&all=1"><img src="$images_uri/admin/${img_prefix}move_down.gif" width="17" height="13" alt="Move Down" border="0" align="absbottom"></a>
+<a href="$cgi_uri/admin/move.pl?id=$id&d=down&edit=1&all=1&r=$url"><img src="$images_uri/admin/${img_prefix}move_down.gif" width="17" height="13" alt="Move Down" border="0" align="absbottom"></a>
 HTML
   }
   else {
@@ -747,7 +755,7 @@ HTML
   }
   if ($$rindex > 0) {
     $html .= <<HTML;
-<a href="$cgi_uri/admin/move.pl?id=$id&d=up&edit=1&all=1"><img src="$images_uri/admin/${img_prefix}move_up.gif" width="17" height="13" alt="Move Up" border="0" align="absbottom"></a>
+<a href="$cgi_uri/admin/move.pl?id=$id&d=up&edit=1&all=1&r=$url"><img src="$images_uri/admin/${img_prefix}move_up.gif" width="17" height="13" alt="Move Up" border="0" align="absbottom"></a>
 HTML
   }
   else {
@@ -792,7 +800,12 @@ sub tag_imgmove {
   $urladd = '' unless defined $urladd;
 
   my $urlbase = $req->cfg->entryVar('site', 'url');
-  my $url = "$urlbase$ENV{SCRIPT_NAME}?id=$article->{id}&showimages=1$urladd";
+  my $url = "$urlbase$ENV{SCRIPT_NAME}?id=$article->{id}";
+  my $t = $req->cgi->param('_t');
+  if ($t && $t =~ /^\w+$/) {
+    $url .= "&_t=$t";
+  }
+  $url .= $urladd;
   $url = CGI::escape($url);
 
   my $html = '';
@@ -883,15 +896,6 @@ sub tag_old {
   }
 }
 
-# sub tag_error_img {
-#   my ($self, $errors, $args) = @_;
-
-#   return '' unless $errors->{$args};
-#   my $images_uri = $self->{cfg}->entry('uri', 'images', '/images');
-#   my $encoded = encode_entities($errors->{$args});
-#   return qq!<img src="$images_uri/admin/error.gif" alt="$encoded" title="$encoded" border="0" align="top">!; 
-# }
-
 sub iter_admin_users {
   require BSE::TB::AdminUsers;
 
@@ -1890,7 +1894,7 @@ sub save_image_changes {
   my ($self, $req, $article, $articles) = @_;
 
   $req->user_can(edit_images_save => $article)
-    or return $self->show_images($req, $article, $articles,
+    or return $self->edit_form($req, $article, $articles,
                                 "You don't have access to save image information for this article");
 
   my $cgi = $req->cgi;
@@ -1930,27 +1934,26 @@ sub save_image_changes {
   generate_article($articles, $article) if $Constants::AUTO_GENERATE;
 
 
-  return $self->refresh($article, $cgi, undef, 'Image information saved', 
-                       '&showimages=1');
+  return $self->refresh($article, $cgi, undef, 'Image information saved');
 }
 
 sub add_image {
   my ($self, $req, $article, $articles) = @_;
 
   $req->user_can(edit_images_add => $article)
-    or return $self->show_images($req, $article, $articles,
+    or return $self->edit_form($req, $article, $articles,
                                 "You don't have access to add new images to this article");
 
   my $cgi = $req->cgi;
 
   my $image = $cgi->param('image');
   unless ($image) {
-    return $self->show_images($req, $article, $articles,
+    return $self->edit_form($req, $article, $articles,
                              'Enter or select the name of an image file on your machine', 
                              { image => 'Please enter an image filename' });
   }
   if (-z $image) {
-    return $self->show_images($req, $article, $articles,
+    return $self->edit_form($req, $article, $articles,
                              'Image file is empty',
                             { image => 'Image file is empty' });
   }
@@ -2015,8 +2018,7 @@ sub add_image {
   use Util 'generate_article';
   generate_article($articles, $article) if $Constants::AUTO_GENERATE;
 
-  return $self->refresh($article, $cgi, undef, 'New image added',
-                       '&showimages=1');
+  return $self->refresh($article, $cgi, undef, 'New image added');
 }
 
 # remove an image
@@ -2024,7 +2026,7 @@ sub remove_img {
   my ($self, $req, $article, $articles, $imageid) = @_;
 
   $req->user_can(edit_images_delete => $article)
-    or return $self->show_images($req, $article, $articles,
+    or return $self->edit_form($req, $article, $articles,
                                 "You don't have access to delete images from this article");
 
   $imageid or die;
@@ -2039,23 +2041,22 @@ sub remove_img {
   use Util 'generate_article';
   generate_article($articles, $article) if $Constants::AUTO_GENERATE;
 
-  return $self->refresh($article, $req->cgi, undef, 'Image removed',
-                       '&showimages=1');
+  return $self->refresh($article, $req->cgi, undef, 'Image removed');
 }
 
 sub move_img_up {
   my ($self, $req, $article, $articles) = @_;
 
   $req->user_can(edit_images_reorder => $article)
-    or return $self->show_images($req, $article, $articles,
+    or return $self->edit_form($req, $article, $articles,
                                 "You don't have access to reorder images in this article");
 
   my $imageid = $req->cgi->param('imageid');
   my @images = $article->images;
   my ($imgindex) = grep $images[$_]{id} == $imageid, 0..$#images
-    or return $self->show_images($req, $article, $articles, "No such image");
+    or return $self->edit_form($req, $article, $articles, "No such image");
   $imgindex > 0
-    or return $self->show_images($req, $article, $articles, "Image is already at the top");
+    or return $self->edit_form($req, $article, $articles, "Image is already at the top");
   my ($to, $from) = @images[$imgindex-1, $imgindex];
   ($to->{displayOrder}, $from->{displayOrder}) =
     ($from->{displayOrder}, $to->{displayOrder});
@@ -2065,23 +2066,22 @@ sub move_img_up {
   use Util 'generate_article';
   generate_article($articles, $article) if $Constants::AUTO_GENERATE;
 
-  return $self->refresh($article, $req->cgi, undef, 'Image moved',
-                       '&showimages=1');
+  return $self->refresh($article, $req->cgi, undef, 'Image moved');
 }
 
 sub move_img_down {
   my ($self, $req, $article, $articles) = @_;
 
   $req->user_can(edit_images_reorder => $article)
-    or return $self->show_images($req, $article, $articles,
+    or return $self->edit_form($req, $article, $articles,
                                 "You don't have access to reorder images in this article");
 
   my $imageid = $req->cgi->param('imageid');
   my @images = $article->images;
   my ($imgindex) = grep $images[$_]{id} == $imageid, 0..$#images
-    or return $self->show_images($req, $article, $articles, "No such image");
+    or return $self->edit_form($req, $article, $articles, "No such image");
   $imgindex < $#images
-    or return $self->show_images($req, $article, $articles, "Image is already at the end");
+    or return $self->edit_form($req, $article, $articles, "Image is already at the end");
   my ($to, $from) = @images[$imgindex+1, $imgindex];
   ($to->{displayOrder}, $from->{displayOrder}) =
     ($from->{displayOrder}, $to->{displayOrder});
@@ -2091,8 +2091,7 @@ sub move_img_down {
   use Util 'generate_article';
   generate_article($articles, $article) if $Constants::AUTO_GENERATE;
 
-  return $self->refresh($article, $req->cgi, undef, 'Image moved', 
-                       '&showimages=1');
+  return $self->refresh($article, $req->cgi, undef, 'Image moved');
 }
 
 sub get_article {
@@ -2134,7 +2133,7 @@ my %types =
 sub _refresh_filelist {
   my ($self, $req, $article, $msg) = @_;
 
-  return $self->refresh($article, $req->cgi, undef, $msg, '&filelist=1');
+  return $self->refresh($article, $req->cgi, undef, $msg);
 }
 
 sub filelist {
@@ -2151,7 +2150,7 @@ sub fileadd {
   my ($self, $req, $article, $articles) = @_;
 
   $req->user_can(edit_files_add => $article)
-    or return $self->filelist($req, $article, $articles,
+    or return $self->edit_form($req, $article, $articles,
                              "You don't have access to add files to this article");
 
   my %file;
@@ -2175,12 +2174,12 @@ sub fileadd {
   # build a filename
   my $file = $cgi->param('file');
   unless ($file) {
-    return $self->filelist($req, $article, $articles,
+    return $self->edit_form($req, $article, $articles,
                           "Enter or select the name of a file on your machine",
                          { file => 'Please enter a filename' });
   }
   if (-z $file) {
-    return $self->filelist($req, $article, $articles,
+    return $self->edit_form($req, $article, $articles,
                           "File is empty",
                           { file => 'File is empty' });
   }
@@ -2252,7 +2251,7 @@ sub fileswap {
   my ($self, $req, $article, $articles) = @_;
 
   $req->user_can('edit_files_reorder', $article)
-    or return $self->filelist($req, $article, $articles,
+    or return $self->edit_form($req, $article, $articles,
                           "You don't have access to reorder files in this article");
 
   my $cgi = $req->cgi;
@@ -2283,8 +2282,8 @@ sub filedel {
   my ($self, $req, $article, $articles) = @_;
 
   $req->user_can('edit_files_delete', $article)
-    or return $self->filelist($req, $article, $articles,
-                          "You don't have access to delete files from this article");
+    or return $self->edit_form($req, $article, $articles,
+                              "You don't have access to delete files from this article");
 
   my $cgi = $req->cgi;
   my $fileid = $cgi->param('file');
@@ -2318,7 +2317,7 @@ sub filesave {
   my ($self, $req, $article, $articles) = @_;
 
   $req->user_can('edit_files_save', $article)
-    or return $self->filelist($req, $article, $articles,
+    or return $self->edit_form($req, $article, $articles,
                           "You don't have access to save file information for this article");
   my @files = $article->files;
 
index a09a10d..0f4a4af 100644 (file)
@@ -7,6 +7,7 @@ my @checks =
      edit_delete_article
      edit_field_edit_title
      edit_field_edit_summary
+     edit_add_child
      );
 my %checks = map { $_=> 1 } @checks;  
 
@@ -442,4 +443,19 @@ sub check_edit_field_edit_summary {
   return 1;
 }
 
+sub check_edit_add_child {
+  my ($self, $user, $article, $action, $rmsg) = @_;
+
+  if ($article->{generator} eq 'Generate::Product') {
+    $$rmsg = "Products cannot have children";
+    return;
+  }
+  unless (defined $self->{cfg}->entry('level names', $article->{level}+1)) {
+    $$rmsg = "Too many levels";
+    return;
+  }
+
+  return 1;
+}
+
 1;
index 1a869c2..4142d18 100644 (file)
@@ -43,7 +43,12 @@ sub shop_cart_tags {
        return 0;
      },
      item => 
-     sub { $cart->[$item_index]{$_[0]} || $cart_prods->[$item_index]{$_[0]} },
+     sub { 
+       my $value = $cart->[$item_index]{$_[0]};
+       defined($value) or $value = $cart_prods->[$item_index]{$_[0]};
+       defined($value) or $value = '';
+       $value;
+     },
      extended =>
      sub { 
        my $what = $_[0] || 'retailPrice';
index d2b7589..b6c5936 100644 (file)
@@ -215,7 +215,7 @@ sub _get_type_html_sql {
          \@values );
 }
 
-sub _get_type_html_sql {
+sub _get_type_html_enum {
   my ($self, $type, $name, $cgi, $db) = @_;
 
   my $sect = "report datatype $type";
@@ -223,7 +223,7 @@ sub _get_type_html_sql {
   my @values = split ',', $self->{cfg}->entry($sect, 'values', '');
 
   @values
-    or return '** no values found for type '$type' **';
+    or return "** no values found for type '$type' **";
   my @labels = split ',', $self->{cfg}->entry($sect, 'labels', '');
   if (@labels < @values) {
     push @labels, @values[@labels .. $#values];
@@ -477,16 +477,16 @@ sub iter_levelN {
   # which columns are we checking?
   my $match = $report->{sql}[$level]{match};
   
-  my @parnames = @{$results->[$level-1]{names_lc};
+  my @parnames = @{$results->[$level-1]{names_lc}};
   my $parent = $work->[$level-1];
 
   my @pardata = @$parent{map $parnames[$match->[$_][1]-1], 0.. $#$match};
 
-  my $source = $results[$level]{rows};
+  my $source = $results->[$level]{rows};
 
   my @out = grep 
     {
-      
+      1;
     } @$source;
 }
 
index b0afef4..5fb8c75 100755 (executable)
@@ -489,7 +489,12 @@ sub prePurchase {
        return 0;
      },
      item=> sub { CGI::escapeHTML($items[$item_index]{$_[0]}); },
-     product => sub { CGI::escapeHTML($products[$item_index]{$_[0]}) },
+     product => 
+     sub { 
+       my $value = $products[$item_index]{$_[0]};
+       defined($value) or $value = '';
+       CGI::escapeHTML($value);
+     },
      extended =>
      sub { 
        my $what = $_[0] || 'retailPrice';
@@ -666,7 +671,10 @@ sub purchase {
 
   # check if a customizer has anything to do
   eval {
-    $cust_class->order_save($CGI::Q, \%order, \@cart, \@products, $cfg);
+    my %custom = %{$session{custom}};
+    $cust_class->order_save($CGI::Q, \%order, \@cart, \@products, 
+                           \%custom, $cfg);
+    $session{custom} = \%custom;
   };
   if ($@) {
     return checkout($@, 1);
@@ -783,7 +791,12 @@ sub send_order {
        return 0;
      },
      item=> sub { $items->[$item_index]{$_[0]}; },
-     product => sub { $products->[$item_index]{$_[0]} },
+     product => 
+     sub { 
+       my $value = $products->[$item_index]{$_[0]};
+       defined($value) or $value = '';
+       $value;
+     },
      order => sub { $order->{$_[0]} },
      extended => 
      sub {
index 8cce926..b986902 100644 (file)
@@ -10,6 +10,71 @@ Maybe I'll add some other bits here.
 
 =head1 CHANGES
 
+=head2 0.12_29
+
+=over
+
+=item *
+
+makeIndex.pl now redirects directly to menu.pl rather than to /admin/
+after rebuilding the index
+
+=item *
+
+added the "Don't index even if listed" and "Don't index this article
+or it's descendants" flags
+
+=item *
+
+the custom session hash is now supplied to the order_save() custom
+hook
+
+=item *
+
+the product tag on the cart pages now checks for undef values to
+prevent warnings
+
+=item *
+
+field names in the validation messages produced by subs.pl now have
+the first letter upper-cased.
+
+=item *
+
+creating a subscription now mentions that it's successful
+
+=item *
+
+the experimental report.pl compiles
+
+=item *
+
+added line-breaks between article flags on the edit pages
+
+=item *
+
+the image and file lists are now accessed using the default target in
+add.pl.  Use _t=img and _t=file to access the lists now.
+
+=item *
+
+admin/edit_2.tmpl through admin/edit_5.tmpl are no longer distributed,
+all normal article editing now use admin/edit_1.tmpl.  If you need
+different pages for different levels remove the mappings from the
+[templates] section in bse.cfg
+
+=item *
+
+the C<order_detail> target in shopadmin.pl now accepts a message
+parameter
+
+=item *
+
+the edit_add_child security check will now fail if the article is a
+product or if the article is too many levels deep to have a child.
+
+=back
+
 =head2 0.12_28
 
 =over
index ccd10c8..36d12bd 100644 (file)
@@ -26,6 +26,7 @@
 <input type="hidden" name="id" value="<: article id :>">
 <input type="hidden" name="parentid" value="<: article parentid :>">
 <input type="hidden" name="imgtype" value="<: articleType :>">
+<input type="hidden" name="_t" value="img" />
   <table border="0" cellspacing="0" cellpadding="0" bgcolor="#000000" class="table">
     <tr> 
       <td> 
@@ -68,6 +69,7 @@
 <input type="hidden" name="id" value="<: article id :>">
 <input type="hidden" name="parentid" value="<: article parentid :>">
 <input type="hidden" name="imgtype" value="<: articleType :>">
+<input type="hidden" name="_t" value="img" />
   <h2>Manage images</h2>
 
 <table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000" class="table">
               <:ifUserCan edit_images_save:article:><input type="text" name="url" value="<: image url :>" size="32"><:or:><: image url :><:eif:>
             </td>
             <td valign="bottom" nowrap> 
-              <:ifUserCan edit_images_delete:article:><b><a href="<:script:>?level=<: level :>&parentid=<: article parentid :>&id=<:article id:>&imgtype=<: articleType :>&removeimg_<: image id :>" onClick="return window.confirm('Are you sure you want to delete this Image')">Delete</a></b><:or:><:eif:></td>
+              <:ifUserCan edit_images_delete:article:><b><a href="<:script:>?id=<:article id:>&removeimg_<: image id :>=1&_t=img" onClick="return window.confirm('Are you sure you want to delete this Image')">Delete</a></b><:or:><:eif:></td>
             <td><:imgmove:></td>
           </tr>
           <: iterator separator images :> 
index 875d676..48187ee 100644 (file)
             <td bgcolor="#FFFFFF" width="100%"><:iterator begin flags:><:if FieldPerm flags:>
               <input type=checkbox name=flags value="<:flag id:>" <:ifFlagSet [flag id]:>checked<:or:>
               <:eif:>><:or FieldPerm:><:ifFlagSet [flag id]:>Yes<:or:>No<:eif:>
-              <:eif FieldPerm:><:flag desc:><:iterator end flags:></td>
+              <:eif FieldPerm:><:flag desc:><:iterator separator flags:><br /><:iterator end flags:></td>
             <td nowrap bgcolor="#FFFFFF"><:help edit flags:> <:error_img flags:></td>
           </tr>
                  <tr> 
                   </td>
                 </tr>
               </table>
-              <p><a href="<:script:>?filelist=1&id=<:article id:>"><b>Manage Files</b></a>
+              <p><a href="<:script:>?id=<:article id:>&_t=file"><b>Manage Files</b></a>
               </p>
               <:or Files:>
-              <p>No files are attached to this article. <a href="<:script:>?filelist=1&id=<:article id:>"><b>Manage Files</b></a></p>
+              <p>No files are attached to this article. <a href="<:script:>?id=<:article id:>&_t=file"><b>Manage Files</b></a></p>
               <:eif Files:>
             </td>
             <td nowrap bgcolor="#FFFFFF" valign="top"><:help edit files:> <:error_img
               <:image width:> height=<:image height:>> <:iterator separator images:> 
               <hr noshade size="1">
               <: iterator end images :>
-              <p align="left"><a href="<:script:>?id=<:article id:>&showimages=1"><b>Manage Images</b></a></p>
+              <p align="left"><a href="<:script:>?id=<:article id:>&_t=img"><b>Manage Images</b></a></p>
               <:or Images:>
-              <p align="left">No images are attached to this article.  <a href="<:script:>?id=<:article id:>&showimages=1"><b>Manage Images</b></a></p>
+              <p align="left">No images are attached to this article.  <a href="<:script:>?id=<:article id:>&_t=img"><b>Manage Images</b></a></p>
               <:eif Images:>
            </td>
             <td valign="top" nowrap bgcolor="#FFFFFF"><:help edit images:> <:error_img
index 875d676..cb7b5be 100644 (file)
             <td bgcolor="#FFFFFF" width="100%"><:iterator begin flags:><:if FieldPerm flags:>
               <input type=checkbox name=flags value="<:flag id:>" <:ifFlagSet [flag id]:>checked<:or:>
               <:eif:>><:or FieldPerm:><:ifFlagSet [flag id]:>Yes<:or:>No<:eif:>
-              <:eif FieldPerm:><:flag desc:><:iterator end flags:></td>
+              <:eif FieldPerm:><:flag desc:><:iterator separator flags:><br /><:iterator end flags:></td>
             <td nowrap bgcolor="#FFFFFF"><:help edit flags:> <:error_img flags:></td>
           </tr>
                  <tr> 
index 5a925c7..df36b3c 100644 (file)
             <td bgcolor="#FFFFFF" width="100%"><:iterator begin flags:><:if FieldPerm flags:>
               <input type=checkbox name=flags value="<:flag id:>" <:ifFlagSet [flag id]:>checked<:or:>
               <:eif:>><:or FieldPerm:><:ifFlagSet [flag id]:>Yes<:or:>No<:eif:>
-              <:eif FieldPerm:><:flag desc:><:iterator end flags:></td>
+              <:eif FieldPerm:><:flag desc:><:iterator separator flags:><br /><:iterator end flags:></td>
             <td nowrap bgcolor="#FFFFFF"><:help edit flags:> <:error_img flags:></td>
           </tr>
           <tr> 
index 6c8817d..b568881 100644 (file)
@@ -98,7 +98,7 @@
             <td bgcolor="#FFFFFF" width="100%"><:iterator begin flags:><:if FieldPerm flags:>
               <input type=checkbox name=flags value="<:flag id:>" <:ifFlagSet [flag id]:>checked<:or:>
               <:eif:>><:or FieldPerm:><:ifFlagSet [flag id]:>Yes<:or:>No<:eif:>
-              <:eif FieldPerm:><:flag desc:><:iterator end flags:></td>
+              <:eif FieldPerm:><:flag desc:><:iterator separator flags:><br /><:iterator end flags:></td>
             <td bgcolor="#FFFFFF"><:help edit flags:> <:error_img flags:></td>
           </tr>
           <tr> 
index 0b4dec2..4ee16ec 100644 (file)
@@ -24,6 +24,7 @@
 <form method="post" action="<:script:>" enctype="multipart/form-data">
 
 <input type="hidden" name="id" value="<: article id :>" />
+<input type="hidden" name="_t" value="file" />
   <table border="0" cellspacing="0" cellpadding="0" bgcolor="#000000" class="table">
     <tr> 
       <td> 
@@ -87,6 +88,7 @@
 
 <form method="post" action="<:script:>" enctype="multipart/form-data">
 <input type="hidden" name="id" value="<: article id :>" />
+<input type="hidden" name="_t" value="file" />
 <table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000" class="table">
     <tr>
       <td>
                   <td valign="top" align="center" nowrap> <:if UserCan edit_files_save:article:><input type="checkbox" name="requireUser_<:file id:>"
                     <:ifFile requireUser:> checked<:or:><:eif:> /><:or UserCan:><img src="/images/admin/<:ifFile requireUser:>checked.gif<:or:>unchecked.gif<:eif:>" width="16" height="16" /><:eif UserCan:>Require login 
                     &nbsp;&nbsp;&nbsp;</td>
-                  <td nowrap align="right" width="100%"> <:ifUserCan edit_files_delete:article:><b><a href="<:script:>?filedel=1&amp;id=<:article id:>&amp;file=<:file id:>" onClick="return window.confirm('Are you sure you want to delete this File')">Delete</a></b> <:or:><:eif:>
+                  <td nowrap align="right" width="100%"> <:ifUserCan edit_files_delete:article:><b><a href="<:script:>?filedel=1&amp;id=<:article id:>&amp;file=<:file id:>&_t=file" onClick="return window.confirm('Are you sure you want to delete this File')">Delete</a></b> <:or:><:eif:>
                     <:movefiles:></td>
                 </tr>
               </table>
index 6d33c2b..28806fe 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use BSE::Test;
 
 ++$|;
-print "1..45\n";
+print "1..47\n";
 my $baseurl = base_url;
 ok($baseurl =~ /^http:/, "basic check of base url");
 my $ua = make_ua;
@@ -47,3 +47,5 @@ fetch_ok($ua, "group list", "$baseurl/cgi-bin/admin/adminusers.pl?a_groups=1",
         qr!Admin\sGroups!s);
 fetch_ok($ua, "subscriptions", "$baseurl/cgi-bin/admin/subs.pl",
         qr/Subscriptions\s+List/);
+fetch_ok($ua, "reports", "$baseurl/cgi-bin/admin/report.pl",
+        qr/Reports/);