NB: The calculation field is only available if the Extra-price add-on is also installed and active.
Available functions
The calculation is run using the MEXP library. You can see the list of available functions here: https://github.com/bugwheels94/math-expression-evaluator
There are several other available functions, specific to the configurator:
Comparison functions:
equals(val1, val2)
returns 1 if val1 is equal to val2, 0 if it is not.
not_equal(val1, val2)
returns 1 if val1 is not equal to val2, 0 if they are equal.
greater_than(val1, val2)
returns 1 if val1 is greater than val2, 0 if it is not.
smaller_than(val1, val2)
returns 1 if val1 is smaller than val2, 0 if it is not.
greatest(val1, val2)
returns the greatest value of the two.
Rounding:
round_up(val)
returns the value rounded up
round_down(val)
returns the value rounded down
round_to_nearest(val)
returns the value rounded to the nearest integer. E.g. round_to_nearest(1.2)
will return 1, round_to_nearest(1.5)
will return 2
Others:
value_is_in_range(from, to, val1)
returns 1 if val1 is >= from
and <= to
, 0 otherwise (added in v1.1.16)
count_unique_values(val1, val2, ...)
returns the number of unique values passed in the function (this does not use a token but a custom JS function).
Adding your own functions:
If you require other special functions, you can add them using the filter mkl_pc/math-expression-evaluator/tokens
and following the Mexp token documentation.
E.g.
add_filter( 'mkl_pc/math-expression-evaluator/tokens', function( $tokens ) { $tokens .= ' mexp.addToken([ { type: 8, token: "equals", show: "equals", value: function (a, b) { if(a===b) return 1; return 0; }, } ]); '; return $tokens; } );
Example 2: Calculating the surface using the 2 highest values out of 4:
add_filter( 'mkl_pc/math-expression-evaluator/tokens', function( $tokens ) { $tokens .= ' mexp.addToken([ { type: 8, token: "calcsurface", show: "calcsurface", numberOfArguments: 4, value: function (a, b, c, d) { // Add values to an array var t = [ a, b, c, d ]; // Sort the array and get the last 2 values (the highest) var highest = t.sort(function(aa, bb) { return aa - bb; }).slice(-2); // calculate the surface using those values return highest[0]*highest[1]; }, } ]); '; return $tokens; } );
Usage:
length_a to length_d are 4 fields in the same form. We are using the 2 highest values to calculate a surface. Then we multiply by the price per unit (20).
Note: this requires the Extra price add-on v1.1.14+ which has an updated version of the Mexp library.