From f835021d4b5f8b51c74e97323351622f1bb40d12 Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer <reinhold@kainhofer.com> Date: Sat, 6 Sep 2014 00:42:12 +0200 Subject: [PATCH] V1.10: Fix issues with J3.0; install plugin table on install/update --- Makefile | 2 +- ordernumber.php | 19 ++++++++++++------- ordernumber.script.php | 18 ++++++++++++++++-- ordernumber.xml | 16 ++++++++-------- releases/plg_vmshopper_ordernumber_v1.10.zip | Bin 0 -> 12638 bytes 5 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 releases/plg_vmshopper_ordernumber_v1.10.zip diff --git a/Makefile b/Makefile index 3673229..118d3ef 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ BASE=ordernumber PLUGINTYPE=vmshopper -VERSION=1.9 +VERSION=1.10 PLUGINFILES=$(BASE).php $(BASE).script.php $(BASE).xml index.html diff --git a/ordernumber.php b/ordernumber.php index 7ad7753..621e195 100644 --- a/ordernumber.php +++ b/ordernumber.php @@ -15,7 +15,6 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { parent::__construct($subject, $config); /* Create the database table */ $this->tableFields = array_keys ($this->getTableSQLFields ()); - $this->onStoreInstallPluginTable($this->_psType); } public function getVmPluginCreateTableSQL () { @@ -140,19 +139,19 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { // Look up the current counter $db = JFactory::getDBO(); - /* prevent sql injection attacks by escaping the user-entered format! */ - $nr_escaped = $db->getEscaped ($nr); + /* prevent sql injection attacks by escaping the user-entered format! Empty for global counter... */ /* For global counting, simply read the empty number_format entries! */ - $q = 'SELECT `count` FROM `'.$this->_tablename.'` WHERE `number_type`='.(int)$nrtype.' AND `number_format`="'.($global?"":$nr_escaped).'"'; + $nr_escaped = $global?"":$db->getEscaped ($nr); + $q = 'SELECT `count` FROM `'.$this->_tablename.'` WHERE `number_type`='.(int)$nrtype.' AND `number_format`="'.$nr_escaped.'"'; $db->setQuery($q); $existing = $db->loadResult(); $count = $existing?($existing+1):1; // Insert new counter value into the db if ($existing) { - $q = 'UPDATE `'.$this->_tablename.'` SET `count`= "'.$count.'" WHERE `number_type`='.(int)$nrtype.' AND `number_format`="'.($global?"":$nr_escaped).'"'; + $q = 'UPDATE `'.$this->_tablename.'` SET `count`= "'.$count.'" WHERE `number_type`='.(int)$nrtype.' AND `number_format`="'.$nr_escaped.'"'; } else { - $q = 'INSERT INTO `'.$this->_tablename.'` (`count`, `number_type`, `number_format`) VALUES ('.(int)$count.','.(int)$nrtype.', "'.($global?"":$nr_escaped).'")'; + $q = 'INSERT INTO `'.$this->_tablename.'` (`count`, `number_type`, `number_format`) VALUES ('.(int)$count.','.(int)$nrtype.', "'.$nr_escaped.'")'; } $db->setQuery( $q ); $db->query(); @@ -188,7 +187,7 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { $orderstatusForInvoice = VmConfig::get('inv_os',array()); if(!is_array($orderstatusForInvoice)) $orderstatusForInvoice = array($orderstatusForInvoice); //for backward compatibility 2.0.8e $pdfInvoice = (int)VmConfig::get('pdf_invoice', 0); // backwards compatible - $force_create_invoice=JRequest::getInt('create_invoice', 0); + $force_create_invoice=JInput::getInt('create_invoice', 0); if ( in_array($orderDetails['order_status'],$orderstatusForInvoice) or $pdfInvoice==1 or $force_create_invoice==1 ){ $nrtype = 1; /*invoice-nr*/ $fmt = $this->params->get ('invoice_number_format', "#"); @@ -215,5 +214,11 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { return $data; } } + + /* 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: */ + public function plgVmOnStoreInstallPluginTable($psType, $name='') { + return $this->onStoreInstallPluginTable($psType, $name); + } } diff --git a/ordernumber.script.php b/ordernumber.script.php index 5bfe935..caa5f20 100644 --- a/ordernumber.script.php +++ b/ordernumber.script.php @@ -6,6 +6,9 @@ defined('_JEXEC') or die('Restricted access'); * @copyright Copyright (C) 2013-2014 Reinhold Kainhofer, office@open-tools.net * @license GPL v3+, http://www.gnu.org/copyleft/gpl.html */ +defined('DS') or define('DS', DIRECTORY_SEPARATOR); +if (!class_exists( 'VmConfig' )) + require(JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'helpers'.DS.'config.php'); class plgVmShopperOrdernumberInstallerScript { @@ -29,12 +32,23 @@ class plgVmShopperOrdernumberInstallerScript /** * Called after any type of action * - * @param string $route Which action is happening (install|uninstall|discover_install) + * @param string $route Which action is happening (install|update|uninstall|discover_install) * @param JAdapterInstance $adapter The object responsible for running this script * * @return boolean True on success */ // public function postflight($route, JAdapterInstance $adapter); + public function postflight ($type, $parent = null) { + if(!class_exists( 'vmPlugin' )) + require JPATH_VM_ADMINISTRATOR.DS.'plugins'.DS.'vmplugin.php'; + if(!class_exists( 'plgVmShopperOrdernumber' )) + require JPATH_ROOT.DS.'plugins'.DS.'vmshopper'.DS.'ordernumber'.DS.'ordernumber.php'; + $dispatcher = new JDispatcher(); + $config = array('name' => 'ordernumber', 'type' => 'vmshopper'); + $plugin = new plgVmShopperOrdernumber($dispatcher, $config); + $plugin->plgVmOnStoreInstallPluginTable('shopper'); +// $dispatcher->trigger("plgVmOnStoreInstallPluginTable", array('vmshopper')); + } /** * Called on installation @@ -79,7 +93,7 @@ class plgVmShopperOrdernumberInstallerScript { // Remove plugin table $db =& JFactory::getDBO(); - $db->setQuery('DROP TABLE `#__virtuemart_shopper_plg_ordernumber`;'); + $db->setQuery('DROP TABLE IF EXISTS `#__virtuemart_shopper_plg_ordernumber`;'); $db->query(); } } \ No newline at end of file diff --git a/ordernumber.xml b/ordernumber.xml index bad71ae..32999cd 100644 --- a/ordernumber.xml +++ b/ordernumber.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<extension version="1.6" type="plugin" group="vmshopper" method="upgrade"> +<extension version="2.5" type="plugin" group="vmshopper" method="upgrade"> <name>VMSHOPPER_ORDERNUMBER</name> <creationDate>2013-01-09</creationDate> <author>Reinhold Kainhofer</author> @@ -7,8 +7,8 @@ <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.9</version> - <releaseDate>2014-01-13</releaseDate> + <version>1.10</version> + <releaseDate>2014-08-31</releaseDate> <releaseType>Minor update</releaseType> <downloadUrl>http://www.open-tools.net/virtuemart-2-extensions/vm2-ordernumber-plugin.html</downloadUrl> @@ -18,14 +18,14 @@ <filename plugin="ordernumber">ordernumber.php</filename> <filename>ordernumber.script.php</filename> <filename>index.html</filename> - <folder>language</folder> + <folder>language</folder> </files> <scriptfile>ordernumber.script.php</scriptfile> <languages folder="language"> - <language tag="en-GB">en-GB/en-GB.plg_vmshopper_ordernumber.ini</language> - <language tag="en-GB">en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini</language> - <language tag="de-DE">de-DE/de-DE.plg_vmshopper_ordernumber.ini</language> - <language tag="de-DE">de-DE/de-DE.plg_vmshopper_ordernumber.sys.ini</language> + <language tag="en-GB">en-GB/en-GB.plg_vmshopper_ordernumber.ini</language> + <language tag="en-GB">en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini</language> + <language tag="de-DE">de-DE/de-DE.plg_vmshopper_ordernumber.ini</language> + <language tag="de-DE">de-DE/de-DE.plg_vmshopper_ordernumber.sys.ini</language> </languages> <!-- Joomla 2.5 & 3.0 config --> <config> diff --git a/releases/plg_vmshopper_ordernumber_v1.10.zip b/releases/plg_vmshopper_ordernumber_v1.10.zip new file mode 100644 index 0000000000000000000000000000000000000000..076ce15134dc99ad2fe9169eebb0649616e20d0a GIT binary patch literal 12638 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 AlmGw# literal 0 HcmV?d00001 -- GitLab