diff --git a/Makefile b/Makefile index 38addfd5afd0bef9287e7c625ac1c0f034a69a71..c426d94206c07c638cc94a039935e56e366774d7 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ BASE=ordernumber PLUGINTYPE=vmshopper -VERSION=1.6.1 +VERSION=1.6.2 PLUGINFILES=$(BASE).php $(BASE).script.php $(BASE).xml index.html # TRANSDIR=../../../administrator/language/ diff --git a/ordernumber.php b/ordernumber.php index ea08c7797ff5e07791be18653e0f12c30ff5efd0..a5b51ee365af04dcc71410b1d5d05166a3e476ac 100644 --- a/ordernumber.php +++ b/ordernumber.php @@ -10,75 +10,6 @@ defined('_JEXEC') or die( 'Direct Access to ' . basename( __FILE__ ) . ' is not allowed.' ) ; if (!class_exists('vmShopperPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmshopperplugin.php'); -/* For php 5.2 we cannot use lambda functions or any other way to pass local variables to the callback. - The only way to pass a local variable to a callback for preg_replace_callback is to - create a class instance... */ -class ReplacementCallback { - private $details; - private $nrtype; - - function __construct($nrtype, $details) { - $this->details = $details; - $this->nrtype = $nrtype; - } - - /* Return a random "string" of the given length taken from the given alphabet */ - static function randomString($alphabet, $len) { - $alen = strlen($alphabet); - $r = ""; - for ($n=0; $n<$len; $n++) { - $r .= $alphabet[mt_rand(0, $alen-1)]; - } - return $r; - } - - function replace ($match) { - $varname = strtolower($match[1]); - switch ($varname) { - case "year": return date ("Y"); - case "year2": return date ("y"); - case "month": return date("m"); - case "day": return date("d"); - case "hour": return date("H"); - case "hour12": return date("h"); - case "ampm": return date("a"); - case "minute": return date("i"); - case "second": return date("s"); - case "random": - /* the regexp matches (random)(Type)(Len) as match 1 to 3, Len is optional */ - $len = ($match[3]?$match[3]:1); - // Fallback: If no Type is given, use Digit - $alphabet = "0123456789"; - // Select the correct alphabet depending on Type - switch (strtolower($match[2])) { - case "digit": $alphabet = "0123456789"; break; - case "hex": $alphabet = "0123456789abcdef"; break; - case "letter": $alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; break; - case "uletter": $alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; break; - case "lletter": $alphabet = "abcdefghijklmnopqrstuvwxyz"; break; - case "alphanum": $alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; break; - } - return self::randomString ($alphabet, $len); - case "vendorid": return ($this->details->virtuemart_vendor_id); - case "userid": return ($this->details->virtuemart_user_id); - case "ipaddress": return ($this->details->ip_address); - - // Only for Invoice: - case "ordernumber": return ($this->details->order_number); - case "orderid": return ($this->details->virtuemart_order_id); - case "lastname": return ($this->details->last_name); - case "firstname": return ($this->details->first_name); - case "company": return ($this->details->company); - case "city": return ($this->details->city); - case "zip": return ($this->details->zip); - case "orderstatus": return ($this->details->order_status); - } - // No variable type matched, so don't replace, return the original string - return $match[0]; - } -} - - class plgVmShopperOrdernumber extends vmShopperPlugin { function __construct(& $subject, $config) { @@ -104,29 +35,85 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { // We don't need this function, but the parent class declares it abstract, so we need to overload function plgVmOnUpdateOrderBEShopper($_orderID) {} + + /* Return a random "string" of the given length taken from the given alphabet */ + static function randomString($alphabet, $len) { + $alen = strlen($alphabet); + $r = ""; + for ($n=0; $n<$len; $n++) { + $r .= $alphabet[mt_rand(0, $alen-1)]; + } + return $r; + } + + function replaceRandom ($match) { + /* the regexp matches (random)(Type)(Len) as match, Type and Len is optional */ + $len = ($match[3]?$match[3]:1); + // Fallback: If no Type is given, use Digit + $alphabet = "0123456789"; + // Select the correct alphabet depending on Type + switch (strtolower($match[2])) { + case "digit": $alphabet = "0123456789"; break; + case "hex": $alphabet = "0123456789abcdef"; break; + case "letter": $alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; break; + case "uletter": $alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; break; + case "lletter": $alphabet = "abcdefghijklmnopqrstuvwxyz"; break; + case "alphanum": $alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; break; + } + return self::randomString ($alphabet, $len); + } + - /* Replace the format variables, match[1] is the variable name, match[2] and match[3] are only used for random fields */ /* Type 0 means order number, type 1 means invoice number, type 2 means customer number, 3 means order password */ function replace_fields ($fmt, $nrtype, $details) { - // Match variables for the form random[type][count] and everything else. - // This makes it possible to handle "random" just like any other type! - $patterns = array ( - '/\[(random)(.*?)([0-9]*?)\]/', // For randomTypeN, spit the three parts - '/\[([^\]]+)\]/' // Everything else matches whole variable name + // First, replace all randomXXX[n] fields. This needs to be done with a regexp and a callback: + $fmt = preg_replace_callback ('/\[(random)(.*?)([0-9]*?)\]/', array($this, 'replaceRandom'), $fmt); + + $reps = array ( + "[year]" => date ("Y"), + "[year2]" => date ("y"), + "[month]" => date("m"), + "[day]" => date("d"), + "[hour]" => date("H"), + "[hour12]" => date("h"), + "[ampm]" => date("a"), + "[minute]" => date("i"), + "[second]" => date("s"), + "[userid]" => $details->virtuemart_user_id, + "[vendorid]" => $details->virtuemart_vendor_id ); -// // TODO: in php 5.3 and 5.4 we can easier pass $orderDetails to the callback -// function my_callback ($match) { -// return self::replacementCallback ($match, $details); -// }; -// return preg_replace_callback ($patterns, -// function ($match) use ($details) { -// return self::replacementCallback ($match, $details); -// }, $fmt); - - /* php 5.2 does not allow lambda functions and there is no other way to - pass a local variable to the callback than a class instance! */ - $callback = new ReplacementCallback ($nrtype, $details); - return preg_replace_callback ($patterns, array($callback, 'replace'), $fmt); + if ($nrtype==0 or $nrtype == 1) { + $reps["[ipaddress]"] = $details->ip_address; + } + if ($nrtype==1) { + // Only for Invoice: + $reps["[ordernumber]"] = $details->order_number; + $reps["[orderid]"] = $details->virtuemart_order_id; + $reps["[lastname]"] = $details->last_name; + $reps["[firstname]"] = $details->first_name; + $reps["[company]"] = $details->company; + $reps["[city]"] = $details->city; + $reps["[zip]"] = $details->zip; + $reps["[orderstatus]"] = $details->order_status; + } + if ($nrtype==2) { + // Customer number: + print_r($details); + $reps["[username]"] = $details->username; + $reps["[name]"] = $details->name; + $reps["[email]"] = $details->email; + $reps["[company]"] = $details->company; + $reps["[title]"] = $details->title; + $reps["[firstname]"] = $details->first_name; + $reps["[middlename]"] = $details->middle_name; + $reps["[lastname]"] = $details->last_name; + $reps["[zip]"] = $details->zip; + $reps["[city]"] = $details->city; + $reps["[countryid]"] = $details->virtuemart_country_id; + $reps["[stateid]"] = $details->virtuemart_state_id; + $reps["[user_is_vendor]"] = $details->user_is_vendor; + } + return str_ireplace (array_keys($reps), array_values($reps), $fmt); } /* Type 0 means order number, type 1 means invoice number, type 2 means customer number */ @@ -154,7 +141,6 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { $db->query(); // return the format with the counter inserted - return str_replace ("#", sprintf('%0' . $padding . 's', $count), $nr); } @@ -162,7 +148,7 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { function plgVmOnUserOrder(&$orderDetails/*,&$data*/) { // Is order number customization enabled? if ($this->params->get('customize_order_number')) { - $nrtype=0; /*order-nr*/ + $nrtype = 0; /*order-nr*/ $fmt = $this->params->get ('order_number_format', "#"); $global = $this->params->get ('order_number_global', 1); $padding = $this->params->get ('order_number_padding', 1); @@ -171,8 +157,9 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { } // Is order password customization enabled? if ($this->params->get('customize_order_password')) { + $nrtype = 3; /* order password */ $fmt = $this->params->get ('order_password_format', "[randomHex8]"); - $passwd = $this->replace_fields ($fmt, 3, $orderDetails); + $passwd = $this->replace_fields ($fmt, $nrtype, $orderDetails); $orderDetails->order_pass = $passwd; } } @@ -186,7 +173,7 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { $pdfInvoice = (int)VmConfig::get('pdf_invoice', 0); // backwards compatible $force_create_invoice=JRequest::getInt('create_invoice', 0); if ( in_array($orderDetails['order_status'],$orderstatusForInvoice) or $pdfInvoice==1 or $force_create_invoice==1 ){ - $nrtype=1; /*invoice-nr*/ + $nrtype = 1; /*invoice-nr*/ $fmt = $this->params->get ('invoice_number_format', "#"); $global = $this->params->get ('invoice_number_global', 1); $padding = $this->params->get ('invoice_number_padding', 1); @@ -202,7 +189,7 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { function plgVmOnUserStore(&$data) { // Is order number customization enabled? if ($this->params->get('customize_customer_number') && isset($data['customer_number_bycore']) && $data['customer_number_bycore']==1) { - $nrtype=2; /*customer-nr*/ + $nrtype = 2; /*customer-nr*/ $fmt = $this->params->get ('customer_number_format', "#"); $global = $this->params->get ('customer_number_global', 1); $padding = $this->params->get ('customer_number_padding', 1); diff --git a/ordernumber.script.php b/ordernumber.script.php index d7146b75e23a3e552de540a67c21ecb2e0b0b514..cbbd586c93481ee7ff26815fe50c4a8635e3915f 100644 --- a/ordernumber.script.php +++ b/ordernumber.script.php @@ -57,8 +57,10 @@ class plgVmShopperOrdernumberInstallerScript public function update(JAdapterInstance $adapter) { jimport( 'joomla.filesystem.file' ); - JFile::delete( JPATH_ROOT . DS . "administrator" . DS . "language" . DS . "en-GB" . DS . "en-GB.plg_vmshopper_ordernumber.sys.ini"); - JFile::delete( JPATH_ROOT . DS . "administrator" . DS . "language" . DS . "de-DE" . DS . "de-DE.plg_vmshopper_ordernumber.sys.ini"); + $file = JPATH_ROOT . DS . "administrator" . DS . "language" . DS . "en-GB" . DS . "en-GB.plg_vmshopper_ordernumber.sys.ini"; + if (JFile::exists($file)) JFile::delete($file); + $file = JPATH_ROOT . DS . "administrator" . DS . "language" . DS . "de-DE" . DS . "de-DE.plg_vmshopper_ordernumber.sys.ini"; + if (JFile::exists($file)) JFile::delete($file); return true; } diff --git a/ordernumber.xml b/ordernumber.xml index ca874edca62946430b271d8615d234e4b9172482..2f6128ae9e2a8efea6210ec97f3c1ac0b41ebdd5 100644 --- a/ordernumber.xml +++ b/ordernumber.xml @@ -7,8 +7,8 @@ <authorUrl>http://www.kainhofer.com/</authorUrl> <copyright>Copyright (C) 2012-2013 Reinhold Kainhofer. All rights reserved.</copyright> <license>http://www.gnu.org/licenses/gpl-3.0.html GNU/GPLv3</license> - <version>1.6.1</version> - <releaseDate>2013-01-09</releaseDate> + <version>1.6.2</version> + <releaseDate>2013-01-11</releaseDate> <releaseType>Minor update</releaseType> <downloadUrl>http://www.kainhofer.com/virtuemart-2-extensions/vm2-ordernumber-plugin.html</downloadUrl> diff --git a/releases/plg_vmshopper_ordernumber_v1.6.2.zip b/releases/plg_vmshopper_ordernumber_v1.6.2.zip new file mode 100644 index 0000000000000000000000000000000000000000..6669f863eab81c38ad3d053fad0fff03622d5cce Binary files /dev/null and b/releases/plg_vmshopper_ordernumber_v1.6.2.zip differ