breadcrumbs —
| Attribute | Pos. | Req. | Default | Description |
|---|---|---|---|---|
| title | ||||
| reset_on_product | ||||
| template | ||||
| joiner | ||||
| interpolate | 0 | interpolate output? | ||
| hide | 0 | Hide the tag return value? |
Interchange 5.6.0:
Source: dist/standard/config/breadcrumbs.tag
Lines: 198
# Copyright 2004-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: breadcrumbs.tag,v 1.5 2007-08-09 13:40:53 pajamian Exp $
UserTag breadcrumbs Order number
UserTag breadcrumbs addAttr
UserTag breadcrumbs Routine <<EOR
sub {
my ($number, $opt) = @_;
use vars qw/$Tag $Scratch $CGI $Session $Variable/;
my $only_last = $::Variable->{BREADCRUMB_ONLY_LAST} || 'ord/basket login';
my $exclude = $::Variable->{BREADCRUMB_EXCLUDE};
my $max = $number || $::Variable->{BREADCRUMB_MAX} || 6;
my %exclude;
my %only_last;
my @exclude = split /[\s,\0]+/, $exclude;
my @only_last = split /[\s,\0]+/, $only_last;
@exclude{@exclude} = @exclude;
@only_last{@only_last} = @only_last;
my $curpage = $Global::Variable->{MV_PAGE};
my $titles = $Scratch->{bc_titles} ||= {};
my %special = (
scan => sub {
my $url = shift;
my @items = split m{/}, $url;
my $title;
for(@items) {
if(s/^se=//) {
$title = $_;
}
elsif(s/^va=banner_text=//) {
$title = $_;
}
}
return ($title, $title);
},
);
my $curhist = $Session->{History}->[-1] || [];
my $curparams = $curhist->[1] || {};
my $keyname;
my $curfull = $curhist->[0];
$curfull =~ s/$Vend::Cfg->{HTMLsuffix}$//;
$curfull =~ s{^/}{};
my ($curaction,$curpath) = split m{/}, $curfull, 2;
my $ptitle = $opt->{title} || $curparams->{short_title};
$ptitle ||= $Scratch->{short_title};
my $db;
my @extra;
if($special{$curaction} and ! $ptitle) {
($ptitle, $keyname) = $special{$curaction}->($curpath);
}
elsif(
$Vend::Flypart
and
$db = Vend::Data::product_code_exists_ref($Vend::Flypart)
)
{
my $tab = $db->name();
my $record = tag_data($tab, undef, $Vend::Flypart, { hash => 1});
$ptitle = $keyname = $record->{$Vend::Cfg->{DescriptionField}};
if($record and $record->{prod_group}) {
my @parms;
push @parms, "fi=$tab";
push @parms, "co=yes";
push @parms, "st=db";
push @parms, "sf=prod_group";
push @parms, "se=$record->{prod_group}";
push @parms, "op=eq";
push @extra, {
key => $record->{prod_group},
title => $record->{prod_group},
description => undef,
url => $Tag->area({ search => join("\n", @parms) }),
};
}
if($record and $record->{category}) {
my @parms;
push @parms, "fi=$tab";
push @parms, "co=yes";
push @parms, "st=db";
if($record->{prod_group}) {
push @parms, "sf=prod_group";
push @parms, "se=$record->{prod_group}";
push @parms, "op=eq";
}
push @parms, "sf=category";
push @parms, "se=$record->{category}";
push @parms, "op=eq";
push @extra, {
key => $record->{category},
title => $record->{category},
description => undef,
url => $Tag->area({ search => join "\n", @parms }),
};
}
}
if(! $ptitle) {
$ptitle = $Scratch->{page_title};
$ptitle =~ s/(\s*\W+\s*)?$Variable->{COMPANY}(\s*\W+\s*)?//;
}
$ptitle =~ s/^\s+//;
$ptitle =~ s/\s+$//;
$keyname ||= $curpage;
$titles->{$curpage} = $ptitle if $ptitle;
my %exclude_param = qw(
mv_pc 1
bread_reset 1
);
if($Scratch->{bread_reset} || $CGI->{bread_reset}) {
delete $Session->{breadcrumbs};
}
my $crumbs = $Session->{breadcrumbs} ||= [];
my $crumb;
if($opt->{reset_on_product} and @extra) {
#::logDebug("Resetting based on product");
@$crumbs = ();
}
if(! $exclude{$curpage}) {
my $form = '';
if(! $CGI->{bread_no_params}) {
for(grep !$exclude_param{$_}, keys %$curparams) {
$form .= "\n$_=";
$form .= join("\n$_=", split /\0/, $curparams->{$_});
}
}
$crumb = {
key => $keyname,
title => HTML::Entities::encode($ptitle),
description => HTML::Entities::encode($Scratch->{page_description}),
url => $Tag->area({ href => $curfull, form => $form, secure => $CGI->{secure} }),
};
}
push @$crumbs, @extra if @extra;
push @$crumbs, $crumb if $crumb;
my %seen;
my @new = grep !$seen{$_->{key}}++, reverse @$crumbs;
my $did_one;
for(@new) {
## Kill ones that only are allowed in last position
if( $did_one and $only_last{$_->{key}}) {
$_ = undef;
}
$did_one = 1;
}
if(@new > $max) {
splice @new, $max;
}
@$crumbs = grep $_, reverse @new;
my $tpl = $opt->{template} || <<EOF;
<a href="{url}"{description?} title="{description}"{/description?} class=breadlink>{title}</a>
EOF
my @out;
for(@$crumbs) {
next unless ref($_) eq 'HASH' and $_->{url};
my $link = tag_attr_list($tpl, $_);
#::logDebug("link=$link from:\ntpl=$tpl\ncrumb=" . ::uneval($_));
push @out, $link;
}
$opt->{joiner} = ' > ' unless defined $opt->{joiner};
return join $opt->{joiner}, @out;
}
EOR