4.1. accessories
A Swiss-army-knife widget builder, this provides access to Interchange's product option attributes (e.g., to choose or access product options such as a shirt's size or color).
Can build selection objects (radio, check, select boxes, etc), forms or hyperlinks, or can simply return a value.
Or more -- see also Looping tags and Sub-tags.
4.1.1. Summary
[accessories code arg] [accessories code=os28044 arg="size, radio, ... " other_named_attributes] deprecated [accessories code=os28044 attribute=size type=radio ... other_named_attributes]
Parameters | Description | Default |
code | Value of the master key in the product (or specified other) table | none |
arg |
Positionally interpreted comma-delimited list of values for the following attributes:
|
none |
Attributes | Default |
attribute | none |
type
|
select |
column | attribute |
table | products |
name | mv_order_attribute |
outboard | none |
passed | none |
key (alias for code) | none |
row (alias for code) | none |
base (alias for table) | products |
database (alias for table) | products |
db (alias for table) | products |
col (alias for column | attribute |
field (alias for column | attribute |
delimiter | comma (',') |
prepend | none |
append | none |
extra | none |
js | none |
rows | varies with type; often 4 |
cols | varies with type; often 40 |
width | none |
default | none |
price | none |
price_data | none |
contains (type=radio or check) | none |
joiner (type=links) | none |
href (type=links) | none |
template (type=links) | none |
form (type=links) | mv_action=return |
empty (type=links) | none |
secure (type=links) | none |
new | none |
interpolate (reparse) | No |
Other_Characteristics | |
Invalidates cache | No |
Container tag | No |
Has Subtags | No |
Tag expansion example:
[accessories os28044 size] --- <SELECT NAME="mv_order_size"><OPTION VALUE="10oz">10oz\ <OPTION VALUE="15oz">15oz<OPTION VALUE="20oz">20oz</SELECT>
ASP-like Perl call:
$Tag->accessories( { code => '[[EXAMPLE_SKU]]', arg => 'color, radio' table => 'special_products', } );
or similarly with positional parameters,
$Tag->accessories($code, $arg, $attribute_hash_reference);
4.1.1.1. See Also
4.1.2. Description
This is the swiss-army-knife widget builder for providing access to Interchange's product option attributes (e.g., to choose or access product options such as a shirt's size or color).
Interchange allows you to choose item attribute values for each ordered item -- you can attach a size, color, or other modifier to a line item in the shopping cart. You can also resubmit previous attribute values via hidden fields on a form.
The catalog.cfg file directive UseModifier is used to set the name of the modifier or modifiers. For example
UseModifier size color
will attach both a size and color attribute to each item code that is ordered.
Important Note -- You may not use the following names for attributes:
item group quantity code mv_ib mv_mi mv_si
You can also set modifier names with the mv_UseModifier scratch variable -- [set mv_UseModifier] size color [/set] has the same effect as above. This allows multiple options to be set for products. Whichever one is in effect at order time will be used. Be careful; you cannot set it more than once on the same page. Setting the mv_separate_items or global directive SeparateItems places each ordered item on a separate line, simplifying attribute handling. The scratch setting for mv_separate_items has the same effect.
The modifier value is accessed in the [item-list] loop with the [item-param attribute] tag, and form input fields are placed with the [modifier-name attribute] tag. This is similar to the way that quantity is handled.
Note: You must be sure that no fields in your forms have digits appended to their names if the variable is the same name as the attribute name you select, as the [PREFIX-modifier-name size] variables will be placed in the user session as the form variables size0, size1, size2, etc.
Interchange will automatically generate the select boxes when the [accessories code="os28044" attribute="size"] or [item-accessories size] tags are called. They have the syntax:
[item-accessories attribute, type, column, table, name, outboard, passed] [accessories code=sku attribute=modifier type=select column=db_table_column_name table=db_table name=varname outboard=key passed="value=label, value2*, value3=label 3"] [accessories js=| onChange="set_description(simple_options, variant)"; | type=select name="[item-param o_group]" passed="=--choose--,[item-param o_value]"]
Notes:
- The 'attribute' attribute is required.
- See the type attribute for a list of types.
- The trailing '*' in value2 will mark it as the default ('SELECTED') value in the select widget (see below).
When called with an attribute, the database is consulted and looks for a comma-separated list of item attribute options. They take the form:
name_a=Label Text1, default_name=Default Label Text*, name_b, etc.
The label text is optional -- if none is given, the name will be used (as in 'name_b' above).
If an asterisk is the last character of the label text, the item is the default selection. If no default is specified, the first will be the default. An example:
[item-accessories color]
This will search the product database for a field named "color". If an entry "beige=Almond, gold=Harvest Gold, White*, green=Avocado" is found, a select box like this will be built:
<SELECT NAME="mv_order_color"> <OPTION VALUE="beige">Almond <OPTION VALUE="gold">Harvest Gold <OPTION SELECTED>White <OPTION VALUE="green">Avocado </SELECT>
In combination with the mv_order_item and mv_order_quantity session variables, you can use this to allow a customer to enter an item attribute during an order.
If used in an item list, and the user has changed the value, the generated select box will automatically retain the current value the user has selected.
The value can then be displayed with [item-modifier color] on the order report, order receipt, or any other page containing an [item-list].
4.1.2.1. Emulating with a loop
You can also build widgets directly, without using the accessories tag. You may have to do so if you need more control of the content than the tag offers. Below is a fragment from a shopping basket display form which shows a selectable size with "sticky" setting and a price that changes based upon the modifier setting. (Note that this example would normally be contained within the [item-list][/item-list] pair.)
<SELECT NAME="[loop-modifier-name size]"> [loop option="[loop-modifier-name size]" list="S, M, L, XL"] <OPTION> [loop-code] -- [price code="[item-code]" size="[loop-code]"] [/loop] </SELECT>
The output of the above would be similar to the output of [item-accessories size, select] if the product database field size contained the value S, M, L, XL. The difference is that the options in the loop emulation show the adjusted price in addition to the size within each option value.
4.1.2.2. Hash Lists -- Technical Note
As a technical note, some of the features of this tag work differently depending upon whether it was called with an '$item' hash reference, for example, as [item-accessories] within an [item-list].
In this context, the tag will have access to ancillary data from the item (including, perhaps, a user's chosen item attribute value). For example, if building a TEXTAREA widget within an [item-list], the widget will show the chosen item attribute value. On the other hand, within an array list such as a [search-list] in a [search-region], the widget would be empty.
If you really know what you're doing, you can pass it the item hash reference within a [perl] tag like this:
$Tag->accessories( $code, undef, # 'arg' parameter value $named_attribute_hashref, $item_hashref );
See also Looping tags and Sub-tags for information about hash-context and array-context in looping tags.
4.1.2.3. code
This is the master key of the specified table (commonly sku in a product table). If no table is specified, the tag uses the products table by default.
You should not specify a code when looping on [item_accessories] because it internally sets 'code' to the key for the current item in the loop.
4.1.2.4. arg
Deprecated after Interchange 4.6
This allows you to pass values for some of the more commonly used attributes in the manner of the [item-accessories] tag, as a comma-delimited positional list:
arg="attribute, type, column, table, name, outboard, passed"
Whitespace within the list is optional.
If you leave out one or more of the above attributes, be sure to keep the comma(s) if you are setting anything after it in the list:
arg="attribute, type, , table"
The above examples show the attribute names for clarity; you would actually use the values. Hence, the previous example might actually be something like the following:
arg="color, radio, , products"
Although you must use such a comma-delimited list to pass attributes to the [item-accessories] tag, please use named attributes instead for the [accessories] tag. The 'arg' attribute is deprecated.
For detail about a specific attribute, please see its subheading below.
4.1.2.5. attribute
Despite the name, this has nothing to do with tag attributes. You can set attributes for items in a database table (typically the products table) with the UseModifier configuration directive. Typical are size or color.
This selects the item attribute the tag will work with.
4.1.2.6. type
This determines the action to be taken. One of:
Action | Description |
select | Builds a dropdown <SELECT> menu for the item attribute, with the default item attribute value SELECTED. The accessories tag builds a select widget by default if type is not set. |
display | Shows the label text for *only the selected option* if called in Hash List context (e.g., within an [item-list]). Ignored otherwise (i.e., the tag will build the default <SELECT> menu). |
show |
Returns the list of possible attributes for the item (without labels or any HTML widget). For example, if sku os28044 is available in several sizes:
----------------------------------------- Sm=10oz, Med=15oz*, Lg=20oz |
options |
This shows the attribute options as a newline delimited list:
----------------------------------------- Sm Med Lg |
labels |
This shows the attribute option labels:
----------------------------------------- 10oz 15oz* 20oz |
radio | Builds a radio box group for the item, with spaces separating the elements. |
radio nbsp | Builds a radio box group for the item, with separating the elements. |
radio break | Builds a radio box group for the item, with '<br>' separating the radio button/label pairs from one another. |
radio left n |
Builds a radio box group for the item, inside a table, with the checkbox on the left side. If "n" is present and is a digit from 2 to 9, it will align the options in that many columns.
You can also set FONT SIZE like this: type="radio left n fontsizem" where -9 <= m <= 9 |
radio right n |
Builds a radio box group for the item, inside a table, with the checkbox on the right side. If "n" is present and is a digit from 2 to 9, it will align the options in that many columns.
You can also set FONT SIZE like this: type="radio right n fontsizem" where -9 <= m <= 9 |
check | Builds a checkbox group for the item, with spaces separating the elements. |
check nbsp | Builds a checkbox group for the item, with ' ' separating the checkbox/label pairs from one another. |
check break | Builds a checkbox group for the item, with '<br>' separating the checkbox/label pairs from one another. |
check left n |
Builds a checkbox group for the item, inside a table, with the checkbox on the left side. If "n" is present and is a digit from 2 to 9, it will align the options in that many columns.
You can also set FONT SIZE like this: type="check left n fontsizem" where -9 <= m <= 9 |
check right n |
Builds a checkbox group for the item, inside a table, with the checkbox on the right side. If "n" is present and is a digit from 2 to 9, it will align the options in that many columns.
You can also set FONT SIZE like this: type="check right n fontsizem" where -9 <= m <= 9 |
textarea_XX_YY |
A textarea with XX columns and YY rows. The textarea will contain the selected item attribute value if used in Hash List context (e.g., within an [item-list]).
If you simply use 'type=textarea', the size will default to 4 rows by 40 columns, unless you have set the rows or cols tag attributes. |
text_YY |
A text box with YY width in characters. The HTML tag's VALUE will be set to the selected item attribute value if used in Hash List context (e.g., within an [item-list]).
If you simply use 'type=text', the width will default to 60, unless you have set the cols tag attribute. |
combo | Special type, used with nullselect filter, for selecting from a list or inputting a new value |
reverse_combo | Special type, used with last_non_null filter, for selecting from a list or inputting a new value -- differs from combo in order of presentation |
move_combo | Special type, used with null_to_space or null_to_comma filter, for selecting multiple non-ordered values from a list or inputting into a textarea |
links | Produces a series of links based on the option values. The base form value is passed via the form parameter, just like in an [area ...] or [page ...] tag, and the value is named with the passed NAME attribute. |
value | Returns the selected value if called in Hash List context (e.g., within an [item-list]), or nothing otherwise. |
hidden | Creates a hidden form field. The hidden field's VALUE will be set to the selected item attribute value if used in Hash List context (e.g., within an [item-list]). |
password_YY |
A password box with YY width in characters. The HTML tag's VALUE will be set to the selected item attribute value if used in Hash List context (e.g., within an [item-list]).
If you simply use 'type=password', the width will default to 12, unless you have set the cols tag attribute. |
The default is 'select', which builds an HTML select form entry for the attribute.
Some types build widgets that use the ROWS=m, COLS=n, or certain other HTML attributes. For these, you can define widget rows and columns within the string that sets the type; for example, type="textarea_6_33_wrap=virtual" specifies a TEXTAREA widget with ROWS=6, COLS=33, and WRAP=virtual. You should resort to this only when you cannot use the named parameters, for example within an [item-accessories] tag. Otherwise, use the rows=m and cols=n tag attributes instead.
The result of setting conflicting values in the type string and the rows or cols attributes is undefined.
The following list shows syntax for type strings, where rows is the number of rows and cols is the number of columns.
- text
- textarea (default is 4 rows, 40 columns, like 'textarea_4_40')
- textarea_rows_cols
- text_cols
- textarea rows=rows cols=cols wrap=WRAP value
- password
- password (default is 12 columns, like 'password_12')
- password_cols
- combo (similarly for reverse_combo and move_combo)
- combo (default is 1 row, 16 columns, like 'combo_1_16')
In any of the option building types, you can append the string ranges and a special option processing will be done -- any option matching the pattern [A-Za-z0-0]..[A-Za-z0-0] will be expanded into a comma separated range between the bounds. The same behavior is accomplished by passing the accessories tag option ranges. For example:
[accessories name=foo type=select ranges=1 "A..C,1..5,10,20"] and [accessories name=foo type="select ranges" passed="A..C,1..5,10,20"] will both output: <select NAME="foo"> <option VALUE="A">A <option VALUE="B">B <option VALUE="C">C <option VALUE="1">1 <option VALUE="2">2 <option VALUE="3">3 <option VALUE="4">4 <option VALUE="5">5 <option VALUE="10">10 <option VALUE="15">15 <option VALUE="20">20 </select>
The above applies to any of the option building types -- check, combo, combo_move, labels, multiple, options, radio, reverse_combo, and select. It will refuse to produce more than 5000 options -- that limit can be changed with Limit option_list N in catalog.cfg, where N is an integer greater than 0.
4.1.2.7. column
The column of the table corresponding to the attribute will traditionally have the same name as the attribute, though it need not.
This specifies the table column that contains an item's attribute values. The tag will find item attribute names and values in a comma-delimited list of name=value pairs stored in this field of an item's table entry. If unspecified, the column name will default to the name given for the 'attribute' attribute.
For example, if an item in the products table has a 'size' attribute, and each item's comma-delimited list of available sizes is stored in the 'how_big' column, then you would need to specify "column=how_big" because the tag's default column choice (size) would be missing or used for some other purpose.
4.1.2.8. table
This is the database table containing the item's attribute values. It defaults to the first products file where the item code is found.
If you have configured your database so that the attributes are kept in a different table from other item data, 'code' should be set to the master key in this table. See 'outboard') if you are using [item-accessories] and cannot specify code=key.
4.1.2.9. name
This sets the name of the form variable to use if appropriate for the widget being built. Defaults to 'mv_order_attribute' -- i.e. if the attribute is size, the form variable will be named mv_order_size.
If the variable is set in the user session, the widget will "remember" its previous setting. In other words, [value name] will contain the previous setting, which the widget will use as its default setting. See also the default attribute.
4.1.2.10. outboard
If calling the item-accessories tag, and you wish to select from an outboard database table whose master key is different from the item code, you can pass the key the tag should use to find the accessory data.
4.1.2.11. passed
You can use this to pass your own values to the widget the tag will build. If you have set passed to a list of widget options, then the tag will simply build a widget of the specified type with your values instead of fetching an attribute value list from the database.
For example, to generate a select box with a blank option (perhaps forcing a select), the value of blue with a label of Blue, and the value of green with a label of Sea Green, do:
[accessories type=select name=color passed="=--select--*, blue=Blue, green=Sea Green"]
This will generate:
<SELECT NAME="color"><OPTION VALUE="" SELECTED>--select--\ <OPTION VALUE="blue">Blue\ <OPTION VALUE="green">Sea Green</SELECT>
Note: trailing backslashes ('\') in the above example indicate line continuation and are not part of the tag output.
4.1.2.12. delimiter
The list of attribute values will be a delimited string. This allows you to specify an alternative delimiter if the list is not comma-delimited (the default).
4.1.2.13. prepend
You can set a string to prepend to the returned output of the tag. Note that this is not a list to prepend to the fetched attribute value list, which is treated within the tag.
For example,
[accessories code=os28044 type=select attribute=size append="Append Me<br>" prepend="Prepend Me"] --- Prepend Me<SELECT NAME="mv_order_size">\ <OPTION VALUE="10oz">10oz\ <OPTION VALUE="15oz">15oz\ <OPTION VALUE="20oz">20oz</SELECT>Append Me<br>
4.1.2.14. append
You can set a string to append to the returned output of the tag. Note that this is not a list to append to the fetched attribute value list, which is treated within the tag.
4.1.2.15. extra
Setting the 'extra' attribute appends its value as the last attribute of the HTML output tag. The following example illustrates the append, extra and js options:
[accessories code=os28044 type=select attribute=size append="Append Me<br>" extra="Last=Extra" js="javascript_here"] --- <SELECT NAME="mv_order_size" javascript_here Last=Extra>\ <OPTION VALUE="10oz">10oz\ <OPTION VALUE="15oz">15oz\ <OPTION VALUE="20oz">20oz</SELECT>Append Me<br>
4.1.2.16. js
This allows you to place javascript within the start tag of the HTML output. See the example given above for extra.
js has no default, except when 'type=move_combo', where the default is:
onChange="addItem(this.form.Xname,this.form.name)"
4.1.2.17. rows
The tag will pass the number you choose through to the HTML 'ROWS=n' attribute in HTML widgets that accept it.
For some types, you can also define widget rows and columns within the string that sets the type; for example, type="textarea_6_33_wrap=virtual" specifies a TEXTAREA widget with ROWS=6, COLS=33, and WRAP=virtual. You should resort to this only when you cannot use the named parameters, for example within an [item-accessories] tag.
The result of setting conflicting values in the type string and the rows=n attribute is undefined.
4.1.2.18. cols
The tag will pass the number you choose through to the HTML 'COLS=n' attribute in HTML widgets that accept it.
See also 'rows' above.
4.1.2.19. width
This is a quasi-alias for 'cols' that only works with the 'text' and '<password>' types. Use 'cols' instead.
4.1.2.20. default
Sets the default attribute option in the widget returned by the tag. This will override a default indicated with a trailing '*' in the database or 'passed' string. This will also override the default of a user's previous selection when the tag would otherwise have preserved it.
For example the following selects blue by default rather than green as it would otherwise have done,
[accessories type=select name=color passed="blue=blue, green=Sea Green*" default="blue"] --- <SELECT NAME="color"><OPTION VALUE="blue" SELECTED>blue\ <OPTION VALUE="green">Sea Green</SELECT> ---
Obscure technical note: the tag ignores the 'default' attribute if it has an item hash reference -- see Hash Lists above.
4.1.2.21. price
When combined with the price_data tag attribute, this allows you to force prices for item attributes. You probably do not want to use this; just let the tag pick up prices from your database table(s) when appropriate.
If you are passing attribute values, you can use this to control the displayed price in the widget.
[accessories type=check name=color price=1 price_data="blue=20, green=50" passed="blue=Blue, green=Sea Green*"] --- <INPUT TYPE="checkbox" NAME="color" VALUE="blue" > Blue ($20.00) <INPUT TYPE="checkbox" NAME="color" VALUE="green" CHECKED> Sea Green ($50.00)
4.1.2.22. price_data
4.1.2.23. contains
Requires 'type=radio' or 'type=check'.
Used to determine whether a substring match of the value will cause a radio box or check box to be selected. If true, the match will happen whether the value is on a word boundary or not -- if false, the value must be on a word boundary. (When we speak of a word boundary, it is in the Perl sense -- a word character [A-Za-z0-9_] followed or preceded by a non-word character, or beginning or end of the string.)
4.1.2.24. joiner
Requires 'type=links'.
With type=links, the accessories tag returns a link for each option. This allows you to override the default string ('<BR>') that joins these links. You can use Perl's metacharacter escapes, such as '\n' for newline or '\t' for tab.
4.1.2.25. href
Requires 'type=links'.
This sets the base HREF for the link in a links type. Default is the current page.
4.1.2.26. template
Requires 'type=links'.
Allows you to override the standard Interchange template for a hyperlink. You probably don't need to use this -- grep the code to grok it if you do (see 'sub build_accessory_links').
4.1.2.27. form
Requires 'type=links'.
This sets the base value for the form in a links type. Default is mv_action=return, which will simply set the variable value in the link.
For example, to generate a series of links -- one per item attribute value passed -- that set the variable "color" to the corresponding passed value (blank, blue, or green), do this:
[accessories type=links name=color passed="=--select--, blue=Blue, green=Sea Green"]
This will generate something like the following:
<A HREF="VENDURL/MV_PAGE?mv_action=return&color=blue">Blue</A><BR> <A HREF="VENDURL/MV_PAGE?mv_action=return&color=green">Sea Green</A>
where VENDURL is your Interchange URL for the catalog MV_PAGE is the current page.
If you want the empty "--select--" option to show up, pass an empty=1 parameter.
4.1.2.28. empty
Requires 'type=links'.
Setting 'empty=1' includes a hyperlink for the empty "--select--" option. See the example in form above; if empty=1 had been specified, three links would have been generated.
4.1.2.29. secure
Requires 'type=links'.
Setting secure=1 causes the generated link(s) to point to your secure Interchange URL.
4.1.2.30. new
Requires 'type=combo' or 'reverse_combo'.
You can use this to set a value in place of the 'New' or 'Current' option in a combo box. For example, if item 'os28044' has size attribute values of "Sm=10oz, Med=15oz, Lg=20oz":
[accessories code=os28044 attribute=size type=combo new="my_new_value"] --- <INPUT TYPE=text NAME="mv_order_size" SIZE=16 VALUE=""> <SELECT NAME="mv_order_size" SIZE="1"> <OPTION VALUE="my_new_value">my_new_value <OPTION VALUE="Sm">10oz <OPTION VALUE="Med">15oz <OPTION VALUE="Lg">20oz</SELECT>
Or, with the default new value:
[accessories code=os28044 attribute=size type=combo] --- <INPUT TYPE=text NAME="mv_order_size" SIZE=16 VALUE=""> <SELECT NAME="mv_order_size" SIZE="1"> <OPTION VALUE=""><-- New <OPTION VALUE="Sm">10oz <OPTION VALUE="Med">15oz <OPTION VALUE="Lg">20oz</SELECT>
Default is no VALUE with option text set to '<-- New' for a combo box or 'Current -->' for a reverse_combo box.