menu-load —
| Attribute | Pos. | Req. | Default | Description |
|---|---|---|---|---|
| type | ||||
| menu_fields | ||||
| table | ||||
| first_field | ||||
| second_field | ||||
| desc_field | ||||
| description_field | ||||
| key_field | ||||
| even_large | ||||
| sort_fields | ||||
| no_leaves | ||||
| sku_field | ||||
| comb_field | ||||
| sort_string | ||||
| sort_order | ||||
| cat_table | ||||
| sel | ||||
| html | ||||
| interpolate | 0 | interpolate output? | ||
| hide | 0 | Hide the tag return value? |
Interchange 5.9.0:
Source: code/UI_Tag/menu_load.coretag
Lines: 569
# Copyright 2002-2007 Interchange Development Group and others
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. See the LICENSE file for details.
#
# $Id: menu_load.coretag,v 1.9 2007-03-30 23:40:54 pajamian Exp $
UserTag menu-load Order type
UserTag menu-load addAttr
UserTag menu-load Version $Revision: 1.9 $
UserTag menu-load Routine <<EOR
sub old_link {
my ($row, $nrow) = @_;
#Debug("row link_type='$row->{link_type}'");
if($row->{link_type} eq 'external') {
my $first;
$first = $row->{url};
$first =~ s/\s+$//;
$first =~ s/^\s+//;
$nrow->{page} = $first;
}
elsif ($row->{link_type} eq 'internal') {
my ($page, $form) = split /\s+/, $row->{url}, 2;
$nrow->{page} = $page;
$nrow->{form} = $form;
}
elsif ($row->{link_type} eq 'simple') {
my (@items) = split /\s*[\n,]\s*/, $row->{selector};
my @out;
my $fi = $row->{tab};
my $sp = $row->{page};
my $arg = '';
$nrow->{page} = 'search';
push @out, "fi=$fi" if $fi;
push @out, "sp=$sp" if $sp;
push @out, "st=db";
if(! @items) {
push @out, "ra=yes";
$nrow->{form} = join "&", @out;
}
else {
push @out, "co=yes";
for(@items) {
my ($col, $string) = split /\s*=\s*/, $_, 2;
push @out, "sf=$col";
push @out, "se=$string";
}
push @out, $row->{search}
if $row->{search} =~ /^\s*\w\w=/;
push @out, qq{va=banner_image=$row->{banner_image}}
if $row->{banner_image};
push @out, qq{va=banner_text=$row->{banner_text}}
if $row->{banner_text};
for(@out) {
s/(.*?=)(.*)/$1 . Vend::Util::hexify($2)/ges;
}
$arg = join $Global::UrlJoiner, @out;
$nrow->{form} = $arg;
}
}
elsif ($row->{link_type} eq 'complex') {
$nrow->{page} = 'search';
$row->{search} =~ s/[\r\n+]/\n/g;
$row->{search} .= qq{\nva=banner_text=$row->{banner_text}}
if $row->{banner_text};
$row->{search} .= qq{\nva=banner_image=$row->{banner_image}}
if $row->{banner_image};
my @items = grep /\S/, split /[\r\n]+/, $row->{search};
for(@items) {
s/(.*?=)(.*)/$1 . Vend::Util::hexify($2)/ges;
}
$nrow->{form} = join $Global::UrlJoiner, @items;
$nrow->{form} =~ s/[\r\n]+/&/g;
}
return $nrow;
}
sub {
my ($type, $opt) = @_;
#::logDebug("Called menu_load");
$type ||= $opt->{type} || 'tree';
my @menufields;
if($opt->{menu_fields}) {
@menufields = grep /\S/, split /[\s,\0]+/, $opt->{menu_fields};
}
else {
@menufields = qw/
code mgroup msort next_line indicator exclude_on depends_on page
form name super inactive description help_name img_dn img_up
img_sel img_icon url member
/;
}
my %menuinit = (
code => 0,
inactive => 0,
msort => "'x'",
);
my @out;
if ($type eq 'tree') {
$opt->{table} ||= 'products';
$opt->{first_field} ||= 'prod_group';
$opt->{second_field} ||= 'category';
$opt->{desc_field} ||= $opt->{description_field} || 'description';
#::logDebug("menu_load options=" . uneval($opt));
PRODBUILD: {
my $tab = $opt->{table};
my $db = database_exists_ref($tab)
or do {
Vend::Tags->error({ set => errmsg(
"Failed to open %s table %s.",
'products',
$tab,
),
});
last PRODBUILD;
};
my $tname = $db->name();
#::logDebug("LARGE=" . $db->config('LARGE'));
$opt->{key_field} ||= $db->config('KEY');
if(! $opt->{even_large} and $db->config('LARGE')) {
Vend::Tags->error({ set => errmsg(
"%s database %s for tree write: %s",
'check',
$tab,
'too large, must override',
),
});
last PRODBUILD;
}
my @somefields = qw/mgroup page name description/;
my @fields = (
$opt->{key_field},
$opt->{first_field},
$opt->{second_field},
$opt->{desc_field}
);
my $sfields = join ",", @fields;
my $tfields = $opt->{sort_fields} || join ",", @fields[1..$#fields];
my $q = qq{SELECT $sfields FROM $tname ORDER BY $tfields};
my $ary = $db->query($q)
or do {
Vend::Tags->error({
set => errmsg(
"No results from %s table %s.",
'products',
$tname,
),
});
last PRODBUILD;
};
my $prev_area = '';
my $prev_cat = '';
@out = join "\t", @menufields;
my @rows;
my $base_search = "scan/co=yes/fi=$tab";
for(@$ary) {
my($sku, $area, $cat, $desc) = @$_;
for( \$sku, \$area, \$cat, \$desc) {
$$_ =~ s/\s+$//;
}
if($area ne $prev_area) {
$prev_area = $area;
$prev_cat = '';
my $url = join '/',
$base_search,
"sf=$opt->{first_field}",
"se=$area",
"op=eq",
"tf=$opt->{second_field},$opt->{desc_field}",
;
push @rows, {
%menuinit,
msort => 0,
page => $url,
inactive => 0,
name => $area,
};
}
if($cat ne $prev_cat) {
$prev_cat = $cat;
my $url = join '/',
$base_search,
"sf=$opt->{first_field}",
"se=$area",
"op=eq",
"sf=$opt->{second_field}",
"se=$cat",
"op=eq",
"tf=$opt->{desc_field}",
;
push @rows, {
%menuinit,
msort => 1,
page => $url,
inactive => 0,
name => $cat,
};
}
push @rows, {
%menuinit,
msort => 2,
name => $desc,
inactive => 0,
page => $sku,
} unless $opt->{no_leaves};
}
for(@rows) {
#::logDebug("pushing out --> " . $_->{name});
push @out, join "\t", @{$_}{@menufields};
}
}
}
elsif ($type eq 'category_file') {
$opt->{table} ||= 'category';
$opt->{first_field} ||= 'prod_group';
$opt->{second_field} ||= 'category';
#::logDebug("menu_load options=" . uneval($opt));
CATBUILD: {
my $tab = $opt->{table};
my $db = database_exists_ref($tab)
or do {
Vend::Tags->error({ set => errmsg(
"Failed to open %s table %s.",
'products',
$tab,
),
});
last CATBUILD;
};
my $tname = $db->name();
#::logDebug("LARGE=" . $db->config('LARGE'));
$opt->{key_field} ||= $db->config('KEY');
$opt->{sku_field} ||= 'sku';
unless ( $db->column_exists($opt->{sku_field}) ) {
Vend::Tags->error({ set => errmsg(
"%s database %s for tree write: %s",
'check',
$tab,
"sku field $opt->{key_field} does not exist",
),
});
last CATBUILD;
}
my @somefields = qw/mgroup page name description/;
my @fields = (
$opt->{key_field},
$opt->{first_field},
$opt->{second_field},
);
push @fields, $opt->{desc_field} if $opt->{desc_field};
my $sfields = join ",", @fields;
my $tfields = $opt->{sort_fields};
if(! $tfields) {
$tfields = "$opt->{first_field},$opt->{second_field}";
$tfields .= ",$opt->{desc_field}" if $opt->{desc_field};
}
my $q = qq{SELECT $sfields FROM $tname ORDER BY $tfields};
#::logDebug("category_file menu_load query=$q");
my $ary = $db->query($q)
or do {
Vend::Tags->error({
set => errmsg(
"No results from %s table %s.",
'products',
$tname,
),
});
last CATBUILD;
};
my $prev_area = '';
my $prev_cat = '';
@out = join "\t", @menufields;
my @rows;
my $base_search = "scan/co=yes/fi=$tab/rf=$opt->{sku_field}";
$base_search .= "/tf=$opt->{desc_field}" if $opt->{desc_field};
for(@$ary) {
my($sku, $area, $cat, $desc) = @$_;
for(\$area, \$cat) {
$$_ =~ s/\s+$//;
}
if($area ne $prev_area) {
$prev_area = $area;
$prev_cat = '';
my $url = join '/',
$base_search,
"sf=$opt->{first_field}",
"se=$area",
"op=eq",
"tf=$opt->{second_field}",
;
push @rows, {
%menuinit,
msort => 0,
page => $url,
inactive => 0,
name => $area,
};
}
if($cat ne $prev_cat) {
$prev_cat = $cat;
my $url = join '/',
$base_search,
"sf=$opt->{first_field}",
"se=$area",
"op=eq",
"sf=$opt->{second_field}",
"se=$cat",
"op=eq",
;
push @rows, {
%menuinit,
msort => 1,
page => $url,
inactive => 0,
name => $cat,
};
}
}
for(@rows) {
#::logDebug("pushing out --> " . $_->{name});
push @out, join "\t", @{$_}{@menufields};
}
}
}
elsif ($type eq 'comb_category') {
$opt->{table} ||= 'products';
$opt->{comb_field} ||= 'comb_category';
$opt->{sort_string} ||= "tf=$opt->{comb_field},$Vend::Cfg->{DescriptionField}";
$opt->{sort_order} ||= $opt->{comb_field};
COMB_BUILD: {
my $tab = $opt->{table};
my $comb_field = $opt->{comb_field};
my $db = $Db{$tab}
or do {
$Tag->error({ set => errmsg(
"Failed to open %s table %s.",
'products',
$tab,
),
});
last COMB_BUILD;
};
#Debug("LARGE=" . $db->config('LARGE'));
if(! $opt->{even_large} and $db->config('LARGE')) {
$Tag->error({ set => errmsg(
"%s database %s for tree write: %s",
'check',
$tab,
'too large, must override',
),
});
last COMB_BUILD;
}
my @somefields = qw/mgroup page name description/;
my $q = qq{
SELECT $comb_field
FROM $tab
ORDER BY $comb_field
};
my $ary = $db->query($q)
or do {
$Tag->error({
set => errmsg(
"No results from %s table %s.",
'products',
$tab,
),
});
last COMB_BUILD;
};
@out = join "\t", @menufields;
my @rows;
my @base_search = ( "bs=1",
"em=1",
"su=1",
"fi=$tab",
"st=db"
);
my @levels;
my %seen;
$seen{$_->[0]}++ for @$ary;
for(sort keys %seen) {
my $comb_category = $_;
$comb_category =~ s/\s+$//;
my @parts = split /:/, $comb_category;
my $combname = '';
for( my $i = 0; $i < @parts; $i++) {
my $level = $levels[$i] ||= {};
my $name = $parts[$i];
my $comb = join ":", @parts[0 .. $i];
if(! $level->{$name}) {
$level->{$name}++;
my $searchterm = "se=";
$searchterm .= $Tag->filter('urlencode',$comb);
my $form = join "&",
@base_search,
$opt->{sort_string},
"sf=$comb_field",
$searchterm
;
push @rows, {
%menuinit,
msort => $i,
page => 'search',
inactive => 0,
name => $name,
form => $form,
};
}
}
}
for(@rows) {
#Debug("pushing out --> " . $_->{name});
push @out, join "\t", @{$_}{@menufields};
}
#return join("<br>",@out);
}
}
elsif ($type eq 'cat_menu') {
AREABUILD: {
my $tab = $opt->{table} || 'area';
my $ctab = $opt->{cat_table} || 'cat';
my $db = database_exists_ref($tab)
or do {
Vend::Tags->error({ set => errmsg(
"Failed to open %s table %s.",
'area',
$tab,
),
});
last AREABUILD;
};
#Debug("LARGE=" . $db->config('LARGE'));
my $q = qq{ SELECT * FROM $tab};
$q .= qq{ WHERE sel = '$opt->{sel}'}
if $opt->{sel};
$q .= qq{ ORDER BY sort };
my $ary = $db->query({ sql => $q, hashref => 1 } )
or do {
Vend::Tags->error({
set => errmsg(
"No results from %s table %s.",
'area',
$tab,
),
});
last AREABUILD;
};
@out = join "\t", @menufields;
my @rows;
my $nc = '0000';
my $cdb = database_exists_ref($ctab)
or do {
Vend::Tags->error({
set => errmsg(
"No results from %s table %s.",
'category',
$tab,
),
});
last AREABUILD;
};
my $ctabname = $cdb->name();
foreach my $row (@$ary) {
my $code = $row->{code};
my $nrow = {
code => $nc++,
name => $row->{name},
img_icon => $row->{image},
msort => 0,
mgroup => $row->{set_selector},
};
old_link($row, $nrow);
my $sq = qq{
SELECT * FROM $ctabname
WHERE sel = '$code'
OR sel like '$code %'
OR sel like '% $code'
OR sel like '% $code %'
ORDER BY sort
};
#Debug("subquery=$sq");
push @rows, $nrow;
my $sary = $cdb->query({ sql => $sq, hashref => 1 });
#Debug("subquery returned: " . uneval($sary));
for my $crow (@$sary) {
my $nsub = {
code => $nc++,
name => $crow->{name},
img_icon => $crow->{image},
msort => 1,
mgroup => $crow->{sel},
};
old_link($crow, $nsub);
push @rows, $nsub;
}
}
for(@rows) {
#Debug("pushing out --> " . $_->{name});
push @out, join "\t", @{$_}{@menufields};
#Debug("pushing out --> row=" . uneval($_));
}
}
}
elsif($type eq 'html') {
my $text = $opt->{html};
my $start = '0001';
@out = join "\t", @menufields;
while($text =~ s{<a(\s+.*?)</a>}{}is) {
my $blob = $1;
my $desc = '';
$blob =~ m{^[^>]*\s+title=(['"]?)(.*?)\1}
and $desc = $2;
$blob =~ s{^.*?\shref\s*=\s*(["'])?(.*?)\1}{}is
or next;
my $link = $2;
$blob =~ s/.*?>//;
1 while $blob =~ s{<.*?>}{};
my $anchor = $blob;
my $sort = $start;
$sort =~ s/./x/;
my($href, $parms) = split /\?/, $link, 2;
my %record = (
code => $start++,
msort => $sort,
page => $href,
form => $parms,
name => $anchor,
description => $desc,
);
push @out, join "\t", @record{@menufields};
}
}
return '' unless @out;
return join "\n", @out, '';
}
EOR