This module is only for updating existing installations of toolkit only. It should not be used if you don't currently have it installed in your store.
The tool kit function library fills in many of the gaps in the SMT coding system by using the module's item tags, similar to those you are already familiar with in your page templates.
You can even use the mvassign and mveval functions to
run dozens of mivascript functions and expressions right
in your SMT pages if you are familiar with the mivascript
language or you look them up in the mivascript reference
manual. It also contains many functions for extending
the capabilities of your store without additional,
expensive modules. You can even use it to create a
mobile framework for your store so that customers can
view your store on their smartphone without the aid of
a magnifying glass. The module is 100% compatible with
MySQL, MivaSQL, store morph page templates, and skins.
New Merchant users will find the use of item
tag tokens to be straightforward and a great addition to
the already extensive capabilities of Merchant. Once you
get a couple functions under your belt, you will find
this module has many unique features that are fairly
easy to implement. Touted by developers and store owners
alike as a must have module.
The license is for one Miva Merchant domain/mall and cannot be sold,
transferred, or re-distributed. If you have multiple
stores in the same domain merchant.mvc, only one license
is needed. If you have a store in a different domain,
that would require another license.
Below is a summary of the dozens of features currently in
the tool kit. This module is frequently updated with new
features added from store owner wish lists. If you don't
see something you want, please ask.
Below that is the list of specific functions
used to implement these features. The "how to" examples
in the list below are even more extensive than the
examples in the module's admin screen.
If you have
difficulty understanding the examples and implementing
a particular feature or just don't have time to do it, we
may be available to do it for you. Submit an inquiry via
our
Contact Us form for a price quote and availability.
Once you obtain a price quote, you will be referred to
our
Negotiated Product and Service Prices page to place
an order.
Store Morph Language Extensions
Mivascript expressions. Dramatically
extend store morph. The ultimate super function, run
almost any mivascript simple or complex
expression and save the result to a variable using the
mvassign function. You can also use the mveval function to do the
same thing except it displays the result without having to save it to a variable first.
MOBILE layout. Use many of the functions
in this Tool Kit to automatically route customers to your
specifically designed pages for viewing on a smartphone.
If you are currently viewing this page from a smartphone,
you already know what the mobile layout can look like.
You can create a basic mobile layout yourself using a
how to
guide or you can hire a designer to do it for you. You
could even add advanced features and modules like those
in your desktop layout, e.g. ratings and reviews,
coupon redemption, and checkout questions.
If you are on a PC or MAC, our mobile demo will give you
an idea of what your store could look like on your
customers' smartphones.
String. Several low level string functions can be used to manipulate string values. These are for those who
are not familiar with the mivascript language or when you have a simple expression to process.
Brief description display. Display a specified
number of sentences from the beginning of the description or
header fields, e.g. product briefs on category pages or
the category page meta description from its header.
No html. Strips the html tags from strings.
Math. Several low level math functions can be used to make computations involving numeric variables. Display
price savings. Consecutively number products on the product list pages. The uses are endless. These functions are
for those not familiar with the mivascript language.
Elapsed time for page render. Calculate the time it takes to load a page. Great development tool to see how
each feature you add to a page effects the load time.
Currency format. You can format a number to the currency format used by the store.
Time/date. Several time/date conversion functions can be used for displaying the current date or some date in the future.
You can display the date in the format you want.
Arrays. Create single dimension arrays from string data separated with a delimiter or from a variable, e.g. in a
custom product field. You can further sort that array alphabetically. You can also sort
multidimensional arrays on a specific column.
Counter. Implement a counter for use within foreach loops. For example, display the incremented product number on the product list pages next to each product.
Header Output. You can change the content-type
of a store morph page for use with other applications. You
can also change the page status, e.g. 404 or 301.
Short links. You can create links like
http://www.yourdomain.com/ABC.html to improve your SEO.
Form validation. You can validate specific
inputs in a form on a page and redisplay the page if they
don't pass validation.
Enhanced Maintenance. Close the store to
visitors but keep it open for the store owner so he/she
can work on it and view the changes. This can be done
for the whole store or just one screen that you are
working on.
Set Cookie. Easily set a cookie in the
page headers.
Product Extensions
Product Ratings and Reviews. Complete,
best in class, system for managing ratings and reviews.
The module can even verify that the reviewing customer
actually bought the product from you. Optionally allow
customers to rate without logging in. Optionally require
admin approval before the review is publicly visible.
Products in category, product list, and search screens
can be sorted by highest rated on top when using other
Tool Kit or Power Search features. Show a product's
rating or review on any screen with tokens. Show a list
of the most recent reviews on the storefront or any
page with a token.
Multi-Quantity add. Assign quantities for
multiple options then click the single add to basket button.
No specific function is involved. See the example below in the
simplesearch section.
Products in category list. List one or more products from any category in the store on any page in the store.
Product find. Lookup the details of any specific product in the store and display that data on any page in the
store.
Custom product fields. Display the value
in any custom product field, e.g. upc, manufacturer,
condition, MSRP. Insert a value into the custom field,
e.g. number of page views for each product. Show these
extra fields on any screen in the store.
Custom product images. Display a specific
custom product image.
Product count in categories. In admin >
utilities > emporium plus tool kit you can run the
product count in categories and save the values to a
custom product field which can be displayed anywhere in the
store, including in the category tree.
Featured products. Create an easy to change list of product codes which can then be displayed on any page in the store.
Best sellers. Retrieve and display the
best sellers in the store or in specific categories.
Combine functions to list the top selling products under each
subcategory on a parent category's page. The best seller
list changes automatically since it is based on actual
sales.
New products. Retrieve and display the most recently added products in the store.
Most recent purchased. Display the most recently purchased products.
Related products. Display related products of a specific product at any location.
Recommendation engine (suggested products).
Using prior purchase history, display products which were
also bought when a specific product was purchased, i.e.
customers who bought A also bought X, Y, and Z. This is
similar to related products but is dynamically updated by
the actual purchases made by your customers. Old, stale
relationships are dropped over time. Display them on the
product page, in the basket, and on the invoice. If you
are using our Follow-on Contact module you can even
display them as recommendations in the email sent several
days/weeks after the order.
Product in categories. List all the categories a product is in. Useful in breadcrumb navigation when the category code is not passed in the url.
Next/Previous buttons. Display links for the customer to go to the next or previous product in the same category.
Random product display. Display a specified number of non-repeating random products from the entire store or a specified category on any page in the store. You can also display a random image from the list of products on a specific page, e.g. the product list page. The automatic rotation of products and images keeps your pages fresh, keeping search engines interested. Improve your search engine optimization (SEO) with dynamically changing content. The random display respects availability group settings.
Header/footer text. Read and display the contents of the header and footer.
Meta tag text. Read and display the meta tag keyword and description without the meta tag formatting.
Variant info in the basket. Display the variant name and code in the basket.
Dynamic attributes. Conditionally display a message in the basket as an attribute.
Percent Attributes. Add or subtract a percent of the product price with option percent prices
Tax adjust items. Remove tax of an item if one of its options is not taxable.
Product list pagination and sorting. On the
product list pages include links to all of the pages in
the store's product list along with
the page and product totals for the whole store. You can
also let the customer sort products and set the number of
products per page.
Wait List. Allow customers to put themselves
on a wait list for out of stock products. It can be used for the
inventory by product code and inventory at the attribute-option
level.
Product Page Templates. You can have multiple
versions and layouts of your product pages.
Product Search (Simple Search). You can search
keywords in any product or custom product field. You can
sort on any of those fields and even on best sellers. Allow the
customer to select sorting and products per page. Implement search
on any page, including the category and product list pages.
Prior purchase of a product. Display the
customer's most recent order which the current product was in.
Recent visit history. Show links to product
pages that the customer had visited in the current session.
Pages currently being browsed. Display the
page links for product, category, search, and product list
of pages currently being visited by all customers in your
store.
Category Extensions
Category lists. List parent categories and subcategories at any location. Great for subcategory navigation.
In addition to the category names, you can display their images.
Category pagination and sorting. On the category pages include links to all of the pages in that category along with
the page and product totals for the category. You can
also let the customer sort products and set the number of
products per page.
Open (expanded) category tree. You can build a category tree that remains expanded at all times.
Custom category fields. Display the value in a custom category field on the CTGY page template.
Breadcrumb navigation. Display breadcrumb trail to guide the customer to higher level categories from a subcategory.
Header/footer text. Read and display the contents of the header and footer.
Meta tag text. Read and display the meta tag keyword and description without the meta tag formatting.
Tool tips. Include tool tips on your category pages.
Category Page Templates. You can have multiple
versions and layouts of your category pages.
Category Information Retrieve most of the variables related to a specific category.
Basket Enhancements
EZ Basket save and restore. Save the basket contents
with one click; no expiration. Restore the basket contents with one click
or individually. Display the saved basket before restoring. Display the
date saved. Three systems: use custom customer field,
cookie, or email address. The email address is useful since
you can save the basket on your smartphone or other device and
then restore the basket on your home computer or share the
basket with friends or co-workers without revealing your login.
Discount. Use simple or complex conditional
store morph code to run a token and give a fixed or
percentage discount to customers in the basket or during
checkout.
Upcharge. Add a surcharge or fee based on
conditions with store morph coding.
Multi-product (bulk) additions. Add multiple
products to the basket with a single button click from
category, all products, search, and shopping pad lists.
Basket thumbnails. Include the product thumbnails in the basket.
Basket weight. Calculate the total weight of the items in the basket.
Basket subtotal. Display a subtotal of
just the products in the basket, less shipping, tax,
coupons, discounts, fees, and other charges.
Combined price. Combine the base and
attribute prices into one price in the basket for each
line item
Basket clear all. Empty the basket with a single button click. You can also use it to empty the basket when
a customer logs out.
Basket one click update. Replace the remove and update buttons on each product with a checkbox and quantity
input for each and a single basket update button that updates all changes at once.
Update basket with cookie. Using saved cookies, insert first name, last name, state, zip, country and other non-sensitive data, you can automatically update the basket database. This is great for stores that use the shipping calculator function which displays shipping rates before logging in and checking out.
Basket Filler. Refill customer info when not logged in and returned to checkout.
Continue shopping. Put a continue shopping button on the basket page that takes the customer back to the
Miva Merchant category, product list, or search page they were last on before putting a product in the basket.
Mini-basket. Abbreviated basket count and total. Create a miniature basket listing products and totals and insert on any page.
Attribute prompt vs code. Display the attribute and option prompt in the basket instead of the non-descriptive code.
It can also be used for the checkout, invoice and picklist screens.
Attribute/Option Images. Display the attribute and option images if they exist.
Country. Display the country name instead of or in addition to the country code.
Charge Delete. Delete a basket charge, e.g. coupon or discount
Percent Attributes. Add or subtract a percent of the product price with option percent prices
Shipping Calculator
Calculate shipping using the installed shipping modules. This preview shipping feature lets you display the shipping methods and charges on any page in the store. Customers like to check shipping before they go to checkout and fill in their full customer info. This feature is even compatible with the Sort Shipping Plus Free Shipping Option and CBS Shipping Supermod modules so their location and other restrictions are reflected in the shipping options list.
Checkout Enhancements
Order subtotal. Calculate the subtotal of products in the order, less shipping, tax and other charges. This
is useful for analytic programs that can only use the subtotal.
Order variables. Display order product subtotal, other charges total, shipping and tax amount,
total weight, item count, and grand total.
Agreement page. Do not allow the customer to continue checkout
unless they agree to your terms.
Order minimums for groups. Set order minimums
(dollar value and/or quantity) for price or availability
groups. Configure custom message for standard minimum order page.
Proceed code generation. Eliminate fraudulent
email addresses by sending a proceed code before the
customer can continue checkout.
Order History
Order history. Display all of the logged in customer's orders with links to redisplay the invoice of each. Include a summary total of orders which have not been deleted.
Reorder. Quick button click to insert all of the products into the basket that were in a past order. Great for recurring orders.
Printable Invoices. Redisplay past invoices so they can be printed.
Customer Enhancements
Customer Do Not Email Registry. You can
allow customers to opt out of non-order type emails.
Custom customer fields read. Display the contents of any custom customer field.
Custom customer fields write. Insert data into a custom customer field, e.g. tax ID, addr2, sales rep.
Force login. Force the customer to login/create an account before they can view any page in the store.
Block IP. Check IP address and redirect if desired.
Keep customer logged in. Upon order completion the customer is usually logged out. This feature can keep them
logged in for a specified period of time up to the basket timeout limit.
Customer Login Lookup. Customers can find their login by entering their email address.
New Customer Sign Up.
Automatically insert customers, e.g. new customer, into
a price or availability group.
Price Group Based on Purchase History.
Combine with the order
history feature to reward customer loyalty based on past
orders total by promoting to higher price groups as the
orders total increases, i.e. price groups based on
purchase history. You can also use custom customer fields
and the insert feature to track the cumulative orders total
for price group insertion. This method does not require
orders be kept on the server.
Purchase Membership Product.
You can also automatically
assign customers to price or availability groups based on
purchase of a specific membership product(s). Using the
the custom customer fields you can even set a term limit
on the membership and delete them automatically from the
group when they login and their membership has expired.
Automatic Email. Automatically email the
customer as price or availability group status changes.
Membership. Determine if a customer or product or category is assigned to price/availability groups.
Order minimums for groups. Set order minimums
(dollar value and/or quantity) for price or availability
groups. Configure custom message for standard minimum order page.
Affiliate Tracking
Affiliate Lookup. If you are using the built-in affiliate module and the customer arrived via an affiliate link to your store, you can determine the affiliate id, code, and name on any page in the store. This allows you to change the look and feel of the store based on the affiliate referral. You can also combine this with the export function in the Tool Kit to create a flat file of affiliate orders which can be downloaded an analyzed with a program like MS Excel.
Page Includes
External file insertion. Insert external file content (txt, html, etc.) directly into your page templates. You can also run external programs/scripts (php, asp, miva, cfm, etc.) to perform functions or return data to display in your page templates at any location. This content can be from your domain or even from another domain anywhere on the Internet. If on your domain, you can check for the existence of the external file or program before running the functions.
You can use the callurl functions to pass variables to the target file or use the faster, file read function if that is not needed.
You can hide content unless the customer fits a certain profile, e.g. is in an availability or price group.
Mini-page insertion. Insert the contents of any page template directly inside another page template. Build small widgets or objects using the add page template feature in Merchant. The objects can contain store morph code which can display dynamic data to the customer. The ability to display these widgets is handy for displaying a specials category on your storefront, a minibasket or shipping calculator on any page in the store, custom navigation objects at any location, and dozens of other uses.
Email Features
Send screen snapshot to a friend. This is the ultimate tell a friend email module. Send a snapshot of any page in your store to a friend. The snapshot can include
a message to the friend along with a link to the actual page. You can also include a math challenge question to cut down on automated form spammers. You can even specify the character encoding of the email if your store uses other character sets so the page will look correct.
Unlimited contact us forms. Create as many contact, inquiry, support, formmail, etc. type pages in your store as you want.
Each page can have a distinct layout page to receive and validate the inputs. That receiving page is then emailed to your
store staff. You can include a math challenge question to cut down on automated form spammers.
Send email from any page. Create email
templates which can be sent from any page in the store.
Send welcome emails. Generate welcome emails
when new customers create an account.
File Export/Import
Flat file export and import. You can export to a flat log file any variable on any merchant page. You can also read in and
display the contents of the flat file.
Real time export order to XML file. Export order data to an xml file as each order is completed.
Deal of the Day. Export and import the
daily deal product and coupon (requires coupon module) codes.
State List
State alphabetical list. The built in state list is not entirely in alphabetical order. It is alphabetized on
state CODE so Virginia comes before Vermont. This function sorts the list by state NAME.
Below is a list of functions currently in the tool kit.
There is also example template code using each function.
You can see by copying and pasting the example code that you
can quickly enhance your page templates with features you
thought were not possible without extensive coding or
over-priced modules. For those who want more than the
simple functions listed, you can build expressions and
create variables using the
built in mivascript functions listed in the reference
manual. Use mvassign and mveval to build complex
expressions. Study the examples and create your own
customizations of the page templates.
Real time export order to XML file - exportxmlbegin, exportxml, exportxmlend
Header output - headeroutput, vheaderoutput
Short links - tksl, altpagecode
Form validation - systemaction
Deal of the Day - export, import, sassign, vassign, mvassign,
randomall, vproduct_find
Wait List - waitlist, waitlistshow
Simple Search - simplesearch
Detailed List of Tool Kit Functions with Examples:
For the purpose of the string function demo, the following
text is used. "This page demonstrates the use of the tool kit function library to create new variables
and make changes to existing variables inside the Merchant 5.x store morph templates. The %product_name% can easily replace a token
within a description field. #Alternate Description: Can have other text here, e.g. greeting"
1. Use the substring to show the first x characters in a string. In this example,
<mvt:item name="toolkit" param="substring|l.all_settings:product:descrip,1,20" />,
we display the first 20 characters in the product description.
This page demonstrat
Alternatively, if you want to save the substring to a new
variable, you can use the newsubstring function.
For example,
<mvt:item name="toolkit" param="newsubstring|new_desc|l.all_settings:product:descrip,1,200" />
This is used in the
balloon tooltip functionality as seen
here.
2. Use the gettoken to separate a string using a delimiter character. In this example,
<mvt:item name="toolkit" param="gettoken|l.all_settings:product:descrip,#,2" />
we display the text after the # in the product description.
Alternate Description: Can have other text here, e.g. greeting
A variation of this is the vgettoken which allows
use of a variable in the last parameter instead of a
constant. So you could change the 2 above to a variable.
If you want to save the result to a variable rather than
display immediately, you can add a
third parameter to the function. For example:
<mvt:item name="toolkit" param="gettoken|l.all_settings:product:descrip,#,2|newtext" />
would save the portion of the full text to a variable
called newtext.
An example of this feature can be used with other tool kit
functions to display random products from a list of
product codes. Below is example code. Note that the
random function uses a number one less than the total
number of codes in the list of codes. Then one is added
back to it after the random number is obtained.
<br />
<mvt:item name="toolkit" param="sassign|codes|SR_00013#1S_00001#LCS00002#LC_00001#LC_00002#1S_00002#TC_00008" />
<mvt:item name="toolkit" param="sassign|one|1" />
<mvt:item name="toolkit" param="random|nrandom|6" />
<mvt:item name="toolkit" param="math_add|thisone|nrandom|one" />
<mvt:item name="toolkit" param="vgettoken|codes,#,thisone|select_product_code" />
<mvt:item name="toolkit" param="vproduct_find|productfound|select_product_code" />
<img src="&mvt:key_product:image;" border="0">
<br />
&mvt:key_product:name;
<br />
&mvt:key_product:formatted_price;
3. Use the vassign to create and name a global variable from a variable. In this example,
<mvt:item name="toolkit" param="vassign|product_name|l.all_settings:product:name" />
creates a variable named product_name from the dynamic variable l.all_settings:product:name. Then you can use the mvt to evaluate the global:product_name variable.
TOOL KIT v5
<mvt:item name="toolkit" param="vassign|ip|remote_addr" />
Your IP: &mvte:global:ip;
Displays the IP address of the customer.
<mvt:item name="toolkit" param="vassign|camefrom|http_referer" />
<mvt:if expr="NOT ISNULL g.camefrom">
You came from: &mvte:global:camefrom;
</mvt:if>
Displays the url the customer came from.
The nohtml function works just like the vassign except that it will strip html out of the variable before assigning it to the new variable. This is useful for creating a variable for use on the category page or meta tag on the product page that has no html. Then you can use the substring function to limit the number of characters displayed, e.g. a shorter description might have just the first 200 characters of the description with the html stripped out. Replace vassign with nohtml in the example above to use this function.
For example, this is used in the
balloon tooltip functionality as seen
here.
4. Use the sassign to create and name a global variable from a string. In this example,
<mvt:item name="toolkit" param="sassign|greeting|Happy Mother\\'s Day" />
creates a variable named greeting from the string "Happy Mother's Day". Note the use of the backslash to escape the apostrophe character. Then you can use the mvt to evaluate the global:greeting variable.
Happy Mother's Day
5. Use the vlength to create and name a global variable which is the length (number of characters) of
another variable. In this
example,
<mvt:item name="toolkit" param="vlength|name_length|l.all_settings:product:name" />
creates a variable named name_length from the length of the dynamic variable l.all_settings:product:name.
Then you can use the mvt to evaluate the global:name_length variable or you can use it in other functions.
11
6. Use the vglosub to replace a string with a dynamic variable inside of another variable. For example, in the product description you can replace the %product_name% with a variable.
<mvt:item name="toolkit" param="vglosub|l.all_settings:product:descrip,%product_name%,l.all_settings:product:name" />
In this example it replaces it with the l.all_settings variable.
This page demonstrates the use of the tool kit function library to create new variables
and make changes to existing variables inside the Merchant 5.x store morph templates. The TOOL KIT v5 can easily replace a token
within a description field. #Alternate Description: Can have other text here, e.g. greeting
7. You can use the same vglosub to replace a string with a variable that you create with the assign commands above in the page template. As example,
<mvt:item name="toolkit" param="vglosub|l.all_settings:product:descrip,greeting,g.greeting" />
use the g.greeting variable as the replacement.
This page demonstrates the use of the tool kit function library to create new variables
and make changes to existing variables inside the Merchant 5.x store morph templates. The TOOL KIT v5 can easily replace a token
within a description field. #Alternate Description: Can have other text here, e.g. Happy Mother's Day
8. Use the sglosub to replace a string with another string. For example,
<mvt:item name="toolkit" param="sglosub|l.all_settings:product:descrip,function,features" />
replace the word function with the word features in the product description.
This page demonstrates the use of the tool kit features library to create new variables
and make changes to existing variables inside the Merchant 5.x store morph templates. The TOOL KIT v5 can easily replace a token
within a description field. #Alternate Description: Can have other text here, e.g. Happy Mother's Day
For the purpose of the math demo, the product price is $2.00 and the product cost is $3.00.
9. Use the math_add to calculate the sum of two variables to a new number. For example,
<mvt:item name="toolkit" param="math_add|sum|l.all_settings:product:price|l.all_settings:product:cost" />
sum the price plus the cost to get a variable called sum.
5
10. Use the math_subtract to calculate the difference between two variables to a new number. For example,
<mvt:item name="toolkit" param="math_subtract|difference|l.all_settings:product:cost|l.all_settings:product:price" />
subtract the cost minus the price to get a variable called difference.
1
This function comes in handy if you are bench marking your
page development to see how fast pages load and how new
code on the page might effect load times. For example, put
<mvt:item name="toolkit" param="vassign|starttime|dyn_time_t" />
at the beginning of the page template. Then at the end of
the page template, put
<mvt:item name="toolkit" param="vassign|endtime|dyn_time_t" />
<mvt:item name="toolkit" param="math_subtract|elapsed|endtime|starttime" />
Elapsed Time: &mvte:global:elapsed; seconds
11. Use the math_multiply to save the result of variable1 times variable2 to a new number. For example,
<mvt:item name="toolkit" param="math_multiply|times|l.all_settings:product:cost|l.all_settings:product:price" />
multiply the cost times the price to get a variable called times.
6
12. Use the math_divide to save the result of variable1 divided by variable2 to a new number. For example,
<mvt:item name="toolkit" param="math_divide|result|l.all_settings:product:cost|l.all_settings:product:price" />
multiply the cost times the price to get a variable called times.
1.5
13. Use the currencyformat to format a variable to a text string formatted to the store's currency. For example,
<mvt:item name="toolkit" param="currencyformat|formatted_savings|difference" />
Format the difference between the cost and price to show savings.
Savings: $1.00
14. Use the a combination of functions to show percent savings of one price off another. The mathematical operation needs to be broken down into multiple steps. For example,
<mvt:item name="toolkit" param="math_subtract|difference|l.all_settings:product:cost|l.all_settings:product:price" />
<mvt:item name="toolkit" param="math_divide|result|difference|l.all_settings:product:cost" />
<mvt:item name="toolkit" param="sassign|value2|100" />
<mvt:item name="toolkit" param="math_multiply|times|result|value2" />
<mvt:item name="toolkit" param="math_round|times|times|2" />
obtains the difference between the cost and price. Then divides the difference by the cost. Then
multiplies that division result times 100. And finally math_round will round that result to 2 decimal places.
Savings: 33.33%
15. Time/date functions: These functions were used to display the current time and date of our server (offset -4).
<mvt:item name="toolkit" param="set_time_zone|our_time|-4" />
<mvt:item name="toolkit" param="time_t_year|nyear|our_time" />
<mvt:item name="toolkit" param="time_t_month|nmonth|our_time" />
<mvt:item name="toolkit" param="time_t_dayofmonth|ndayofmonth|our_time" />
<mvt:item name="toolkit" param="time_t_hour|nhour|our_time" />
<mvt:item name="toolkit" param="padl|chour|nhour|2|0" />
<mvt:item name="toolkit" param="time_t_minute|nminute|our_time" />
<mvt:item name="toolkit" param="padl|cminute|nminute|2|0" />
<mvt:item name="toolkit" param="time_t_second|nsecond|our_time" />
<mvt:item name="toolkit" param="padl|csecond|nsecond|2|0" />
<mvt:item name="toolkit" param="time_t_dayofweek|ndayofweek|our_time" />
<mvt:item name="toolkit" param="sassign|days|Sunday#Monday#Tuesday#Wednesday#Thursday#Friday#Saturday" />
<mvt:item name="toolkit" param="vgettoken|days,#,ndayofweek" /> Note: The below values are simulated as this is a 4.x
store so the module is not actually installed. See the
Tool Kit Demo link below to actually see the module in use.
Our time zone: -4
Current year (our time): 2006
Current month (our time): 5
Current day (our time): 26
Current date (our time): 5 / 26 / 2006
Current hour (our time): 11 (left padded: 11)
Current minute (our time): 7 (left padded: 07)
Current second (our time): 18 (left padded: 18)
Current time (our time): 11:07:18
Current day of week (our time): 6 Friday mktime_t creates a variable which is the number of
seconds since Jan 1, 1970. As example,
<mvt:item name="toolkit" param="mktime_t|utc|year|month|dayofmonth|hours|minutes|seconds|time_zone" />
creates the utc variable. Each of the parameters 3-9 must
be a variable for that value; not a hardcoded number.
You'll probably use sassign or newsubstring to create
those variables.
16. padl creates a variable which is left padded a specific number of characters with a set character from an original variable. As example,
<mvt:item name="toolkit" param="padl|csecond|nsecond|2|0" />
creates the csecond variable from nsecond. It is padded with the 0 character to the left if the length of nsecond is less than 2.
17. padr creates a variable which is right padded a specific number of characters with a set character from an original variable. As example,
<mvt:item name="toolkit" param="padr|csecond|nsecond|2|0" />
creates the csecond variable from nsecond. It is padded with the 0 character to the right if the length of nsecond is less than 2.
18. Use the callurl to pass fields, (eg subscription list, name, email) to a remote program (mvc, php, etc) and return result. The return result can be displayed with the mvt or it can just be ignored, depending on your need for the function. For example it could display the contents of the file or web page at that location or it could do something like sign the customer up for a mailing list. For example,
<mvt:item name="toolkit" param="callurl|sample|http://www.mydomain.com/subscribe.php|POST|sublist,ship_lname,ship_email" />
You could use the mvt of the variable to display the return result, in this case "sample".
You can use vcallurl if you need to have a dynamic url to call. In this function, you would enter a variable for the full url in the 3rd parameter instead of a fixed url. This would be useful if you need to build a url at runtime.
19. Use custom to retrieve a product's custom field
value (if it exists), e.g. in the basket screen. It saves
the value to a variable of your choosing. For example,
<mvt:item name="toolkit" param="custom|studio|l.all_settings:item:product_id|company" />
<mvt:if expr="g.studio">
Studio: &mvte:global:studio;
</mvt:if>
will check the custom product field "company" for the
current product and save the value to a variable called
"studio". You can then mvte the studio variable to display
it. Note: This function requires use of the Miva Corp
built-in custom fields module and that you have created
custom product fields.
In admin, you can search a product custom field and display the matching products in a table. If you include your email
address you can have the list emailed to you as an attachement. Click the + to the left of the word Utilities and scroll
down to the Emporium Plus Tool Kit. Click the link.
Beginning with Tool Kit version 5.163, you can use the product code instead of the product ID by using the function
customc. Sometimes the code is available and the ID is not. That said, if the ID is available use the custom
function as it is faster.
20. Use attr to retrieve a product's attribute count. It saves the value to a variable of your choosing. For example,
<mvt:item name="toolkit" param="attr|acount|l.all_settings:product:id" />
Count: &mvte:global:acount;
If you use attrc, you can use the variable for the product code in the 3rd parameter.
21. Use cxp to load a category's products into an array. The category ID number is fed into the cxp function. It saves the product count to a variable of your choosing. You can then display the contents of the sub_products array. For example,
<mvt:item name="toolkit" param="cxp|pcount|l.all_settings:sub_category:id" />
<mvt:if expr="pcount GT 0">
(&mvte:global:pcount;)
<font size="-2">
<mvt:foreach iterator="sub_product" array="sub_products">
<br>
<a href="&mvt:global:secure_sessionurl;Screen=PROD&Product_Code=&mvta:sub_product:code;">
&mvt:sub_product:name;</a>
</mvt:foreach>
</font>
</mvt:if>
Alternatively, if you do not know the category ID number, you can use the category code by changing the function to cxpc, e.g.
<mvt:item name="toolkit" param="cxpc|pcount|g.Category_Code" />
22. Use parentcat to load the parent categories into an array.
It saves the category count to a variable of your choosing. You can then
display the contents of the parent_categories array. This function does
not capture the image urls, however, if your images are named according to their
category code, eg category code "mycat" uses an image called "mycat.jpg"
you could easily build the dynamic img src path. Alternatively you can use the functions
catimage or cattreeimage (see below) to retrieve the image urls.
To display parent
category names, you could use code like
<mvt:item name="toolkit" param="parentcat|pccount" />
<mvt:foreach iterator="parent_category" array="parent_categories">
&mvt:parent_category:name;
</mvt:foreach>
23. Use subcat to load a parent's subcategories into an array.
It saves the subcategory count to a variable of your choosing. You can then
display the contents of the sub_categories array. This function does
not capture the image urls, however, if your images are named according to their
category code, eg category code "mycat" uses an image called "mycat.jpg"
you could easily build the dynamic img src path. Alternatively you can use the functions
catimage or cattreeimage (see below) to retrieve the image urls.
To display subcategory names,
you could use code like
<mvt:item name="toolkit" param="subcat|ccount|g.Category_Code" />
<mvt:if expr="ccount GT 0">
<mvt:foreach iterator="sub_category" array="sub_categories">
&mvt:sub_category:name;
</mvt:foreach>
</mvt:if>
Similar functions exist for subcat2, subcat3, subcat4, subcat5, and subcat6. When used together
you can display the entire (up to 7 levels deep) category tree expanded. An
example tree using
some of these functions should get you started. You can see the
effect at the bottom of
this page. You can also make the typical left column
expanded category tree. Simply put the
example code in a new
page called OPEN. Then use the render token
<mvt:item name="toolkit" param="render|OPEN" />
to place that tree on any page in the store. A variation of
this template is the unordered list tree that Barrett posted
in the
Miva Forum.
24. Use pgroup to identify all of the price groups a customer is in.
It saves the price group count to a variable of your choosing. You can then
display the names of the price groups the current customer is in.
<mvt:item name="toolkit" param="pgroup|pcount" />
<mvt:if expr="g.pcount GT 0">
<mvt:foreach iterator="customer_pgroup" array="customer_pgroups">
<br>&mvt:customer_pgroup:name;
</mvt:foreach>
</mvt:if>
Combine this function with other functions. In the
example below you can set order minimums for groups. This
example sets an order minimum of $50.00 for customers in
the Platinum price group. It has a custom message which is
displayed on the standard order minimum page. Put this
block of code at the very top of the OSEL page template.
<mvt:item name="toolkit" param="subtotal|basketsubtotal" />
<mvt:if expr="g.basketsubtotal LT 50">
<mvt:item name="toolkit" param="pgroup|pcount" />
<mvt:if expr="g.pcount GT 0">
<mvt:foreach iterator="customer_pgroup" array="customer_pgroups">
<mvt:if expr="l.settings:customer_pgroup:name EQ 'Platinum'">
<mvt:item name="toolkit" param="sassign|showmin|1" />
</mvt:if>
</mvt:foreach>
</mvt:if>
<mvt:if expr="g.showmin">
<mvt:item name="toolkit" param="sacreate|error_message|Your price group requires $50.00 minimum order!|," />
<mvt:item name="toolkit" param="sassign|Error_Message_Count|1" />
<mvt:item name="toolkit" param="vassign|Error_Messages|l.all_settings:error_message" />
<mvt:item name="toolkit" param="render|OMIN" />
<mvt:exit>
</mvt:if>
</mvt:if>
25. Use agroup to identify all of the availability groups a customer is in.
It saves the availability group count to a variable of your choosing. You can then
display the names of the availability groups the current customer is in.
<mvt:item name="toolkit" param="agroup|acount" />
<mvt:if expr="g.acount GT 0">
<mvt:foreach iterator="customer_agroup" array="customer_agroups">
<br>&mvt:customer_agroup:name;
</mvt:foreach>
</mvt:if>
26. Use pgroup-p to identify all of the price groups a product is in.
It saves the price group count to a variable of your choosing. You can then
display the names of the price groups the product is in.
<mvt:item name="toolkit" param="pgroup-p|prdcount|g.Product_Code" />
<mvt:if expr="g.prdcount GT 0">
<mvt:foreach iterator="product_pgroup" array="product_pgroups">
<br>&mvt:product_pgroup:name;
</mvt:foreach>
</mvt:if>
27. Use agroup-p to identify all of the availability groups a product is in.
It saves the availability group count to a variable of your choosing. You can then
display the names of the availability groups the product is in.
<mvt:item name="toolkit" param="agroup-p|aprdcount|g.Product_Code" />
<mvt:if expr="g.aprdcount GT 0">
<mvt:foreach iterator="product_agroup" array="product_agroups">
<br>&mvt:product_agroup:name;
</mvt:foreach>
</mvt:if>
28. Use breadcrumb to create an array of category names and codes from the current g.Category_Code up to the top level parent. You can check the number of items in the array. If there is one or more, you can display the array as a breadcrumb display. A category code must be used to start the function. In most cases it will be g.Category_Code which is available on a product page when that page is reached via a link on the category page.
<mvt:item name="toolkit" param="breadcrumb|b_count|g.Category_Code" />
<mvt:if expr="b_count GT 0">
<a href="http://www.yourdomain.com/mm5/merchant.mvc">Home</a>
<mvt:foreach iterator="breadcrumb" array="breadcrumbs">
>
<mvt:if expr="g.Category_Code EQ l.settings:breadcrumb:code">
<b>
<a href="http://www.yourdomain.com/c/&mvta:breadcrumb:code;/&mvta:breadcrumb:name;.html">
&mvt:breadcrumb:name;</a></b>
<mvt:else>
<a href="http://www.yourdomain.com/c/&mvta:breadcrumb:code;/&mvta:breadcrumb:name;.html">
&mvt:breadcrumb:name;</a>
</mvt:if>
</mvt:foreach>
</mvt:if>
In admin, you can search a product custom field and display the matching products in a table. If you include
your email address you can have the list emailed to you as an attachement. Click the + to the left
of the word Utilities and scroll down to the Emporium Plus Tool Kit. Click the link.
29. Use sexists to check for the existence of a file. Assign text to the file name. Then using either sglosub (or vglosub for variables), you can replace
part of that text string and assign to a variable. Then plug that variable into the sexists function to check for the existence of the file. The result will be 1 if the
file is present. The file has to be on the same domain as the merchant program and the path must be virtual, ie no http://domainname in the path. In the example,
vpath will be 1 if the file exists.
<mvt:item name="toolkit" param="sassign|filename|/mm5/%prog_name%" />
<mvt:item name="toolkit" param="sglosub|filename,%prog_name%,merchant.mvc" />
<mvt:item name="toolkit" param="sexists|vpath|filename" />
30. Use vproduct_find to display basic product
info (name, code, thumbnail, image, price, and cost)
on any page (storefront, basket, etc) in the store.
The 2nd value is true if the product is found. The
3rd parameter is a variable. The 4th parameter is
optional and was added to the Tool Kit in version
5.227. Normally, you only display active products.
But if you put an A in the 4th parameter, it will
display both active and inactive products. In the example,
the thumbnail, name and formatted price are displayed.
<mvt:item name="toolkit" param="vproduct_find|productfound|Product_Code" />
<mvt:if expr="productfound GT 0">
<mvt:if expr="NOT ISNULL l.settings:key_product:thumbnail">
<img src="&mvte:key_product:thumbnail;" border="0" width="30" height="20">
</mvt:if>
&mvte:key_product:name;
&mvte:key_product:inv_short;
&mvte:key_product:formatted_price;
<mvt:if expr="l.settings:key_product:costlessadjprice GT 0">
<font color="red">
(savings: &mvte:key_product:formatted_costlessadjprice;)
</font>
</mvt:if>
</mvt:if>
Alternatively, you can use sproduct_find and insert the raw product code in the 3rd parameter instead of using a variable.
31. Use render to display the contents of any page
template at any location in another page. For example,
if you have a page template called MINI which has only
the
mini-basket as its content, you can insert that
page content anywhere inside another page. Page templates are
created in Merchant 5 by clicking admin > stores > pages
and clicking the Add button. The page code is case
sensitive. In the example, a page called MINI is pulled
into another page.
<mvt:item name="toolkit" param="render|MINI" />
This same technique can be used for things like inserting
a "Specials" category into your storefront screen. The
technique for doing this is explained
here.
You can even replace a whole page. For example, let's say
you want to force customers to login before they view some
or all pages in your store. Simply put the following code
at the beginning of each page you want to restrict and it
will display the login screen instead. No need to buy a
separate module for that simple task.
<mvt:if expr="basket:cust_id EQ 0">
<mvt:item name="toolkit" param="render|LOGN" />
<mvt:exit />
</mvt:if>
Like the forced login, you can replace a page if the
customer does not agree to terms, i.e. an agreement page.
For example, on the OSEL page you could have
<mvt:if expr="g.TK NE 1">
<mvt:item name="toolkit" param="render|SFNT" />
<mvt:exit>
</mvt:if>
Create a new page called AGREE. On the OCST page template
instead of the hidden input for screen going to OUSL, you
could go to AGREE. Then in the form on the AGREE page,
make sure you have a hidden input called TK and the Screen
going to OSEL. You can see it working at
our test store. If you are using the upsell feature in
your store, you will need to adjust the screen inputs
accordingly.
You can use this function in conjunction with our Power
Search module to show similar search results from two or
more different stores on one screen.
Example
You can use vrender if the second parameter is a variable rather than a hard
coded string.
You can also have an optional 3rd parameter in the render function. Instead of
automatically displaying the page requested, it saves the page to a variable (the
3rd parameter). You can then use Tool Kit code to extract data or sections of text
from that variable. An example usage of this is the search of a page called ARCHIVE
to find obsolete product codes and replace them with alternate codes, then redirect
to the new page.
<mvt:item name="toolkit" param="render|ARCHIVE|archive_list" />
32. Use no_apostrophe to strip apostrophe characters out of a string. For example,
<mvt:item name="toolkit" param="no_apostrophe|new_descrip2|new_descrip" />
takes the variable new_descrip and removes the apostrophe. It saves the new value to the variable new_descrip2. This
is particularly useful when you need the string passed to a javascript
function. This is used in the
balloon tooltip functionality as seen
here.
33. Use bestseller to list the best sellers in a specific category. For example,
<mvt:item name="toolkit" param="bestseller|pcount|g.Category_Code|5|1" />
<mvt:if expr="pcount GT 0">
Best Sellers
<mvt:foreach iterator="bestsell" array="bestseller">
<br>
<a href="&mvt:global:sessionurl;Screen=PROD&Product_Code=&mvta:bestsell:code;&Store_Code=&mvta:store:code;">
&mvte:bestsell:name;<a>
&mvte:bestsell:formatted_price;
</mvt:foreach>
</mvt:if>
shows the best sellers in the current category. The 4th parameter is the number of items
to display, eg 5.
Optionally you can put a 1 as the 5th parameter to hide out of stock products. Leave it blank if you want to include
out of stock products.
Alternatively you can display the best sellers storewide
by changing the 3rd parameter to the word ALL, ie replace
g.Category_Code with ALL in the above example. You can
even include the actual number sold if you want your
customers to know how popular the items are by using
the variable &mvte:bestsell:counter;
In admin, you can also see the
top XX number of best
sellers in the store. Go to admin > store and click the
+ to the left of utilities and then click on the link for
Emporium Plus Tool Kit.
Also, see function bestseller_recent for another way to
display best sellers.
34. Use last to list the most recent products added to the store.
Great for a "What's New" list. For example,
<mvt:item name="toolkit" param="last|pcount|10" />
<mvt:if expr="pcount GT 0">
<table border="0" width="200">
<th>What's New</th>
<tr><td align="center">
<font size="-1">
<mvt:foreach iterator="newproduct" array="new">
<a href="&mvt:global:sessionurl;Screen=PROD&Product_Code=&mvta:newproduct:code;&Store_Code=&mvta:store:code;">
&mvt:newproduct:name;</a>
<br>
&mvt:newproduct:formatted_price;
<br><br>
</mvt:foreach>
</font>
</td></tr>
</table>
</mvt:if>
creates an array of the last 10 items added to the store. The 3rd parameter is the number of items
to display, eg 10.
Optionally you can put a 1 as the 4th parameter to hide out of stock products. Leave it blank if you want to include
out of stock products.
A variation of this is the function lastcat. Everything
is identical except use lastcat instead of last in the
function. It can only be used on category pages. It
displays the most recent products added to the current
category.
35. Use basket to display the quantity and subtotal in the basket. For example,
<mvt:item name="toolkit" param="basket|itemcount" />
<mvt:if expr="g.itemcount GT 0">
Items in Basket: &mvte:toolkit:basketcount;
<br>Subtotal: &mvte:toolkit:baskettotalF;
<mvt:else>
Basket Empty
</mvt:if>
Other variables available with this function are basketweight, baskettotal, basketsubtotal,
basketsubtotalF, basketother, basketotherF
If you want a full minibasket with products listed,
you can use the tool kit to do that too. Go to pages [add]
and create a new page. Give it a code of TKMINI and call it
a mini basket. Insert the code from this
example page. Then you can use the tool kit render function
to insert that page inside any other page in the store.
<mvt:item name="toolkit" param="render|TKMINI" />
36. Use random to generate a random number. For example,
<mvt:item name="toolkit" param="random|nrandom|100" />
<br>Random number: &mvte:global:nrandom;
generates a random number between 0 and 100. This could be used
in conjunction with the sassign, vglosub, and vcallurl functions to
insert a random file (text) into a web page. You would need a
text file for each of the numbers that could be generated, e.g.
0.htm, 1.htm, 2.htm ..... 100.txt. More than likely, you will
use a much smaller number for your random generation to match text
files. A missing file would generate an error, so all have to
be present.
<mvt:item name="toolkit" param="sassign|randomurl|http://www.pinemporium.com/%nrandom%.txt" />
<mvt:item name="toolkit" param="vglosub|randomurl,%nrandom%,g.nrandom" />
<mvt:item name="toolkit" param="vcallurl|text_insert|randomurl|GET|" />
&mvte:global:text_insert;
If the random file contains html tags which you want to render correctly,
use &mvt instead of &mvte
A variation of the random function is vrandom.
For the third parameter you use a variable instead of a
constant. Below is an example of displaying a random thumbnail
from an array of products, e.g. on the category or product
list page using several tool kit functions.
<mvt:item name="toolkit" param="sassign|one|1" />
<mvt:item name="toolkit" param="sassign|delimiter|#" />
<mvt:foreach iterator="product" array="products">
<mvt:if expr="l.settings:product:thumbnail">
<mvt:item name="toolkit" param="math_add|numberinstring|numberinstring|one" />
<mvt:item name="toolkit" param="concat|newstring|newstring|l.all_settings:product:code" />
<mvt:item name="toolkit" param="concat|newstring|newstring|delimiter" />
</mvt:if>
</mvt:foreach>
<mvt:if expr="g.numberinstring GT 0">
<mvt:item name="toolkit" param="math_subtract|result|numberinstring|one" />
<mvt:item name="toolkit" param="vrandom|nrandom|result" />
<mvt:item name="toolkit" param="math_add|thisone|nrandom|one" />
<mvt:item name="toolkit" param="vgettoken|newstring,#,thisone|select_product_code" />
<mvt:item name="toolkit" param="vproduct_find|productfound|select_product_code" />
<img src="&mvt:key_product:thumbnail;" border="0">
</mvt:if>
An example can be seen at
this category.
37. Use states to generate an array of states alphabetically by name, not state code. For example,
<mvt:item name="toolkit" param="states" />
Thus, on the customer account create page template (customer fields section) replace
<mvt:item name="states" param="Customer_ShipStateSelect" />
with
<mvt:item name="toolkit" param="states" />
<select name="Customer_ShipStateSelect">
<option value="">Outside US</option>
<mvt:foreach iterator="state" array="states">
<mvt:if expr="l.settings:state:code">
<mvt:if expr="Customer_ShipStateSelect EQ l.settings:state:code">
<option value="&mvte:state:code;" selected>&mvte:state:name;</option>
<mvt:else>
<option value="&mvte:state:code;">&mvte:state:name;</option>
</mvt:if>
</mvt:if>
</mvt:foreach>
</select>
It is slightly different for the ocst page and others which have a state selector. Likewise,
this is for the "ship to" section. It is slightly different for the "bill to" section.
38. Use nextprevious on the product page to navigate to the previous or next product
in the category. This only works when going from the category page to the individual product
page and the category code is in the url. The below code goes on the product page in whatever location you want it.
<mvt:item name="toolkit" param="nextprevious|l.all_settings:product:code" />
<mvt:if expr="l.settings:tkskip:previous">
<a href="&mvte:global:sessionurl;Screen=PROD&Product_Code=&mvte:tkskip:previous;&Category_Code=&mvte:global:Category_Code;">
Previous</a>
</mvt:if>
<mvt:if expr="l.settings:tkskip:next">
<a href="&mvte:global:sessionurl;Screen=PROD&Product_Code=&mvte:tkskip:next;&Category_Code=&mvte:global:Category_Code;">
Next</a>
</mvt:if>
39. Use concat to combine one variable with another. For example:
<mvt:item name="toolkit" param="concat|newstring|var1|var2" />
You can include a 5th parameter which would be a delimiter. If you surround with the apostrophe it is a
string literal, otherwise it is a variable. If you preceed it with the minus character it is inserted between
var1 and var2. If no minus is used, it is appended after the var2.
<mvt:item name="toolkit" param="concat|newstring|var1|var2|'#'" />
40. Use prompt to display the attribute and option
prompts instead of the codes in the basket and invoice
screens. To initialize the variables, go to the basket
page template. Click the link at the top called basket
contents. Insert
<mvt:item name="toolkit" param="prompt" />
on the line immediately before
<mvt:foreach iterator="option" array="item:options">
Then about 10 lines down you will see the lines of code that display the attribute and option codes. Replace &mvt:option:attr_code; with &mvt:option:attr_prompt; and &mvt:option:opt_code; with &mvt:option:opt_prompt; Do NOT replace &mvt:option:data_long; or &mvt:option:data;
41. Use quick to fill an array with product info for listed
product codes. The third variable for the quicklist is a list of product
codes separated by commas.
Optionally you can put a 1 as the 4th parameter to hide out of stock products. Leave it blank if you want to include
out of stock products.
The function tests for product existence and
availability group status and works great for things like featured products.
Example display:
<mvt:item name="toolkit" param="quick|pcount|1AA00100,1S_00002,PB_00001,1S_00004,LCS00002" />
<table border="0">
<mvt:foreach iterator="quicklist" array="quicklists">
<tr>
<td align="center" valign="top">
<mvt:if expr="NOT ISNULL l.settings:quicklist:thumbnail">
<img src="&mvt:quicklist:thumbnail;" border="0" width="50" height="50">
<mvt:else>
No Photo
</mvt:if>
<br>
<a href="&mvt:global:sessionurl;Screen=PROD&Product_Code=&mvta:quicklist:code;">
&mvt:quicklist:name;</a>
<br>
&mvt:quicklist:formatted_price;
<br><br>
</td>
</tr>
</mvt:foreach>
</table>
A variation of the quick is the vquick. The third
parameter is a variable instead of a hard coded string
of product codes. This is useful for the alsobought
function using a custom product field called alsobought.
See the alsobought function further down in this list.
A complex use of the vquick function and several other Tool
Kit functions is a Shopping Pad (version 5.248 or newer)
where a customer can enter a list of product codes and
generate a page that the customer can click one button to
put the whole list in the basket.
42. Use pgrpinsert to insert a customer into a
price group. This could be used on the sfnt page to insert
a customer when creating a new account. Give customers a
discount incentive to create an account. It could also
be used on the invc page to insert a customer based on
the product purchased. This would be excellent if you sell
memberships and want to automatically add them to a price
group based on the membership product they purchase. An
example for the sfnt page is:
<mvt:if expr="g.Action AND g.Action EQ 'ICST'">
<mvt:item name="toolkit" param="pgrpinsert|maxgrp|Chairman" />
<mvt:if expr="maxgrp">
Price Group: &mvte:global:maxgrp;
</mvt:if>
</mvt:if>
Another use might be to redeem a "group" coupon. For example,
put the following on the ACED (account edit page) to enter
customers into the coupon special price group if they enter
coupon code SURPRISE and click the redeem button.
Enter coupon for price group membership:
<form method="post" action="&mvt:global:secure_sessionurl;">
<input type="hidden" name="Store_Code" value="&mvte:global:Store_Code;">
<input type="hidden" name="Action" value="">
<input type="hidden" name="Screen" value="ACED">
<input type="text" name="tkcoupon" value="" size="15">
<input type="submit" name="trash" value="Redeem">
</form>
<mvt:if expr="g.tkcoupon">
<mvt:if expr="g.tkcoupon EQ 'SURPRISE'">
<mvt:item name="toolkit" param="pgrpinsert|maxgrp|Coupon Special" />
<mvt:if expr="g.maxgrp">
You are now entered into the &mvte:global:maxgrp; price group.
</mvt:if>
<mvt:else>
Invalid
</mvt:if>
</mvt:if>
43. Use vacreate to create an array from a string
in which the data is in a variable separated by a
delimiter. An example might be a custom product field
with actors' names, each separated by a comma. The 2nd
parameter is the array name. The third parameter is the
variable or custom field. The 4th parameter is the
delimiter, usually a comma. The variable can then be
displayed using the store morph operator "foreach".
Here's an example to display the names on separate lines:
<mvt:item name="toolkit" param="vacreate|cast|l.all_settings:product:customfield_values:customfields:actors|," />
<mvt:if expr="NOT ISNULL l.settings:cast">
<mvt:foreach iterator="actor" array="cast">
<br> &mvte:actor;
</mvt:foreach>
</mvt:if>
Alternatively you can use sacreate to manually write a string to an array.
<mvt:item name="toolkit" param="sacreate|cast|Howard, Winkler, Williams|," />
You can also sort a single dimension array alphabetically with asort.
<mvt:item name="toolkit" param="sacreate|cast|Zanuck, Howard, Winkler, Williams|," />
<mvt:item name="toolkit" param="asort|cast2|l.all_settings:cast" />
<mvt:foreach iterator="actor" array="cast2">
<br> &mvte:actor;
</mvt:foreach>
44. Use agrpinsert to insert a customer into an availability group.
This could be used on the sfnt or aced (landing) page to insert a customer when they create a
new account. You can use this to force login and restrict access,
ensuring a customer has to create an account and/or login
before they can view products and shop in your store.
It could also be used on the invc page to insert a customer based on the
product purchased. An example for the aced page is:
<mvt:if expr="g.Action AND g.Action EQ 'ICST'">
<mvt:item name="toolkit" param="agrpinsert|avail|Wholesale" />
<mvt:if expr="avail">
Availability Group: &mvte:global:avail;
</mvt:if>
</mvt:if>
The function above accepts a constant for the 3rd parameter.
You can use a variable, e.g. as part of a url or form
post by using the function vagrpinsert.
45. Use related to list related products for a specific product code. An
example to display the products in a vertical list is:
<mvt:item name="toolkit" param="related|pcount|g.Product_Code" />
<mvt:if expr="pcount GT 0">
<table border="0" width="200">
<th>
Related
</th>
<tr>
<td align="center">
<font size="-1">
<mvt:foreach iterator="relproduct" array="related">
<mvt:if expr="NOT ISNULL l.settings:relproduct:thumbnail">
<img src="&mvte:relproduct:thumbnail;" border="0"><br>
</mvt:if>
<a href="&mvt:global:sessionurl;Screen=PROD&Product_Code=&mvta:relproduct:code;&Store_Code=&mvta:store:code;">
&mvt:relproduct:name;</a>
<br>
&mvt:relproduct:formatted_price;
<br><br>
</mvt:foreach>
</font>
</td>
</tr>
</table>
</mvt:if>
46. Use catimage to retrieve the path, if any, for the category main image. An
example for displaying that image is below. The path (2nd parameter) is saved to a variable of your
chosing, e.g. bigimage. The 3rd parameter is the variable that contains the category
code. This example variable is for a specific scenario; it could be something else, e.g. g.Category_Code
or other variable.
<mvt:item name="toolkit" param="catimage|bigimage|l.all_settings:parent_category:code" />
<mvt:if expr="bigimage">
<img src="&mvte:global:bigimage;" border="0">
</mvt:if>
47. Use cattreeimage to retrieve the path, if any, for the category tree image. An
example for displaying that image is below. The path (2nd parameter) is saved to a variable of your
chosing, e.g. smallimage. The 3rd parameter is the variable that contains the category
code. This example variable is for a specific scenario; it could be something else, e.g. g.Category_Code
or other variable.
<mvt:item name="toolkit" param="cattreeimage|smallimage|l.all_settings:parent_category:code" />
<mvt:if expr="smallimage">
<img src="&mvte:global:smallimage;" border="0">
</mvt:if>
48. Use export to write variables to a flat file
in the "export" directory under your store's data
directory. It will not write to other directories.
Delimiters can be tab or | or , or #. This function is
used with our
Deal of the Day feature which requires our Coupon
Redemption and Tool Kit modules. The step by step
how to explains the page creation and coupon generation.
49. Use import to read the contents of a flat file
in the "export" directory under your store's
data directory. It will not read from other directories.
The content is entity encoded for security reasons, so
html will be garbled. For example:
<mvt:if expr="g.customer:login EQ 'ABCD123'">
<mvt:item name="toolkit" param="import|megalist|cust.dat|crlf" />
<pre>
&mvt:global:megalist;
</pre>
</mvt:if>
This example in a page template would display the contents
of cust.dat. It is wrapped inside the check for
a specific customer login so that only that person would
see the display. You would change the ABCD123 to your
customer login for your merchant.mvc. The crlf in the
function defines the end of line as a carriage return and
line feed. By using the <pre> tags it displays that
as a list on the page which you could copy and paste to
the clipboard then insert into a file or application on
your PC. You could change the crlf to <br> and leave
off the <pre> tags. That option would look the same
on the screen but
would not have the carriage return and line feeds needed
by many applications.
50. Use productmeta to display the text in the product meta tag keywords and/or description fields. The
second parameter is either CODE or ID (upper case), depending on the variable you are using in the third parameter. For example:
<mvt:item name="toolkit" param="productmeta|CODE|l.all_settings:product:code" />
<br>&mvte:meta:keywords;
<br>&mvte:meta:description;
51. Use categorymeta to display the text in the category meta tag keywords and/or description fields. The
second parameter is either CODE or ID (upper case), depending on the variable you are using in the third parameter. For example:
<mvt:item name="toolkit" param="categorymeta|CODE|l.all_settings:category:code" />
<br>&mvte:meta:keywords;
<br>&mvte:meta:description;
52. Use exportxml to export variables to an XML
file. This export requires the use of three commands.
exportxmlbegin is used to initialize the file and
must be used before the first of the exportxml commands.
Then after all of the exportxml commands have been run,
you close the process and write the data to the file with
the exportxmlend command. As example, the following
lines placed in the INVC page template will write the
order number and customer last name to a XML file called
basket.dat.
<mvt:item name="toolkit" param="exportxmlbegin" />
<mvt:item name="toolkit" param="exportxml|ORDER_NUMBER|l.all_settings:order:id|ORDER_NUMBER" />
<mvt:item name="toolkit" param="exportxml|SHIP_LAST|l.all_settings:order:ship_lname|SHIP_LAST" />
<mvt:item name="toolkit" param="exportxmlend|basket.dat|ORDER_NUMBER|l.all_settings:order:id|ORDER_NUMBER" />
See this page for details and explanation
of the three functions.
53. Use logbackin on the INVC (invoice) screen to
log customers back in automatically (transparent to the
customer). Normally when a customer completes an order
they are automatically logged out. This function can be
used on the invoice screen to log them back in without
exposing their password on the invoice page. The second
parameter is optional. If left blank, it will log them
back in with the full time until basket timeout setting.
If you put a number between 1 and the basket timeout
setting, it will extend their login for only that number
of minutes. For example, the line below will log them
back in for 10 minutes. If they click on any link in the
store during the next 10 minutes, their time will update
as if they never logged out.
<mvt:item name="toolkit" param="logbackin|10" />
If you are using other 3rd party modules that keep the
customer logged in, do not use this function as it is not
needed and would be redundant.
54. Use childof when you want to retrieve the
parent category name and code for the current category.
Typically this would be used on the category page if you
did not want to use the full breadcrumb function above.
For example:
<mvt:item name="toolkit" param="childof|parentfound|g.Category_Code" />
<mvt:if expr="g.parentfound">
<a href="http://www.yourdomain.com/mm5/merchant.mvc?Screen=CTGY&Category_Code=&mvta:childof:code;">
&mvt:childof:name;</a>
</mvt:if>
55. Use pastorders to display a list of a customer's past orders when they are logged in. It will
display all of those orders which are still in the store's admin, either batched or unbatched. You can limit
the number of orders that are displayed by using the pos1 variable as you see in the first example below. Or
you can limit those orders newer than a set date as you see in the second example. If you
don't limit the display, you can use the variable formatted_ordersum to display the
total. If you have code on your
INVC page template to hide items (like the nav bar) when the variable "print" exists, you can even use this
for displaying printable invoices. If you use this function on the invoice screen, you'll need to use the
logbackin function above to keep the customer logged in
for at least a few minutes. In addition to the variables
in the examples below, the pastorder:bill_zip and pastorder:bill_email
are populated.
Simple list with link to each invoice
<mvt:item name="toolkit" param="pastorders|ordersum" />
<mvt:if expr="g.ordersum GT 0">
<br>
Recent Orders
<mvt:item name="toolkit" param="currencyformat|formatted_ordersum|g.ordersum" />
&mvte:global:formatted_ordersum;
<mvt:foreach iterator="pastorder" array="pastorders">
<mvt:if expr="pos1 LT 11">
<br>
<a href="&mvte:global:secure_sessionurl;Action=NEW&SubScreen=TKINVC&order_id=&mvta:pastorder:id;&print=1">
&mvt:pastorder:id;</a> &mvt:pastorder:orderdate;
&mvt:pastorder:formatted_total;
</mvt:if>
</mvt:foreach>
<br>
</mvt:if>
Drop down select
<mvt:item name="toolkit" param="pastorders|ordersum" />
<mvt:if expr="g.ordersum GT 0">
<br>
Recent Orders
<mvt:item name="toolkit" param="currencyformat|formatted_ordersum|g.ordersum" />
&mvte:global:formatted_ordersum;
<br>
<select size="1" name="pastorder" onchange="document.location.href=this.value"> <option selected value="&mvt:global:sessionurl;">------------ View ------------</option>
<mvt:foreach iterator="pastorder" array="pastorders">
<mvt:if expr="l.settings:pastorder:systemdate GT '20080101'">
<option value="&mvte:global:secure_sessionurl;Action=NEW&SubScreen=TKINVC&order_id=&mvta:pastorder:id;&print=1">
&mvt:pastorder:id;
&mvt:pastorder:orderdate;
&mvt:pastorder:formatted_total;</option>
</mvt:if>
</mvt:foreach>
</select>
<br>
</mvt:if>
On the INVC page you can include a link to reorder the
same items. If your store has inventory variant products,
you cannot use this feature as they are not supported.
<a href="&mvte:global:secure_sessionurl;Action=NEW&SubScreen=TKORDR&order_id=&mvta:order:id;&Store_Code=&mvta:global:Store_Code;">Reorder</a>
Important: If you have code on your INVC page for affiliate,
tracking, analytics, etc. you need to surround that code
with a conditional that makes sure it only runs if the
Action variable is AUTH. That way re-displaying the invoice
will not run the code.
<mvt:if expr="'AUTH' CIN g.Action">
do code that should only run when action is AUTH
</mvt:if>
56. Use weight to display the basket total weight.
For example
<mvt:item name="toolkit" param="weight|totalweight" />
&mvte:global:totalweight;
57. Use subtotal to display the subtotal of the
products in the basket. This yields a raw number. If you wanted it
formatted as currency, use in conjunction with the
currencyformat function above. For example
<mvt:item name="toolkit" param="subtotal|basketsubtotal" />
<mvt:item name="toolkit" param="currencyformat|formatted_subtotal|basketsubtotal" />
&mvte:global:formatted_subtotal;
58: Use subtotalorder to display the subtotal of the products in the order. This yields
a raw number. If you wanted it formatted as currency, use in conjunction with the currencyformat function above. For example
<mvt:item name="toolkit" param="subtotalorder|ordersubtotal" />
<mvt:item name="toolkit" param="currencyformat|formatted_subtotal|ordersubtotal" />
&mvte:global:formatted_subtotal;
59. Use alsobought on the INVC page template to
keep track of items bought when another
product is bought. This gives you a suggested products
based on prior purchase history feature. First create a
custom product field in utilities with the CODE
"alsobought". Then add the token
<mvt:item name="toolkit" param="alsobought|250" />
on the INVC page template at any location, e.g. near the end. The second parameter is any value
between 1 and 250. This determines the number of product codes that will be saved. You need to
look at the average length of your product codes. For example, if it is 10, then 250 would save
about 25 product codes before it started erasing the oldest ones. Keep in mind that customers would probably only want to see 5 or 6 of these also bought product links. So if you wanted 6, then
make the number 66 (10 for each product code and 1 for the delimiter between them). Then on the
product page, e.g. just below the related products item, you could add the following code. Make sure
the custom field alsobought is assigned to the product page in the point and click mode. The system automatically updates the codes as each order is placed. You can also manually edit the
custom product field to "tweak" the results.
<mvt:if expr="NOT ISNULL l.settings:product:customfield_values:customfields:alsobought">
<mvt:item name="toolkit" param="vquick|pcount|l.all_settings:product:customfield_values:customfields:alsobought" />
<mvt:if expr="pcount GT 0">
<br>
<table border="0">
<tr>
<td align="center" colspan="3">
<mvt:item name="fonts" param="hdr_font">
Customers who bought &mvt:product:name; also bought these products
</mvt:item>
</td>
</tr>
<mvt:foreach iterator="quicklist" array="quicklists">
<tr>
<td align="left" valign="top">
<mvt:if expr="NOT ISNULL l.settings:quicklist:thumbnail">
<img src="&mvt:quicklist:thumbnail;" border="0" width="50" height="50" alt="&mvta:quicklist:name;">
<mvt:else>
<img src="/mm5/graphics/en-US/admin/blank.gif" border="0" width="50" height="50" alt="&mvta:quicklist:name;">
</mvt:if>
</td>
<td align="left" valign="top">
<mvt:item name="fonts" param="body_font">
<a href="&mvt:global:sessionurl;Screen=PROD&Product_Code=&mvta:quicklist:code;">
&mvt:quicklist:name;</a>
</mvt:item>
</td> <td align="left" valign="top">
<mvt:item name="fonts" param="body_font">
&mvt:quicklist:formatted_price;
</mvt:item>
</td>
</tr>
</mvt:foreach>
</table>
</mvt:if>
</mvt:if>
60. Use clearall on the BASK screen to provide a
link to clear the basket of all items. If you have
implemented kits and are tracking inventory of the
component parts, you will need Tool Kit version 5.2020 or
newer to keep inventory in sync when using the clearall
function. For example
<mvt:item name="toolkit" param="clearall" />
Alternatively, you can insert the url directly without the token, for example
<a href="&mvt:global:sessionurl;Screen=BASK&SubScreen=TKCLEAR&Action=NEW&Store_Code=&mvta:store:code;">Clear Basket</a>
61. Use basketoneclick on the BASK screen and you
can replace the individual remove and update buttons
with a single update button for the whole basket. An
example
basket contents template with the necessary
changes documented is online.
62. Use agroup-c to identify all of the availability groups a category is in. It saves the availability group count to a variable of your choosing. You can then display the names of the availability groups the category is in.
<mvt:item name="toolkit" param="agroup-c|acatcount|g.Category_Code" />
<mvt:if expr="g.acatcount GT 0">
<mvt:foreach iterator="category_agroup" array="category_agroups">
<br>&mvt:category_agroup:name;
</mvt:foreach>
</mvt:if>
63. Use agroup-cats to list all categories assigned to an availability group. It saves the category count to a variable of your choosing. You can then display the
category info of those that are in the availability group.
<mvt:item name="toolkit" param="agroup-cats|acatcount|l.settings:agroup:name" />
<mvt:if expr="g.acatcount GT 0">
<mvt:foreach iterator="agroup_cat" array="agroup_cats">
<br>&mvt:agroup_cat:name;
</mvt:foreach>
</mvt:if>
64. Use lasturl to log the last screen (CTGY, PLST, or SRCH) a customer was on and display a continue shopping link on the basket (BASK) screen. You will be putting tokens on four screens. Don't forget to assign the tool kit to the items list of all four of those screens. In admin, on either the CTGY, PLST, or SRCH page put the following token which will create the logging database. The location is not important.
<mvt:item name="toolkit" param="create" />
Then in merchant.mvc go to the screen you put the create token on so that it will run the token and create the database. Next, go back into admin and change that token to
<mvt:item name="toolkit" param="trim" />
This token will trim expired entries about 1 out of 100 times that this screen displays in your store. Next, on the CTGY, PLST, and SRCH screens put the following token which will capture the visit to
the page.
<mvt:item name="toolkit" param="lasturl|url|http://www.yourdomain.com/mm5/merchant.mvc" />
The last url visited will be saved to the variable name in the second parameter, e.g. url in this example. The third parameter is the fallback url if there is no CTGY, PLST, or SRCH page visited. This
would usually be your storefront. Next, on the BASK page template you can use the following to display a continue shopping link.
<mvt:item name="toolkit" param="lasturl|url|http://www.yourdomain.com/mm5/merchant.mvc" />
<a href="&mvte:global:url;">Continue Shopping</a>
As you can see the first line is the same as on the other three pages. Then you have a http link for the continue shopping url. You can replace the text with an image button to match your store's look and
feel. You may also want to have a continue shopping button on the
PROD page. It would be the same code as the BASK page. If
you are going to use the footsteps/visitors functions you have to use the
token on the PROD page so that product page visits will be tracked.
Finally, there is a token if you decide to discontinue this feature. It removes the logging datebase. To discontinue, remove the lasturl tokens from the four pages. Then change the trim token to
<mvt:item name="toolkit" param="remove" />
Visit that page in merchant.mvc to remove the database. Then in admin, remove the token completely. If for some reason your "trim" page is not visited frequently enough, your logging database could get large and you may have to use the remove technigue to clear out the database. This should never be an issue in a MySQL store and probably won't be in a MivaSQL store, but keep it in mind. Moving the trim token to a more frequently visited page may also help.
In version 5.080 and newer you can have a 4th parameter if you are also using our Power Search module. If you are not using our Power Search module, do not use the 4th parameter setting. The lasturl token will include name, code and description field searches. If you are using Power Search but not including custom fields to be searched in Power Search then use this token on the SRCH page instead of the default above.
<mvt:item name="toolkit" param="lasturl|url|http://www.yourdomain.com/mm5/merchant.mvc|1" />
If you are including custom fields to be searched, you need to include each of those that are selectable in the SRCH screen in the 4th parameter. If they are not selectable, do not include them. For example
<mvt:item name="toolkit" param="lasturl|url|http://www.yourdomain.com/mm5/merchant.mvc|srch_circa,srch_actors,srch_company,srch_director" />
would check to see if the customer had selected to search the fields circa, actors, company, and director. If
they did, the continue shopping would also select them.
In version 5.085 you can even put the continue shopping button on a static page like index.html, policies.html,
shipping.html, etc. You must setup the lasturl system as above and have that working before putting the link on static pages. The url is a bit different.
<a href="http://www.yourdomain.com/mm5/merchant.mvc?Action=NEW&SubScreen=TKLAST&Store_Code=yourstorecode">Continue Shopping</a>
65. Use updatebasket to insert a value in a field in the customer's basket. This is likely to be used
in conjunction with the cookie saving and reading functions in the tool kit. Here is an example of updating the basket with the "ship to" state value. This is useful if you have modules which display shipping before checkout, e.g. our mini-basket module. The customer doesn't have to fill in the data since it is already known from their saved cookie.
<mvt:item name="toolkit" param="updatebasket|ship_state|g.value" />
See this
example code for setting and reading cookies.
66. Use productincategory to retrieve the categories a product is in. This can be used in conjunction
with the breadcrumb function to display breadcrumbs to all of the categories a product is in. This example
combines the two functions.
<mvt:item name="toolkit" param="productincategory|incatcount|g.Product_Code" />
<mvt:if expr="incatcount GT 0">
<mvt:foreach iterator="incategory" array="incategories">
</mvt:foreach>
</mvt:if>
You can add a 4th parameter to the token if you just want to see if the product is in a specific category. For
example if the category is XYZ, put 'XYZ' in the 4th parameter. Alternatively, you could use a variable in the
4th parameter by omitting the apostrophes around the variable, for example g.Category_Code.
<mvt:item name="toolkit" param="productincategory|incatcount|g.Product_Code|'XYZ'" />
67. Use header to save the category or product header to a variable. Then display the variable. It only
works on the screen = CTGY or PROD. The Category_Code or Product_Code variable needs to be present so the function knows which category or product header to lookup. The second parameter in the function is the variable
name you want to save it to.
<mvt:item name="toolkit" param="header|cathead" />
&mvt:global:cathead;
68. Use footer to save the category or product footer to a variable. Then display the variable. It only
works on the screen = CTGY or PROD. The Category_Code or Product_Code variable needs to be present so the function knows which category or product footer to lookup. The second parameter in the function is the variable
name you want to save it to.
<mvt:item name="toolkit" param="footer|catfoot" />
&mvt:global:catfoot;
69. Use mvassign if you want to use mivascript expressions on the store morph page templates. This function
works similar to the MvASSIGN in mivascript. It allows you to assign a value to a variable based on an expression. Most functions in the mivascript reference manual can be used. The second parameter in the token is the global variable you are assigning the value to. The third parameter is a mivascript function with applicable variables. After the token you can then display the value. For example:
<mvt:item name="toolkit" param="mvassign|word|substring(l.all_settings:product:descrip,1,200)" />
&mvte:global:word;
Displays the first 200 characters in the product description on a product page template.
<mvt:if expr="l.settings:product:cost GT l.settings:product:price">
<br>MSRP: <s>$&mvt:product:cost;</s>
<mvt:item name="toolkit" param="mvassign|savings|rnd(l.all_settings:product:cost - l.all_settings:product:price,2)" />
<mvt:item name="toolkit" param="mvassign|percent|rnd((g.savings/l.all_settings:product:cost) * 100,2)" />
<br>Your Price: <b>&mvt:product:formatted_price;</b>
<br>Savings:
<font color="red">
$&mvte:global:savings; (&mvte:global:percent;%)
</font>
<mvt:else>
<br>Price: <b>&mvt:product:formatted_price;</b>
</mvt:if>
If you setup the cost as MSRP and it is higher than the price,
you can show the difference and percentage savings.
<mvt:item name="toolkit" param="mvassign|imgurl|'/mm5/graphics/00000001/' $ tolower(l.all_settings:product:code) $ '.gif'" />
<mvt:item name="toolkit" param="mvassign|vpath|sexists(g.imgurl)" />
<mvt:if expr="g.vpath">
<img src="&mvte:global:imgurl;" border="0">
<mvt:else>
No Image Available
</mvt:if>
For stores whose images are named based on the product code, this function checks for the existence of
an image file and displays it.
70. Use mveval if you want to display the results
of an expression directly without creating a variable
first. It works like mvassign and can use the dozens of
mivascript functions. The difference is the global
variable is omitted. Some examples:
MSRP: <mvt:item name="toolkit" param="mveval|l.all_settings:product:price * 1.1" />
This example multiplies the product price by 110%
<mvt:item name="toolkit" param="mveval|glosub(l.all_settings:product:name,asciichar(34),' ')" />
Removes the " character from the product name.
<mvt:item name="toolkit" param="mveval|gettoken(l.all_settings:product:descrip,'#',2)" />
Shows text in the product description after the # character.
Great for use with multilanguage stores or for adding
custom field like data directly in the description.
71. Use catpages to display category pagination. Number the category pages with configurable
links to any page in the category. Make sure you have
pagination turned on for the page you are putting this code
on, unless you are also using the ctgyproduct_list token (further down this list) on the page. See
this page for an example with pagination.
<mvt:item name="toolkit" param="catpages|l.all_settings:category:id" />
<table>
<tr>
<td colspan="2" align="right" nowrap>
<mvt:item name="fonts" param="ctgy_font">
<mvt:if expr="l.settings:cxp_total_pages GT 0">
Page &mvt:cxp_current_page; of &mvt:cxp_total_pages;
<br>
</mvt:if>
<mvt:if expr="l.settings:cxp_total_pages GT 1"> |
<mvt:foreach iterator="pages" array="cxp_offset">
<mvt:if expr="l.settings:pages:buffer GE 5
AND l.settings:pages:number NE 1 AND
l.settings:pages:number NE l.settings:cxp_total_pages">
<mvt:if expr="l.settings:pages:buffer EQ 5">
<a href="&mvt:global:sessionurl;Screen=CTGY&Store_Code=&mvta:store:code;&Category_Code=&mvta:global:category_code;&offset=&mvt:pages:offset;">
<mvt:if expr="l.settings:pages:number GT l.settings:cxp_current_page">
<img src="graphics/right.gif" border="0"> </a>
<mvt:else>
<img src="graphics/left.gif" border="0"> </a>
</mvt:if>
</mvt:if>
<mvt:else>
<mvt:if expr="l.settings:cxp_current_page EQ pos1">
&mvt:pages:number; |
<mvt:else>
<a href="&mvt:global:sessionurl;Screen=CTGY&Store_Code=&mvta:store:code;&Category_Code=&mvta:global:category_code;&offset=&mvt:pages:offset;">
&mvt:pages:number;</a> |
</mvt:if>
</mvt:if>
</mvt:foreach>
<br>
</mvt:if>
Total products in &mvt:category:name;: &mvt:cxp_product_total;
</mvt:item>
</td>
</tr>
</table>
FTP the left.gif and right.gif to the mm5/graphics directory.
The example doc combines the page
numbering of catpages with the sorting and page length selection of the ctgyproduct_list function.
72. Use customer to display the contents of a
custom customer field when the customer is logged in.
Use it to display things like membership number, sales
rep, etc. The second parameter is the global variable you
want to save the custom field value to. The third
parameter is the custom field code.
<mvt:item name="toolkit" param="customer|member|membership" />
&mvte:global:member;
73. Use custinsert to insert a variable value
into a custom customer field when the customer is logged
in. Use it to capture values like tax ID, sales rep,
etc. The second parameter is the custom field code (case
sensitive) to save the variable value to. The third
parameter is the variable name. If you want to use a
string in the 3rd parameter rather than a variable,
surround the word with the apostrophe character, e.g.
'NA'. If you want to completely erase a previously
saved value in the custom customer field, use '' for
the 3rd parameter.
<mvt:item name="toolkit" param="custinsert|taxid|g.mytax" />
You can use this function in conjunction with other functions to perform complex tasks.
For example, you can assign customers to price groups based on their prior purchase
history. Step one: Create a custom customer field under admin utilities called orders.
Step two: Insert the following code anywhere on the INVC page template. This code will
read the custom customer field called orders for the current customer and retrieve
the value in that field. It will then sum the existing value with the order total.
It will then insert that new value back into the orders field.
<mvt:if expr="'AUTH' CIN g.Action">
<mvt:item name="toolkit" param="customer|current_total|orders" />
<mvt:item name="toolkit" param="math_add|new_total|g.current_total|l.all_settings:order:total" />
<mvt:item name="toolkit" param="custinsert|orders|g.new_total" />
</mvt:if>
Step three: Anywhere on the ACED page template insert the following code. It will retrieve
the current total from that field. In the below example there are two conditions;
current total over 50 and current total over 25. If it is not over 50, it checks to
see if it is over 25. If the first or second test is true, it inserts the customer
into the price group listed in the function (PG50 or PG25). You can have as many
conditional checks as you want with corresponding tiers. You just have to write the
conditionals for it. After the customer logs in and lands on the account edit page,
this code will run and insert them into the appropriate price group. If you use the
pgroup function above you can even display the price groups a customer is in on the
account edit page.
<mvt:item name="toolkit" param="customer|current_total|orders" />
<mvt:if expr="g.current_total GT 50">
<mvt:item name="toolkit" param="pgrpinsert|maxgrp|PG50" />
<mvt:else>
<mvt:if expr="g.current_total GT 25">
<mvt:item name="toolkit" param="pgrpinsert|maxgrp|PG25" />
</mvt:if>
</mvt:if>
74. Use sendpage to send a snapshot of any page
in your store to an email address. See the form in the left
column on this page as a tell a friend example. You can also
use it to send responses in a contact us form to an email
address. You can have unlimited contact forms for surveys,
support, general inquiries, etc.
<mvt:item name="toolkit" param="sendpage" />
is inserted inside the form you put on the page. See this
example page on how to use this feature.
75. Use randomcat to create a random, non-repeating array of products from a specified category. The 2nd parameter is the variable name to save the count to. The 3rd parameter is a variable representing the category code. The 4th parameter is the number of random products to load into the array. If the category does not have that many products in it, it will return the number of products in the category as the count. In this example we are loading
an array of 5 random products from a category whose code is SPECIALS.
<mvt:item name="toolkit" param="sassign|cat_code|SPECIALS" />
<mvt:item name="toolkit" param="randomcat|pcount|g.cat_code|5" />
<mvt:if expr="pcount GT 0">
<table border="0" width="100%" cellpadding="3" cellspacing="3">
<tr valign="top" align="center">
<mvt:foreach iterator="sub_product" array="sub_products">
<td>
<a href="&mvt:global:secure_sessionurl;Screen=PROD&Product_Code=&mvta:sub_product:code;">
&mvt:sub_product:name;</a> <br>
&mvt:sub_product:formatted_price;<br>
<mvt:if expr="NOT ISNULL l.settings:sub_product:thumbnail">
<img src="&mvt:sub_product:thumbnail;" border="0">
</mvt:if>
</td>
</mvt:foreach>
</tr>
</table>
</mvt:if>
76. Use randomall to create a random, non-repeating
array of products from the entire store. The 2nd parameter
is the variable name to save the count to. The 3rd
parameter is the number of random products to load into
the array. In this example we are loading an array of 5
random products from the store.
Optionally you can put a 1 as the 4th parameter to hide out of stock products. Leave it blank if you want to include
out of stock products.
You can see an
example display using the code below.
<mvt:item name="toolkit" param="randomall|pcount|5" />
<mvt:if expr="pcount GT 0">
<table border="0" width="100%" cellpadding="3" cellspacing="3">
<tr valign="top" align="center">
<mvt:foreach iterator="sub_product" array="sub_products">
<td>
<a href="&mvt:global:secure_sessionurl;Screen=PROD&Product_Code=&mvta:sub_product:code;">
&mvt:sub_product:name;</a> <br>
&mvt:sub_product:formatted_price;<br>
<mvt:if expr="NOT ISNULL l.settings:sub_product:thumbnail">
<img src="&mvt:sub_product:thumbnail;" border="0">
</mvt:if>
</td>
</mvt:foreach>
</tr>
</table>
</mvt:if>
77. Use counter to increment a number for the items in an array. One use is to number the products on the
product list page. Just before the foreach loop for products put the token to initialize the variable with an existing variable. Offset is a variable which holds the count of products from the beginning. On page 1 it is zero, but for each page that number goes up. So just before the loop, put
<mvt:item name="toolkit" param="counter|current_nbr|g.offset" />
Existing loop beginning <mvt:foreach iterator="product" array="products">
Then just before the display of the product info, put
<mvt:item name="toolkit" param="counter|current_nbr" />
&mvte:global:current_nbr;.
If there is no need to initialize the variable you can leave that line out. When the 3rd parameter is used, it sets
the starting number. When there is no 3rd parameter, then 1 is added to the counter variable (which is the 2nd parameter).
78. Use prodthumb to retrieve the url to the product thumbnail for display in locations like the basket. The
second parameter is the variable to save the url to. The third parameter is the product code.
<mvt:item name="toolkit" param="prodthumb|imgurl|l.all_settings:item:code" />
<mvt:if expr="g.imgurl">
<img src="&mvte:global:imgurl;" border="0">
<mvt:else>
</mvt:if>
79. Use shipcalc to create a shipping calculator, i.e. an array of shipping methods which can be displayed on any screen in the store. Let your customers calculate shipping on the basket (or other) screen prior to checkout. Create a new page called SHIPCALC. The initial token on the page is
<mvt:item name="toolkit" param="shipcalc|1|1|1|cost|sortship" />
The 2nd parameter is state, required (1) or not (0). The 3rd is zip, required (1) or not (0). The 4th is country,
required (1) or not (0). The 5th is the sort order. The choices are cost, name, code, and module. If left blank, the shipping options will not be sorted. The 6th parameter is used if you have either our
Sort Shipping Plus Free Shipping Option (sortship) or the CBS Shipping Supermod (cbs-supshipping5) installed. This will implement the special rules, e.g. location restrictions that those modules use. Leave it blank if you do not have either of these.
To create the SHIPCALC page, you will need the
example source code.
You may have to view source on that page if the browser tries to render the code on that page. Copy and paste the source on that
page to the new SHIPCALC page template. Assign the following items to that page: states, countries, colors, fonts, and toolkit. If you have the CBS Shipping Supermod and have included its module code in the 6th parameter, you
will also need to assign the minibaskship item to the page.
See this knowledgebase article
which has the minibaskship file attached.
If a customer has something in the basket, the shipping calculator will display its button. Note: we have included the link near the end to use a button
called shipping.gif in the root directory. You will need to upload a gif file to your domain root directory. You can put it in another directory; just adjust the code near the end of the template to its actual location. The template is ready to go after you upload the button and change the 6th parameter based on your store's installed modules. If you make changes to the template, it is up to you to troubleshoot your code. Now that you have created your template, a single line is used to insert it into any page in your store.
<mvt:item name="toolkit" param="render|SHIPCALC" />
To see how it works,
click here, then click the calculate shipping button.
80. Use fileread to insert the contents of a file
into any page template and at any location you want it.
This is similar to the vcallurl function above. But there
are three important differences. This function is faster
than vcallurl. This function does not pass any variables
(name value pairs) to the called file. This function can
only read files in the same domain, whereas
vcallurl can read from any domain.
The fileread function will check for the existence of the
file. The second parameter in this function is the
variable that the file contents are saved to. The third
parameter is always the word script. When displaying the
contents of the file, if it contains html, use &mvt. If
it does not, use &mvte.
<mvt:item name="toolkit" param="sassign|filepath|/mm5/5.00/extras/%code%.txt" />
<mvt:item name="toolkit" param="vglosub|filepath,%code%,l.all_settings:product:code" />
<mvt:item name="toolkit" param="fileread|content|script|filepath" />
&mvt:global:content;
Here's a tip for putting flash into a miva merchant page. Create a
regular html page in your domain. Get the flash working on that
page. Then use fileread to display that page with the flash inside
a merchant page template.
81. Use affiliate to determine if the customer arrived at your store via an affiliate link and you are using
the built in affiliate module in your store. If the active session contains a valid affiliate code; the id, code and name of the affiliate is available for your use in template code. You might want to use it just to display the affilate company name as in the example below. Or you might want to use it in conditional code to export affiliate data to a flat file using our export function above.
<mvt:item name="toolkit" param="affiliate|myaffil" />
<mvt:if expr="g.myaffil">
Referred by: &mvte:myaffiliate:company;
</mvt:if>
82. Use loginlookup to lookup a customer's login by entering their email address into the input. This form
can be put on any page. In this example the code is put on a page template called LLU. Create a new page with the
code of LLU and insert the code below. You can then call that page with a link to the Screen=LLU or make a
javascript popup that shows that screen in a window. If you decide to put the form on a different page, simply change the value
of the hidden input called Screen to reflect the alternate page. In this example the login will be displayed on the page AND it will be emailed to the customer's email address if it is valid. You can eliminate the emailing by deleting
the hidden inputs for email_subject and email_message. You can eliminate the display by deleting the conditional code
that displays the Customer_Login_Lookup variable.
<html>
<body>
<h3> Customer Login Lookup</h3>
<mvt:if expr="g.Customer_Login_Lookup">
<mvt:if expr="',' IN g.Customer_Login_Lookup">
Your UserName Logins: &mvte:global:Customer_Login_Lookup;
<mvt:else>
Your UserName Login: &mvte:global:Customer_Login_Lookup;
</mvt:if>
</mvt:if>
<mvt:if expr="g.Error_Messages">
<font color="red">
&mvte:global:Error_Messages;
</font>
</mvt:if>
<mvt:if expr="g.email_sent">
<br> <br> Your login has been sent to &mvte:global:email_sent;
<br> <br>
</mvt:if>
<form method="post" action="&mvt:global:sessionurl;">
<input type="hidden" name="Store_Code" value="&mvte:store:code;">
<input type="hidden" name="Screen" value="LLU">
<mvt:item name="toolkit" param="loginlookup" />
<input type="hidden" name="Action" value="NEW">
<input type="hidden" name="email_subject" value="Your login ID">
<input type="hidden" name="email_message" value="Your username login: %customer_login%.">
Your Email Address: <input type="text" size="40" name="Customer_Email_Lookup" value="&mvte:global:Customer_Email_Lookup;">
<br>
<input type="submit" name="trash" value="Retrieve Login">
</form>
</body>
</html>
83. Use hyphen to replace spaces and non-alphanumeric characters in a variable, e.g. product name, with a hyphen so that you can use that variable in urls. The 2nd parameter is the variable to save the converted text to. The 3rd parameter is the variable holding the text to convert. This example converts the product name on the product list
page.
<mvt:item name="toolkit" param="hyphen|pname|l.all_settings:product:name" />
&mvte:global:pname;.html
84. Use hyphen2 to replace spaces in a variable,
e.g. product name, with a hyphen so that you can use that
variable in urls. It works like hyphen except it also
strips out non-alphanumeric characters like " / (). The
2nd parameter is the variable to save the converted text
to. The 3rd parameter is the variable holding the text to
convert. This example converts the product name on the
product list page.
<mvt:item name="toolkit" param="hyphen2|pname|l.all_settings:product:name" />
&mvte:global:pname;.html
85. Use customcategory to insert a custom category field value on the CTGY page template.
<mvt:item name="toolkit" param="customcategory|cattotal|l.all_settings:category:id|productcount" />
&mvte:global:cattotal;
This will check the custom category field "productcount" for the current category and save the value
to a variable called "cattotal". You can then mvte the cattotal variable to display it. Note: This function requires use of the Miva Corp built-in custom fields module and that you have created
custom category fields. This example is using the custom category field "productcount". That field is automatically created if you run the Products in Category Count under admin > utilities > Emporium Plus Tool Kit. Keep in mind, you cannot use the count feature if your store uses availability
groups or your products are hidden when they go out of stock. That is because the feature is run in admin whenever you change products in categories. It remains static until you run it again. In addition to being able to display the count as above, you can assign the custom field productcount to the category tree template and display counts in the tree with:
<mvt:if expr="NOT ISNULL l.settings:cattree_category:customfield_values:customfields:productcount">
(&mvt:cattree_category:customfield_values:customfields:productcount;)
</mvt:if>
<mvt:if expr="NOT ISNULL l.settings:cattree_category:customfield_values:customfields:cathaschild">
+
</mvt:if>
Beginning with Tool Kit version 5.163, you can use the category code instead of the category ID by using the function
customcategoryc. Sometimes the code is available and the ID is not. That said, if the ID is available use the
customcategory function as it is faster.
86. Use country to retrieve the name of the country when the country code is known. The country name is saved to the variable in the second parameter. The country code is a variable in the third parameter. In this example it is passing the basket variable for the ship to country code in the third
parameter. Note: There are many country codes which are shared between more than one country. In those cases it will retrieve the first matching record. For example TT is shared between Trinidad and Tobago.
<mvt:item name="toolkit" param="country|ccode|g.basket:ship_cntry" />
&mvte:global:ccode;
87. Use current to list the most recent products purchased. For example,
<mvt:item name="toolkit" param="current|pcount|10|0" />
<mvt:if expr="pcount GT 0">
<table border="0" width="200">
<th>Recent Purchases</th>
<tr><td align="center">
<font size="-1">
<mvt:foreach iterator="currentsale" array="currentsales">
<mvt:if expr="NOT ISNULL l.settings:currentsale:thumbnail">
<a href="&mvt:global:sessionurl;Screen=PROD&Product_Code=&mvta:currentsale:code;&Store_Code=&mvta:store:code;">
<img src="&mvt:currentsale:thumbnail;" border="0"></a><br>
</mvt:if>
<a href="&mvt:global:sessionurl;Screen=PROD&Product_Code=&mvta:currentsale:code;&Store_Code=&mvta:store:code;">
&mvt:currentsale:name;</a>
<br>
&mvt:currentsale:formatted_price;
<br><br>
</mvt:foreach>
</font>
</td></tr>
</table>
</mvt:if>
creates an array of the last 10 items purchased. The 3rd parameter is the number of items
to display, eg 10. The 4th parameter (added in version 5.203) as 1 filters the list to only the viewing
customer's purchases. If 0 or blank, it is all customers.
88. Use pageinfo to capture and display the page
name of the page you are on.
<mvt:item name="toolkit" param="pageinfo" />
&mvt:pageinfo:name;
89. Use headeroutput to change the output of the header. In this example putting this on the first line
of a page template will change the Content-Type to application/json for use with ajax. The page will not be viewable
as html but will rather pass data to a javascript file for dynamic display, e.g. with an autocomplete input.
<mvt:item name="toolkit" param="headeroutput|Content-Type|application/json" />
A variation of this is the vheaderoutput which allows you to make the 3rd parameter a variable. An example
of this usage would be redirecting a visitor or search bot to another page when the old page has been moved. This
can be done in our short links page (TKSL). In the below example, a new url is constructed and saved to a variable
called "newurl".
<mvt:item name="toolkit" param="headeroutput|Status|301 Moved Permanently" />
<mvt:item name="toolkit" param="vheaderoutput|Location|g.newurl" />
90. Use plstpages to display product list pagination. Number the product list pages with configurable links to any page in the store's product list.
<mvt:item name="toolkit" param="plstpages" />
<table>
<tr>
<td colspan="2" align="right" nowrap>
<mvt:item name="fonts" param="ctgy_font">
<mvt:if expr="l.settings:plst_total_pages GT 0">
Page &mvt:plst_current_page; of &mvt:plst_total_pages;
<br>
</mvt:if>
<mvt:if expr="l.settings:plst_total_pages GT 1"> |
<mvt:foreach iterator="pages" array="plst_offset">
<mvt:if expr="l.settings:pages:buffer GE 10 AND l.settings:pages:number NE 1 AND l.settings:pages:number NE l.settings:plst_total_pages">
<mvt:if expr="l.settings:pages:buffer EQ 10">
<a href="&mvt:global:sessionurl;Screen=PLST&Store_Code=&mvta:store:code;&offset=&mvt:pages:offset;">
<mvt:if expr="l.settings:pages:number GT l.settings:plst_current_page">
<img src="graphics/right.gif" border="0"> </a> <mvt:else>
<img src="graphics/left.gif" border="0"> </a> </mvt:if>
</mvt:if>
<mvt:else>
<mvt:if expr="l.settings:plst_current_page EQ pos1">
&mvt:pages:number; |
<mvt:else>
<a href="&mvt:global:sessionurl;Screen=PLST&Store_Code=&mvta:store:code;&offset=&mvt:pages:offset;">
&mvt:pages:number;</a> |
</mvt:if>
</mvt:if>
</mvt:foreach>
<br>
</mvt:if>
Total products in &mvt:store:name;: &mvt:plst_product_total;
</mvt:item>
</td>
</tr>
</table>
FTP the left.gif and right.gif to the mm5/graphics directory.
91. Use tksl to create search engine optimized (SEO) links at the domain root level. Your link can
look like http://www.yourdomain.com/ABC.html. Add a new page template with the code TKSL (upper case). Assign the toolkit item to the items list of that page. In the body of the page you will have 3 lines.
<mvt:item name="toolkit" param="tksl" />
<mvt:item name="toolkit" param="vrender|g.Screen" />
<mvt:exit>
Then modify the .htaccess file slightly from the default code that is in it when you check "Enable short links" and
update under admin > global settings > domain settings > SEO settings. Retrieve the .htaccess file from the server. There should be 5 rules. Remove the rules for product and category (2nd and 3rd). Then change the product + category and the other screens (4th and 5th) to read
like this.
Test your store and make sure it is working. Then edit links in the category tree, CTGY, and PLST page templates. An
example in the CTGY would be:
http://www.YOURDOMAIN.com/&mvta:product:code;-p-&mvta:category:code;.html?Offset=&mvta:global:offset;
In the category tree:
http://www.YOURDOMAIN.com/&mvta:cattree_category:code;.html
In the PLST:
http://www.YOURDOMAIN.com/&mvta:product:code;.html
You probably will not change the links in the SRCH page template because search engines don't perform fake searches
to see what products display. Besides, many of you are using our Power Search module which has a specially formatted
link so that customers can return to the exact spot they were at in the search results. You also
cannot have a category code the same as any product code, nor can a page code be
the same as any category or product code. These links and the .htaccess
example are used when you only have one store in your merchant.mvc. If you
have multiple stores you will need to devise extra parameters to handle the
store code. You can see these short links in use in this store.
You can modify the TKSL page even further to make it an error handler and give your store the ability to have
multiple category and product page templates without having to resort to expensive modules to do it. It handles this
page reassignment as fast, if not faster, than 3rd party modules written specifically to do this functionality. This
is discussed in parts 2 and 3 of the tksl.txt file.
92. Use systemaction to validate inputs from a page and redisplay the page if there is a problem. You use regular store morph code to validate the inputs. Put the following inside the form on the page sending the input values, e.g. on the PROD page.
<mvt:item name="toolkit" param="systemaction|ADPR|PROD|Year of Birth must be between 1900 and 1994" />
The 2nd parameter is the "action" to check. In this example we are going to check for a year of birth between 1900-1994. If the customer does not provide a date in that range, we are going to reload the page identified with the 3rd parameter. The 4th parameter is the message. No html allowed in the message. Then we need to create a new page template to handle the validation code. The page code is the same as the original page plus "_SYSTEM". So the companion page for PROD would be PROD_SYSTEM. In this example we would then put the following on this new page.
<mvt:if expr="g.Action EQ 'ADPR'">
<mvt:if expr="g.Product_Attributes[2]:code EQ 'YOB'">
<mvt:if expr="(g.Product_Attributes[2]:value GE 1900) AND (g.Product_Attributes[2]:value LE 1994)">
<mvt:else>
<mvt:if expr="g.Product_Attributes[2]:value">
<mvt:item name="toolkit" param="sassign|quantity|0" />
<mvt:item name="toolkit" param="mvassign|tkmessage|encodeentities(g.tkmessage)" />
<mvt:item name="toolkit" param="mvassign|tkscreen|encodeentities(g.tkscreen)" />
<mvt:item name="toolkit" param="vacreate|error_message|g.tkmessage|," />
<mvt:item name="toolkit" param="sassign|Error_Message_Count|1" />
<mvt:item name="toolkit" param="vassign|Error_Messages|l.all_settings:error_message" />
<mvt:item name="toolkit" param="vassign|Screen|g.tkscreen" />
</mvt:if>
</mvt:if>
</mvt:if>
</mvt:if>
<mvt:exit>
93. Use lastupdate to display the last updated time from a custom product, category or customer field that is tied to the record you are looking at. The module updates the time for products and categories when you add or edit a record in admin. It updates the customer record when they add or update their own record in merchant. If you are importing products from a flat file, you will need to put the current unix time in the column you are going to
use for lastupdate. You can easily get that unix time by updating any product record in admin. Then check its
custom product field for lastupdate. Copy and paste that number into your flat file.
To get you started, you can use our Template Data Feed module.
When exporting, if it finds an empty lastupdate, it inserts
the current unix time into the field. See its install doc
for the correct token. Finally, if you do not edit individually
in admin or you don't run the template data feed, you can
still insert an update into the empty lastupdate records. If
you include the below code on the page, when the page is next
visited, the token will update those that are empty with
the current unix time. It will not change that date on later
visits. Only updates as above will do that.
The time is unix time and it is stored in a custom field called lastupdate. Below are examples of each.
The -4 in the below examples is the time zone offset.
Put the following on the product page template at any location.
<mvt:item name="fonts" param="ctgy_font">
<mvt:item name="toolkit" param="lastupdate|lastupdate|-4|PRODUCT|l.all_settings:product:id" />
<mvt:if expr="g.lastupdate">
<mvt:item name="toolkit" param="mvassign|date2|g.lastupdate:DATE:MM$'/'$g.lastupdate:DATE:DD$'/'$g.lastupdate:DATE:YYYY" />
<mvt:item name="toolkit" param="sassign|days|Sunday#Monday#Tuesday#Wednesday#Thursday#Friday#Saturday" />
<mvt:item name="toolkit" param="vgettoken|g.days,#,g.lastupdate:DATE:DOW|cday" />
Updated: &mvte:global:cday; &mvte:global:date2; &mvte:global:lastupdate:TIME:HH;:&mvte:global:lastupdate:TIME:MM;:&mvte:global:lastupdate:TIME:SS;
<mvt:item name="toolkit" param="sassign|months|Jan#Feb#Mar#Apr#May#Jun#Jul#Aug#Sep#Oct#Nov#Dec" />
<mvt:item name="toolkit" param="vgettoken|months,#,g.lastupdate:DATE:M|cmonth" /> (&mvte:global:cmonth; &mvt:global:lastupdate:DATE:D;, &mvt:global:lastupdate:DATE:YYYY;)
</mvt:if>
</mvt:item>
Put the following on the category page template at any location.
<mvt:item name="fonts" param="ctgy_font">
<mvt:item name="toolkit" param="lastupdate|lastupdate|-4|CATEGORY|l.all_settings:category:id" />
<mvt:if expr="g.lastupdate">
<mvt:item name="toolkit" param="mvassign|date2|g.lastupdate:DATE:MM$'/'$g.lastupdate:DATE:DD$'/'$g.lastupdate:DATE:YYYY" />
<mvt:item name="toolkit" param="sassign|days|Sunday#Monday#Tuesday#Wednesday#Thursday#Friday#Saturday" />
<mvt:item name="toolkit" param="vgettoken|g.days,#,g.lastupdate:DATE:DOW|cday" />
Updated: &mvte:global:cday; &mvte:global:date2; &mvte:global:lastupdate:TIME:HH;:&mvte:global:lastupdate:TIME:MM;:&mvte:global:lastupdate:TIME:SS;
<mvt:item name="toolkit" param="sassign|months|Jan#Feb#Mar#Apr#May#Jun#Jul#Aug#Sep#Oct#Nov#Dec" />
<mvt:item name="toolkit" param="vgettoken|months,#,g.lastupdate:DATE:M|cmonth" /> (&mvte:global:cmonth; &mvt:global:lastupdate:DATE:D;, &mvt:global:lastupdate:DATE:YYYY;)
</mvt:if>
</mvt:item>
Put the following on the ACED (customer edit) screen at any location.
<mvt:item name="fonts" param="ctgy_font">
<mvt:item name="toolkit" param="lastupdate|lastupdate|-4|CUSTOMER|customer:id" />
<mvt:if expr="g.lastupdate">
<mvt:item name="toolkit" param="mvassign|date2|g.lastupdate:DATE:MM$'/'$g.lastupdate:DATE:DD$'/'$g.lastupdate:DATE:YYYY" />
<mvt:item name="toolkit" param="sassign|days|Sunday#Monday#Tuesday#Wednesday#Thursday#Friday#Saturday" />
<mvt:item name="toolkit" param="vgettoken|g.days,#,g.lastupdate:DATE:DOW|cday" />
Updated: &mvte:global:cday; &mvte:global:date2; &mvte:global:lastupdate:TIME:HH;:&mvte:global:lastupdate:TIME:MM;:&mvte:global:lastupdate:TIME:SS;
<mvt:item name="toolkit" param="sassign|months|Jan#Feb#Mar#Apr#May#Jun#Jul#Aug#Sep#Oct#Nov#Dec" />
<mvt:item name="toolkit" param="vgettoken|months,#,g.lastupdate:DATE:M|cmonth" /> (&mvte:global:cmonth; &mvt:global:lastupdate:DATE:D;, &mvt:global:lastupdate:DATE:YYYY;)
</mvt:if>
</mvt:item>
Put the following on the landing page after a new customer account is created at any location.
<mvt:if expr="g.Action AND g.Action IN 'ICST'">
<mvt:item name="toolkit" param="lastupdate|lastupdate|-4|CUSTOMER|customer:id" />
</mvt:if>
94. Use custadd to add a value to a comma delimited list in a custom customer field. This
is useful if you want to make a customer favorites list for logged in customers. First create a custom customer field. Name it anything you want. In this example we will call it myfav. Then on the product page put the following code. This code tests to make sure the customer is logged in. Then displays a link to add the product to the list. If the customer clicks the link, the page refreshes and the toolkit custadd item executes and adds the product to the custom field.
<mvt:if expr="g.basket:cust_id GT 0">
<a href="&mvte:global:sessionurl;Screen=PROD&Product_Code=&mvta:global:Product_Code;&Category_Code=&mvta:global:Category_Code;&Store_Code=&mvta:global:store:code;&favorite=&mvta:global:Product_Code;">
Favorites List</a>
<mvt:if expr="g.favorite">
<mvt:item name="toolkit" param="custadd|myfav|g.favorite" />
</mvt:if>
</mvt:if>
95. Use custdelete to remove a value from a comma delimited list in a custom customer field. It is usually used in tandem with the custadd function to create a favorites list. For example, you
can use the vquick function above to display products in the custom customer field. As you display those products you can use the custdelete link to let customers delete items from their favorites list.
<mvt:if expr="g.favdelete">
<mvt:item name="toolkit" param="custdelete|myfav|g.favdelete" />
</mvt:if>
<mvt:item name="toolkit" param="customer|fav|myfav" />
<mvt:if expr="g.fav">
<mvt:item name="toolkit" param="vquick|pcount|g.fav" />
<mvt:if expr="pcount GT 0">
<mvt:foreach iterator="quicklist" array="quicklists">
show product info in quicklist array
<a href="&mvt:global:secure_sessionurl;Screen=ACNT&Order=0&Store_Code=&mvta:global:store_code;&favdelete=&mvta:quicklist:code;">
Remove</a>
</mvt:foreach>
</mvt:if>
</mvt:if>
96. Use pgrpdelete to delete a customer from a price group. This could
be used in conjunction with automated price group membership management.
<mvt:item name="toolkit" param="pgrpdelete|maxgrp|Chairman" />
<mvt:if expr="maxgrp">
Your membership in the &mvte:global:maxgrp; price group has been terminated.
</mvt:if>
97. Use agrpdelete to delete a customer from an availability group. This could
be used in conjunction with automated availability group membership management.
<mvt:item name="toolkit" param="agrpdelete|avail|Wholesale" />
<mvt:if expr="avail">
Your membership in the &mvte:global:avail; availability group has been terminated.
</mvt:if>
98. Use smtp to send an email from any page in the store. You create an email
as a page template. Then using the token, e.g.
<mvt:item name="toolkit" param="smtp|VISITED" />
it will send the email. In this example I created a page template with the code VISITED and the name Page Visit. In the body of the page template I put the following
code:
<mvt:if expr="g.Screen CIN 'VISITED'">
<mvt:exit>
</mvt:if>
%subject|Product page visited%
%from|g.store:email%
%to|g.store:email%
<html>
<body>
The &mvt:product:name; product page was visited. <mvt:if expr="g.basket:cust_id GT 0">
The customer was &mvte:global:customer:bill_fname; &mvte:global:customer:bill_lname; at &mvte:global:customer:bill_email;
</mvt:if>
</body>
</html>
On the first line make sure the screen name is the exact same as the code for the page
template you created (case sensitive). The subject token is a string. It cannot be a variable at this time. The from and to tokens must be variables. In the example above the to token is g.store:email. It could have been g.customer:bill_email if you wanted to send something to logged in customers. Be careful on how you use this. You would not want a spammer to be able
to send emails through your store to hundreds of people. As long as you control the message and
the destination is your store or logged in customers, spamming would be unlikely.
You can create
as many email template pages as you want. For example, you might want to use the pgrpinsert function to assign customers to a price group. Then use the smtp function to send them an email
to highlight the benefits of the price group they were just assigned to. Then use a different
template to send them an email if their price group membership expires and you remove them with the pgrpdelete function. All of this can be automated with the Tool Kit functions.
If your version of the tool kit has the smtp function listed
in its admin screen here is the
how to.
Another useful email is the welcome email when new
customers create an account. Here's a quick
how to that should take less than 5 minutes (most
of that time to change the text in the welcome email) to
setup, saving you from buying a $40 module that does the same
thing and takes just as long to setup. You can see how
it works by creating a new account in our
test
store.
99. Use randomstring to generate a random string of characters. The second parameter is
the variable you want to save the string to. The third parameter is the length of the random string
you want to create. For example:
<mvt:item name="toolkit" param="randomstring|proceedcode|8" />
There are many things you might use this for. As example, use it in conjunction with custinsert to store a proceed code with a customer's record. If they know
the code, they can proceed in the checkout. Use the smtp function to send the customer the code. This would mean the customer would have to supply a valid email address to receive the code. If they used a
fake address, it is probably a fraudulent order. Hence, they would not receive the code and could not
proceed.
Instructions for this implementation are fairly easy to follow.
100. Use pickprompt to replace the attribute and option codes with their prompts in the picklist
screen which is run under manage shipments in admin. Locate the line
<mvt:foreach iterator="option" array="item:options">
On the line immediately following that, insert the following line.
<mvt:item name="toolkit" param="pickprompt|l.all_settings:option" />
Then in the next few lines replace attr_code with attr_prompt and opt_code with opt_prompt.
101. Use promptimage to replace or add to the attribute options. This will check for the existence of
an attribute/option image. If there is one it will create a variable that allows you to display the image in
the basket. Just before the item:options foreach loop put this line
<mvt:item name="toolkit" param="promptimage" />
Then a few lines down where the attribute and option codes are displayed you can use this code
<mvt:if expr="l.settings:option:opt_image">
<img src="&mvt:option:opt_image;" border="0" alt="&mvt:option:opt_code;">
</mvt:if>
to display the image if it exists.
102. Use exit to abruptly end the display. Here is an example usage to allow store owners
to keep the store open so they can work on it, but make it appear closed to all other visitors. The following code has a conditional in its first line. When 1 EQ 1 exists, this code is active.
If you change the code to 1 EQ 2, then none of this code executes. You put your IP address where you see the Xs in the first line. When you want the store in maintenance mode to all
visitors, but not yourself, you change it to 1 EQ 1. When done you change it back to 1 EQ 2. Don't forget to turn it back on. To you, your store will always appear open, so don't forget
and leave it closed to others. Assign the toolkit to all
pages in the store EXCEPT MNTN by going to admin:pages click items. Then find
toolkit. Click edit. Click pages. Assign to all pages EXCEPT MNTN.
This code below goes before any other text in the html_profile item which can be edited by clicking your store name in admin, then the HTML profile tab on the right.
<mvt:if expr="(1 EQ 1) AND (remote_addr NE 'XX.XXX.XXX.XX')">
<mvt:item name="toolkit" param="sassign|emessage|Closed for maintenance" />
<mvt:item name="toolkit" param="vacreate|error_message|g.emessage|," />
<mvt:item name="toolkit" param="sassign|Error_Message_Count|1" />
<mvt:item name="toolkit" param="vassign|Error_Messages|l.all_settings:error_message" />
<mvt:item name="toolkit" param="render|MNTN" />
<mvt:item name="toolkit" param="exit" />
</mvt:if>
Alternatively, you could use this technique on just one
screen that you are working on. You would put the code
on the effected screen just before the first line which
is the html_profile item. Visitors could see all of the
store except the one screen you activate the code on.
103. Use basketfiller to refill the basket's customer info if they have browsed your site
and then returned to checkout. When a customer goes to checkout and does NOT create an account, they enter their address info but it is not saved to the customer database. If they decide to go
back and shop some more, those values will not be retained with the typical Merchant flow. Instead
when they return to checkout the inputs are all blank. This function will refill those inputs with
the previously entered values if it is the same session. Insert this function at the beginning of the OCST page template.
<mvt:item name="toolkit" param="basketfiller" />
104. Use custfavcount to display on the product page the number of customer favorites lists
the product is in. See custadd and custdelete above for adding and deleting from the favorites list.
The 2nd parameter is the variable you are saving the count to. The 3rd parameter is the custom
customer field code for your favorites list. The 4th parameter is the product code variable.
<mvt:item name="toolkit" param="custfavcount|favcount|myfav|g.Product_Code" />
<mvt:if expr="g.favcount GT 0">
&mvte:global:favcount; customers have this product in their favorites list
</mvt:if>
105. Use prodinsert to insert a value into a custom product field. This is useful if you want to
keep track of the number of views a product has. In this case you would use it in conjunction with the
custom, math_add, and sassign functions above. Insert this example on the PROD page template.
<mvt:item name="toolkit" param="custom|lastip|l.all_settings:product:id|viewip" />
<mvt:if expr="g.lastip NE remote_addr">
<mvt:item name="toolkit" param="sassign|one|1" />
<mvt:item name="toolkit" param="custom|viewcount|l.all_settings:product:id|views" />
<mvt:item name="toolkit" param="math_add|newviews|g.viewcount|one" />
<mvt:item name="toolkit" param="prodinsert|l.all_settings:product:id|views|g.newviews" />
<mvt:item name="toolkit" param="prodinsert|l.all_settings:product:id|viewip|remote_addr" />
</mvt:if>
First create two custom fields, views and viewip. This example checks the IP address. If it is not the same as the last person to visit this page, it processes the lines that follow. The custom function
gets the current value in the views field. It then adds 1 to it. Then it inserts the new count into the views custom field and the IP address into the viewip custom field.
106. Use acount to count the number of elements in an array.
<mvt:item name="toolkit" param="acount|number_actors|l.all_settings:cast" />
Count: &mvte:global:number_actors;
107. Use sibling to load a parent's subcategories into an array when starting
from one of the subcategories. This gives you the sibling categories to the current category. It saves the sibling
category count to a variable of your choosing. You can then display the contents of the siblings array. This function
does not capture the image urls. You can use the functions catimage or cattreeimage (see above) to retrieve the image
urls. To display sibling names, you could use code like
<mvt:item name="toolkit" param="sibling|scount|g.Category_Code" />
<mvt:if expr="scount GT 0">
<mvt:foreach iterator="sibling" array="siblings">
&mvt:sibling:name;
</mvt:foreach>
</mvt:if>
108. Use waitlist to determine if a product or its autogenerated variants are out of stock. This function requires Miva Merchant
version PR7 or newer. Typically, this function is used on the special WAITLIST page template which is called from the
product page. You would not use it on other pages. See the
how to document for
instructions for the other pages. The function also sends pending emails to wait listed customers
automatically if the product or its variants are detected as being back in stock whenever the PROD page loads, either
by a customer or search engine visiting the page. A typical scenario is a customer puts a product in their basket and
it goes out of stock, but they leave the store without buying. A little while later another customer visits the page
and puts their email address in the wait list queue. If you have an automatic restocking module, like our Restock
Shelves, or you do daily basket deletions, the item is placed back in stock that same day. In other wait list systems,
the email is only sent when store employees manually take action to send emails for back in stock products. They may do
this only when new inventory arrives and they update their store. Conversely, the Tool Kit waitlist is continually
checking inventory and purging the queue throughout the day. Each product page in your store is likely to be visited by
multiple search engine bots throughout the day. This allows you to recapture the sale before they look elsewhere. The
function also removes the wait listed customer emails from the wait list as the emails are sent. It also adds customers
to the wait list if they enter their email address and submit the form. They do not have to be logged in or have an
account. However, if they are logged in, they can check their entire wait list using the waitlistshow function.
They can also remove items from their wait list if they change their mind. The token used on the PROD page is
<mvt:item name="toolkit" param="render|WAITLIST" />
The token used on the ACED page is
<mvt:item name="toolkit" param="waitlistshow|wcount" />
In admin, the store employees can check an individual user's wait list and remove all of their entries if they want to.
They can also list all products which have someone waiting for them to come back in stock. That list can be sorted by
product name or code and can be used to identify potential products to order.
109. Use ctgyproduct_list to create as many different category page templates with sorting and pagination that
you want without having to
buy a module other than this Tool Kit, which you already have. With this function you can create new page templates,
e.g. CTGY1, CTGYLINE, CTGYCOL3, CTGYCOL4, and so on. You will probably use this function in conjunction with the
catpages (pagination) token above. First let's modify your default CTGY page template. Go to the CTGY page template.
Click the Category Product List Layout tab at the top. Copy that product list layout template code to the clipboard.
Click back to the main CTGY page template input and locate the line <mvt:item name="product_list" /> and remove it.
Paste the code you copied to the clipboard at the location where you removed the product_list item. Update the page.
Click on the word "Items" at the top of the page and unassign the product_list item. Then assign the toolkit item.
Then insert the following line just after the body item tag (<mvt:item name="body">) in the CTGY page template.
<mvt:item name="toolkit" param="ctgyproduct_list|10|cxp.asc|1" />
You can quickly create multiple category templates by copying and pasting the contents of the main CTGY page template
which you just modified into a new page. Then edit the product list layout part of the template to the
various layouts you want. If you don't know where to start on editing the product list layout part, you can go up to
the Items link at the top and reassign the product_list item. Then click the link at the top for the Product List Layout. If it does not say Category Product List Layout, switch to point and click mode and the first
input lets you choose the layout. Change it to Category Product List Layout and save. Design the layout you want, e.g.
expanded vs line, number of columns, fields to show, etc. Save the new layout. Copy the layout and paste it into the
main page, overwriting the old product list layout design. Save the changes. Click Items and unassign product_list.
Using this technique, you can quickly design several different pages with different layouts.
See the TKSL function above on how to redirect to these multiple page templates and
incorporate short SEO links in the format http://www.yourdomain.com/ABC123.html.
Note that the above has 4 required parameters. The 1st calls the function. The second is the number of products per page
to show when the page initially loads. The customer can select to see more per page if you give them the drop down to
choose alternate numbers. The third parameter is the sort order that the products
are in when the page first displays. cxp.asc is the default list order; the same that you see when in your admin. You
can have a drop down to let the customer sort differently, e.g. by best sellers in the category. The fourth
parameter is the option to load custom product field values for each product displayed. If the customer chooses to show
All products in the category and that category has 1000 products you might want to have a conditional
to turn off that flag. For example
<mvt:if expr="g.ProductsPerPage GT 200">
<mvt:item name="toolkit" param="ctgyproduct_list|10|cxp.asc|0" />
<mvt:else>
<mvt:item name="toolkit" param="ctgyproduct_list|10|cxp.asc|1" />
</mvt:if>
The example doc combines the page
numbering of catpages with the sorting and page length selection of the ctgyproduct_list function. If
you setup a new store after May 1, 2010 you are probably using the CSSUI. Here is the
CSSUI example doc if that
is the case.
There may be times when you don't want a product to be found in the category pages and only available by direct link.
Insert <!-- miva_nodisplay //--> anywhere in the description of the products and they will not show in the
category pages. The text will also not display in the description because it is surrounded with html comment tags.
You can do this with the category and product list pages, and if you are using our Power Search module, the search
page. Since I mentioned Power Search, take a look at this
example
category. Just to the right of the category title is a search
button. Click it. This takes you to the Power Search
screen filtered to only show this category. This gives you
full keyword search.
While not part of the ctgyproduct_list function, I'll mention the ability to have multiple PROD page templates here. The
procedure for creating new product pages is similar to categories but you do not have to unassign items. You also do not
have to copy and paste the product layout to the main page. You can leave the items in place so the tabs for each
page component will be accessible for cleaner editing. You will need to fix the product list layout tab. The default
is category. On the PROD pages that needs to be related products. So click the product list layout tab at the top
after you create the new page. Then on that screen, change the layout to related product list layout.
110. Use plstproduct_list to add sorting and page length selection to the product list without having to
buy a module other than this Tool Kit, which you already have. You will probably use this function in conjunction with
the plstpages (pagination) token above. You will modify the original PLST page template.
<mvt:item name="toolkit" param="plstproduct_list|20|prod.asc|0" />
Note that the above has 4 parameters. The 1st calls the function. The second is the number of products per page to
show when the page initially loads. The customer can select to see more per page if you give them the drop down to
choose alternate numbers. The third parameter is the sort order that the products are in when the page first displays.
prod.asc is the default list order; the same that you see when in your admin. You can have a drop down to let the
customer sort differently, e.g. by best sellers in the store. The fourth parameter is the option to load custom product
field values for each product displayed. If the customer chooses to show All products in the store you might want to
have a conditional to turn off that flag or not allow the "All product" option. For example
<mvt:if expr="g.ProductsPerPage GT 200">
<mvt:item name="toolkit" param="plstproduct_list|10|prod.asc|0" />
<mvt:else>
<mvt:item name="toolkit" param="plstproduct_list|10|prod.asc|1" />
</mvt:if>
Beginning with version 5.179 you can also use the variable
"Initial" to limit the display to products whose name begins
with the letter specified, e.g. &initial=M would list all
beginning with the letter M. If you use this, be sure to
include the variable in the page numbering urls and the add,
next and previous forms like you did with productsperpage and sort.
The example doc combines the page
numbering of plstpages with the sorting and page length selection of the plstproduct_list function. If
you setup a new store after May 1, 2010 you are probably using the CSSUI. Here is the
CSSUI example doc if that
is the case.
There may be times when you don't want a product to be found in the product list pages and only available by direct link.
Insert <!-- miva_nodisplay //--> anywhere in the description of the products and they will not show in the
product list pages. The text will also not display in the description because it is surrounded with html comment tags.
You can do this with the category, product list, and search
pages.
111. Use simplesearch to replace the original
search or add an advanced search to your store. You can
even include search capabilities to the category and
product list screens. The token contains 6 parameters.
The simplist form of the token is like
<mvt:item name="toolkit" param="simplesearch|20|name.asc|'name,code,descrip'|'actors,circa'|g.Category_Code" />
A slightly more advanced form of the token may look like
<mvt:item name="toolkit" param="simplesearch|20|name.asc|pfields|cfields|g.Category_Code" />
The first parameter runs the simplesearch function. The
second sets the default products per page to be shown. If
you include a select drop down for the ProductsPerPage
variable, the customer can change the number of products
to show on each page. The third sets the default sort
order. The results can be sorted on regular or custom
product fields, e.g. most viewed products using a custom
product field that is updated with the Tool Kit. You can
even sort on best sellers using the built in sale
quantity tracking. The fourth uses a string (1st example
above) or variable (2nd example above) for which product
fields will be searched. This parameter is flexible in
that the store can designate all or some fields to be
searched. Then based on what the customer does, others
may be added. Like the 4th parameter, the fifth parameter
uses a string or variable to determine which custom
product fields will be searched. Like the fourth
parameter, the store can designate one or more to be
searched in all cases. If the customer selects other
fields, those fields are also searched. The sixth
parameter is an optional filter for a specific category.
The category list is built using the Tool Kit subcat
functions (how to).
If a category is selected, the results are
filtered and the category header for that category can be
displayed.
You can easily put the Simple Search feature on your
regular category and product list pages. The default search
uses the boolean operator "and", thus it will display products that contain all of the search words the customer lists.
If the customer puts quotation marks around the string of words, the search is treated as an exact phrase and the words
must appear in that order in at least one of the fields being searched. There may be
times when you don't want a product to be found in the search pages and only available by direct link.
Insert <!-- miva_nodisplay //--> anywhere in the description of the products and they will not show in the
search pages. The text will also not display in the description because it is surrounded with html comment tags.
You can do this with the category, product list, and search
pages. No mirror or offsite file is needed for Simple Search,
so any changes you make in your product data are immediately
reflected in the search results.
In addition to adding multiple products from a list, you can
add multiple quantities from a single product page.
Product with Multi-Quantity Add - Example CSSUI [full page code]
112. Use prior to lookup a customer's most recent
order of the product they are currently viewing, if they
had ordered that product previously. You can also have a
link to view that specific order status. The customer has
to be logged in. Put the token and code anywhere on the
PROD page template, e.g. probably at the top of the product
layout. If you have bought from Emporium Plus after 2001,
you can see how this works. Login using your Emporium Plus
login and password. Then go to any product page for a
product you bought after 2001. You should see a highlighted
message that you have purchased the item with a link to
the specific order invoice.
<mvt:if expr="g.basket:cust_id">
<mvt:item name="toolkit" param="prior|g.product_code" />
<mvt:if expr="l.settings:prior:order_id GT 0">
<table border="0" cellpadding="0" cellspacing="0">
<tr> <td bgcolor="#ffff00">
You purchased this item on
<mvt:item name="toolkit" param="time_t_year|nyear|-4|l.all_settings:prior:orderdate" />
<mvt:item name="toolkit" param="time_t_month|nmonth|-4|l.all_settings:prior:orderdate" />
<mvt:item name="toolkit" param="time_t_dayofmonth|ndayofmonth|-4|l.all_settings:prior:orderdate" />
<mvt:item name="toolkit" param="sassign|months|Jan#Feb#Mar#Apr#May#Jun#Jul#Aug#Sep#Oct#Nov#Dec" />
<mvt:item name="toolkit" param="vgettoken|months,#,nmonth" /> &mvt:global:ndayofmonth;,
&mvt:global:nyear;
<a href="&mvt:global:secure_sessionurl;Screen=ORDS&Store_Code=&mvta:global:store:code;&Order_ID=&mvta:prior:order_id;">
View order #&mvte:prior:order_id;</a> .
</td> </tr>
</table>
</mvt:if>
</mvt:if>
113. Use footsteps to display a customer's recent product page visits. You must have the lasturl (continue
shopping) function above running in the store before you implement this feature. While lasturl is required for footsteps to work, the footsteps is not required for lasturl to work. So you can have continue shopping without
the recent visit history. The 2nd parameter in the function is the total found (which can be limited by the 3rd
parameter. The field that stores the product codes is limited so if your product codes are real long you may only be able to display a few. If you exceed the field length, excess will be deleted. The 3rd function lets you limit the number to display. If your codes are short a customer could end up having dozens in the field. You may want to limit that display to 10 or 20.
Optionally you can put a 1 as the 4th parameter to hide out of stock products. Leave it blank if you want to include
out of stock products.
You can see how it works in this store. Visit some
product pages. Then click on the basket tab and scroll to the
bottom of the page to see your recent visit history.
Example code is:
<mvt:item name="toolkit" param="footsteps|fcount|10" />
<mvt:if expr="g.fcount GT 0">
<table border="0" cellpadding="2" cellspacing="0" width="80%">
<mvt:foreach iterator="footstep" array="footsteps">
<tr>
<td align="left" valign="top">
<a href="&mvt:global:sessionurl;Screen=PROD&Product_Code=&mvta:footstep:code;&Store_Code=&mvta:global:Store_Code;">
&mvt:footstep:code;</a>
</td>
<td align="left" valign="top" nowrap>
&mvt:footstep:name;
</td>
<td align="left" valign="top">
<mvt:if expr="NOT ISNULL l.settings:footstep:thumbnail">
<img src="&mvt:footstep:thumbnail;" border="0" width="50" height="35">
<mvt:else>
<img src="graphics/en-US/admin/blank.gif" border="0" width="50" height="35">
</mvt:if>
</td>
<td align="right" valign="top">
&mvt:footstep:formatted_price;
</td>
</tr>
</mvt:foreach>
</table>
</mvt:if>
114. Use visitors to display page names of some of the pages that other customers are currently looking at in your store. Peak interest in customers by showing them what others are interested in. You must have the lasturl (continue shopping) function above running in the store before you implement this feature. While lasturl is required for visitors to work, the visitors is not required for lasturl to work. So you can have continue shopping without the the visitor browsing list running.
You will need to make sure you have the lasturl token on the PROD, CTGY, SRCH, and PLST pages.
The visitors token is in the format
<mvt:item name="toolkit" param="visitors|vcount|'5'|'prod,ctgy,srch,plst'|1" />
The 2nd parameter is the variable name that the count is saved to. The 3rd parameter is the number of pages to show. On the storefront or other screen you will probably limit that to about 5. On a separate BROWSE page you might make
that number 50 or more. The 4th parameter is the pages you want to display. The 4 you see above are the ones that are tracked. If you are showing this on the storefront, you may want to limit it to something like 'prod,ctgy' so that
viewers are more likely to see images and products. The srch and plst are rather non-interesting to view. Note that
in the above token, the 3rd and 4th parameters are surrounded with the apostrophe character, like '5'. If you want to
make that parameter a variable, you simply put in a variable name without the apostrophe characters, e.g.
<mvt:item name="toolkit" param="visitors|vcount|g.numbertoshow|g.pagestoshow|1" />
Of course you have to have variables which contain the value you want to use. You'll probably use the Tool Kit sassign
function to create the variable and assign a value to it, e.g. <mvt:item name="toolkit" param="sassign|numbertoshow|5" />.
This would be done if you want to pass a variable based
on a dynamic condition. The 5th parameter is optional.
If you leave it blank there will be no affect. Put a 1
in it if you don't want repeated entries. For example, if two
people visit the same product page, it will only show the most recent customer's visit time. On the storefront you are
more likely to set the no repeat value to 1. On the full page list, you'll probably leave that blank.
The token above creates an array of visitor data. You then display the data based on the visitor:screen in each record. For example, the PROD screen would have a visitor:code which would be the product code. Likewise the CTGY screen would
have a visitor:code which is the category code. The SRCH screen has visitor:search which is the search string used. The
PLST has no code or search string. The CTGY, SRCH, and PLST screen also have a variable called visitor:fullurl which is
the same url that the continue shopping button uses in the lasturl function. This is handy if you want to link directly
to the specific page in a category or search where another customer had been browsing. The visitor:lastupdate variable contains the exact date/time the page was visited. So you can even display a "time since" by subtracting the current time minus the lastupdate time.
See the
"
how to" page for setting this feature up. You can see
this in use at the
test store at the bottom of the page.
115. Use savebasket as an easy save of the products
in the logged in customer's basket with one click for later one click easy restore. The contents are saved to a custom customer field with no expiration. You can use the Tool Kit's custom
customer field search feature in admin to list/edit all customers who have saved their baskets and the contents of those
baskets. You can even list customers who have a specific product in their saved baskets. Simply create a custom customer field called "basket". Insert the code below on any page in the store, e.g. the BASK page. If that page is called with the variable "save" in the url or form posting to the page with a hidden input for "save", the savebasket token will run. It will return the number of products saved to the backup basket. It does not clear the basket. Those products remain in the basket unless the customer clears them with the remove button, the clearall function above, or the basket expires.
<mvt:if expr="g.save">
<mvt:item name="toolkit" param="savebasket|bcount" />
<mvt:if expr="g.bcount">
&mvte:global:bcount; items were saved to your backup basket. You can
clear the basket below and restore it at any time.
</mvt:if>
</mvt:if>
Once saved, you can restore the basket with a single click, either from a link or form if logged in. The restore function checks inventory levels (both basic and attribute inventory) and will not add a product if there are not enough in stock. If there are failed additions, the error message for each failure is configurable with store morph. An example link would be
<mvt:item name="toolkit" param="customer|saved|basket" />
<mvt:if expr="g.saved">
<a href="&mvt:global:sessionurl;Store_Code=&mvta:store:code;&Screen=BASK&Action=NEW&SubScreen=TKRESTORE">
Restore Saved Basket</a>
</mvt:if>
The code from an
example BASK page will get you started.
That page is in a CSSUI store so do not copy the whole
page as its css may not work with your store. The
applicable code is commented for the save and restore
features.
116. Use savebasketdate to retrieve the date and time the basket was saved to the custom customer field called "basket". The 2nd parameter is the variable to save the value to. It returns two values, the count and date. In the example below the number of items in the saved basket would be g.saved:count and the date/time would be g.saved:date. The date can be translated to a human readable date using the Tool Kit date functions above.
<mvt:item name="toolkit" param="savebasketdate|saved" />
If you saved the basket to a cookie using the savebasketascookie function, you can retrieve the count and date/time
by adding a 3rd parameter to the savebasketdate function. The 3rd parameter is the cookie name. For example, if
you choose to save the basket to a cookie called basket, the token would be
<mvt:item name="toolkit" param="savebasketdate|saved|basket" />
117. Use order to retrieve values for several order variables on the invoice page, template emails, picklist,
etc. The variables are: ordercount, orderweight, ordersubtotal, ordersubtotalF, orderother, orderotherF, ordershipping, ordershippingF, ordertax, ordertaxF, ordertotal, and ordertotalF. The 2nd parameter is a variable that you want to
save the item count to. The 3rd parameter is the order id passed as a variable. That variable may be different on
some pages, e.g. l.order:id, order:id, l.all_settings:order:id, l.all_settings:ordershipment:order:id, or even l.order_id.
<mvt:item name="toolkit" param="order|ocount|order:id" />
118. Use brief to strip html tags and parse a block of text into sentences, each sentence as a separate array element which can be displayed using a foreach loop on the page template. This allows you to define how many sentences you want to display. The typical use of this function would be to display the first couple of sentences from the product
description on the category page. The default function has 4 parameters: the function name, the variable to save the array to, the variable to pass to the function which contains the block of text, and an optional length of text to parse. The third parameter extracts the first X number of characters from the block of text. By doing this, the module does not need to remove the html tags and then parse the sentences for the whole block, thus saving processing time. The below example
works on the category or search pages and only parses the first 500 characters of the description. It then displays the first two sentences from that description. If there is a 3rd sentence, it shows the word "more" as a link to the product page.
<mvt:item name="toolkit" param="brief|briefdesc|l.all_settings:product:descrip|500" />
<mvt:foreach iterator="sentence" array="global:briefdesc">
<mvt:if expr="pos2 LT 3">
&mvt:sentence;
</mvt:if>
<mvt:if expr="pos2 EQ 3">
<a href="&mvt:global:sessionurl;Screen=PROD&Product_Code=&mvta:product:code;&Store_Code=&mvta:store:code;">
more>></a>
</mvt:if>
</mvt:foreach>
If you do not want to create an array which you can manipulate each sentence, you can simply save all of the sentences
to a single global variable. To do this, put the number of sentences in the 5th parameter. The example below uses the
Tool Kit header function to retrieve the category header. Then that variable is inserted into the brief function to save the first 2 sentences to a global variable. This code is placed in the head tag content section and would be used
if you have not taken the time to create a meta tag description for each of your categories. This does it automatically from the category's header.
<mvt:if expr="'CTGY' IN g.Screen">
<mvt:item name="toolkit" param="header|cathead" />
<mvt:if expr="g.cathead">
<mvt:item name="toolkit" param="brief|briefdesc|g.cathead|250|2" />
<meta name="description" content="&mvt:global:briefdesc;" />
</mvt:if>
</mvt:if>
119. Use savebasketascookie to easily save the products in the basket whenever the token runs for later one click or
individual easy restore. The contents are saved to a cookie so login is not required. The typical usage is to insert the token in the head section of the BASK page template. Each time that page runs, the contents will be saved. It is an automatic passive action so the customer does not need to click a button to save the basket. It does not clear the basket either. Those products remain in the basket unless the customer clears them with the remove button, the clearall function above, or the basket expires. The function has seven required parameters. The 2nd is a variable
which records the number saved. The 3rd is the name of the cookie. The 4th is the number of hours the cookie will
be valid, e.g. 720 would be 30 days. The 5th is non-secure (0) or secure (1). If the page you put this token on is always secure you should make that a 1. The cookie would then only be readable on secure pages. In most stores, that will
not be the case. The cookie will be non-secure and the content will be read on non-secure pages. The 6th parameter
is the maximum number of products to save in the cookie. The 7th parameter is the character length of the cookie for your domain. There is a physical limit of 4000 characters for each domain's cookie. Miva Merchant already has several small cookies, but you would not want to run out of storage for them. I would recommend 2000 or less for the
7th parameter.
<mvt:item name="toolkit" param="savebasketascookie|bcount|basket|720|0|10|2000" />
Once saved, you can restore the basket with a single click, either from a link or form. Login is not required. The restore function checks inventory levels (both basic and attribute inventory) and will not add a product if there are not enough in stock. If there are failed additions, the error message for each failure is configurable with store morph. The difference between restoring from a custom customer field and restoring from a cookie is the variable "tksaved" is
included with the name of the cookie as its value. An example link would be
<mvt:item name="toolkit" param="savebasketshow|savedcount|basket" />
<mvt:if expr="g.savedcount">
<a href="&mvt:global:sessionurl;Store_Code=&mvta:store:code;&Screen=BASK&Action=NEW&SubScreen=TKRESTORE&tksaved=basket">
Add All Items</a>
</mvt:if>
120. Use savebasketshow to easily display the contents of the saved basket. The 2nd parameter returns saved:count and saved:date. The date can be translated to a human readable date using the Tool Kit date functions above. The 3rd parameter is only used if the basket is saved to a cookie. In that case, the 3rd parameter is the name of the cookie. If the basket was saved to a custom customer field using the savebasket function above, the 3rd parameter is left blank. The token creates an array of products. It includes the options so that the products can be added back to the basket without having to stop at the missing attributes screen. You can add one at a time with the typical add to basket form or add all at once as discussed in the paragraph above using TKRESTORE. For example code, see the link on the module's product page at Emporium Plus in the savebasketshow paragraph. The token is:
a) when saved to a custom customer field with savebasket
<mvt:item name="toolkit" param="savebasketshow|saved|" />
b) when saved to a cookie with savebasketascookie
<mvt:item name="toolkit" param="savebasketshow|saved|basket" />
121. Use setcookie to save content to a cookie. The 2nd parameter is a variable which contains the content to
be saved. The 3rd is the actual cookie's name, e.g. widget in the example below. The 4th is the number of hours in the future that the cookie expires, e.g. 720 would be 30 days. The 5th parameter is non-secure (0) or secure (1). Cookies set on secure pages and read on secure pages are set to 1. Cookies that are set on non-secure pages are read on non-secure pages. Non-secure cookies should not be read on secure pages.
<mvt:item name="toolkit" param="setcookie|g.somevalue|widget|720|0" />
122. Use reviewsetup to initially setup the Emporium Plus Tool Kit ratings and review system. Before you do
anything, go to admin > utilities and make sure the custom fields module is assigned. Then click on the custom product fields tab and make sure you do not already have the fields "rating" and "reviews" already created. If you do, you will need to rename them to something else and change how you were using them. Once you have done
this, put the following token on the PROD page template anywhere on the page.
<mvt:item name="toolkit" param="reviewsetup" />
It is only going to be there for a single page display, then you are going to immediately remove it. Assign the toolkit item to the items list of the PROD page. Then go to your merchant.mvc and display any product page in the store. Then immediately go to the PROD page template and remove the token. The token should create the two new custom product fields, "rating" and "reviews". If you have been using our Rate This module, it should import the data from that module into your new Tool Kit managed system. After the import, you can inactivate the Rate This module, if applicable.
Now you need to create five page templates from the
how to examples. After you create the five page templates, you can read over the other "review" functions below. Keep in mind, the "how to" examples are fully functioning pages that only need your customization if you so desire. The other functions below are already included in those examples, so they are presented below just to inform you about what each function is doing in case you want to make modifications.
123. Use ratingshow to retrieve the numerical rating from the custom product field "rating". The function can
be used on any page where the product ID variable is accessible or can be retrieved. The token format is
<mvt:item name="toolkit" param="ratingshow|rating|l.all_settings:product:id" />
The function returns the global variable "rating" with two subelements, "rating:average" and "rating:count". The
average is the sum of the ratings which have been approved for view divided by the number used to compute that sum. The number is rounded 2 decimal places. It can then be used to display the number of hearts, stars, or whatever image you want to use in conditional store morph code. This gives the visitor a quick visual representation of the "like factor" of the product.
124. Use reviewshow to display the narrative product reviews which customers have entered. The 2nd parameter
is the variable which tells you how many reviews were returned. It is limited by the number of actual reviews and the 4th parameter which can put a hard limit on how many will be shown. For example, on the product page, you may only want to show a couple with a link to show all. The 3rd parameter is the product ID. An optional 5th parameter can be used to filter the results to only reviews that have a specific 1-5 rating for the individual
ratings/reviews. The token here shows the basic token without the 5th parameter.
<mvt:item name="toolkit" param="reviewshow|rcount|l.all_settings:product:id|2" />
125. Use reviewerlist to show all the ratings/reviews that a specific customer has made. This is normally linked
from the first name and uses the customer login to match the reviews across multiple products. This helps a visitor to evaluate the reliability and usefulness of certain reviewer's comments. The 2nd parameter is the number
of reviews returned. The 3rd parameter is the product code. Because of the way this page is called, we pass the product code instead of product ID. As you can see, the 3rd parameter is a bit different from the tokens described above. The 4th parameter is the offset in the data for this particular reviewer. By doing it this way we do not pass
the reviewer login or cookie data in the url, thereby maintaining privacy. The 5th parameter is the type of lookup. Most likely you will use "login" as it is more reliable. However, if a lot of your customers do not login, you may want to use "id". That id relates to a cookie value stored on your customers' computers that is already present with visitors who allow cookies while shopping your store. It is unlikely that your visitors are blocking cookies. However,
many people delete cookies routinely so this method of relating reviews to a visitor over time is less reliable, but does work. An example token for login lookup is
<mvt:item name="toolkit" param="reviewerlist|rcount|rrcode|offset|login" />
126. Use reviewfriendshow to display an info line on how many or what percentage of reviewers responded to the question about whether they would recommend the product to their friends.
<mvt:item name="toolkit" param="reviewfriendshow|friends|l.all_settings:key_product:id" />
127. Use rrinsert to actually insert the rating and review into the database. The 2nd parameter is a variable
to indicate successful insertion of the review into the reviews field. The 3rd parameter is the product ID. The
4th parameter is the approved status for the review. Most stores will probably automatically approve ratings/reviews from their logged in customers. You would do this with the number 1 in the 4th parameter. If you allow ratings/reviews from non-logged in customers, you can set the pending approval element to 0. Do not leave this parameter blank. It must be 1 or 0. The 5th parameter lets you limit the length of the review text. You may allow longer reviews by logged in customers vs your anonymous reviewers. Here is an example token for automatic approval with
a limit of 500 characters of text.
<mvt:item name="toolkit" param="rrinsert|result|l.all_settings:product:id|1|500" />
When the rating/review is submitted the function will check to see if the same reviewer had posted before by using the
login and cookie data. If they had, it erases the previous entry and inserts the new entry at the beginning of the list. If it is an exact duplicate (except for timestamp), it does not insert the rating and review. This cuts down
on the number of emails and other processing. If you have our Power Search (version 5.105 or newer) module in your store, it also updates the mirror automatically so that the reviews become searchable by other customers on your product search page (SRCH) if you have include the custom product field "reviews" in your search criteria. If the logged in customer had previously bought the product they are reviewing, the module gives them the option to let others know they actually bought the product and might know what they are talking about. In the rrinsert function, the module verifies that they really had bought the product.
128. Use variantlistbasketinfo to lookup the inactive product variants in the basket so you can display the full code
or name. It also only works if the variants were created at the product level using the
autogenerate feature. In the basket contents tab within the "items" foreach loop you can include the following
code.
<mvt:item name="toolkit" param="variantlistbasketinfo|vcount|l.all_settings:item:product_id|l.all_settings:item:variant_id" />
<mvt:if expr="vcount GT 0">
<mvt:foreach iterator="part" array="basketitem:variant:parts">
<br> &mvte:part:code; &mvte:part:name;
</mvt:foreach>
</mvt:if>
129. Use reviewsnew to list the most recent reviews, e.g. on the storefront. This function produces an array, similar to the reviewerlist function. The difference is that it lists the most recent reviews by all customers for a
specified period of time. If more than one recent review is made on the same product, only the latest will be shown. The 2nd parameter is the variable name which contains the count of the records found. The 3rd parameter is the rating
filter. Only reviews which had a rating equal to or higher than this number will be included. If you don't want to
showcase your worst products on the storefront, you would set this number to 4 or 5. The 4th parameter is the number
of days the list will cover. The maximum is 10. If you put a number higher than 10, it will reset it internally back to 10.
<mvt:item name="toolkit" param="reviewsnew|newcount|4|7" />
130. Use alsobought_list_load to load a list of products using the alsobought (see alsobought function) field of
all of the products in the basket or order. The 2nd parameter is the variable that you want to save the product count to. The 3rd parameter is the basket id or order id. The 4th parameter is either the word basket or order, depending on the page you put it on. The 5th parameter is the maximum number of product to show. While you may have 20 or 30 products
which were also bought with those in the basket or order, you would not want to show all of them. Typically 8 or 10 is more than enough. So if you put 8 and there are 30 total, the function selects 8 random products from the list. So
if you viewed the list in the BASK you may actually see a different set of products each time you refresh the basket.
Optionally you can put a 1 as the 6th parameter to hide out of stock products. Leave it blank if you want to include
out of stock products.
Example for the BASK page.
<mvt:item name="toolkit" param="alsobought_list_load|acount|g.basket:basket_id|basket|8" />
Example for the INVC page.
<mvt:item name="toolkit" param="alsobought_list_load|acount|order:id|order|8" />
This is only the first line. It creates an array which is accessed and displayed like other arrays using the foreach command, e.g. <mvt:foreach iterator="product" array="alsobought">. Study other array examples using the foreach loop and design the layout to match the way you want the data displayed.
131. Use savebasket2email to save the products in the basket with one click for later one click restore. Login is not required. The contents are saved to a database with an expiration that you set (parameter 3 in days). Insert the code below on the BASK page. If that page is called with the variable "save" in the url or form posting to the page with a hidden input for "save", the savebasket2email token will run. It will return the number of products saved to the backup basket. The name of the variable to capture the number of products is parameter 2 in the token. It does not clear the basket. Those products remain in the basket unless the customer clears them with the remove button, the clearall function above, or the basket expires. The 4th parameter limits how many products can be saved
to the backup basket.
<mvt:if expr="g.save">
<mvt:item name="toolkit" param="savebasket2email|ecount|3|10" />
<mvt:if expr="g.ecount EQ 1">
&mvte:global:ecount; item was saved to your backup basket.<br />
<mvt:else>
<mvt:if expr="g.ecount GT 1">
&mvte:global:ecount; items were saved to your backup basket.<br />
</mvt:if>
</mvt:if>
<mvt:if expr="g.Save2Email_Error">
<font color="red"> &mvte:global:Save2Email_Error; <br /> </font>
</mvt:if>
<mvt:item name="toolkit" param="smtp|SAVE2EMAIL" />
</mvt:if>
Once saved, you can restore the basket with a single click, from a form. The restore function checks inventory levels (both basic and attribute inventory) and will not add a product if there are not enough in stock. If there are failed additions, the error message for each failure is configurable with store morph. An example link would be
<form method="post" action="&mvt:global:sessionurl;Screen=BASK">
Email: <input type="text" name="myemail" value="" size="20">
<input type="hidden" name="Action" value="NEW">
<input type="hidden" name="SubScreen" value="TKRESTORE">
<input type="hidden" name="tksaved" value="email">
<input type="submit" value="Restore" class="button" />
</form>
The
"how to"
shows you the error messages, the save and restore forms, and the example
email.
A variation of the token is to pre-save the customer
email so that it can be tied to a specific basket id.
This is only practical in the Restock Shelves module
email (RESTOCK_E) or similar action. The 5th parameter is
the basket id and the 6th is a flag to overwrite a
previously saved basket or abort if a non-expired saved
record exists for the email address. Leave the 6th blank
for overwrite or 1 if you do not want to overwrite. This
example shows the 1 in the 6th parameter for no overwrite.
Generally, you will not want to overwrite in order to
retain the last purposely saved, non-expired record. Be
sure to change the domain in the basket link in the
example.
<mvt:item name="toolkit" param="vassign|myemail|g.basket:bill_email" />
<mvt:item name="toolkit" param="savebasket2email|ecount|1|20|g.basketitems[1]:basket_id|1" />
<mvt:if expr="g.ecount GT 0">
<a href="http://www.YOURDOMAIN.com/mm5/merchant.mvc?Screen=BASK&myemail=&mvta:global:myemail;&Action=NEW&SubScreen=TKRESTORE&tksaved=email&Store_Code=&mvta:global:store:code;">
Retrieve Last Saved Basket</a>
</mvt:if>
132: Use discount to apply one discount per session on any page template. You can wrap the token with just about any combination of store morph conditionals you want. Use it as a coupon. Use it for an amount (fixed or percent) off the total or just one single product. Restrict to a specific price group or no price group. Restrict to a specific location. Have a different percent off based on the basket total. The conditions are limited by your imagination. The token has 5 parameters. The 5th is optional. The second parameter is the label that shows in the basket page.
Beginning with version 5.244 you can use either a string literal or a variable for the 2nd parameter. If you use a
string put an apostrophe around the text, for example 'Facebook Disount'. If you use a variable, leave off the
apostrophes, for example g.savingsmessage.
The third parameter is the amount. Surround that value with the apostrophe if it is a string. If it is a variable, leave
off the ' so it might look like |l.amount|. The 4th parameter is if it is taxable or not. If you want it to reduce
the tax of the order, make that a 1 instead of a zero. The fifth parameter defines what values are calculated in the display of the order total. When the token reduces the order total, it overwrites the order total that is shown in the basket. It does not change the order total in the database; that is done in the background between pages. This function makes the change on the actual page rather than between pages. Probably the only screen you would use the fifth parameter on is the OPAY page because on that page the new values for shipping and tax appear. So the displayed
total has to include those values. The text to put in the fifth parameter, if used, is ST.
<mvt:item name="toolkit" param="discount|FaceBook Discount 5%|'5%'|0|" />
133: Use logout to logout from any page. Sometimes the Action=LOGO may not work. If not you can try this. On
the page where you want the link put:
<a href="&mvt:global:secure_sessionurl;logout=1&Screen=SFNT&Store_Code=&mvta:global:store_code;">
Log Out</a>
Then on the landing page, e.g. SFNT, put these lines.
<mvt:if expr="g.logout EQ 1">
<mvt:item name="toolkit" param="sassign|Customer_Session_Verified|1" />
<mvt:item name="toolkit" param="logout" />
</mvt:if>
134. Use customimage to retrieve a product's custom images values (if it exists). It saves
the value to a variable of your choosing. For example,
<mvt:item name="toolkit" param="customimage|big|l.all_settings:item:product_id|fullsize" />
<mvt:if expr="g.big">
<img src="&mvt:global:imageroot;&mvte:global:big;">
</mvt:if>
will check the product's custom image field "fullsize" for the current path and save the value
to a variable called "big". You can then mvt the "big" variable to display it. If you leave the 4th parameter blank, the function will return the first custom image in the images array. The above example is for use in the basket. On other pages the "item" in the variable may be different as it is the iterator value
in a foreach array. The product id may also be different, e.g. just id instead of product_id. Note: This function requires use of the Miva Corp built-in custom product images fields module in admin utilities and that you have created custom product image fields.
You can use the product code instead of the product ID by using the function customimagec. Sometimes the code is available and the ID is not. That said, if the ID is available use the customimage function as it is faster. Here are two examples using the product code. The first example simply displays the first image in the list when you leave the 4th parameter blank.
<mvt:item name="toolkit" param="customimagec|big|g.product_code|" />
<mvt:if expr="g.big">
<img src="&mvt:global:imageroot;&mvte:global:big;">
</mvt:if>
Beginning with version 5.234 of the Tool Kit you can also list all of the images for the product if you leave the 4th parameter blank. There are several image variables returned in the array. Below shows just the url.
<mvt:item name="toolkit" param="customimagec|big|g.product_code|" />
<mvt:if expr="g.big">
<mvt:foreach iterator="image" array="toolkitadditionalimages">
<img src="&mvt:global:imageroot;&mvte:image:image:image;">
</mvt:foreach>
</mvt:if>
Beginning with version 5.238 of the Tool Kit you can display the resized, generated images from the image
machine. You will need to be using the built in image machine module and set the image dimensions in its tab
so that it will automatically generate the images from the base image. Then in the 5th and 6th parameters of
the token you would enter the width and height (same as from the image dimensions tab) of the image you want
to display. In the event that size does not exist, you can have a fallback and display the base image if you
put a 1 in the 7th parameter. Variations of tokens above might be:
<mvt:item name="toolkit" param="customimage|big|l.all_settings:sub_product:id|fullsize|274|274|1" />
<mvt:item name="toolkit" param="customimagec|big|g.product_code||42|42|" />
<mvt:item name="toolkit" param="customimagec|big|g.product_code||300|300|1" />
The 3rd example, i.e. the array, has both variables available. So you can have code like this in the foreach loop.
<mvt:if expr="NOT ISNULL l.settings:image:generated:image">
<img src="&mvt:global:imageroot;&mvte:image:generated:image;">
<mvt:else>
<img src="&mvt:global:imageroot;&mvte:image:image:image;">
</mvt:if>
135. Use asortmulti to sort a multidimensional array. The 2nd parameter is the array name. The 3rd is the column to sort on. It must be preceeded with the colon character. The 4th parameter is the direction of the sort. Use 1 for ascending and -1 for descending. Below is an example of sorting the category list in the
Power Search display.
<mvt:item name="toolkit" param="asortmulti|l.all_settings:searchcats|:name|1" />
136. Use altpagecode to determine the screen code when only the numerical page id is known. This is most likely to
be used on the TKSL page to determine if an alternate page code exists for products and categories before checking the
custom field screencode. In Merchant PR8 Update 4, the ability to designate an alternate page was added. This function
can determine if a value exists. The 2nd parameter is the variable the alternate screen code (if it exists) is saved to.
The 3rd parameter is the page id, determined with the TKSL function and
saved as a variable called g.altpageid. For example, the product check would be:
<mvt:if expr="g.altpageid GT 0">
<mvt:item name="toolkit" param="altpagecode|newscreen|g.altpageid" />
<mvt:else>
<mvt:item name="toolkit" param="customc|newscreen|g.Product_Code|screencode" />
</mvt:if>
and the category check would be:
<mvt:if expr="g.altpageid GT 0">
<mvt:item name="toolkit" param="altpagecode|newscreen|g.altpageid" />
<mvt:else>
<mvt:item name="toolkit" param="customcategoryc|newscreen|g.Category_Code|screencode" />
</mvt:if>
137. Use fexists to check for the existence of a file in the data directory. Save the file name
to a variable. Then plug that variable into the fexists function to check for the existence of the file. The result will be 1 if the file is present. The file has to be on the same domain as the merchant program and the path must be virtual, i.e. no http://domainname in the path. In the example, vpath will be 1 if the file exists.
Then you can use the variable in a conditional to do some other process.
<mvt:item name="toolkit" param="sassign|filename|/Merchant5/s01/export/neworders.xls" />
<mvt:item name="toolkit" param="fexists|vpath|filename" />
<mvt:if expr="g.vpath">
do some process
</mvt:if>
As example, this code uses the variable to determine
if a file exists and then inserts a header row if it is
a new file. It is used in the
Template Order Export which is generated using this
Tool Kit's "export" function.
138. Use bestseller_recent to list the best sellers in a specific category for the past X number
of days. NOTE: This function only works in MySQL stores. It does not work in MivaSQL stores. For example,
<mvt:item name="toolkit" param="bestseller_recent|pcount|g.Category_Code|5|30|1|U" />
<mvt:if expr="pcount GT 0">
Best Sellers
<mvt:foreach iterator="bestsell" array="bestseller">
<br>
<a href="&mvt:global:sessionurl;Screen=PROD&Product_Code=&mvta:bestsell:code;&Store_Code=&mvta:store:code;">
&mvte:bestsell:name;<a>
&mvte:bestsell:formatted_price;
</mvt:foreach>
</mvt:if>
shows the best sellers in the current category. The 4th parameter is the number of items
to display, e.g. 5. The 5th parameter is the number of days back the count will include, e.g. 30.
Alternatively you can display the best sellers storewide by changing the 3rd parameter to the word ALL, i.e. replace g.Category_Code with ALL in the above example. You can even include the actual number sold if you want your customers to know how popular the items are by using
the variable &mvte:bestsell:counter; Optionally you can put a 1 as the 6th parameter to hide out of stock products. Leave it blank if you want to include out of stock products.
Optionally you can exclude one string from the product code to hide products in the 7th
parameter. For example, if you want to hide catalogs, gift certificates, etc, put a unique string in their product
code and they will not appear in the list.
139. Use bask_getsum to create a price sum variable in the basket. It sums the base price + the attribute prices to create a formatted_price_sum. To use this function, just before the price display in the basket contents of the BASK page, insert this line.
<mvt:item name="toolkit" param="bask_getsum" />
Then change &mvt:item:formatted_price; to &mvt:item:formatted_price_sum; and also the &mvt:item:formatted_subtotal; to &mvt:item:formatted_subtotal_sum; Then you will remove the display of attribute option prices. You can also use this feature in the checkout screens as they use the basket contents display. You will use the same token as the basket screen.
If you want this feature in the invoice screen or template emails, the process is similar, except the token is
<mvt:item name="toolkit" param="invc_getsum" />
140. Use dynamicattributebasket to include a hidden attribute which then becomes visible in the basket, checkout, invoice, and emails as a typical attribute. You can use it for just about anything, e.g. shipping estimates for various products. You could have a generic date or use a custom product field for shipping estimates. The 2nd parameter in the token is the product code. It is most often l.all_settings:product:code but
might also be g.Product_Code or even something other than those two. The 3rd parameter is the attribute code. It should be somewhat descriptive as that is what will be seen in the basket. The 4th parameter is the value of the attribute. If you enclose it with single quote characters, it can be a string literal. If no quote, it has to be a variable. The token is embedded in the add to basket forms. Here are three examples based on the product types.
<mvt:if expr="('1AA' IN l.settings:product:code)">
<mvt:if expr="NOT ISNULL l.settings:product:customfield_values:customfields:baskmessage">
<mvt:item name="toolkit" param="dynamicattributebasket|l.all_settings:product:code|Design Service:|l.all_settings:product:customfield_values:customfields:baskmessage" />
<mvt:else>
<mvt:item name="toolkit" param="dynamicattributebasket|l.all_settings:product:code|Email delivery:|'Software is usually sent via email within 2 hours'" />
</mvt:if>
<mvt:else>
<mvt:item name="toolkit" param="set_time_zone|our_time|68" />
<mvt:item name="toolkit" param="time_t_hour|curhour|g.our_time" />
<mvt:item name="toolkit" param="sassign|endtime|15" />
<mvt:item name="toolkit" param="sassign|oneday|24" />
<mvt:if expr="g.curhour GT g.endtime">
<mvt:item name="toolkit" param="math_add|our_time|g.oneday|g.our_time" />
</mvt:if>
<mvt:item name="toolkit" param="time_t_dayofweek|ndow|g.our_time" />
<mvt:if expr="g.ndow EQ 7">
<mvt:item name="toolkit" param="math_add|our_time|g.oneday|g.our_time" />
<mvt:item name="toolkit" param="math_add|our_time|g.oneday|g.our_time" />
</mvt:if>
<mvt:if expr="g.ndow EQ 1">
<mvt:item name="toolkit" param="math_add|our_time|g.oneday|g.our_time" />
</mvt:if>
<mvt:item name="toolkit" param="time_t_year|nyear|g.our_time" />
<mvt:item name="toolkit" param="time_t_month|nmonth|g.our_time" />
<mvt:item name="toolkit" param="time_t_dayofmonth|ndayofmonth|g.our_time" />
<mvt:item name="toolkit" param="sassign|usdate|%month%/%day%/%year%" />
<mvt:item name="toolkit" param="vglosub|usdate,%day%,ndayofmonth" />
<mvt:item name="toolkit" param="vglosub|usdate,%month%,nmonth" />
<mvt:item name="toolkit" param="vglosub|usdate,%year%,nyear" />
<mvt:item name="toolkit" param="dynamicattributebasket|l.all_settings:product:code|Expected shipping date:|g.usdate" />
</mvt:if>
The first instance of the token is checking for a value in a custom product field called baskmessage. If it finds a value it uses that as a variable in the 4th parameter. The second instance is using a string literal since no custom field value was found for baskmessage. This would be the generic display for a certain group of product codes. After the first two groups an mvt:else separates all the other products in this example store. This example shows multiple conditions. This would be typical of giving an estimated shipping date based on the day of week and time of day. It starts by setting the time zone 3 days in the future minus 4 hours for this particular time zone, i.e. 68 hours. Then it sets an ending work time of the day that we count shipping from, in this case 15 hours, i.e. 3PM our time. So if our current time is greater than the ending work day time, it adds one day (24 hours) to the time in the future. Then it tests the day of the week. If the day of the week is Saturday (7), it adds two days. If the day is Sunday (1), it adds one day. In this example, store shipping is only M-F. We could do other conditions like testing if it was Dec 25th.
The above example is using the date in the format M/D/YYYY.
You can easily change that to other date formats. For example,
the below creates a variable called sysdatedashes which is in
the format YYYY-MM-DD. These lines would be added to the
above and then use the sysdatedashes variable in the
message instead of usdate.
<mvt:item name="toolkit" param="padl|cmonth|nmonth|2|0" />
<mvt:item name="toolkit" param="padl|cday|ndayofmonth|2|0" />
<mvt:item name="toolkit" param="sassign|sysdatedashes|%year%-%month%-%day%" />
<mvt:item name="toolkit" param="vglosub|sysdatedashes,%day%,cday" />
<mvt:item name="toolkit" param="vglosub|sysdatedashes,%month%,cmonth" />
<mvt:item name="toolkit" param="vglosub|sysdatedashes,%year%,nyear" />
Because this is a dynamic attribute, there is no real attribute established to cover this attribute. Hence, there is
no prompt in the attributes database. Normally, that is not an issue. But if your basket and order contents have been
set to display the attribute prompt instead of the attribute code, you will need to make a minor modification to the Basket Contents tab in each of the screens where you display the basket, e.g. BASK, OCST, OSEL, OPAY, INVC, and your emails. The code will test for an attr_prompt and if it is blank, it will show the attr_code instead. The dynamic attribute has a code, but no prompt. Change
&mvt:option:attr_prompt;: &mvt:option:data;
to
<mvt:if expr="NOT ISNULL l.settings:option:attr_prompt">
&mvt:option:attr_prompt;
<mvt:else>
&mvt:option:attr_code;
</mvt:if>
: &mvt:option:data;
141. Use taxadjustitem to change the tax status of an item in the basket. For example, you might have an option
to download a purchase rather than send a tangible item to the customer. In many jurisdictions the downloaded item
could be tax exempt. Include the conditional test and the taxadjustitem token in the basket contents tab of the
OCST page template. You would put it right after the beginning of the foreach loop for option:items. In this example
the 2nd parameter is the line_id of the product. The 3rd parameter is 0, which means turn off the tax flag so tax is
not applied. If you set it to 1, you would be turning on the tax flag.
<mvt:if expr="l.settings:option:opt_code EQ 'download'">
<mvt:item name="toolkit" param="taxadjustitem|l.all_settings:item:line_id|0 " />
</mvt:if>
142. Use upcharge to apply a surcharge or fee to an order. You can use store morph coding on the page template to conditionally apply the charge. Below is a simple example testing the basket total. If it is greater than or equal to $500, the surcharge is zeroed out. If it is less than $500, the charge is $25. The 2nd parameter in the token is the basket charge description which appears in the basket, invoice and emails. You can use a string literal as you see below by surrounding it with the apostrophe characters. Or you can use a variable without the apostrophe characters, e.g. g.addonmessage. The 3rd parameter is the amount of the surcharge. Like the 2nd parameter it can be a string literal or a variable. So if you wanted to do something like the difference between the minimum order and the current basket total, you could use the Tool Kit math_subtract function to get that difference and save it to a variable. Then use the variable in the 3rd parameter. The 4th parameter is the tax flag. Test that to see how you want it based
on what your surcharge is and your state's tax status for surcharges and fees.
<mvt:if expr="l.settings:basket:total GE 500">
<mvt:item name="toolkit" param="upcharge|'Order minimum surcharge'|'0'|1" />
<mvt:else>
<mvt:item name="toolkit" param="upcharge|'Order minimum surcharge'|'25'|1" />
</mvt:if>
143. Use variantarray to create an array of variants. This is primarily used in conjunction with multiple
quantity inputs on the product page, one for each radio option when the options are inventory variants. The token is
in the format
<mvt:item name="toolkit" param="variantarray|vcount|g.product_code" />
An example usage of this token is in the
how to insert quantity inputs next to each radio
option on the product page for multiple (bulk) product
additions to the basket with a single button click.
144. Use catinfo to retrieve most of the variables related to a specific category. The 2nd parameter is the global variable you want to save the value to. Then you will use either the 3rd and 4th parameters (not both) to look up the category record. If you know the category code, put that in the 3rd parameter and leave the 4th blank or
not use at all. If you don't know the category code but you do know the category ID, leave the 3rd parameter blank and put the numeric ID in the 4th parameter. The examples below show both usages:
<mvt:item name="toolkit" param="catinfo|catvar|g.Category_Code" />
<mvt:item name="toolkit" param="vassign|cat_id|g.catvar:id" />
145. Use basketchargedelete to delete a basket charge, e.g. a coupon or discount. You cannot use it to remove shipping or tax if your store requires them (even if they are $0.00). The 2nd parameter can be a string literal surrounded by the apostrophe as in the example below. Alternatively, you could use a variable without the surrounding apostrophe characters. A typical example is to offer a discount for using a certain payment method. You can do that with the Tool Kit "discount" function which creates a discount record with the type = TKDISCOUNT. But if they don't use that payment method, you can delete the TKDISCOUNT basket charge. The following code, placed just below the body tag on the OPAY page, would do the scenario desribed in this paragraph.
<mvt:if expr="g.PaymentMethod EQ 'poplus:poplus'">
<mvt:item name="toolkit" param="discount|'Purchase Order Discount 5%'|'5%'|0|ST" />
<mvt:else>
<mvt:item name="toolkit" param="basketchargedelete|'TKDISCOUNT'" />
</mvt:if>
146. Use basketattributepercent to make the add or subtract value of an attribute-option a percentage of the base price plus other options which are fixed value. You can apply the percentage charge to select drop down options or radio options. All you need to do is include the % character in the option prompt, e.g. Large (add 10%). Then you set the option value as a decimal, e.g. .25 would result in a 25% upcharge. Whereas, -.05 would result in a 5% discount. Place the following token in the basket contents tab of the BASK and OCST pages. It goes near the top but after the conditional test for empty basket. This token causes the module to check and reconcile attribute percent charges.
<mvt:item name="toolkit" param="basketattributepercent" />
If there is a situation where the customer does not land on the basket or checkout screens after adding an item to
the basket, you can include the token elsewhere. For example, a customer adding from the "All Products" page may return them to that same page, not the basket page. If that is the case in your store, use the token below on applicable pages. I found I could use it in the category tree header and all cases were covered. It does not run every time the tree displays. Because of the conditional, it only runs if the Action is equal to "ADPR", which means add product to the basket.
<mvt:if expr="g.Action EQ 'ADPR'">
<mvt:item name="toolkit" param="basketattributepercent" />
</mvt:if>
147. Use ascii2html to obfuscate a string of
characters. It converts the characters in the string
into their html equivalent. A practical usage of this
is to display an email address on your store pages while
hiding the real characters from spam bots which harvest
emails from web pages. The second parameter is the
variable name you are going to save the result to. The
third parameter is the string you want to hide from the
bots. It can either be a variable or the actual string
of characters. If you use the actual string, surround it
with the ' character.
<mvt:item name="toolkit" param="ascii2html|emailstore|'sales@domain.com'" />
or
<mvt:item name="toolkit" param="ascii2html|emailstore|g.store:email" />
"mailto:&mvt:global:emailstore;"
148. Use json_encode to remove characters which would break a json data stream. This would be used for projects where your data needs to be cleaned up before it is sent back to the calling routine. In this example, the token accepts the 3rd parameter as a variable. It removes characters and saves the new text to the variable in the 2nd parameter. If you do not include the "l.all_setting:" portion of the 2nd parameter, the variable will be a global variable. In this example it is a local variable and can be used in the page template the token is in.
<mvt:item name="toolkit" param="json_encode|l.all_settings:pick:term|l.all_settings:pick:term" />
An
example
usage is documented in the power search autocomplete feature.
149. Use batchsummary to process data in the
Template Batch Report tab to create a statistical summary
of your batches. The
how to contains the template code to create a new
batch report for retrieving batch statistics. Here is an
example from this store way back at the beginning of the
millennium.
150. Use donotemail to add, remove, view customers
on your store's Do Not Email registry. The 2nd parameter
is a variable you can save the result to. The 3rd
parameter is action value add, remove, or check. The 4th
parameter is the email address to perform the action on.
Add and remove will not return a result. Check will
return a variable with 3 members; noemail, added, ip if
the email is in the database. The check can be used to
hide content on a page template from customers who do
not want to receive emails. The format for the add action
is
<mvt:item name="toolkit" param="donotemail|dne|add|g.email" />
how to shows you how to setup the NOEMAIL page template.
See donotemail_e function below for the preferred method.
151. Use donotemail_e to add, remove, view
customers on your store's Do Not Email registry. It is
like the donotemail function above except that it
obfuscates the email address to make it less likely that
a competitor could stuff potential customer emails into
your Do Not Email registry. The 2nd parameter is a
variable you can save the result to. The 3rd parameter is
action value add, remove, or check. The 4th parameter is
the email address to perform the action on. Add and
remove will not return a result. Check will return a
variable with 3 members; noemail, added, ip if the email
is in the database. The check can be used to hide content
on a page template from customers who do not want to
receive emails. The format for the add action is
<mvt:item name="toolkit" param="donotemail_e|dne|add|g.email" />
I highly recommend you use the obfuscated emails instead
of the plain text emails, hence the donotemail_e is the
preferred token for add and remove. You would still use
donotemail for most checks. The
how to shows you how to setup the NOEMAIL page template.
152. Use decrypt_email to revert an obfuscated
email back to readable plain text. The 2nd parameter is
a variable you can save the result to. The 3rd parameter
is the email address to make readable.
<mvt:item name="toolkit" param="decrypt_email|clear_email|g.email" />
&mvte:global:clear_email;
This module does everything. I am sure that it is the most widely used module of all.
Recommended
You need this module!
5 out of 5
Location:
Date: January 1, 1970
If you plan to do any automation or customization of your MIVA e-commerce platform you NEED this module. Well documented with examples and code samples. Dozens of essential procedures, this is the Swiss Army Knife of Miva Modules.
Recommended
A Miva Must Have Module..
5 out of 5
Location:
Date: January 1, 1970
We use this module to help categorize and navigate over 175,000 differnt products from over 275 differnt manufacturers. A lot of the module we used was for category display. So we didnt have a mile long category tree, we were able to have the categories show up in the main window. Also being able to use short urls has helped tremndously with our web traffic.
13 May 2006 - 5.00 15 May 2006 - 5.0010 added math functions 23 May 2006 - 5.0011 added more to the help screen 26 May 2006 - 5.002 added cim_lic functions and vlength, date/time, pad, vgettoken 28 May 2006 - 5.003 added callurl 21 Jun 2006 - 5.004 added custom product field 4 Jul 2006 - 5.005 added attr 4 Jul 2006 - 5.0051 took out a > in the content screen 4 Jul 2006 - 5.0052 show example of bulk add and attr 4 Jul 2006 - 5.006 added cxp for product display 8 Jul 2006 - 5.007 added parentcat and subcat 10 Jul 2006 - 5.008 added agroup and pgroup 11 Jul 2006 - 5.009 added agroup-p and pgroup-p 1 Sep 2006 - 5.010 added breadcrumb 3 Sep 2006 - 5.011 added vcallurl 9 Sep 2006 - 5.012 added nohtml 16 Sep 2006 - 5.013 added page item is assigned to 18 Dec 2006 - 5.014 added sexists 23 Dec 2006 - 5.015 added vproduct_find 24 Dec 2006 - 5.016 added inventory and savings to vproduct_find 26 Dec 2006 - 5.017 added pricelessadjprice savings 20 Feb 2007 - 5.018 added render 5 Mar 2007 - 5.019 added newsubstring and no_apostrophe 8 Mar 2007 - 5.020 added bestseller 14 Mar 2007 - 5.021 remove from util menu 29 Mar 2007 - 5.022 safety for component unassign 31 Mar 2007 - 5.023 added subcat2, subcat3, subcat4 25 Jun 2007 - 5.024 added last for new products 3 Jul 2007 - 5.025 added random 14 Jul 2007 - 5.026 added states 23 Jul 2007 - 5.027 added nextprevious 25 Jul 2007 - 5.028 added concat 6 Aug 2007 - 5.029 added prompt and quick 9 Aug 2007 - 5.030 added pgrpinsert 11 Aug 2007 - 5.031 added ALL to bestseller 14 Aug 2007 - 5.032 modified round function due to empresa error 14 Aug 2007 - 5.033 rolled back the round function to use empresa functionality 18 Aug 2007 - 5.034 added vacreate, sacreate 23 Aug 2007 - 5.035 fixed attribute opened and not closed, added agrpinsert 18 Sep 2007 - 5.036 added tk_item_code 9 Oct 2007 - 5.037 added related 22 Feb 2008 - 5.038 added catimage and cattreeimage 5 Mar 2008 - 5.039 assign l.all_settings:related" = "" 25 Mar 2008 - 5.040 added mktime_t 28 Mar 2008 - 5.041 added lastcat 3 Apr 2008 - 5.042 color for admin 5 Apr 2008 - 5.043 added 3rd parameter to gettoken 7 Apr 2008 - 5.044 added import and export 8 Apr 2008 - 5.045 added vrandom 16 Apr 2008 - 5.046 g.session_id in the basket function 18 Apr 2008 - 5.047 productmeta and categorymeta 29 May 2008 - 5.048 added exportxml functions 2 Jun 2008 - 5.049 added action bestsell and rename file 12 Jun 2008 - 5.051 added logbackin 19 Jun 2008 - 5.052 moved cim_lic.dbf with key 20 Jun 2008 - 5.053 added childof key with 72 hours 23 Jun 2008 - 5.054 added Module_Status('upgrade') 24 Jun 2008 - 5.055 insert as system 1 Jul 2008 - 5.056 added weight 2 Jul 2008 - 5.057 added subtotal 4 Jul 2008 - 5.058 added inbasket (not displayed in admin) 7 Jul 2008 - 5.059 added subtotalorder 7 Jul 2008 - 5.060 added reorder capability 9 Jul 2008 - 5.061 fixed adjusted price in quick function 9 Jul 2008 - 5.062 added alsobought function 12 Jul 2008 - 5.063 took out EIN function 15 Jul 2008 - 5.064 pgrpman support for PGMAdjusted_Price 15 Jul 2008 - 5.065 pgrpman more efficient 18 Jul 2008 - 5.066 fixed metatag so can be used in CTGY 18 Jul 2008 - 5.067 added tkinvc for prompt function 22 Jul 2008 - 5.068 added clearall 23 Jul 2008 - 5.069 basketoneclick 25 Jul 2008 - 5.070 fixed basketoneclick 1 Aug 2008 - 5.071 adjusted/formatted price in cxp and cxpc 2 Aug 2008 - 5.072 g.customer:id in order invoice 3 Aug 2008 - 5.073 access license action=new 3 Aug 2008 - 5.074 cim_license sql 9 Aug 2008 - 5.075 build cim_license sql if missing in upgrade 12 Aug 2008 - 5.076 added agroup-c 17 Aug 2008 - 5.077 fixed Check_IfExists test 25 Aug 2008 - 5.078 lasturl added for continue shopping 27 Aug 2008 - 5.079 fixed AvailGroupXProduct 29 Aug 2008 - 5.080 check if power search for lasturl on SRCH param 4 and keep if not length(l.url) 4 Sep 2008 - 5.081 updatebasket 7 Sep 2008 - 5.082 changed example to not discuss cust_id, updatebasket will not update cust_id, productincategory 20 Sep 2008 - 5.083 added header and footer for CTGY and PROD 9 Oct 2008 - 5.084 corrected footer example 1 Nov 2008 - 5.085 added TKLAST for static pages 3 Nov 2008 - 5.086 added mvassign and mveval 3 Nov 2008 - 5.087 added catpages 4 Nov 2008 - 5.088 added basketweight, basketsubtotal, basketsubtotalF, basketother, basketotherF to basket function 5 Nov 2008 - 5.089 check for fexists toolkitsave.dbf 6 Nov 2008 - 5.090 added customer for custom customer field 7 Nov 2008 - 5.091 added custinsert 9 Nov 2008 - 5.092 added sendpage 10 Nov 2008 - 5.093 added asort 12 Nov 2008 - 5.094 added randomcat 13 Nov 2008 - 5.095 fixed to and from without angle brackers 14 Nov 2008 - 5.096 tkclear and LOGO action 15 Nov 2008 - 5.097 added randomall 15 Nov 2008 - 5.098 added counter 19 Nov 2008 - 5.099 related products sorted 27 Nov 2008 - 5.100 added prodthumb 6 Dec 2008 - 5.101 added shipcalc 7 Dec 2008 - 5.102 added fileread 16 Dec 2008 - 5.103 added affiliate 20 Dec 2008 - 5.104 added loginlookup 24 Dec 2008 - 5.105 added hyphen 28 Dec 2008 - 5.106 added vagrpinsert 4 Jan 2009 - 5.107 extended license limit to 864000 (10 days) 15 Jan 2009 - 5.108 bestseller for ctgy more efficient 20 Feb 2009 - 5.109 blank out quicklists array 21 Feb 2009 - 5.110 added vrender 10 Mar 2009 - 5.111 check active in randomall 18 Mar 2009 - 5.112 added hyphen2 1 Apr 2009 - 5.113 custinsert Module_Customer_Set_Field 16 Apr 2009 - 5.114 updated core-17 category and product meta 27 Apr 2009 - 5.115 customcategory added 1 May 2009 - 5.116 moved customcategory to the top for whitespace 8 May 2009 - 5.117 blank out vquick quicklists array 22 May 2009 - 5.118 added bill zip and email to pastorders array 28 May 2009 - 5.119 text in help about INVC and AUTH 29 May 2009 - 5.120 blank out bestseller array 31 May 2009 - 5.121 added MvFUNCTIONRETURN VALUE="" to a couple functions, several on one line 31 May 2009 - 5.122 functions c,h,l,m,p added 14 Jun 2009 - 5.123 functions r,s added 17 Jun 2009 - 5.124 correct export to remove | as a delimiter 18 Jun 2009 - 5.125 added country, check s.time_t vs license date 5 Jul 2009 - 5.126 added current for most recent purchases 16 Jul 2009 - 5.127 added pageinfo 28 Jul 2009 - 5.128 added headeroutput 31 Jul 2009 - 5.129 changed shippingmethods to minbaskship in the instructions for shipcalc 18 Aug 2009 - 5.130 added plstpages 19 Aug 2009 - 5.131 fixed alsobought insert vs update 24 Aug 2009 - 5.132 added tksl for short links 25 Aug 2009 - 5.133 corrected l.code for tksl 25 Aug 2009 - 5.134 added systemaction 25 Aug 2009 - 5.135 added product count under utilities 27 Aug 2009 - 5.136 added g.Customer:pgrpcount + 1 to pgrpinsert function 18 Sep 2009 - 5.137 added lastupdate 24 Sep 2009 - 5.138 added custadd, custdelete, inv_level to quick and vquick 2 Oct 2009 - 5.139 trim product code in vproduct_find, delete parameter in export, check for file in import 6 Oct 2009 - 5.140 fixed plst_total and category_total 10 Oct 2009 - 5.141 added make_dirty to tkclear feature 25 Oct 2009 - 5.142 added pgrpdelete, agrpdelete, smtp, check action not AUTH for TKINVC 30 Oct 2009 - 5.143 added randomstring 5 Nov 2009 - 5.144 added pickprompt for attr/opt prompts on picklist 6 Nov 2009 - 5.145 added promptimage 10 Nov 2009 - 5.146 disabled logbackin if g.Merchant_API_Version 5.6 or newer 23 Nov 2009 - 5.147 allow also bought if AUTH anywhere in the action variable 23 Nov 2009 - 5.148 fixed the above alsobought 29 Nov 2009 - 5.149 added exit for use with store maintenance 2 Dec 2009 - 5.150 added more to the exit documentation 10 Dec 2009 - 5.151 related function now using Runtime_Product_InventoryFields_Read API, change RelProducts to Products 18 Dec 2009 - 5.152 TKCLEAR updated to work with wombat and backward compatible 29 Dec 2009 - 5.153 added basketfiller 4 Jan 2010 - 5.154 added Ship/BillStateSelect for basketfiller 7 Jan 2010 - 5.155 added custfavcount 10 Feb 2010 - 5.156 added prodinsert 17 Feb 2010 - 5.157 included update to powersearch in the prodinsert function 2 Mar 2010 - 5.158 added admin search of product custom fields 5 Mar 2010 - 5.159 CSSUI 15 Mar 2010 - 5.160 added admin search of customer custom fields 1 Apr 2010 - 5.161 changed to secure_sessionurl with favdelete 6 Apr 2010 - 5.162 waitlist, waitshow, acount, sibling, product/customer custom field search wraps if too long 6 Apr 2010 - 5.163 created toolkit data directory and created toolkitsave.dbf in it, customc, customcategoryc, render takes 3rd parameter to save page to a variable, vheaderoutput, ctgyproduct_list, plstproduct_list 12 Apr 2010 - 5.164 offset, prevoffset, nextoffset, product_count variables changed for CSSUI 26 Apr 2010 - 5.165 tksl support for OINF directs to OCST, lasturl for CTGY renaming, in examples used l.cssui_installed to show different code 30 Apr 2010 - 5.166 added l.product:link to product_read function, also instruction screen re: product_list token 6 May 2010 - 5.167 use g.Store:ui_mod:code to determine cssui 13 May 2010 - 5.168 fixed update waitlist with MySQL 13 May 2010 - 5.169 allow currencyformat be run in the picklist 1 Jul 2010 - 5.170 changed instructions for waitlist token on PROD page 31 Jul 2010 - 5.171 improved export function so could use | as delimiter 29 Sep 2010 - 5.172 sorting on custom fields added to ctgy and plst listings 8 Oct 2010 - 5.173 added sort order to the plst and ctgy screens for lasturl (continue shopping) and productsperpage to all three 12 Oct 2010 - 5.174 changed expire to 14 days 16 Oct 2010 - 5.175 added formatted cost to the product_read function 28 Oct 2010 - 5.176 check offset and ppp against mcafee inserts 31 Oct 2010 - 5.177 added simple search (not documented) 7 Nov 2010 - 5.178 changed simple search to allow string or variable, allow search1-10, sort cpf and best seller, test for custom fields mod installed in admin utilities section, lasturl for new ctgy, srch, and plst screens w/simple search 21 Nov 2010 - 5.179 added initial to the plstproduct_list function 24 Nov 2010 - 5.180 added subcat5 and subcat6 25 Nov 2010 - 5.181 added prior skipped 5.182 3 Dec 2010 - 5.183 modified tkshopmore with footstep and curprod, added footstep and curprod to lasturl and create 5 Dec 2010 - 5.184 fixed the howmany variable in visitors 6 Dec 2010 - 5.185 turn off lasturl (and footsteps, visitors) if callerid is disabled, ie no cookies 7 Dec 2010 - 5.186 lasturl if not prod, keep curprod if not ctgy, srch or plst 8 Dec 2010 - 5.187 visitors 5th parameter for no repeat 11 Dec 2010 - 5.188 added savebasket and TKRESTORE. Function f added to rid whitespace in footsteps, order added. added string capability to custinsert, e.g. 'NA', Override Customer Password under utilities, TKSQL_Search_Clause_Exact 24 Dec 2010 - 5.189 added brief, changed header to allow any CTGY or PROD CIN g.screen, added product_code to the error message of tkrestore when product exists, quicklist:quantity (in basket), key_product:quantity, setcookie, savebasketascookie, savebasketshow 2 Jan 2011 - 5.190 changed lasturl check to bot or spider in s.http_user_agent 4 Jan 2011 - 5.191 fixed lasturl for current_product when it is the first page visited 13 Jan 2011 - 5.192 added support for attribute templates for saving the basket (cf and cookie) 14 Jan 2011 - 5.193 use ABS(pv.value) for custom field views and database is MySQL for ctgyproduct_list, plstproduct_list, and simplesearch 15 Jan 2011 - 5.194 added Initial to the simplesearch function 16 Jan 2011 - 5.195 added slurp (yahoo) to the lasturl check 5 Feb 2011 - 5.196 tksl more efficient, rating and review functions, allow hard code emails in smtp function 9 Feb 2011 - 5.197 added variantinfo 10 Feb 2011 - 5.198 fixed array sorting 12 Feb 2011 - 5.199 changed smtp from template_render to TemplateManager_Render_Page 13 Feb 2011 - 5.200 in product reviews if product code not found, return to _screen so doesn't run while loop 14 Feb 2011 - 5.201 hid variantinfo and added new variantlistbasketinfo which works with both attrib and parts variants 18 Feb 2011 - 5.202 fixed tkclear when used on kit products with parts 23 Feb 2011 - 5.203 added limit to current to limit to just the current customer 25 Feb 2011 - 5.204 changed waitlist and tkrestore to use productvariantparts so it would work with PR8, use quick sort array for shipcalc 28 Feb 2011 - 5.205 zero our rating show if none 5 Mar 2011 - 5.206 added reviewsnew 6 Mar 2011 - 5.207 added alsobought_list_load 19 Mar 2011 - 5.208 added pros and cons to rrinsert, savebasket2email, discount, logout 19 Apr 2011 - 5.209 search order options in utility, randomcust, randomfbf included in 5.209 but not shown because PR8 is not released customimage, customimagec 5 May 2011 - 5.210 fixed state name in the reviewlistnew 6 Jun 2011 - 5.211 quantity 0 can now delete upsold 14 Jun 2011 - 5.212 correct example for agrpdelete 1 Jul 2011 - 5.213 catpages and plstpages supply failsafe l.page_len if store erroneously unassigned pagination 30 Jul 2011 - 5.214 customimage, customimagec made available, new function asortmulti 29 Aug 2011 - 5.215 replaced g.features:inventory:active 28 Sep 2011 - 5.216 changed the check for key and only removed if key is phony 2 Oct 2011 - 5.217 send alert email to store:email that the key has been removed 17 Nov 2011 - 5.218 blank out Runtime_Product_InventoryFields_Read if NOT inv_active, inventory for last and bestsell functions 19 Nov 2011 - 5.219 added the hide variable to hide out of stock products in several of the lists 30 Nov 2011 - 5.220 test for Module_Feature_SHP_UT and apply rules 1 Dec 2011 - 5.221 round discount to 2 decimals 20 Dec 2011 - 5.222 check page_id, return altpageid, add function altpagecode 30 Dec 2011 - 5.223 added fexists function 5 Jan 2012 - 5.224 added code for OCST page with ORDR action to run the lastupdate 16 Jan 2012 - 5.225 sort pastorders on ABS(orderdate) 18 Jan 2012 - 5.226 ABS(orderdate) cannot be used with mivasql 4 Feb 2012 - 5.227 4th param for A(ll) added to vproduct_find and sproduct_find, customimage(c) can take a blank image type and return the first in the cache array, fixed a few ABS in mivasql calls 5 Feb 2012 - 5.228 added products in orders report in utilities 8 Feb 2012 - 5.229 added ability to search one order number, bestseller_recent function added 18 Apr 2012 - 5.230 force upper email for savebasket2email and tkrestore from email 28 Apr 2012 - 5.231 added soundex which uses power search database, not documented in admin screen 1 May 2012 - 5.232 check for active for last and lastcat 3 May 2012 - 5.233 use runtime category for breadcrumbs 18 May 2012 - 5.234 implemented cleanup_store feature, allow local variables as l.all_settings:thevariable 22 May 2012 - 5.235 implemented bask_getsum and invc_getsum 24 May 2012 - 5.236 added tksavebasket to cleanup function 2 Jun 2012 - 5.237 currencyformat token improved for admin and merchant 22 Jun 2012 - 5.238 added generated images to the customimage and customimagec functions 22 Jun 2012 - 5.239 fixed currencyformat for older PR versions, new stuff not used until 8 22 Jun 2012 - 5.240 fixed the customimage and customimagec when type named - issue on some stores 3 Jul 2012 - 5.241 added log feature and dynamicattributebasket 10 Jul 2012 - 5.242 in key check included a safety feature for b9SM4DzqZEE 26 Jul 2012 - 5.243 dynamic attribute DESC so will add to last, taxadjustitem 30 Jul 2012 - 5.244 added 4th param to productincategory, discount can use string or variable to describe the discount, added surcharge function changed example for systemaction without changing the version number 3 Aug 2012 - 5.245 product_read now captures cancat_id and page_id 7 Aug 2012 - 5.246 change check to 'b9SM4DzqZEE' IN l.stringout2 10 Aug 2012 - 5.247 can now have multiple attributes with dynamicattributebasket 14 Aug 2012 - 5.248 added TKADPR feature for multiple product adds 16 Aug 2012 - 5.249 - added inventory clear out in quick and vquick, added support for inventory variants in TKADPR 17 Aug 2012 - 5.250 - included encodeentities to the quick and vquick to encode the variables in the array 19 Aug 2012 - 5.251 - attr include tkattributelist, new attrc, added product screen attribute quantities to TKADPR 25 Aug 2012 - 5.252 - added variantarray, support for product page option quantities multiples in TKADPR including variants, 5th param added to concat 18 Sep 2012 - 5.253 - removed customer override login 28 Sep 2012 - 5.254 - included l.override_basket_id and l.no_update in the savebasket2email, include price and formatted price in variantarray 14 Oct 2012 - 5.255 - added catinfo, purge duplicates when alsobought runs, create toolkitsave.dbf if missing in admin screen 9 Nov 2012 - 5.256 - added basketchargedelete 13 Nov 2012 - 5.257 - added basketattributepercent 16 Nov 2012 - 5.258 - space issue in taxadjustitem trimmed as some engines were not reading as 0, changed recommendation to OSEL page 25 Nov 2012 - 5.259 - added cc to waitlist_email, trim email and waitlist_value before inserting, skiptest 27 Nov 2012 - 5.260 - changed example for savebasket2email for the sessionurl link to basket 5 Dec 2012 - 5.261 - fixed basket total in basketchargedelete 8 Feb 2013 - 5.262 - added check to TKORDR (reorder) for fake attributes 14 Feb 2013 - 5.263 - added ascii2html 28 Feb 2013 - 5.264 - added Product_Load_Code_WithRuntimeInventory to ?product_find and json_encode 15 Mar 2013 - 5.265 - added database structure report 16 Mar 2013 - 5.266 - added fake_id for attr_id in dynamicattributebasket 28 Mar 2013 - 5.267 - batchsummary report token 30 Mar 2013 - 5.268 - corrected batchsummary time chart am vs pm 2 Apr 2013 - 5.269 - 2nd l.crlf to smtp 14 Apr 2013 - 5.270 - added DoNotEmail registry, use minus before email to remove from waitlist in popup 29 Apr 2013 - 5.271 - strip carriage returns from savebasketascookie 20 Nov 2013 - 5.272 - added from_name to the smtp function 11 Dec 2013 - 5.273 - added the following MvSMTP controls PORT = "{g.Domain:mailport}" USERNAME = "{ g.Domain:mailuser }" PASSWORD = "{ [ g.Module_Library_Crypto ].Decrypt_Payment_Password( g.Domain:mailpass ) }" FLAGS = "{ g.Domain:mailflags }" 7 Feb 2014 - 5.274 - added counter variable to the bestseller function 27 Feb 2014 - 5.275 - fixed the %DoNotEmail_E% in the waitlist_email 23 Mar 2014 - 5.276 - added fieldtype to the field insert for custom fields
23 Jan 2015 - 5.277 - Fixed tab error, updated bask_getsum to account for groups
27 August 2020 - 5.278 - Added in backwards compatability for ctgyproduct_list, header & footer functions with Miva v10
03 November 2023 -5.279 Fixed compatibility issues wtth Miva 10.08.00
10 Nov 2023 - 5.280 - Added back missing Miva 10 header/footer compatability code that was accidentally removed