From a930dfa9408c4eda04da0637282b43ff4c8e59b2 Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer <reinhold@kainhofer.com> Date: Thu, 13 Nov 2014 19:12:01 +0100 Subject: [PATCH] Add Plugins (a template and awocoupon) for custom variables --- plugins/awocoupon/Makefile | 19 ++++ plugins/awocoupon/awocoupon.php | 44 +++++++++ plugins/awocoupon/awocoupon.script.php | 92 ++++++++++++++++++ plugins/awocoupon/awocoupon.xml | 27 +++++ plugins/awocoupon/index.html | 0 ...GB.plg_vmshipmentrules_rules_awocoupon.ini | 6 ++ ...lg_vmshipmentrules_rules_awocoupon.sys.ini | 6 ++ plugins/awocoupon/language/en-GB/index.html | 1 + plugins/awocoupon/language/index.html | 1 + ...entools_vmshipmentrules_awocoupon_v1.0.zip | Bin 0 -> 15000 bytes plugins/template/Makefile | 19 ++++ plugins/template/YOUR_PLUGIN_NAME.php | 54 ++++++++++ plugins/template/YOUR_PLUGIN_NAME.script.php | 88 +++++++++++++++++ plugins/template/YOUR_PLUGIN_NAME.xml | 27 +++++ plugins/template/create_rules_plugin.sh | 35 +++++++ plugins/template/index.html | 0 ...B.plg_vmshipmentrules_YOUR_PLUGIN_NAME.ini | 6 ++ ...g_vmshipmentrules_YOUR_PLUGIN_NAME.sys.ini | 6 ++ plugins/template/language/en-GB/index.html | 1 + plugins/template/language/index.html | 1 + 20 files changed, 433 insertions(+) create mode 100644 plugins/awocoupon/Makefile create mode 100644 plugins/awocoupon/awocoupon.php create mode 100644 plugins/awocoupon/awocoupon.script.php create mode 100644 plugins/awocoupon/awocoupon.xml create mode 100644 plugins/awocoupon/index.html create mode 100755 plugins/awocoupon/language/en-GB/en-GB.plg_vmshipmentrules_rules_awocoupon.ini create mode 100755 plugins/awocoupon/language/en-GB/en-GB.plg_vmshipmentrules_rules_awocoupon.sys.ini create mode 100644 plugins/awocoupon/language/en-GB/index.html create mode 100644 plugins/awocoupon/language/index.html create mode 100644 plugins/awocoupon/plg_opentools_vmshipmentrules_awocoupon_v1.0.zip create mode 100644 plugins/template/Makefile create mode 100644 plugins/template/YOUR_PLUGIN_NAME.php create mode 100644 plugins/template/YOUR_PLUGIN_NAME.script.php create mode 100644 plugins/template/YOUR_PLUGIN_NAME.xml create mode 100755 plugins/template/create_rules_plugin.sh create mode 100644 plugins/template/index.html create mode 100755 plugins/template/language/en-GB/en-GB.plg_vmshipmentrules_YOUR_PLUGIN_NAME.ini create mode 100755 plugins/template/language/en-GB/en-GB.plg_vmshipmentrules_YOUR_PLUGIN_NAME.sys.ini create mode 100644 plugins/template/language/en-GB/index.html create mode 100644 plugins/template/language/index.html diff --git a/plugins/awocoupon/Makefile b/plugins/awocoupon/Makefile new file mode 100644 index 0000000..cfa0045 --- /dev/null +++ b/plugins/awocoupon/Makefile @@ -0,0 +1,19 @@ +BASE=awocoupon +PLUGINTYPE=vmshipmentrules +ZIPBASE=opentools_$(PLUGINTYPE) +VERSION=1.0 + +PLUGINFILES=$(BASE).php $(BASE).script.php $(BASE).xml index.html + +TRANSLATIONS=$(call wildcard,language/en*/*.plg_$(PLUGINTYPE)_$(BASE).*ini) +INDEXFILES=language/index.html $(call wildcard,language/**/index.html) +ZIPFILE=plg_$(ZIPBASE)_$(BASE)_v$(VERSION).zip + +all: zip + +zip: $(PLUGINFILES) $(TRANSLATIONS) $(ADVANCEDFILES) $(INDEXFILES) + @echo "Packing all files into distribution file $(ZIPFILE):" + @zip -r $(ZIPFILE) $(PLUGINFILES) $(TRANSLATIONS) $(INDEXFILES) + +clean: + rm -f $(ZIPFILE) diff --git a/plugins/awocoupon/awocoupon.php b/plugins/awocoupon/awocoupon.php new file mode 100644 index 0000000..886b25e --- /dev/null +++ b/plugins/awocoupon/awocoupon.php @@ -0,0 +1,44 @@ +<?php + +defined ('_JEXEC') or die('Restricted access'); + +/** + * AwoCoupon variables for VM Shipping by Rules + * + * @subpackage Plugins - VmShipmentRules + * @copyright Copyright (C) 2014 Reinhold Kainhofer, office@open-tools.net + * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php + * VirtueMart is free software. This version may have been modified pursuant + * to the GNU General Public License, and as distributed it includes or + * is derivative of works licensed under the GNU General Public License or + * other free or open source software licenses. + * See administrator/components/com_virtuemart/COPYRIGHT.php for copyright notices and details. + * + * http://open-tools.net/ + * + */ +if (!class_exists ('VmPlugin')) { + require(JPATH_VM_PLUGINS . DS . 'vmplugin.php'); +} + +/** Extension plugin for the "Shipping by Rules" shipping plugin for VirtueMart + */ +class plgVmShipmentRulesRules_AwoCoupon extends VmPlugin { + /** Trigger to add variables to the cart values + * You can add new variables to the $cartvals array or modify existing ones. They will be directly + * available in all rules. + * Please notice that this function might also be called for only a subset of products of the cart. + */ + function onVmShippingRulesGetCartValues(&$cartvals, $cart, $products, $method, $cart_prices) { + $coupon_discount = 0; + $session = JFactory::getSession(); + $coupon_row = $session->get('coupon', '', 'awocoupon'); + if(!empty($coupon_row)) { + $coupon_row = unserialize($coupon_row); + $coupon_discount = $coupon_row['product_discount'] + $coupon_row['shipping_discount']; + } + $cartvals['awodiscount'] = $coupon_discount; + } +} + +// No closing tag diff --git a/plugins/awocoupon/awocoupon.script.php b/plugins/awocoupon/awocoupon.script.php new file mode 100644 index 0000000..24c01a9 --- /dev/null +++ b/plugins/awocoupon/awocoupon.script.php @@ -0,0 +1,92 @@ +<?php +defined('_JEXEC') or die('Restricted access'); + +// TODO: Adjust your plugin name: +$pluginname='awocoupon'; +$plugintype='vmshipmentrules'; + +/** + * Installation script for the plugin + * + * @copyright Copyright (C) 2014 Reinhold Kainhofer, office@open-tools.net + * @license GPL v3+, http://www.gnu.org/copyleft/gpl.html + */ + +// TODO: Adjust the class name. It has to be of the form: +// plgVmShipmentYOUR_PLUGIN_NAMEInstallerScript +class plgVmShipmentRulesAwoCouponInstallerScript +{ + /** + * Constructor + * + * @param JAdapterInstance $adapter The object responsible for running this script + */ +// public function __constructor(JAdapterInstance $adapter); + + /** + * Called before any type of action + * + * @param string $route Which action is happening (install|uninstall|discover_install) + * @param JAdapterInstance $adapter The object responsible for running this script + * + * @return boolean True on success + */ +// public function preflight($route, JAdapterInstance $adapter); + + /** + * Called after any type of action + * + * @param string $route Which action is happening (install|uninstall|discover_install) + * @param JAdapterInstance $adapter The object responsible for running this script + * + * @return boolean True on success + */ +// public function postflight($route, JAdapterInstance $adapter); + + /** + * Called on installation + * + * @param JAdapterInstance $adapter The object responsible for running this script + * + * @return boolean True on success + */ + public function install(JAdapterInstance $adapter) + { + // enabling plugin upon installation + $db =& JFactory::getDBO(); + $db->setQuery('update #__extensions set enabled = 1 where type = "plugin" and element = "'.$pluginname.'" and folder = "'.$plugintype.'"'); + $db->query(); + + return True; + } + + /** + * Called on update + * + * @param JAdapterInstance $adapter The object responsible for running this script + * + * @return boolean True on success + */ +// public function update(JAdapterInstance $adapter) +// { +// jimport( 'joomla.filesystem.file' ); +// $file = JPATH_ROOT . DS . "administrator" . DS . "language" . DS . "en-GB" . DS . "en-GB.plg_".$plugintype."_".$pluginname.".sys.ini"; +// if (JFile::exists($file)) JFile::delete($file); +// $file = JPATH_ROOT . DS . "administrator" . DS . "language" . DS . "de-DE" . DS . "de-DE.plg_".$plugintype."_".$pluginname.".sys.ini"; +// if (JFile::exists($file)) JFile::delete($file); +// return true; +// } + + /** + * Called on uninstallation + * + * @param JAdapterInstance $adapter The object responsible for running this script + */ +// public function uninstall(JAdapterInstance $adapter) +// { +// // Remove plugin table +// $db =& JFactory::getDBO(); +// $db->setQuery('DROP TABLE IF EXISTS `#__virtuemart_'.$plugintype.'_plg_'.$pluginname.'`;'); +// $db->query(); +// } +} diff --git a/plugins/awocoupon/awocoupon.xml b/plugins/awocoupon/awocoupon.xml new file mode 100644 index 0000000..a7491db --- /dev/null +++ b/plugins/awocoupon/awocoupon.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<extension version="1.5" type="plugin" group="vmshipmentrules" method="upgrade"> + <name>VMSHIPMENTRULES_AWOCOUPON</name> + <creationDate>2014-11-10</creationDate> + <author>Reinhold Kainhofer, Open Tools</author> + <authorUrl>http://www.open-tools.net</authorUrl> + <copyright>Copyright (C) 2014, Reinhold Kainhofer</copyright> + <license>GPL v3+</license> + <version>1.0</version> + <description>VMSHIPMENTRULES_AWOCOUPON_DESC</description> + <files> + <filename plugin="awocoupon">awocoupon.php</filename> + <folder>language</folder> + </files> + <languages folder="language"> + <language tag="en-GB">en-GB/en-GB.plg_vmshipmentrules_awocoupon.ini</language> + <language tag="en-GB">en-GB/en-GB.plg_vmshipmentrules_awocoupon.sys.ini</language> + </languages> + <scriptfile>awocoupon.script.php</scriptfile> + + <!-- VM 3.x support (fields rather than params): --> + <vmconfig></vmconfig> + + <!-- VM 2.0 support (params rather than fields): --> + <params></params> + +</extension> diff --git a/plugins/awocoupon/index.html b/plugins/awocoupon/index.html new file mode 100644 index 0000000..e69de29 diff --git a/plugins/awocoupon/language/en-GB/en-GB.plg_vmshipmentrules_rules_awocoupon.ini b/plugins/awocoupon/language/en-GB/en-GB.plg_vmshipmentrules_rules_awocoupon.ini new file mode 100755 index 0000000..36da25d --- /dev/null +++ b/plugins/awocoupon/language/en-GB/en-GB.plg_vmshipmentrules_rules_awocoupon.ini @@ -0,0 +1,6 @@ +; VM Rule-based Shipping plugin: Access to AwoCoupon variables +; Copyright (C) 2014 Reinhold Kainhofer, Open Tools. All rights reserved. +; License http://www.gnu.org/licenses/gpl.html GNU/GPL +; Note : All ini files need to be saved as UTF-8 - No BOM +VMSHIPMENTRULES_AWOCOUPON="AwoCoupon variables for VM Shipping by Rules" +VMSHIPMENTRULES_AWOCOUPON_DESC="This plugin provides access to the AwoCoupon discounts in the Shipping by Rules plugin for VirtueMart." diff --git a/plugins/awocoupon/language/en-GB/en-GB.plg_vmshipmentrules_rules_awocoupon.sys.ini b/plugins/awocoupon/language/en-GB/en-GB.plg_vmshipmentrules_rules_awocoupon.sys.ini new file mode 100755 index 0000000..36da25d --- /dev/null +++ b/plugins/awocoupon/language/en-GB/en-GB.plg_vmshipmentrules_rules_awocoupon.sys.ini @@ -0,0 +1,6 @@ +; VM Rule-based Shipping plugin: Access to AwoCoupon variables +; Copyright (C) 2014 Reinhold Kainhofer, Open Tools. All rights reserved. +; License http://www.gnu.org/licenses/gpl.html GNU/GPL +; Note : All ini files need to be saved as UTF-8 - No BOM +VMSHIPMENTRULES_AWOCOUPON="AwoCoupon variables for VM Shipping by Rules" +VMSHIPMENTRULES_AWOCOUPON_DESC="This plugin provides access to the AwoCoupon discounts in the Shipping by Rules plugin for VirtueMart." diff --git a/plugins/awocoupon/language/en-GB/index.html b/plugins/awocoupon/language/en-GB/index.html new file mode 100644 index 0000000..2efb97f --- /dev/null +++ b/plugins/awocoupon/language/en-GB/index.html @@ -0,0 +1 @@ +<!DOCTYPE html><title></title> diff --git a/plugins/awocoupon/language/index.html b/plugins/awocoupon/language/index.html new file mode 100644 index 0000000..2efb97f --- /dev/null +++ b/plugins/awocoupon/language/index.html @@ -0,0 +1 @@ +<!DOCTYPE html><title></title> diff --git a/plugins/awocoupon/plg_opentools_vmshipmentrules_awocoupon_v1.0.zip b/plugins/awocoupon/plg_opentools_vmshipmentrules_awocoupon_v1.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..ed5ed0583478b367f58854f562f6d28bb46be6f3 GIT binary patch literal 15000 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 BR4o7i literal 0 HcmV?d00001 diff --git a/plugins/template/Makefile b/plugins/template/Makefile new file mode 100644 index 0000000..07f453f --- /dev/null +++ b/plugins/template/Makefile @@ -0,0 +1,19 @@ +BASE=YOUR_PLUGIN_NAME +PLUGINTYPE=vmshipmentrules +ZIPBASE=opentools_vmshipmentrules +VERSION=1.0 + +PLUGINFILES=$(BASE).php $(BASE).script.php $(BASE).xml index.html + +TRANSLATIONS=$(call wildcard,language/en*/*.plg_$(PLUGINTYPE)_$(BASE).*ini) +INDEXFILES=language/index.html $(call wildcard,language/**/index.html) +ZIPFILE=plg_$(ZIPBASE)_$(BASE)_v$(VERSION).zip + +all: zip + +zip: $(PLUGINFILES) $(TRANSLATIONS) $(ADVANCEDFILES) $(INDEXFILES) + @echo "Packing all files into distribution file $(ZIPFILE):" + @zip -r $(ZIPFILE) $(PLUGINFILES) $(TRANSLATIONS) $(INDEXFILES) + +clean: + rm -f $(ZIPFILE) diff --git a/plugins/template/YOUR_PLUGIN_NAME.php b/plugins/template/YOUR_PLUGIN_NAME.php new file mode 100644 index 0000000..404f88c --- /dev/null +++ b/plugins/template/YOUR_PLUGIN_NAME.php @@ -0,0 +1,54 @@ +<?php + +defined ('_JEXEC') or die('Restricted access'); + +/** + * Plugin providing Custom variables for VM Shipping by Rules + * + * @subpackage Plugins - VmShipmentRules + * @copyright Copyright (C) 2014 Reinhold Kainhofer, office@open-tools.net + * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php + * VirtueMart is free software. This version may have been modified pursuant + * to the GNU General Public License, and as distributed it includes or + * is derivative of works licensed under the GNU General Public License or + * other free or open source software licenses. + * See administrator/components/com_virtuemart/COPYRIGHT.php for copyright notices and details. + * + * http://open-tools.net/ + * + */ +if (!class_exists ('VmPlugin')) { + require(JPATH_VM_PLUGINS . DS . 'vmplugin.php'); +} + +/** Extension plugin for the "Shipping by Rules" shipping plugin for VirtueMart + */ +class plgVmShipmentRulesYOUR_PLUGIN_NAME extends VmPlugin { + /** Trigger to add variables to the cart values + * You can add new variables to the $cartvals array or modify existing ones. They will be directly + * available in all rules. + * Please notice that this function might also be called for only a subset of products of the cart. + */ + function onVmShippingRulesGetCartValues(&$cartvals, $cart, $products, $method, $cart_prices) { + $cartvals['template_example'] = 123456789; + + } + /** Trigger to register custom functions for the Shipping by Rules plugin + * The onVmShippingRulesRegisterCustomFunctions() trigger is expected to return an array of the form: + * array ('functionname1' => 'function_to_be_called', + * 'functionname2' => array($classobject, 'memberfunc')), + * ...); + * The functions referenced here are called with exactly one array argument, that holds + * all function arguments, i.e. the function signature should be + * function function_to_be_called($args) {....} + */ + function onVmShippingRulesRegisterCustomFunctions() { + return array('customTestFunction' => array($this, 'custom_test_function')); + } + + function custom_test_function($args) { + return 'Test return value...'; + } +} + +// No closing tag diff --git a/plugins/template/YOUR_PLUGIN_NAME.script.php b/plugins/template/YOUR_PLUGIN_NAME.script.php new file mode 100644 index 0000000..890789d --- /dev/null +++ b/plugins/template/YOUR_PLUGIN_NAME.script.php @@ -0,0 +1,88 @@ +<?php +defined('_JEXEC') or die('Restricted access'); + +/** + * Installation script for the plugin + * + * @copyright Copyright (C) 2014 Reinhold Kainhofer, office@open-tools.net + * @license GPL v3+, http://www.gnu.org/copyleft/gpl.html + */ + +// Adjust the class name. It has to be of the form: +// plgVmShipmentYOUR_PLUGIN_NAMEInstallerScript +class plgVmShipmentRulesYOUR_PLUGIN_NAMEInstallerScript +{ + /** + * Constructor + * + * @param JAdapterInstance $adapter The object responsible for running this script + */ +// public function __constructor(JAdapterInstance $adapter); + + /** + * Called before any type of action + * + * @param string $route Which action is happening (install|uninstall|discover_install) + * @param JAdapterInstance $adapter The object responsible for running this script + * + * @return boolean True on success + */ +// public function preflight($route, JAdapterInstance $adapter); + + /** + * Called after any type of action + * + * @param string $route Which action is happening (install|uninstall|discover_install) + * @param JAdapterInstance $adapter The object responsible for running this script + * + * @return boolean True on success + */ +// public function postflight($route, JAdapterInstance $adapter); + + /** + * Called on installation + * + * @param JAdapterInstance $adapter The object responsible for running this script + * + * @return boolean True on success + */ + public function install(JAdapterInstance $adapter) + { + // enabling plugin upon installation + $db =& JFactory::getDBO(); + $db->setQuery('update #__extensions set enabled = 1 where type = "plugin" and element = "YOUR_PLUGIN_NAME" and folder = "vmshipmentrules"'); + $db->query(); + + return True; + } + + /** + * Called on update + * + * @param JAdapterInstance $adapter The object responsible for running this script + * + * @return boolean True on success + */ +// public function update(JAdapterInstance $adapter) +// { +// jimport( 'joomla.filesystem.file' ); +// $file = JPATH_ROOT . DS . "administrator" . DS . "language" . DS . "en-GB" . DS . "en-GB.plg_vmshipmentrules_YOUR_PLUGIN_NAME.sys.ini"; +// if (JFile::exists($file)) JFile::delete($file); +// $file = JPATH_ROOT . DS . "administrator" . DS . "language" . DS . "de-DE" . DS . "de-DE.plg_vmshipmentrules_YOUR_PLUGIN_NAME.sys.ini"; +// if (JFile::exists($file)) JFile::delete($file); +// return true; +// } + + /** + * Called on uninstallation + * + * @param JAdapterInstance $adapter The object responsible for running this script + */ +// public function uninstall(JAdapterInstance $adapter) +// { +// // Remove plugin table +// $db =& JFactory::getDBO(); +// $db->setQuery('DROP TABLE IF EXISTS `#__virtuemart_vmshipmentrulesles_YOUR_PLUGIN_NAME`;'); +// $db->query(); +// } +} diff --git a/plugins/template/YOUR_PLUGIN_NAME.xml b/plugins/template/YOUR_PLUGIN_NAME.xml new file mode 100644 index 0000000..0ffdfa5 --- /dev/null +++ b/plugins/template/YOUR_PLUGIN_NAME.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<extension version="1.5" type="plugin" group="vmshipmentrules" method="upgrade"> + <name>VMSHIPMENTRULES_TEMPLATE</name> + <creationDate>2014-11-10</creationDate> + <author>Reinhold Kainhofer, Open Tools</author> + <authorUrl>http://www.open-tools.net</authorUrl> + <copyright>Copyright (C) 2014, Reinhold Kainhofer</copyright> + <license>GPL v3+</license> + <version>1.0</version> + <description>VMSHIPMENTRULES_TEMPLATE_DESC</description> + <files> + <filename plugin="YOUR_PLUGIN_NAME">YOUR_PLUGIN_NAME.php</filename> + <folder>language</folder> + </files> + <languages folder="language"> + <language tag="en-GB">en-GB/en-GB.plg_vmshipmentrules_YOUR_PLUGIN_NAME.ini</language> + <language tag="en-GB">en-GB/en-GB.plg_vmshipmentrules_YOUR_PLUGIN_NAME.sys.ini</language> + </languages> + <scriptfile>YOUR_PLUGIN_NAME.script.php</scriptfile> + + <!-- VM 3.x support (fields rather than params): --> + <vmconfig></vmconfig> + + <!-- VM 2.0 support (params rather than fields): --> + <params></params> + +</extension> diff --git a/plugins/template/create_rules_plugin.sh b/plugins/template/create_rules_plugin.sh new file mode 100755 index 0000000..415698b --- /dev/null +++ b/plugins/template/create_rules_plugin.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +SRCDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +ARGC=$# +if [ $ARGC -lt 1 ]; then + echo "Usage: $0 YourPluginName" + echo "Create a proper plugin for the Shipping by Rules plugin from the provided template" + exit -1; +fi + +name=$1 +pluginname=${name,,} +pLUGINNAME=${name,} +Pluginname=${name^} +PLUGINNAME=${name^^} + +echo "Plugin name=$name, pluginname=$pluginname, pLUGINNAME=$pLUGINNAME, Pluginname=$Pluginname, PLUGINNAME=$PLUGINNAME" + + +mkdir -p $pluginname/language/en-GB/ + +sed "s/YOUR_PLUGIN_NAME/$Pluginname/g" $SRCDIR/YOUR_PLUGIN_NAME.php > $pluginname/$pluginname.php +sed "s/YOUR_PLUGIN_NAMEInstaller/${Pluginname}Installer/g; s/YOUR_PLUGIN_NAME/$pluginname/g" $SRCDIR/YOUR_PLUGIN_NAME.script.php > $pluginname/$pluginname.script.php +sed "s/YOUR_PLUGIN_NAME/$pluginname/g; s/VMSHIPMENTRULES_TEMPLATE/VMSHIPMENTRULES_$PLUGINNAME/g" $SRCDIR/YOUR_PLUGIN_NAME.xml > $pluginname/$pluginname.xml +sed "s/YOUR_PLUGIN_NAME/$pluginname/g" $SRCDIR/Makefile > $pluginname/Makefile +for i in $SRCDIR/language/en-GB/*.ini; do + sed "s/YOUR_PLUGIN_NAME/$pluginname/g; s/VMSHIPMENTRULES_TEMPLATE/VMSHIPMENTRULES_$PLUGINNAME/g" $i > $pluginname/${i#$SRCDIR} +done +rename "s/YOUR_PLUGIN_NAME/$pluginname/g" $pluginname/language/en-GB/* +for i in `find $SRCDIR/ -name index.html`; do + cp $i $pluginname/${i#$SRCDIR} +done + +echo "Created new plugin '$pluginname' for the Shipping for Rules plugin. Please adjust the plugin's onVmShippingRulesGetCartValues, all copyright statements and the translations" \ No newline at end of file diff --git a/plugins/template/index.html b/plugins/template/index.html new file mode 100644 index 0000000..e69de29 diff --git a/plugins/template/language/en-GB/en-GB.plg_vmshipmentrules_YOUR_PLUGIN_NAME.ini b/plugins/template/language/en-GB/en-GB.plg_vmshipmentrules_YOUR_PLUGIN_NAME.ini new file mode 100755 index 0000000..7edbd31 --- /dev/null +++ b/plugins/template/language/en-GB/en-GB.plg_vmshipmentrules_YOUR_PLUGIN_NAME.ini @@ -0,0 +1,6 @@ +; VM Rule-based Shipping plugin: Template for extension plugins +; Copyright (C) 2014 Reinhold Kainhofer, Open Tools. All rights reserved. +; License http://www.gnu.org/licenses/gpl.html GNU/GPL +; Note : All ini files need to be saved as UTF-8 - No BOM +VMSHIPMENTRULES_TEMPLATE="VM Shipping by Rules Extension Template" +VMSHIPMENTRULES_TEMPLATE_DESC="This plugin is just a demo template that highlights how one can extend the Shipping by Rules plugin with a plugin of type vmshipmentrules. If installed, it does not do anything useful or harmful." diff --git a/plugins/template/language/en-GB/en-GB.plg_vmshipmentrules_YOUR_PLUGIN_NAME.sys.ini b/plugins/template/language/en-GB/en-GB.plg_vmshipmentrules_YOUR_PLUGIN_NAME.sys.ini new file mode 100755 index 0000000..7edbd31 --- /dev/null +++ b/plugins/template/language/en-GB/en-GB.plg_vmshipmentrules_YOUR_PLUGIN_NAME.sys.ini @@ -0,0 +1,6 @@ +; VM Rule-based Shipping plugin: Template for extension plugins +; Copyright (C) 2014 Reinhold Kainhofer, Open Tools. All rights reserved. +; License http://www.gnu.org/licenses/gpl.html GNU/GPL +; Note : All ini files need to be saved as UTF-8 - No BOM +VMSHIPMENTRULES_TEMPLATE="VM Shipping by Rules Extension Template" +VMSHIPMENTRULES_TEMPLATE_DESC="This plugin is just a demo template that highlights how one can extend the Shipping by Rules plugin with a plugin of type vmshipmentrules. If installed, it does not do anything useful or harmful." diff --git a/plugins/template/language/en-GB/index.html b/plugins/template/language/en-GB/index.html new file mode 100644 index 0000000..2efb97f --- /dev/null +++ b/plugins/template/language/en-GB/index.html @@ -0,0 +1 @@ +<!DOCTYPE html><title></title> diff --git a/plugins/template/language/index.html b/plugins/template/language/index.html new file mode 100644 index 0000000..2efb97f --- /dev/null +++ b/plugins/template/language/index.html @@ -0,0 +1 @@ +<!DOCTYPE html><title></title> -- GitLab