VirtueMart Discounts for the Shipping by Rules Plugins for VirtueMart
All these plugins are "normal" Joomla plugins of plugin type "vmshipmentrules" and need to be installed via the Joomla extension manager. Upon installation they should be automatically published by the installer and their functionality should be available in the Shipping by Rules plugins (both the basic and the advanced plugin) immediately.
Please note that the plugin feature was added only in version 5.0 of the Shipping by Rules plugins, so you need to have at least that version installed.
RegExp Plugin
This plugin provides the following RegExp-related functions to the shipping by rules plugin:
- RegExpMatch(pattern, value)
- returns whether the value matches the expression (true/false)
- RegExpMatches(pattern, value)
- returns an array of all matches of regexp within the value (array)
- RegExpReplace(pattern, value)
- preforms a regexp replacement on the value, returns the resulting string (string)
- RegExpSplit(pattern, value)
- splits value using the regexp as delimiter, returns array of all substrings (excluding the delimiter) (array)
- RegExpFilter(pattern, array)
- returns all members of the array that match the regexp (array)
VM Coupon Prices Plugin
This plugin extends the shipping by rules plugin with two variables (couponValue and AmountAfterCoupon / salesPriceAfterCoupon) that take into account coupon discounts by the stock VirtueMart coupon system. For technical resons, these variables are not part of the Shipping by Rules plugin by default to prevent possible interferences.
By default, VirtueMart evaluates shipping costs first and coupons afterwards, so when shipping is calculated, the coupon discount is not yet calculated in general. To work around this issue, this small plugin adds to trickery to manually calculate the coupon during shipping cost evaluation. As this might interfere with VM (we have not yet run into issues, but who knows...), this functionality is not included by default, but only with this small extension plugin.
The plugin makes some more variables available:
- AmountAfterCoupon / SalesPriceAfterCoupon
- The total amount of the order after coupon discounts have been applied
- CouponValue
- The total coupon discount
AwoCoupon Plugin
This plugin provides access to the coupon granted by AwoCoupon. For technical reasons that coupon is not part of the Amount variable in the rules. The reason is that VirtuMart handles coupon plugins like AwoCoupon after shipping plugins, so when the shipping rules are evaluated, the coupon plugins have not been evaluated. This plugin uses the internals of the AwoCoupon component to extract the coupon discount directly and makes it available as the awodiscount variable.
The plugin also makes some more variables available:
- AwoDiscount
- The total amount of the coupon discount (product discount and shipping discount) including taxes
- AwoProductDiscount
- The total AwoCoupon product discount including taxes
- AwoProductDiscountNoTax
- The total AwoCoupon product discount excluding taxes
- AwoShippingDiscount
- The total AwoCoupon shipping discount including taxes
- AwoShippingDiscountNoTax
- The total AwoCoupon shipping discount excluding taxes
- AmountAfterCoupon
AmountWithTaxAfterCoupon - The order subtotal (product prices total) including taxes after AwoCoupon discounts are applied
- TaxAmountAfterCoupon
- The order tax amount after AwoCoupon discounts are applied
- AmountWithoutTaxAfterCoupon
- The order subtotal (product prices total) excluding taxes after AwoCoupon discounts are applied
CAVEAT: Due to the way VirtueMart processes third-party coupons, when a coupon is added or changed, the first page load does NOT have the AwoCoupon values available, because VirtueMart handles shipping methods before Coupons are evaluated. So, immediately after adding a coupon, the coupon will not be available. Only after another page reload will these values be available.
Template for vmshipmentrules Plugins
This is a template for developers who want to write their own plugins to extend the Shipping by Rules plugins. It can be installed, but does not provide any useful functionality, unless a programmer implements the corresponding functions.
Sometimes, shipping costs have to depend on properties (e.g. custom field values, awocoupon discounts, etc.) that are not by default provided by this plugin. Starting with version 5.0, the Shipping by Rules plugins can be extended with plugins of type "vmshipmentrules". Such extensions can add new variables, modify existing variables and add new functions (advanced version only).
The template available for download has the complete file and code structure, which you can use as a starting point for such a plugin. You will need to adjust the file names, the .xml file and the class names.
There are two triggers in the plugin class that can be reimplemented to provide/modify variables and add new functions:
function onVmShippingRulesGetCartValues(&$cartvals, $cart, $products, $method, $cart_prices)
This trigger is called right before the rules are first evaluated (and during evaluation when a scoping function like evaluate_for_categories is used).
Function arguments | |
$cartvals | Associative array of all defined cart variables available in the rules. This array can be modified by adding new variables or changing existing entries. The variable name is used as the key, its value is the array value of the entry in the associative array. |
$cart | The VirtueMartCart object of the whole order. This includes all products in the order, information about the shopper, the address, the shipment and payment methods (although payment plugins have not neccessarily been processed). |
$products | The list of products for which the cart variables are supposed to be calculated. Always use this list of products rather than $cart->products, because this trigger can also be called for a subset of the cart (e.g. to calculate values for all articles in only one category when evaluate_for_categories is evaluated) |
$method | The configuration of the shipment method. |
$cart_prices | The cart prices of the whole cart. If this trigger is called for only a subset of the cart, this argument is null. |
Return value: | None / Ignored |
Example:
function onVmShippingRulesGetCartValues(&$cartvals, $cart, $products, $method, $cart_prices) { $cartvals['coupon'] = $cart->couponCode; }
function onVmShippingRulesRegisterCustomFunctions()
This trigger is called when the Shipping by Rules plugin is initialized. It is used to register custom function callbacks.
This trigger is called right before the rules are first evaluated (and during evaluation when a scoping function like evaluate_for_categories is used).
Function arguments | |
- | none |
Return value: | |
Associative array containing function definitions. The array keys are the function names to be used in the rules, the corresponding array values are the callback functions (either a string to call a top-level function, or array('classname', 'methodname') to call a static class member function, or array($classinstance, 'methodname') to call a class member function of an existing object, e.g. $this). The callback functions should have a signature "function callbackName($args, $rule) {...}" and will be called when the rule is evaluated. The function arguments given in the rule are passed as an array to the callback function. Its second argument is the rule that is currently evaluated. In most cases there should be no need to access the $rule, except to print out $rule->rulestring in error messages to tell the user which rule caused the error. |
Example:
function onVmShippingRulesRegisterCustomFunctions(&$cartvals, $cart, $products, $method, $cart_prices) { return array ( // Entries are of the form "FunctionNameForRules" => "PHP function to be called" 'customTestFunction' => 'toplevelFunction', // A top-level function 'customTestFunctionMember' => array($this, 'custom_member_func') // Calls the custom_member_func of this plugin ); }
At top-level:
function toplevelFunction($args, $rule) { // $args is an array of all function arguments! JFactory::getApplication()->enqueueMessage(JText::sprintf("Evaluating function customTestFunction in rule '%s'", htmlentities($rule->rulestring)), 'warning'); return count($args); }
Demo Server
Support Forum
License
These plugins are licenced unter the GNU GPLv3.