#==========================================================================#
# catalog.cfg
#==========================================================================#
## We want to hide the .gdbm, .autonumber, .numeric, .sql, .db files
## Needs to go before VariableDatabase
DatabaseDefault HIDE_AUTO_FILES 1
# Read in some initial default variables from a directory. These are
# larger ones -- they could conceivably be maintained in the
# VariableDatabase but might be easier to maintain in a file, especially
# for development.
#
# Notable settings: COMMON_MENU, COPYRIGHT
#
DirConfig Variable variables
# Read in large variables or dynamic variables from a series
# of files in a directory
VariableDatabase variable
# Read in site-specific variables from a database (if any).
# Used to create a information for a temporarily transferred
# catalog, i.e. for development.
#
# Ignored if file doesn't exist.
VariableDatabase site
# Warn if any important modules or usertags are missing.
Require module Digest::MD5 "Need %s %s for better cache keys."
Require module Digest::Bcrypt "Required if you are going to use bcrypt passwords for UserDB."
Require module Crypt::Random "Required if you are going to use bcrypt passwords for UserDB."
Require module Safe::Hole "Need %s %s for embedded perl object access."
# Encoding
Variable MV_UTF8 1
Variable MV_HTTP_CHARSET UTF-8
#==========================================================================#
# Can send various files outside the catalog directory, for disk partition
# reasons, for example.
ParseVariables Yes
ifdef LOGDIR
ErrorFile __LOGDIR__/error.log
AsciiTrack __LOGDIR__/tracking.asc
#TrackFile __LOGDIR__/usertrack
ErrorDestination "Run jobs group=%s pid=%s" __LOGDIR__/jobs_run.log
ErrorDestination "Finished jobs group=%s pid=%s" __LOGDIR__/jobs_run.log
endif
ifndef LOGDIR
AsciiTrack logs/tracking.asc
#TrackFile logs/usertrack
endif
ifdef CACHEDIR
SessionDatabase __CACHEDIR__/session
ScratchDir __CACHEDIR__/tmp
endif
ifndef CACHEDIR
SessionDatabase session
ScratchDir tmp
endif
ifdef RUNDIR
RunDir __RUNDIR__
endif
#==========================================================================#
# Database setup
ParseVariables Yes
ifndef INDEV
DatabaseDefault LOG_ERROR_SESSION 0
endif
## Quote all identifiers to avoid name clash issues and SQL injection attacks
DatabaseDefault QUOTE_IDENTIFIERS 1
ifdef MYSQL
DatabaseDefault NO_ASCII_INDEX 1
include dbconf/mysql/mysql.cfg
endif
ifdef PGSQL
DatabaseDefault NO_ASCII_INDEX 1
include dbconf/pgsql/pgsql.cfg
endif
ifdef SQLITE
DatabaseDefault NO_ASCII_INDEX 1
include dbconf/sqlite/sqlite.cfg
endif
# Default DBM if nothing else defined
ifndef SOME_DATABASE
Require We_need_a_database "%s, must have either MySQL or Postgres"
endif
### Uncomment these for DBI sessions
# SessionType DBI
# SessionDB sessions
# Database sessions sessions.txt __SQLDSN__
# NoImport sessions
### You can change the length of the session ID. Must be integer between
### 8 and 32.
# Limit session_id_length 8
#==========================================================================#
# The URLs which are written to refer back to our catalog.
VendURL http://__SERVER_NAME____CGI_URL__
SecureURL __SECURE_SERVER____CGI_URL__
ifndef SECURE_ENABLE
SecureURL http://__SERVER_NAME____CGI_URL__
endif
# Set the image path for relative images
ImageDir __IMAGE_DIR__/
#==========================================================================#
# Here we set up the catalog theme.
##
## Here we pick up the region variables like LEFTONLY_TOP and LEFTONLY_BOTTOM.
##
## Commenting; new variables TOP and BOTTOM will be defined in variable directory.
## No longer going to need multiple leftright_top, leftonly_top, etc; will be
## defined in "display_class" in each page.
#DirConfig Variable templates/regions
# TRAFFIC is defined system-wide in interchange.cfg. When in low-traffic
# mode, variables are dynamic -- i.e. when you change the region file
# the page changes. Otherwise a reconfig must be done to change the
# variable.
#
# Careful, this can change the way *other* variables are interpreted.
ifdef @TRAFFIC =~ /low/i
Pragma dynamic_variables
Pragma dynamic_variables_file_only
endif
# Provide some links for the admin to edit pages if we have the UI in
ifdef @UI
Autoload admin_links
endif
#==========================================================================#
# Internationalization
LocaleDatabase locale
# Default locale
ifdef DEFAULT_LOCALE
DefaultLocale __DEFAULT_LOCALE__
endif
ifdef DEFAULT_LOCALE
# Database definitions for localized databases
include dbconf/locales/{__LOCALES__}.cfg
endif
Locale en_US <
Pragma no_html_comment_embed
## DATA INSERTION PRAGMAS for form database inserts or updates
## Restricts inserts to insert-only, but allows the fall-through
## behavior from update to insert. No existing data will be clobbered.
# Pragma dml=preserve
## Pragma 'dml=strict' forces update or insert to only perform the
## requested action.
# Pragma dml=strict
## Pragma 'dml=upsert' (the default) preserves Interchange's original
## method of doing an update if the record exists, otherwise doing an
## insert. This can clobber an existing key.
# Pragma dml=upsert
## END DATA INSERTION PRAGMAS
#==========================================================================#
# User session related settings.
# Whether to encrypt passwords in UserDB
UserDB default crypt 1
UserDB default bcrypt 1
# These 2 lines are needed for query/pw_reset
UserDB default promote 1
UserDB default from_plain 1
# The pepper should be unique for your site, but note that if you change this,
# it will make previously-crypted passwords inaccessible --
# so set this before you start adding users, or don't set at all.
UserDB default bcrypt_pepper __BCRYPT_PEPPER__
# Set to 1 to make the username and password case-insensitive
UserDB default ignore_case 0
# Change a field to something that doesn't conflict in MySQL
UserDB default time_field mod_time
# Don't want people setting their credit limit or dealer status directly
UserDB default scratch "dealer price_level credit_limit usernick"
UserDB default expire_field expiration
# Update the database with the date when creating a user
UserDB default created_date_iso created
# Update the database with the date when updating a user via set_values
UserDB default updated_date_iso updated
# Set some other things you want to retain but which don't deserve their
# own field -- stored in serial field preferences
UserDB default extra_fields <{state_cs_in} && !$CGI->{state}){
$CGI->{state} = $CGI->{state_cs_in};
}
return;
[/calc]
mv_same_billing=always_pass
fname=required
lname=required
address1=required
address2=always_pass
city=required
country=required
state=multistate
zip=multizip
phone_day=phone
[if !session logged_in]email=email_only[/if]
EOV
endif
## Payment-related stuff
EncryptKey __PGP_KEY__
## These routes are not order routes, but payment routes
Route authorizenet id "__MV_PAYMENT_ID__"
Route authorizenet secret "__MV_PAYMENT_SECRET__"
Route authorizenet host "__MV_PAYMENT_HOST__"
Route authorizenet referer "__MV_PAYMENT_REFERER__"
Route itransact id "__MV_PAYMENT_ID__"
Route netbilling id "__MV_PAYMENT_ID__"
Route netbilling secret "__MV_PAYMENT_SECRET__"
Route signio id "__MV_PAYMENT_ID__"
Route signio secret "__MV_PAYMENT_SECRET__"
Route signio partner "__MV_PAYMENT_PARTNER__"
Route signio vendor "__MV_PAYMENT_VENDOR__"
Route signio host "__MV_PAYMENT_HOST__"
Route skipjack id "__MV_PAYMENT_ID__"
Route skipjack partner "__MV_PAYMENT_PARTNER__"
Route linkpoint id "__MV_PAYMENT_ID__"
Route linkpoint host "__MV_PAYMENT_HOST__"
Route linkpoint keyfile "__MV_PAYMENT_SECRET__"
# This prevents a user from setting this value, you may want to unset
# this if you have user-selectable handling charges like insurance
FormIgnore mv_handling
#
#
# Along these lines further, for better integrity and less chance of a
# user screwing up your order routes:
# Note that __ORDER_ROUTES__ is empty by default, default Route "default"
# is used with cascades
FormIgnore mv_order_route
## This route places the order entry in the database. If you don't
## have an inventory table (or a userdb table for that matter) make
## sure you remove it from the list of "transactions" tables.
Route log <{deliverable} = $CGI->{mv_arg};
$CGI->{mv_nextpage} = 'deliver';
if(! $Session->{username} and $CGI->{mv_username}) {
$Tag->userdb('login');
}
return 1;
}
EOR
# Pricing setup
#
# If the user is logged in and is marked as a "dealer" (1 in the dealer
# field in the userdb database) then they are given quantity discounts
# based on price groups. (All products are in price group 1 as
# distributed.) If the quantity is 1, then pricing comes from the
# "wholesale" field in the products database.
AutoModifier pricing:price_group
#
# If the user is not a dealer (or not logged in) then pricing just comes
# from "price". Any quantity discounts will be set in the qN fields in the
# database, and are separate from dealer quantity discounts.
#
Profile dealer < < 'nontaxable',
}
EOR
Profile distributor < < 'nontaxable',
}
EOR
## This should match the default direct setting below this paragraph
Profile default CommonAdjust "pricing:q5,q10 ;:sale_price, ;:price, ;$, :related, ==:options"
Profile default NonTaxableField
Profile default PriceField 0
CommonAdjust pricing:q5,q10 ;:sale_price, ;:price, ;$, :related, ==:options
PriceField 0
## This sets the type of options pertaining to the product
OptionsEnable option_type
## Finally, set which tables products can be ordered from
ProductFiles products variants
#==========================================================================#
## Tag which provides a CSS button-looking link
UserTag b-link Order href form
UserTag b-link HasEndTag
UserTag b-link addAttr
UserTag b-link Routine <{no_javascript}) {
$opt->{extra} ||= 'style="font-size: smaller"';
return $Tag->page($opt) . $anchor . '';
}
my $class = $opt->{class} || 'btn';
my $url = $Tag->area($opt);
my $string = $Tag->filter('encode_entities', $anchor);
my @properties;
push @properties, "type=button";
push @properties, qq{value="$string"};
push @properties, qq{class="$class"};
for(qw/style id name/) {
next unless $opt->{$_};
push @properties, qq{$_="$opt->{$_}"};
}
push @properties, qq{onClick="window.location='$url'"};
push @properties, qq{onMouseOver="saveblink=window.status;window.status='$url'"};
push @properties, qq{onMouseOut="window.status=saveblink"};
if($opt->{title}) {
$opt->{title} = $Tag->filter('encode_entities', $opt->{title});
}
else {
$opt->{title} = $string;
}
push @properties, qq{title="$opt->{title}"};
push @properties, $opt->{extra} if $opt->{extra};
return qq{';
}
EOR
### Shipping setup. See Interchange docs -- you will want to change
### the origin postal code and default destination postal codes, for sure.
Shipping Postal default_geo 45056
Shipping QueryUPS default_geo 45056
Shipping default dir products/ship
Database 2ndDayAir ship/2ndDayAir.csv CSV
Database 2ndDayAirAM ship/2ndDayAirAM.csv CSV
Database 3DaySelect ship/3DaySelect.csv CSV
Database Expedited ship/Expedited.csv CSV
Database Express ship/Express.csv CSV
Database Ground ship/Ground.csv CSV
Database NextDayAir ship/NextDayAir.csv CSV
Database NextDayAirSaver ship/NextDayAirSaver.csv CSV
Database Xarea ship/Xarea.csv CSV
Database Zone ship/Zone.csv CSV
Database usps ship/usps.txt TAB
Database Book ship/Book.txt TAB
Database Priority ship/Priority.txt TAB
Database air_pp ship/air_pp.txt TAB
Database surf_pp ship/surf_pp.txt TAB
Database ups_cache ship/ups_cache.txt __SQLDSN__
Database ups_cache AUTO_SEQUENCE ups_cache_seq
Database ups_cache DEFAULT_TYPE varchar(12)
Database ups_cache INDEX weight origin zip shipmode country
## Uncomment
MaxQuantityField inventory:quantity
## Builds a series of hidden variables given an IC-style form
## specification, i.e.
##
## [hiddens]
## mv_action=refresh
## mv_nextpage=foo
## [/hiddens]
##
UserTag hiddens Interpolate 1
UserTag hiddens HasEndTag
UserTag hiddens Routine <filter('encode_entities', $v);
push @out, qq{};
}
return join "\n", @out;
}
EOR
## When uncommented, delivers a redirect if we get a request for an image
## DeliverImage Yes
## Map a subroutine to happen if the page is not there
SpecialSub missing ncheck_category
UserTag edisplay Alias error auto=1 class="alert alert-danger list-unstyled"
UserTag wdisplay Alias warnings auto=1 list_class="alert alert-success list-unstyled"
UserTag ecgi Alias cgi keep=1 filter=encode_entities name=
CodeDef string2uri Filter
CodeDef string2uri Description Sanitize a string for use in a URL
CodeDef string2uri Routine <