From 4ac036c653c41a7c3232d35ceebaae6e36da65e8 Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer <reinhold@kainhofer.com> Date: Sat, 29 Nov 2014 03:10:38 +0100 Subject: [PATCH] V1.90: Add a field to display all current counter values from the database; No editing yet, though --- Makefile | 6 +- fields/vmordernumbercounters.php | 83 ++++++++++++++++++ .../en-GB/en-GB.plg_vmshopper_ordernumber.ini | 4 + .../en-GB.plg_vmshopper_ordernumber.sys.ini | 4 + ordernumber.php | 13 +++ ordernumber.xml | 10 ++- releases/plg_vmshopper_ordernumber_v1.90.zip | Bin 0 -> 15235 bytes 7 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 fields/vmordernumbercounters.php create mode 100644 releases/plg_vmshopper_ordernumber_v1.90.zip diff --git a/Makefile b/Makefile index 5f5f06d..2bc6e55 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,13 @@ BASE=ordernumber PLUGINTYPE=vmshopper -VERSION=1.14 +VERSION=1.90 PLUGINFILES=$(BASE).php $(BASE).script.php $(BASE).xml index.html SYSTRANSLATIONS=$(call wildcard,language/*/*.plg_$(PLUGINTYPE)_$(BASE).*sys.ini) NONSYSTRANSLATIONS=${SYSTRANSLATIONS:%.sys.ini=%.ini} TRANSLATIONS=$(SYSTRANSLATIONS) $(NONSYSTRANSLATIONS) $(call wildcard,language/*/index.html) language/index.html +FIELDS=$(call wildcard,fields/*.php) ZIPFILE=plg_$(PLUGINTYPE)_$(BASE)_v$(VERSION).zip all: zip @@ -16,8 +17,7 @@ $(NONSYSTRANSLATIONS): %.ini: %.sys.ini zip: $(PLUGINFILES) $(TRANSLATIONS) $(SYSTRANSLATIONS) $(NONSYSTRANSLATIONS) @echo "Packing all files into distribution file $(ZIPFILE):" - @zip -r $(ZIPFILE) $(PLUGINFILES) - @zip -r $(ZIPFILE) $(TRANSLATIONS) + @zip -r $(ZIPFILE) $(PLUGINFILES) $(TRANSLATIONS) $(FIELDS) clean: rm -f $(ZIPFILE) diff --git a/fields/vmordernumbercounters.php b/fields/vmordernumbercounters.php new file mode 100644 index 0000000..bf1a24d --- /dev/null +++ b/fields/vmordernumbercounters.php @@ -0,0 +1,83 @@ +<?php +defined('_JEXEC') or die(); +/** + * + * @package VirtueMart + * @subpackage Plugins - Fields + * @author Reinhold Kainhofer, Open Tools + * @link http://www.open-tools.net + * @copyright Copyright (c) 2014 Reinhold Kainhofer. All rights reserved. + * @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. + */ + +defined('DS') or define('DS', DIRECTORY_SEPARATOR); + +class JFormFieldVmOrdernumberCounters extends JFormField { + var $_name = 'vmOrdernumberCounters'; + + protected $countertype; + + public function __get($name) + { + switch ($name) + { + case 'countertype': + return $this->$name; + } + + return parent::__get($name); + } + + public function __set($name, $value) + { + switch ($name) + { + case 'countertype': + $this->$name = (string) $value; + break; + + default: + parent::__set($name, $value); + } + } + + public function setup(SimpleXMLElement $element, $value, $group = null) + { + $return = parent::setup($element, $value, $group); + + if ($return) { + $this->countertype = (string) $this->element['countertype']; + } + + return $return; + } + + protected function getInput() { + // Look up the current counters + $db = JFactory::getDBO(); + $db->setQuery('SELECT `number_format`, `count` FROM `#__virtuemart_shopper_plg_ordernumber` WHERE `number_type`='.(string)$this->countertype . ' ORDER BY `number_format`;' ); + $counters = $db->loadObjectList(); +// JFactory::getApplication()->enqueueMessage("<pre>All counters: ".print_r($counters, 1)."</pre>", 'error'); + // Joomla 2.x uses <li> for the params and float:left on the controls, so we need to add that too + $version = new JVersion(); + $float = ""; + if (version_compare(JVERSION, '3.0', 'lt')) { + $float = "float: left; "; + } + + $ret = "<table border=\"1\" style=\"border: 1px solid dark-gray; border-collapse: collapse; display: inline-table; $float\"><tr><th>".JText::_('PLG_ORDERNUMBER_COUNTERLIST_HEADER_COUNTER')."</th><th>".JText::_('PLG_ORDERNUMBER_COUNTERLIST_HEADER_VALUE'). "</th></tr>"; + $ret .= "<colgroup><col ><col style=\"text-align: center\" ></colgroup>"; + foreach ($counters as $c) { + if ($c->number_format=="") { + $c->number_format = JText::_ ('PLG_ORDERNUMBER_COUNTERLIST_GLOBAL'); + } + $ret .= "<tr><td>" . (string)$c->number_format . "</td><td>" . (string)$c->count . "</td></tr>"; + } + $ret .= "</table>"; + return $ret; + } +} \ No newline at end of file diff --git a/language/en-GB/en-GB.plg_vmshopper_ordernumber.ini b/language/en-GB/en-GB.plg_vmshopper_ordernumber.ini index 1d9313e..fc4bdf7 100644 --- a/language/en-GB/en-GB.plg_vmshopper_ordernumber.ini +++ b/language/en-GB/en-GB.plg_vmshopper_ordernumber.ini @@ -45,3 +45,7 @@ PLG_ORDERNUMBER_CUSTOMERNR_COUNTER_DESC="Choose whether you want one global coun PLG_ORDERNUMBER_CUSTOMERNR_PADDING="Minimum digits for the counter" PLG_ORDERNUMBER_CUSTOMERNR_PADDING_DESC="Select the minimum number of digits that the counter shall display. The value of the counter will be left-padded with 0 to have this minimum number of digits. If the counter is already larger than this number, no padding will occur" +PLG_ORDERNUMBER_ORDERNR_ALLCOUNTERS="All counter values" +PLG_ORDERNUMBER_COUNTERLIST_GLOBAL="<i>Global counter</i>" +PLG_ORDERNUMBER_COUNTERLIST_HEADER_COUNTER="Counter format/name" +PLG_ORDERNUMBER_COUNTERLIST_HEADER_VALUE="Counter value" \ No newline at end of file diff --git a/language/en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini b/language/en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini index 1d9313e..fc4bdf7 100644 --- a/language/en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini +++ b/language/en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini @@ -45,3 +45,7 @@ PLG_ORDERNUMBER_CUSTOMERNR_COUNTER_DESC="Choose whether you want one global coun PLG_ORDERNUMBER_CUSTOMERNR_PADDING="Minimum digits for the counter" PLG_ORDERNUMBER_CUSTOMERNR_PADDING_DESC="Select the minimum number of digits that the counter shall display. The value of the counter will be left-padded with 0 to have this minimum number of digits. If the counter is already larger than this number, no padding will occur" +PLG_ORDERNUMBER_ORDERNR_ALLCOUNTERS="All counter values" +PLG_ORDERNUMBER_COUNTERLIST_GLOBAL="<i>Global counter</i>" +PLG_ORDERNUMBER_COUNTERLIST_HEADER_COUNTER="Counter format/name" +PLG_ORDERNUMBER_COUNTERLIST_HEADER_VALUE="Counter value" \ No newline at end of file diff --git a/ordernumber.php b/ordernumber.php index cba1aa2..61b04eb 100644 --- a/ordernumber.php +++ b/ordernumber.php @@ -223,6 +223,19 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { return $data; } } + + + /** + * plgVmOnSelfCallBE ... Called to execute some plugin action in the backend (e.g. set/reset dl counter, show statistics etc.) + */ +/* function plgVmOnSelfCallBE($type, $name, &$output) { + if ($name != $this->_name || $type != 'vmshopper') return false; + vmDebug('plgVmOnSelfCallBE'); + + $db = JFactory::getDBO(); + $nullDate = $db->getNullDate(); + }*/ + /* In versions before VM 2.6.8, the onStoreInstallPluginTable function was protected, so the installer couldn't call it to create the plugin table... This function simply is a public wrapper to make this function available to the installer on all VM versions: */ diff --git a/ordernumber.xml b/ordernumber.xml index 98c860b..e702bd7 100644 --- a/ordernumber.xml +++ b/ordernumber.xml @@ -7,7 +7,7 @@ <authorUrl>http://www.open-tools.net/</authorUrl> <copyright>Copyright (C) 2012-2014 Reinhold Kainhofer. All rights reserved.</copyright> <license>http://www.gnu.org/licenses/gpl-3.0.html GNU/GPLv3</license> - <version>1.14</version> + <version>1.90</version> <releaseDate>2014-10-05</releaseDate> <releaseType>Minor update</releaseType> <downloadUrl>http://www.open-tools.net/virtuemart-2-extensions/vm2-ordernumber-plugin.html</downloadUrl> @@ -18,7 +18,8 @@ <filename plugin="ordernumber">ordernumber.php</filename> <filename>ordernumber.script.php</filename> <filename>index.html</filename> - <folder>language</folder> + <folder>language</folder> + <folder>fields</folder> </files> <scriptfile>ordernumber.script.php</scriptfile> <languages folder="language"> @@ -29,7 +30,7 @@ </languages> <!-- Joomla 2.5 & 3.0 config --> <config> - <fields name="params"> + <fields name="params" addfieldpath="/plugins/vmshopper/ordernumber/fields"> <fieldset name="basic"> <field name="order_options" type="spacer" label="PLG_ORDERNUMBER_ORDERNR" /> <field name="customize_order_number" type="radio" default="0" class="btn-group btn-group-yesno" label="PLG_ORDERNUMBER_ORDERNR_CUSTOMIZE" description="PLG_ORDERNUMBER_ORDERNR_CUSTOMIZE_DESC"> @@ -42,6 +43,7 @@ <option value="1">PLG_ORDERNUMBER_COUNTER_GLOBAL</option> <option value="0">PLG_ORDERNUMBER_COUNTER_PERFORMAT</option> </field> + <field name="order_number_allcounters" type="VmOrdernumberCounters" label="PLG_ORDERNUMBER_ORDERNR_ALLCOUNTERS" countertype="0" /> <field name="password_options" type="spacer" label="PLG_ORDERNUMBER_PASSWD" /> @@ -62,6 +64,7 @@ <option value="1">PLG_ORDERNUMBER_COUNTER_GLOBAL</option> <option value="0">PLG_ORDERNUMBER_COUNTER_PERFORMAT</option> </field> + <field name="invoice_number_allcounters" type="VmOrdernumberCounters" label="PLG_ORDERNUMBER_ORDERNR_ALLCOUNTERS" countertype="1" /> <field name="customer_options" type="spacer" label="PLG_ORDERNUMBER_CUSTOMERNR" /> <field name="customize_customer_number" type="radio" default="0" class="btn-group btn-group-yesno" label="PLG_ORDERNUMBER_CUSTOMERNR_CUSTOMIZE" description="PLG_ORDERNUMBER_CUSTOMERNR_CUSTOMIZE_DESC"> @@ -74,6 +77,7 @@ <option value="1">PLG_ORDERNUMBER_COUNTER_GLOBAL</option> <option value="0">PLG_ORDERNUMBER_COUNTER_PERFORMAT</option> </field> + <field name="customer_number_allcounters" type="VmOrdernumberCounters" label="PLG_ORDERNUMBER_ORDERNR_ALLCOUNTERS" countertype="2" /> </fieldset> </fields> </config> diff --git a/releases/plg_vmshopper_ordernumber_v1.90.zip b/releases/plg_vmshopper_ordernumber_v1.90.zip new file mode 100644 index 0000000000000000000000000000000000000000..2c59c7fe06bd0c46d7d1a431d03632a702e5aca7 GIT binary patch literal 15235 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 b2FB2IfHx}}s8Hfz;9=O!!oaY}48#KfhX+eS literal 0 HcmV?d00001 -- GitLab